コンピュータプログラミングにおいて、セルフホスティングとは、同じプログラムの新しいバージョンを生成するツールチェーンまたはオペレーティングシステムの一部としてプログラムを使用することです。たとえば、独自のソースコードをコンパイルできるコンパイラなどです。セルフホスティングソフトウェアは、パーソナルコンピュータや大規模なシステムでは一般的です。一般的なセルフホスティングのプログラムには、カーネル、アセンブラ、コマンドラインインタープリタ、リビジョン管理ソフトウェアなどがあります。
オペレーティングシステム
オペレーティング システムを構築するツールチェーンが同じオペレーティング システム上で実行される場合、オペレーティング システムは自己ホスト型です。たとえば、Windows は Windows を実行しているコンピューター上で構築できます。
システムをセルフホスト化するには、セルフホスト化が可能な段階に達するまで開発するための別のシステムが必要です。新しいコンピューターまたはオペレーティング システム向けに開発する場合、開発ソフトウェアを実行するシステムが必要ですが、オペレーティング システムを記述および構築するために使用する開発ソフトウェアも必要です。これはブートストラップ問題、またはより一般的には鶏が先か卵が先かというジレンマと呼ばれます。
この問題の解決策は、クロス コンパイラ(アセンブリ言語を使用する場合はクロス アセンブラ) です。クロス コンパイラを使用すると、あるプラットフォーム上のソース コードを別のマシンまたはオペレーティング システム用にコンパイルできるため、セルフホスティング コンパイラがまだ存在しないマシン用のオペレーティング システムを作成できます。ソフトウェアを作成したら、EPROM 、フロッピーディスク、フラッシュ メモリ(USB サム ドライブなど)、JTAGデバイスなどの手段を使用して、ターゲット システムに展開できます。これは、独自の開発ツールをホストしないゲーム コンソールや携帯電話やタブレットなどのハンドヘルド デバイス用のソフトウェアを作成する方法に似ています。
システムが独自のコードをコンパイルできるほど成熟すると、クロス開発の依存関係は終了します。この時点で、オペレーティング システムはセルフホスト型であると言われます。
コンパイラ
コンパイラやインタープリタを使用したソフトウェア開発は、コンパイラが自身をコンパイルできる場合には、自己ホストすることもできます。[1]
セルフホストコンパイラはオペレーティングシステムと同じブートストラップ問題を抱えているため、新しいプログラミング言語のコンパイラは既存の言語で記述する必要があります。そのため、開発者はアセンブリ言語、C / C++ 、またはPythonやLuaなどのスクリプト言語を使用して、コンパイラの最初のバージョンを構築する場合があります。言語が十分に成熟すると、コンパイラの開発はコンパイラのネイティブ言語に移行し、コンパイラが自ら構築できるようになります。
歴史
最初のセルフホスティングコンパイラ(アセンブラを除く)は、1962年にMITのHartとLevinによってLisp用に書かれました。彼らはLispでLispコンパイラを書き、既存のLispインタプリタ内でテストしました。彼らがコンパイラを改良して、独自のソースコードをコンパイルできるレベルに達したとき、それはセルフホスティングになりました。[2]
標準コンパイラ テープ上に存在するコンパイラは、コンパイラのS 式定義をインタープリタを介して自身で動作させることによって取得されたマシン言語プログラムです。
— AIメモ39 [2]
この手法は通常、コンパイル対象の言語と同じ言語のインタープリタが既に存在する場合にのみ実行可能です。可能ではありますが、人間がコンパイラをそれ自体でコンパイルすることは非常にまれです。[3]この概念は、入力として自分自身でプログラムを実行するというより広い概念から直接借用されており、停止問題が決定不可能であることの証明など、理論計算機科学のさまざまな証明でも使用されています。
例
ケン・トンプソンは1968年にGE-635でプログラムを書き、コンパイルし、それをPDP-7に移植してテストすることでUnixの開発を始めました。初期のUnixカーネル、コマンドインタープリタ、エディタ、アセンブラ、およびいくつかのユーティリティが完成した後、Unixオペレーティングシステムは自己ホスティング型となり、PDP-7自体でプログラムを書き、テストできるようになりました。[4]
ダグラス・マキロイは、 TMGでTMG (コンパイラ・コンパイラ)を紙に書き、「自分の紙を自分の紙に渡すことにした」。そして自分で計算を行い、TMGコンパイラをアセンブリ言語にコンパイルした。そしてそれをケン・トンプソンのPDP-7で入力してアセンブルした。[3]
GNUシステムの開発は、GCC (GNU コンパイラ コレクション) と GNU Emacs (人気のエディタ)に大きく依存しており、 GNU プロジェクトのフリー ソフトウェアの自己完結的で保守的かつ持続的な開発を可能にしています。
多くのプログラミング言語には、自己ホスト型の実装、つまり同じ言語内およびその言語用のコンパイラがあります。ブートストラップというアプローチでは、言語のコア バージョンが最初に別の高級言語、アセンブラ、またはマシン言語を使用して実装され、その結果得られたコンパイラを使用して、それ自体の拡張バージョンの構築が開始されます。
セルフホスティングコンパイラを持つ言語のリスト
以下のプログラミング言語にはセルフホスティングコンパイラがあります: [引用が必要]
- エイダ
- ALGOL (バローズ B5000 )
- ベーシック[5]
- BCPL
- C
- C++ ( Visual C++、clang、gcc 4.8)
- C# ( Microsoft Roslyn、Mono )
- クロージャスクリプト[6]
- コーヒースクリプト
- 結晶
- カレー
- だ
- ダーツ
- デルファイ
- ディラン
- エッフェル
- エリクサー
- ファ#
- FASM [7]
- 要素
- 4番目
- ガンバス
- 行く
- ハスケル[8]
- イドリス
- ジャワ
- コトリン
- Lisp (コモン Lisp )
- ライブスクリプト
- 水銀
- ネメルル
- ニム
- オベロン
- オブジェクトパスカル(フリーパスカル)
- オカムル
- パスカル(フリーパスカル)
- ピレト[9]
- Python ( PyPy )について
- 楽堂
- さび
- スカラ
- スキーム
- 雑談
- 標準 ML ( MLton )
- Tcl [10]
- TMG
- タイプスクリプト
- ヴァラ
- ウェルギリウス[11]
- Visual Basic .NET ( Microsoft Roslyn、Mono )
- ジグ
参照
参考文献
- ^ Heaton, Robert. 「セルフホスティングコンパイラとは何か?」robertheaton.com/。
- ^ ab Hart, Tim; Levin, Mike. 「AI Memo 39-The new compilation」(PDF) 。 2020年12月13日時点のオリジナル(PDF)からアーカイブ。2008年5月23日閲覧。
- ^ ab トンプソン、ケン。「VCF East 2019 -- ブライアン・カーニハンがケン・トンプソンにインタビュー」。YouTube 。2019年10月28日閲覧。
- ^ Dennis M. Ritchie. 「C言語の開発」 1993年。
- ^ BASICO コンパイラのブートストラップ例
- ^ ClojureScript 次へ
- ^ "flat assembler" . 2022年1月7日閲覧。flat
assemblerはセルフホスティングされており、完全なソースコードが含まれています。
- ^ 「Haskell コミュニティと活動レポート」。
- ^ https://www.pyret.org 2018-04-10 に Wayback Machineにアーカイブ
- ^ 「TCL で TCL を実装する」。2017 年 6 月 4 日のオリジナルからアーカイブ。2017年 9 月 19 日閲覧。
- ^ 「ヴァージル」.
