

### 背景

C言語のコンパイラについての勉強を進める中で、『「C言語をコンパイルするためのコンパイラ」をコンパイルするためのコンパイラ…』のように、ブートストラップ問題という問題が存在し、最も初期のコンパイラの実装はアセンブリ言語でなされていることを知りました。ここで、以下の疑問を持ちました。

### 疑問点

  * アセンブラが、アセンブリ言語 ⇒ マシン語に変換するソフトウェアなのであれば、『アセンブラを動かすための更に低レイヤーのアセンブラが必要になり、その更に低レイヤーのアセンブラが必要になり…』という循環に陥るのではないかと考えました。
  * 最も初期のマシン語/アセンブリ言語の接点は、どのように実現されているのでしょうか。


CC BY-SA 4.0
2021-03-08T01:29:43.683
74506
2021-03-08T13:44:21.220
2021-03-08T02:33:27.363
3060
44243
question
compiler
アセンブラのためのアセンブラは必要になるのでしょうか


本当にごく初期のコンピュータというか CPU の評価キットにはプログラマが直接メモリ内容を見たり書き換えたりできるハードウエアがついていました。
[TK-80](https://ja.wikipedia.org/wiki/TK-80)
が代表例ですがこれだけにとどまりません。ハードウエアだけで実装されていましたので、ソフトウエアが全くなくてもプログラムが入力・実行できました。

ホントの最初となるとこの頃の話でしょうか。アセンブラプログラムをノートに書いてそれを２進数（１６進数）に変換するところまでは純粋に人間の作業で、その結果の１６進数を入力して動作させてうまく動かないときはまたノートに記したアセンブラをじっくり見直してバグを見つけて・・・なんてことをしていました。

その次の世代になると「メモリを見たり書き換えたりする組み込みソフトウエア（モニターモードとか呼ばれていましたね）」が付属するようになりました。更には簡易インラインアセンブラ機能が付属するようになったものもあります
(`RET` と入力すると `C9` に翻訳されるだけの簡易機能)

ここまでくると最初期とはもう呼べないかな。そして現代に至るって感じです。


CC BY-SA 4.0
2021-03-08T02:53:33.200
74509
2021-03-08T02:53:33.200
8589
74506
answer


1960～70年代の計算機の黎明期にはアッセンブリー言語などはありませんでした。

更に、現在関数やプロシジャーやとして知っている機能もありませんでした。  
まして、名前や名札(ラベル)なども使えませんでした。

そのために、実行形式では当初はロード時に番地を変えることも困難でした。  
ですから、リロケータブルなどという概念もありません。  
そもそも、主記憶の容量も小さいものでしたので、多分アッセンブラーでさえ１パスでは実行できなかっただろうと思います。

古い時代の話は置いといて、アッセンブラーをアッセンブラーで書くことはできますが、C や C++ や C# や java や PHP,Purl,Ruby
などでもアッセンブリー言語処理プロセッサーが書けるのですから書いた時のコード量の少ない言語を使う方が良いとは思いませんか？


CC BY-SA 4.0
2021-03-08T13:44:21.220
74527
2021-03-08T13:44:21.220
43029
74506
answer