2011-06-30 9 views
6

Go(http://code.google.com/p/go/)用の現在の公式コンパイラは、手作りの、間違いなく秘密のコードジェネレータを使用しています。これには、カスタムセクションをELFバイナリに挿入することが含まれます。Goは独自のコードジェネレータを使用するのはなぜですか?

このアプローチは、ldd,またはstripのように、ELF情報を直接読み書きするユーティリティに関する多くのバグを引き起こしています。

LLVMなどのよくテストされたクロスプラットフォームのコードジェネレータを使用し、Unix/Linuxのld(またはWindowsの場合はld.exe)など、OSに付属のリンク機能を使用することで、 )、またはlink.exe(Visual Studioを使用しているWindows)。

なぜGoは独自のコードジェネレータを使用していますか?それは本当にホイールを改革しているだけですか?それとももっと重要な理由がありますか?

+0

あなたはそのプロジェクトの誰かになぜその選択をしたのか尋ねる必要があります。 – dmckee

+1

彼らが何をするのかを完全に制御する。 – OscarRyz

+2

@dmckee:あるいは、あなたはこの質問に対する答えを読むことができます。 – peterSO

答えて

7

GCCバックエンドを使用する従来のコンパイラgccgoの使用方法については、Setting up and using gccgoを参照してください。

Go Language Specificationはコンパイラに依存しません。利用可能なコンパイラから選択したり、自分で書き込んだり、LLVM Go frontendプロジェクトに貢献したりすることができます。囲碁コンパイラ技術の歴史観については

、この質問への答えをお読みください。(総称して、GCと呼ばれる5グラム、6グラム、および8グラム、)What compiler technology is used to build the compilers?

4

参照コンパイラが基づいケン・トンプソンによって書かれました彼がPlan 9オペレーティングシステム用に書いたCコンパイラ。

  • 彼はすでにCコンパイラの仕組みに精通していたので、まったく新しいフレームワークを学習するのではなく、既存の作業に適応することが容易でした。
  • Goの目標の1つは、高速にコンパイルすることです。 gcコンパイラはおそらくLLVMベースのコンパイラよりも高速ですが、それほど多くの作業をしていないからです。次に、最適化もしていません。

Peterが述べたように、バックエンドとしてgccを使用するgccgoもあります。最終的に、Goのライブラリに完全なGoパーサーと(部分的に完全な)タイプのチェッカーが含まれていることを考えると、Goコンパイラーのための他のオプションがあると思われます。

関連する問題