質問: ### 背景 C言語のコンパイラについての勉強を進める中で、『「C言語をコンパイルするためのコンパイラ」をコンパイルするためのコンパイラ...』のように、ブートストラップ問題という問題が存在し、最も初期のコンパイラの実装はアセンブリ言語でなされていることを知りました。ここで、以下の疑問を持ちました。 ### 疑問点 * アセンブラが、アセンブリ言語 ⇒ マシン語に変換するソフトウェアなのであれば、『アセンブラを動かすための更に低レイヤーのアセンブラが必要になり、その更に低レイヤーのアセンブラが必要になり...』という循環に陥るのではないかと考えました。 * 最も初期のマシン語/アセンブリ言語の接点は、どのように実現されているのでしょうか。
回答: 本当にごく初期のコンピュータというか CPU の評価キットにはプログラマが直接メモリ内容を見たり書き換えたりできるハードウエアがついていました。 TK-80 が代表例ですがこれだけにとどまりません。ハードウエアだけで実装されていましたので、ソフトウエアが全くなくてもプログラムが入力・実行できました。 ホントの最初となるとこの頃の話でしょうか。アセンブラプログラムをノートに書いてそれを2進数(16進数)に変換するところまでは純粋に人間の作業で、その結果の16進数を入力して動作させてうまく動かないときはまたノートに記したアセンブラをじっくり見直してバグを見つけて・・・なんてことをしていました。 その次の世代になると「メモリを見たり書き換えたりする組み込みソフトウエア(モニターモードとか呼ばれていましたね)」が付属するようになりました。更には簡易インラインアセンブラ機能が付属するようになったものもあります (`RET` と入力すると `C9` に翻訳されるだけの簡易機能) ここまでくると最初期とはもう呼べないかな。そして現代に至るって感じです。