2

私が設計している小さなプログラミング言語があり、比較的簡単なバックエンド オプションが必要です。C は、通常のすべての理由 (「適切なアドバイスに従えない」、「アセンブリを知らない」など) から比較的適切なオプションとして際立っています。 Cで簡単に表現することはできません(それは型チェッカーに関するものであり、対応するGCまたはヘビーデューティランタイムはありません)-1つのことを除いて:最適化されたテールコール。

言語にはループ構造があるため、実際には必要ありませんが、機能的であることも想定されているため、TCO は、可能であれば導入する価値があるように思えます。トランポリンまたは怠惰なサンク ソリューションは機能しますが、パフォーマンスに顕著な影響を与えるように見えます (文献から、私はまだプロファイリングしていませんが、とにかく使用に関する情報はありません)。実装によって、ユーザーが問題を有効な方法で表現するのを思いとどまらせたくありません。

この質問は、比較的単純なプラットフォーム固有の「tailcall」ブロックを作成し、「return」を置き換えて、必要な動作を強制することが可能であるべきだと考えています。しかし、x86に慣れていないので、Cの自動スタック操作を制御する方法、ジャンプを狙うべき場所などを知りません(関数の開始後にスタックを拡張するように見えます. .. したがって、テールコールの前にスタックを縮小する必要がありますが、これは少し不要です。または、スタック操作の後にターゲットのボディの開始点で何らかの形でジャンプを狙う必要があります目標 ..?)

そう:

  • これはできますか?
  • 安全にできるか?
  • それはまったく賢明ですか?

C (つまり、C ではなく、私の高級言語) で動作する末尾呼び出しの除去を実装できることを認識していることを繰り返します。コンパイラとプラットフォーム固有の最適化を追加したいだけです。 、「本物」と多かれ少なかれ区別がつかないようにします。LLVM を使用したことがなく、x86 の最低限の読み取り知識しか持っていないのに対し、私は C に非常に自信があるため、主に C を使用したいと考えています。将来的には両方をきちんと学ばなければならないことはわかっていますが...

(つまり、私がこれを尋ねているのは、アイデアが頭に残っていて、より良い方法 (tm) があるのではないかと悩まされているからです。バックエンドを機能させるためのソリューションが必要だからではありません。)

4

1 に答える 1

1

これはできますか?

はい。

安全にできますか?

はい。

それはまったく賢明ですか?

いいえ。gccはすでにTCOを実行しており、さらに計算されたgotoをサポートしているため、これを行う理由はまったくありません。

于 2012-09-30T15:44:04.793 に答える