8

最近、D語を勉強しています。私はいつもランタイムについて少し混乱してきました。

それについて収集できる情報から(それほど多くはありませんが)、Dの機能の一部に役立つランタイムのようなものであることがわかります。ガベージコレクションのように、それはあなた自身のプログラムと一緒に実行されます。しかし、Dはマシンコードにコンパイルされているので、プログラムで必要ない場合は、ガベージコレクションなどの機能が本当に必要ですか?

私を本当に混乱させるのは、次のようなステートメントです。

「Dでオペレーティングシステムを書くことができます。」

オペレーティングシステムには、アセンブリを使用せずにコンパイルされた言語が提供できる以上のものがあるため、実際にはそれを行うことができないことを私は知っています。しかし、Dコードを呼び出すカーネルがある場合、Dランタイムは、Dがそのような必要最低限​​の環境で実行されるのを防ぎますか?それとも、Dランタイムはそれよりも単純ですか?ソースファイル/ライブラリの単なる「自動」インクルードと考えることができますか?アプリケーションでコンパイルすると、そのコードを自分で作成するよりも大きな違いはありませんか?

多分私はそれをすべて間違って見ているだけです。しかし、このテーマに関するいくつかの情報は、多くの人々に役立つと確信しています。

4

2 に答える 2

13

はい、確かに、コンパイラがメインモジュール(またはどこでも)で期待するDRuntimeの機能を実装し、ランタイムなしでコンパイルすれば、Just Work(tm)になります。

ランタイムなしでコードをビルドした場合、ランタイムによって実装されることが期待されるシンボルが欠落していると、コンパイラーはエラーを発行します。次に、DRuntimeがどのように実装するかを確認して、DRuntimeが何を実行するかを確認し、好みの方法で実装できます。これは、Dで記述されたカーネルであるXOmB(言語バージョン1ですが、同じ取引です)が行うことです:http://xomb.net/index.php?title = Main_Page

多くのDRuntimeは実際には多くのアプリケーションで使用されていませんが、Dのランタイムコンポーネントをアプリケーションに含めるのに最も便利な方法です。そのため、静的ライブラリ(将来的には共有ライブラリ)として実行されます。

于 2012-11-09T10:14:36.820 に答える
6

それは私が期待するCやC++とほとんど同じです。言語自体はネイティブコードにコンパイルされ、実行されるだけです。ただし、コマンドラインパラメータの処理など、プログラムを実行するためにすべてを設定するために常に必要なコードがいくつかあります。

また、いくつかのより複雑な言語機能は、使用されるすべての場所でコードを生成するのではなく、いくつかの標準コードを呼び出すことによってより適切に実装されます。たとえば、例外をスローするには、関連するハンドラー関数を見つける必要があります。コンパイラがコードを挿入して、使用されているすべての場所で実行できることは間違いありませんが、ライブラリにコードを記述して呼び出す方がはるかに賢明です。さらに、標準ライブラリには多くの事前に作成されたライブラリ関数があります。

これらすべてが一緒になってランタイムになります。

Cを作成すると、スタートアップコードを自分で作成できるため、オペレーティングシステムの作成に使用できます。メモリ割り当てを処理するためのすべてのコードを自分で作成できます。また、strcatなどの標準関数のすべてのコードを、使用する代わりに自分で作成できます。実行時に提供されたもの。しかし、どのアプリケーションプログラムでもそうすることは望まないでしょう。

于 2012-11-09T10:15:26.570 に答える