web-dev-qa-db-ja.com

最初のコンパイラはどのように書かれましたか?

チキンとエッグとブートストラップについて聞いた。少し質問があります。

何かをバイナリ命令に変換した最初のコンパイラを書いたのは何ですか?

アセンブリはバイナリ命令にコンパイルまたは変換されますか?

...彼らがバイナリでコンパイラを書いたとは信じ難いでしょう。

157
Shawn Mclean

アセンブリ命令は(一般的に)オペコードへの直接マッピングです。オペコードは、プロセッサが直接解釈できるマシンコードの(マルチ)バイト値です。オペコードでプログラムを直接作成することは非常に可能です(たとえば、 6039マイクロプロセッサの場合 など)、一致するアセンブリ命令をリストしたテーブルからプログラムを検索し、ジャンプなどのメモリアドレス/オフセットを決定します。

最初のプログラムは、まさにこの方法で行われました-手書きのオペコード。

ただし、ほとんどの場合、アセンブラを使用してアセンブリコードを「コンパイル」する方が簡単です。アセンブリコードは、これらのオペコードルックアップを自動的に実行し、名前付きジャンプラベルなどのアドレス/オフセットの計算に役立ちます。

最初のアセンブラーは手書きで書かれました。これらのアセンブラーを使用して、より複雑なアセンブラーをアセンブルできます。アセンブラーを使用して、高水準言語用に作成されたコンパイラーなどをアセンブルできます。ツールの次のセットの作成を単純化するためにツールを繰り返し記述するこのプロセスは、(David Rabinowitzの回答で述べられているように) bootstrapping と呼ばれます。

128
Amber

コンパイラブートストラップ および コンパイラ作成の歴史 についてお読みください

アイデアは、非常に単純なコンパイラーをマシンコードに直接記述し、それを使用してより洗練されたコンパイラーを作成し、2番目のコンパイラーを使用して3番目のコンパイラーを作成する、という具合です。

41

卵は鶏よりずっと前にありました。ほとんどの「鶏と卵」の問題に対する答えは同じです:進化。生物学的進化を信じるのに苦労している人もいますが、不信感は論争ではありません(google argumentum ad ignorantiam)。

あなたの質問に直接答えるには:最初のコンパイラは(人間によって) アセンブリ言語 で書かれました-アセンブラと呼ばれるプログラムはアセンブリ言語をバイナリに変換します;これは、アセンブリ言語は数字の代わりにオペコード名を使用したり、アドレスを記号で表すなど、単なる機械語の記号形式であるため、コンパイルよりもはるかに簡単なプロセスです。後続のコンパイラの多くは、アセンブリ言語でも書かれています。しかし、最初のCコンパイラは修正されたBコンパイラで、これは [〜#〜] b [〜#〜] で記述されていました。最初のBコンパイラは [〜#〜] tmg [〜#〜] で作成されました。そのBコンパイラをコンパイルするために使用されたTMGコンパイラは、PDP-7アセンブリ言語で書かれていました。

33
Jim Balter

ウォズは、彼の公開講演で、彼が始めたとき、コンパイラーを買う余裕がなかったので、紙で手作業でバイナリにコンパイルしたと言いました。もっとワイルドなものを見たいなら、 ビル・ゲイツとポール・アレンがAltair 8800のBASICを書いた条件 について読んでください。

「バイナリでコンピューターを書く」ことについて-プログラマーから一歩下がって、初期のコンピューターが何であったかを考えてください。高レベルのものはまだ存在していませんでした-あなたはそれがすべてだったので、低レベルのすべてについて考えました。マシンコードを介して操作する基本的なロジックと算術を実行できるハードウェアがあります(アセンブリをコンパイルしただけです-アンバーはこの部分が手作業で難しくない理由を説明しています)。存在しないオペレーティングシステムについては心配していませんでしたが、(アセンブリ内の)ハードウェアに、フィードした数字の操作方法を伝えただけです。それはちょうど大きな計算機でした。今日のコンピューターは、一度に1つの抽象概念で構築されました。

コンピューターを魔法のように感じさせる障壁を壊したい場合は、 CODE by Charles Petzold および/または The Elements of Computing Systems を読むことを強くお勧めします。プログラミングの基本的な知識だけで、これらの素晴らしくアクセス可能な本は、コンピューターを上から下まで理解させるでしょう。明らかに、コンプを取得することはできません。サイエンス。またはわずか2冊の本でEE学位を取得しましたが、正式なトレーニングを逃した独学のプログラマーと言えます。これらの本は私の世界を揺るがしました。

24
Dinah

何かをバイナリ命令に変換した最初のコンパイラを書いたのは何ですか?

人間がやった。 A-0システム について読む:

1952年に、グレースホッパーはA-0として知られるスペリーの最初のコンパイラを完成させました。 A-0システムは、記号的な数学コードを機械語に変換できる一連の命令でした。 A-0の制作では、長年にわたって収集してきたすべてのサブルーチンを取り、テープに入れました。各ルーチンには呼び出し番号が与えられたため、マシンはテープ上でそれを見つけることができました。 「私がしなければならなかったのは、コール番号のセットを書き留め、コンピューターでそれらをテープで見つけて、持ってきて追加するだけでした。これが最初のコンパイラーでした」とグレースは説明しました。

9
Sinan Ünür

最初のプログラムは(アセンブリ言語ではなく)マシンコードで記述されていました。実際の数値は、スイッチを使用してコンピューターのメモリに接続されていました。私たちは長い道のりを歩んできました...

時々、これはわずかな範囲で発生します-小さなコードのパッチやサンクを作成します。私は初期のマイクロで小さな高速サブルーチンとして実行された基本的な文字列に数字を打ち込んだことを思い出します。また、PDP-11のフロントパネルのスイッチを切り替えて、大学コースのブートローダープログラムをメモリに入力したことを覚えています。

これらのプログラムは、テキストファイルを処理して他のプログラムを作成するために使用されることがあり、できればプログラミング言語が作成されました。

8
Michael Burr