5

私が設計しているプログラミング言語のインタプリタとトレース JIT を書きたいと思っています。私はすでに C++ でのプログラミングの長年の経験がありますが、おそらく新しい代替手段の方が優れているのではないかと考えていました。C++ の時代に最もイライラしたことの 1 つは、扱いにくいワンパス コンパイラ モデルに対処するためにヘッダー ファイルを使用しなければならないことでした。問題は、すべての言語がこの目的に等しく適しているわけではないということです。私のトレース JIT では、実行可能コードをメモリに書き込み、インタープリターがそのコードを呼び出すことができる必要があります。また、生成されたコードをホスト関数にコールバックできるようにする必要もあります。

Go を調べ始めたところ、この言語にはポインターはありますが、ポインター演算はありませんでした。これはすぐに大きな問題として私を襲った。独自のアロケータとガベージ コレクタを書きたいと思うかもしれません。言語オブジェクトがメモリに配置される方法を綿密に制御し、特定のフィールドのアドレスを取得してそれらに書き込むことができるようにする必要があります。これに対処する方法がない限り、Go は私の目的に対して十分に低レベルではないようです。

D言語は有望なようです。ポインター演算と、D の呼び出しと呼び出しに必要な ABI の明確な概要が含まれています。私はそれについて多くの良いことを聞いています。また、コンパイラの作成に適したガベージコレクションもありますが、まだよくわからないことがいくつかあります。

  1. Dには、メモリのチャンクを実行可能としてマークできる標準ライブラリがありますか?

  2. 自分の GC を使用して、自分で管理したい大量のメモリを割り当て、そこに大量のポインターを配置すると、D のガベージ コレクターで問題が発生しますか?

  3. あなたの経験では、D は C コードとどの程度うまく相互運用できますか? C 動的ライブラリをロードして呼び出すのはかなり簡単ですか?

最後に、全体的なサポートの側面があります。ここで Linux で D を使用したことがある人にとって、ツールチェーンはどのくらい優れていますか? 問題はありますか?D で JIT コンパイラを書いた人はいますか? もしそうなら、その経験はどうでしたか?

4

4 に答える 4

5
  1. 私はそう信じてcore.memory.GCいます。私の記憶が正しければ見てください。

  2. いいえ、そうすべきではありません。必要なものを呼び出すだけmallocで、GCがそれを認識しないことを確認してください。

  3. はい、C コードとの相互運用は非常に簡単です。

警告: GC は「正確」ではないため、おそらく GC に依存したくないでしょう (つまり、運が悪いとメモリ リークが発生する可能性があります)。ただし、データの小さなブロックの場合、通常は問題ありません。

于 2012-07-27T21:16:59.933 に答える
4

Go ではポインター演算が可能ですが、そのためにはパッケージをインポートするunsafe(または C 関数を使用する) 必要があります。ポインター演算はバグの一般的な原因であり、Go にはスライスなどの他のメカニズムがあり、C でポインター演算を必要とする同じアクティビティの一部を安全に実行する方法を提供しますunsafe。通常の数値型で、算術を実行できます。uintptruintptr

于 2012-07-27T21:50:02.957 に答える
2

D で作成された非常に本格的な JIT コンパイラが既にあります。http://lycus.org/、より具体的には MCI プロジェクトに関するページ - http://github.com/lycus/mciを参照することを強くお勧めします。 . MCI のドキュメントには、さらに詳しい情報が記載されています。おわかりのように、MCI は単なる JIT ではなく、独自の (私が見た他の何よりも優れた) IR、オプティマイザー、検証機能などを備えています。

于 2012-07-28T00:12:55.113 に答える
2

Go を調べ始めたところ、この言語にはポインターはありますが、ポインター演算はありませんでした。これはすぐに大きな問題として私を襲った。

あなたは、明らかに、言語を試していません。「ポインター演算」がなくても、かなりうまく機能します。本当にルールを曲げる必要がある場合は、何でもできる「安全でない」パッケージが常に存在します。

独自のアロケータとガベージ コレクタを書きたいと思うかもしれません。言語オブジェクトがメモリに配置される方法を綿密に制御し、特定のフィールドのアドレスを取得してそれらに書き込むことができるようにする必要があります。

アロケータやガベージ コレクタを自分で作成したことはありませんが、構造体のフィールドのアドレスを取得できます。すべての Go データ構造は単純で、制御と推論が容易です。簡単な紹介については、 http://research.swtch.com/godataを参照してください。また、サイズとアライメントの保証はhttp://golang.org/ref/spec#Size_and_alignment_guarantees言語の一部です。他に何もなければ、いつでも C または asm に飛び込むことができます。

私見ですが、いくつかの小さなタスクを実装して、Go が要件に適合するかどうかを確認する必要があります。http://groups.google.com/group/golang-nutsでお気軽に質問してください。

アレックス

于 2012-07-28T12:37:03.277 に答える