これは、ELVM上に構築された8ccのVIMスクリプトポートです。言い換えれば、これはVIMスクリプトで書かれた完全なCコンパイラです。
8ccは、x86_64 Linux用のきれいに書かれた小さなCコンパイラです。それはC11に意識され、自己ホストされています。
elvmはe e s e l ang v irtual m achineです。 ELVMは8ccをリターゲットして、独自の中間表現、Eirを放出します。 ELVMは、リターゲット8ccをフロントエンドとして、CコードをEIRにコンパイルします。そして、Eirをさまざまなターゲット(Python、Ruby、C、Brainfxxk、Piet、Befunge、Emacs lisp、...)にバックエンドに翻訳します。アーキテクチャはLLVMに似ています。このプレゼンテーションは、ELVMアーキテクチャをさらに知るのに良いものです(日本語では)。
ELVMは、さまざまなターゲットに自分自身をコンパイルできます。そこで、新しい「VIMスクリプト」バックエンドを追加し、それを使用して8ccのCコードをVIMスクリプトに変換します。
現在、8cc.vimは純粋なVIMスクリプトで書かれています。 8cc.vimは、フロントエンド(カスタマイズされた8cc)とバックエンド(ELC)で構成されています。 CコードをVIMスクリプトにコンパイルできます。そしてもちろん、VIMは生成されたVIMスクリプトコードを評価できます。
これはおもちゃプロジェクトであることに注意してください。 8cc.vimははるかに遅いです。 2015年初頭(2.7 GHz Intel Core I5)でMacBook Proで最もシンプルなputchar()プログラムをコンパイルするには、824(FrontEnd:430 + Backend:396)秒かかります。しかし、実際には機能します!
VMがVIMスクリプトで実行されると、8cc.vimはLinux、OS X、および(できれば)Windowsで動作します。
このリポジトリと:packaddをクローンしてください(参照:help pack-add参照)。
または、お気に入りのプラグインマネージャー(VIM-Plug、dein.vimなど)を使用してください。
:EccCompile:EccRuneightcc#compile()eightcc#run()現在のバッファーでCコードを準備します。以下は「Hello World」の例です。
int putchar ( int x );
int main () {
const char * p = "Hello, world!n" ;
for (; * p ; p ++ )
putchar ( * p );
return 0 ;
}次に、実行:EccCompileコマンド。このよう--verboseいくつかのオプションを使用できることに注意してください。参照してください:EccCompile --help詳細については、ヘルプ。
20分以上時間がかかります。休んで、いくつかの☕を取得しましょう。
その結果、CコードからコンパイルされたVIMスクリプトコードで新しいバッファーが開かれます。ロードする:w putchar.vimおよび:source putchar.vim 。
最後に、以下のVIMスクリプトコードを手で実行します。コンパイルされたコードは、VIMスクリプトのVMで実行されます。 SetupVM()関数は、VMインスタンスを作成します。
:let vm = SetupVM()
:call vm.run()
VIMスクリプトを実行した結果のみを確認したい場合は、 :EccRun使用して上記のプロセスをスキップできます。
対応:EccCompileおよび:EccRunには、 eightcc#compile()およびeightcc#run()関数を使用できます。実行オプションのために1つの辞書を使用できます。
MITライセンス
Copyright(c)2016 RHYSD
このソフトウェアと関連するドキュメントファイル(「ソフトウェア」)のコピーを入手して、制限なしにソフトウェアを扱うために、このソフトウェアを制限する権利を含め、ソフトウェアのコピーをコピー、変更、公開、配布、販売する、ソフトウェアのコピーを許可する人を許可する人を許可することを含めて、許可が無料で許可されます。
上記の著作権通知とこの許可通知は、ソフトウェアのすべてのコピーまたはかなりの部分に含まれるものとします。
このソフトウェアは、商品性、特定の目的への適合性、および非侵害の保証を含むがこれらに限定されない、明示的または黙示的なものを保証することなく、「現状のまま」提供されます。いかなる場合でも、著者または著作権所有者は、契約、不法行為、またはその他の訴訟、ソフトウェアまたはソフトウェアの使用またはその他の取引に関連する、またはその他の契約、またはその他の請求、またはその他の責任について責任を負いません。