トランスコンパイラ
![]() | 「クロスコンパイラ」とは異なります。 |
プログラムの実行 |
---|
一般的な概念 |
コードの種類 |
コンパイル戦略 |
有名なランタイム |
|
有名なコンパイラとツールチェーン |
|
|
トランスコンパイラ(他にトランスパイラ、ソース・トゥ・ソースコンパイラ、などとも)は、あるプログラミング言語で書かれたプログラムのソースコードを入力として受け取り、別のプログラミング言語の同等のコードを目的コードとして生成する、ある種のコンパイラである。一般に、コンパイラが「比較すると高水準な言語のソースコード」を入力とし、「比較すると低水準な言語の目的コード」を、コンパイル結果として出力するものであったのに対し、トランスコンパイラは同じ程度の(抽象化の)水準のコードをコンパイル結果として出力する。
それらの処理系における具体的なコンパイルの処理、すなわち、入力から出力への変換において実際に行われることは、それぞれの処理系によってさまざまである。字句のレキシカルな変換や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 |
コード変換
開発者が、既存コードの大部分を別の言語に変換する場合、すべてを手動変換するよりもトランスコンパイラを使用するほうがよい場合が多い。「機械的」に変換が可能なのであれば、手動変換するのは単に手数を掛けるだけ無駄なばかりではなく、手作業にはミスがつきものだからである。一方で機械的な変換が不可能な場合もまたあり、ソース言語と目的の言語の組み合わせや、実際のコード次第でもあるがケースバイケースであって、一般論としては何も決定的なことは言えない。
ツール | 変換元言語 | 変換先言語 | 備考 |
---|---|---|---|
2to3 script | Python 2 | Python 3 | 2to3は自動変換プロセスはきわめて優れているが、それでも手動変換が必要となる場合はある。 |
Emscripten | LLVMバイトコード | ECMAScript | これはC/C++バイトコードをブラウザ等で実行することを可能にする |
Google Web Toolkit | 特別なAPIを用いたJava | JavaScript | このJavaコードを普通のJavaコードと同等とみなすことは難しい |
Ocsigen(英語版)のJs_of_ocaml[22] | OCaml | JavaScript | |
J2Eif[23] | Java | Eiffel | 変換時、Javaに類似したクラスと構造を持つEiffelの構文や慣習を解決する。 |
C2Eif[24] | C | Eiffel | 変換時、可能な限りクラスと構造をきれいにしようとする。このツールは完璧であり、適切に処理できないCの組み込み関数やアセンブルを除去する。 |
Swiftify[25] | Objective-C | Swift | Swiftifyはオンラインのコード変換ツールで、主にiOSコードベースの一部または全体の移行を支援する。 |
関連リンク
![ポータル コンピュータ](http://upload.wikimedia.org/wikipedia/commons/thumb/c/c9/Portal.svg/36px-Portal.svg.png)
- C to HDL(英語版)
- 言語相互運用性(英語版)
- バイナリ・リコンパイラ
- コード生成
- プログラム変換(英語版)
- ROSE (コンパイラ)(英語版)
- パーサジェネレータ
- 言語バインディング
- Monkey (プログラミング言語)(英語版)
- 中間言語
- 再帰的トランスコンパイル(英語版)
- Extensible Markup Language (XML)・XSL Transformations (XSLT)
脚注
- ^ “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日閲覧。