トランスコンパイラ (他にトランスパイラ、ソース・トゥ・ソースコンパイラ、などとも)は、あるプログラミング言語 で書かれたプログラム のソースコード を入力として受け取り、別のプログラミング言語の同等のコードを目的コードとして生成する、ある種のコンパイラ である。一般に、コンパイラが「比較すると高水準な言語 のソースコード」を入力とし、「比較すると低水準な言語 の目的コード」を、コンパイル結果として出力するものであったのに対し、トランスコンパイラは同じ程度の(抽象化 の)水準のコードをコンパイル結果として出力する。
それらの処理系における具体的なコンパイルの処理、すなわち、入力から出力への変換において実際に行われることは、それぞれの処理系によってさまざまである。字句のレキシカルな変換やsyntactic sugar(糖衣構文 )の展開といったような程度の場合もあれば、高度なコンパイラ最適化 を施して機械語 をコード生成するような、通常のコンパイラと全く同様の処理をおこなっているものもある。
たとえば、Pascal のコードをC のコードへと変換するといったものや、「自動並列化コンパイラ」のように、見た目としては逐次的なfor文などで書かれいているコードを、OpenMP のような並列化 メタデータ やFortran のforall
文のような言語構造に変換する[ 1] 、といったものがある。
トランスコンパイルの別の目的は、基本的なプログラミング言語の次期バージョンを使う場合や、API の後方互換性 が壊れた場合などに、レガシーなコードから変換することである。プログラムの実行環境が変わる場合(例えば、Python 2からPython 3に変換する場合や古いAPIから新しいAPIに変換する場合)や、コンパイルによりプログラムのサイズが極端に大きくなったり実行速度が遅くなったりした場合はリファクタリング を行う。
トランスコンパイラは、元のソースコードの開発やデバッグ を簡単に行うことができるよう、元のコードをコメントなどに残す(ことができる)ものもある。また、元のコードから変換した際に構文が大幅に変わった場合は、同等のコードには見えないようなコードに変換されることもある[ 2] 。元のコードから変換されたソースコードにマッピングを行うデバッグツールもある。
トランスコンパイラを主たる実装として開発されている言語の例としてはClosure Compiler , Coccinelle , CoffeeScript , Dart , Haxe , TypeScript [ 3] , Emscripten [ 4] がある。
歴史
ここでは1980年前後以降の例を示す。
1981年にゲイリー・キルドール によって書かれたデジタルリサーチ のXLT86がある。それはIntel 8080 用の.ASMソースコードからIntel 8086 用の.A86ソースコードに変換した。8080のレジスターを用いた全体的なデータフロー解析 を用い、出力されるコードサイズを最適化し、CP/M-80 とMP/M-80 (英語版 ) のプログラムが自動的にCP/M-86 とMP/M-86 に移行できるよう呼び出しを処理した。XLT86自体はPL/I-80 でかかれ、CP/M-80環境のみならず、DEC VMS (for VAX 11/750 or 11/780)でも動くようになっていた[ 5] 。
似たような、しかしもっと洗練されていないプログラムは1980年 に86-DOS の一部としてティム・パターソン によって書かれたTRANS.COMがある。それは、いくつかのZ80 アセンブラ のソースコードを8086用の.ASMソースコードに変換した。しかし、これは制御コード 、レジスタ 、モードのサブセットのみをサポートしており、かなりの手動変換や手直しを必要とした。それはレジスタやジャンプ の最適化 を行わなかった[ 6] [ 7] 。
言語実装
いくつかの言語実装は当初トランスコンパイラとして開発され、それらの言語実装の中には2016年 現在もトランスコンパイラのものもある。以下の表に加え、CoffeeScript のメンテナがJavaScriptに変換できる言語の一覧を提供している[ 8] 。
変換元言語
変換先言語
備考
BASIC
C
BaConを用いる[ 9]
BCX
C
C
JavaScript
Emscripten
C++
C
cfront を変換に用いる
Chapel
C
ClojureScript
JavaScript
COBOL
C
OpenCOBOL (英語版 ) を用いる
COBOL
Java
P3COBOL (英語版 ) を用いる
CoffeeScript
JavaScript
C#
JavaScript
ScriptSharp[ 10] を用いる
Cython
C
このコード変換は、Pythonインタプリタ のCPython で使用するモジュールのコンパイルを意図している
Dart
JavaScript
Delphi Web Script / Object Pascal
JavaScript
Smart Mobile Studioを用いる[ 11]
ECMAScript 6
JavaScript
Babel [ 12] もしくはtraceur-compiler[ 13] を用いる
Eiffel
C
Go
JavaScript
GopherJS
Groovy
JavaScript
grooscript
Haskell
JavaScript
GHCJSを用いる
Haxe
JavaScript , PHP , C++ , C# , Python , Java
ActionScript バイトコードのようなバイトコード の生成にも用いられる
Java
Objective-C
J2ObjC[ 14]
Java
JavaScript
grooscript , GWT , JSweet , ST-JS
Java
TypeScript
JSweet
Java
C
java2c-transcompiler[ 15]
Julia
C
Juliaの言語実装は機械語を生成し、C言語を必要としない。しかし、個々の関数やすべてのプログラムをC言語に変換することも可能である[ 16] [ 17]
LESS
CSS
Lisaac (英語版 )
C
Mirah (英語版 )
Java
MoonScript [ 18]
Lua
Nim
C , C++ , Objective-C , JavaScript
OCaml bytecode
JavaScript
Ocsigen (英語版 ) プロジェクトのjs_of_ocamlを用いる
PHP
C++
HipHop for PHP (英語版 ) を用いる
Python
JavaScript
Brython , PyPyJs , Rapydscript , Skulpt , Transcrypt
Python
C++
NuitkaとShedSkin[ 19] を用いる
Ratfor
Fortran
Ruby
JavaScript
Opal
Sass [ 20]
CSS
Scheme
C
Stalin compiler (英語版 ) , Chicken Scheme
TypeScript
JavaScript
Vala
GObject のような追加ライブラリ を使用したC
X10
C++ , Java
Xtend (英語版 ) [ 21]
Java
コード変換
開発者が、既存コードの大部分を別の言語に変換する場合、すべてを手動変換するよりもトランスコンパイラを使用するほうがよい場合が多い。「機械的」に変換が可能なのであれば、手動変換するのは単に手数を掛けるだけ無駄なばかりではなく、手作業にはミスがつきものだからである。一方で機械的な変換が不可能な場合もまたあり、ソース言語と目的の言語の組み合わせや、実際のコード次第でもあるがケースバイケースであって、一般論としては何も決定的なことは言えない。
関連リンク
脚注
^ “Types of compilers ”. compilers.net (1997–2005). 28 October 2010 閲覧。
^ Fowler, Martin (February 12, 2013). “Transparent Compilation ”. February 13, 2013 閲覧。
^ Henson, Valerie (January 20, 2009). “Semantic patching with Coccinelle ”. lwn.net. 28 October 2010 閲覧。
^ “HTML5 Epic Citadel ”. 2016年10月20日 閲覧。
^ Digital Research (1981): XLT86 - 8080 to 8086 Assembly Language Translator - User's Guide . Digital Research Inc, Pacific Grove ([1] ).
^ Seattle Computer Products (1980): 86-DOS - Disk Operating System for the 8086. User's manual, version 0.3 - Preliminary . Seattle Computer Products, Seattle ([2] ).
^ “Microsoft DOS V1.1 and V2.0: Z80 to 8086 Translator version 2.21 /msdos/v11source/TRANS.ASM ”. Computer History Museum , マイクロソフト (2013年12月19日). 2014年3月25日 閲覧。 (NB. While the publishers claim this would be MS-DOS 1.1 and 2.0, it actually is SCP MS-DOS 1.25 and TeleVideo PC DOS 2.11 .)
^ “List of languages that compile to JS ”. December 15, 2014 閲覧。
^ Peter van Eerten. “BaCon - A free BAsic CONverter for Unix, BSD and MacOSX ”. Basic-converter.org. 2014年7月8日 閲覧。
^ “Script# by nikhilk ”. Scriptsharp.com. 2013年8月2日 閲覧。
^ “Smart Mobile Studio ”. SmartMobileStudio.com. 2014年3月9日 閲覧。
^ “Babel · The compiler for writing next generation JavaScript ”. babeljs.io . 2016年4月10日 閲覧。
^ “Traceur is a JavaScript.next-to-JavaScript-of-today compiler ”. github.com . 2014年7月2日 閲覧。
^ “j2objc - Java to iOS Objective-C translation tool and runtime. ”. j2objc.org (2014年2月13日). 2015年8月18日 閲覧。
^ “java2c-transcompiler - A simple source-to-source from Java to C - Google Project Hosting ”. 8 October 2014 閲覧。
^ “IntelLabs/julia ”. GitHub . 2016年10月20日 閲覧。
^ “Google Groups ”. google.com . 2016年10月20日 閲覧。
^ “MoonScript, a language that compiles to Lua ”. 2016年9月21日 閲覧。
^ “Shed Skin, An experimental (restricted-Python)-to-C++ compiler ”. 2014年10月1日 閲覧。
^ Maptastic Maple (3.3.9). “Sass: Syntactically Awesome Style Sheets ”. Sass-lang.com. 2014年7月8日 閲覧。
^ “Xtend, modernized Java ”. Eclipse project. 2014年10月1日 閲覧。
^ “Js_of_ocaml ”. 8 October 2014 閲覧。
^ “J2Eif Research Page - Chair of Software Engineering ”. Se.inf.ethz.ch. doi :10.1007/978-3-642-21952-8_4 . 2014年7月8日 閲覧。
^ “C2Eif Research Page - Chair of Software Engineering ”. Se.inf.ethz.ch. 2014年7月8日 閲覧。
^ “Objective-C to Swift Converter | Swiftify ”. 2021年4月23日 閲覧。