Factor/FAQ/Factor の実装

Factor はコンパイルされるのですか、インタープリタで解釈されるのですか?

Factor はコンパイルされます。次の 2 つのコンパイラがあります。

  • 最小限の非最適化 JIT コンパイラ (C で記述)
  • Factor で記述された最適化コンパイラ

ほとんどのコードは最適化コンパイラでコンパイルされますが、実行時に新しいコードを生成するコードは最適化コンパイラではコンパイルされません。

質問の意味が、「Factor ではスタンドアロンの実行可能ファイルを作成できますか?」ということなら、答えはイエスです。デプロイメントに関するページを参照してください。

自分の書いたコードが最適化コンパイラでコンパイルされないのですがなぜですか?

コードが最適化コンパイラでコンパイルされるためには、そのコードのスタック効果が、コンパイラで認識可能な一貫性を持っている必要があります。すなわち、スタックの上から取り出す項目の数とスタック上に積む項目の数が常に一定である必要があります。Factor コンパイラは、コンパイル時にインライン化することができないクォーテーション呼び出しのスタック効果を推測することができません。もう一つ、コードに inline を記述するのを忘れている可能性もあります。コンビネータ定義の後では、コンパイラへのヒントとして必ず inline を記述する必要があります。

Factor はなぜ完全に自己ホスト型ではないのですか?

Factor を自己ホスト型 (self-hosted) にするには、高度な機能をすべて切り捨てて、仮想マシンを Factor 内部で新しい低水準の DSL で書き直す必要があります。この場合、仮想マシンをインタラクティブにデバッグしたり置き換えたりすることはできないので、C を使う場合と比べて実質的なメリットは何もないことになります。C は、低水準コンポーネントを実装するのに適した言語です。

Factor の C コンポーネントは、なぜほかのプログラミング言語では実装されていないのですか?

ほかのプログラミング言語にくらべて、C には多くの利点があります。まず、GCC は高度に最適化されていて、ほとんどどのプラットフォームでも利用できます。C は非常に低水準でマシンに近いため、C が適しているということもあります。Factor では、ヒープを完全にコントロールできるプログラミング言語が必要です。これは、直接ヒープをコピーすることによって、イメージを保存しているからです。

Factor はなぜ Java 仮想マシンや .NET に対応していないのですか?

そもそも Factor は Java で記述され、JVM バイトコードを生成するコンパイラもありました。しかし、処理速度を向上させて外部関数とのインタフェースを改善するために、Factor は C と Factor で書き直されました。すなわち、JFactor を捨てて、代わりに CFactor を採用しました。この時点で、変更を加えていない古い JFactor では、ほとんどすべての Factor コードが動作しなくなりました。JFactor には総称ワードや構文拡張といった重要な機能が欠如しているからです。現在の Factor は、バイトコードにコンパイルされるのではなく、ネイティブにコンパイルされます。JVM に依存しないようにすることで、移植と配布も容易になります。

なぜ Factor は LLVM を使用しないのですか?

Factor がサポートしている一部のプラットフォームは LLVM ではサポートされていませんでした。また、コンパイラをすべて Factor で記述することは、言語としての Factor をテストするうえで有益ですし、非常に高度な最適化機能を実装することができます。ただし、LLVM はコンパイラのバックエンドとしては優れた選択肢ですし、自分で独自の言語を記述する場合は、LLVM について知っておくべきでしょう。

This revision created on Mon, 5 Jan 2009 22:42:11 by slava