今の環境ならコンパイル・アセンブル・リンクを分ける必要はない。

C言語の処理過程を考えると大まかに次のようになっている。

  1. 人間の頭
    • 編集
  2. ソースコード
    • パース
  3. 抽象構文木
  4. アセンブリコード
  5. オブジェクトコード
    • リンク
  6. 実行ファイル
    • OSによる起動
  7. プロセス
    • プロセス実行
  8. 出力

これは必ずしも一斉に処理する必要はないのだろう。

例えば。

C言語スクリプト実行系を考えてみる。

  • 処理系の本体は実行ファイルとして持つ。
  • 一部のモジュールはオブジェクトコードとして持つ。
  • 一部のモジュールはソースコードとして持つ。

処理系の本体にtccコンパイラとダイナミックローダを搭載する。LoadModule()を呼ぶと、ソースコードを自動的にコンパイルしてロードする、という具合。コンパイラをライブラリとして持つことができるなら自然な発想だと思う。

〆。

ソースコードこそが一次データであり、実行ファイルさえ単なるキャッシュにすぎないとみなすことができる。極端なことを言えば間に通信を挟んでも構わないし、最適化情報のフィードバックを受けても構わない。
早すぎた最適化に陥らないために。