最初のアセンブラは機械語で書かれていましたか?


41

私は、コンピューティングシステムの要素:First Principlesから現代のコンピューターを構築するという本を読んでいます。これには、ブールゲートから高レベルのアプリケーションまで(その順序で)コンピューターを構築するプロジェクトが含まれています。私が取り組んでいる現在のプロジェクトは、HackアセンブリコードからHackマシンコードに変換するために、選択した高水準言語を使用してアセンブラーを作成しています(Hackは前の章で構築されたハードウェアプラットフォームの名前です)。ハードウェアはすべてシミュレーターで構築されていますが、実際のプロセスのその時点で使用可能なツールのみを使用して各レベルを実際に構築しているふりをしようとしました。

とはいえ、考えさせられました。高級言語を使用してアセンブラーを作成するのは確かに便利ですが、史上初めて記述されたアセンブラー(つまり、歴史上)にとっては、マシンコードで記述する必要はありませんでした。

そして、関連する質問...今日はどうですか?新しい命令セットと新しいアセンブリ構文を備えた新しいCPUアーキテクチャが登場した場合、アセンブラはどのように構築されますか?新しいプラットフォームのアセンブリ言語と機械語の両方の構文を知っている場合、アセンブラーを記述するタスクは実際には単なるテキスト分析タスクであり、本質的にそのプラットフォームに関連していません(つまり、そのプラットフォームの機械語で記述する必要があります)。私を助けるための高水準言語。


17
クロスコンパイラをいつでも記述し、それを使用して現在の新しいハードウェア用のコードを生成できます。
ケレックSB

@PersonalNexusおかげで、私の側でsnafu編集。
ヤニス

1
@YannisRizos問題はありません、私たちの最高に起こります:)
PersonalNexus

8
最初のアセンブラーが一枚の紙にアセンブリーで書かれている可能性があります。マシンコードへの変換はまだ紙の上で実行され、スイッチ付きのある種のROMに一度に1ワードずつ焼き付けられた可能性があります。
-mouviciel

私の最初のコンピューターは1KBのRAMを搭載したZX81だったので、実際には(明らかに短い)マシンコードプログラムは手動で翻訳されました。
user281377

回答:


36

史上初めて(つまり、歴史上)書かれたアセンブラの場合、マシンコードで書かれる必要はないだろう

必ずしも。もちろん、アセンブラーの最初のバージョンv0.00はマシンコードで記述されている必要がありますが、アセンブラーと呼ばれるほど強力ではありません。「実際の」アセンブラの半分の機能すらサポートしていませんが、それ自体の次のバージョンを作成すれば十分です。次に、アセンブリ言語のサブセットでv0.00を書き換え、v0.01と呼び、それを使用してアセンブラv0.02の次の機能セットを構築し、v0.02を使用してv0.03を構築します。など、v1.00に到達するまで。その結果、マシンコードには最初のバージョンのみが含まれます。最初にリリースされるバージョンはアセンブリ言語になります。

このトリックを使用して、テンプレート言語コンパイラの開発をブートストラップしました。最初のバージョンではprintfステートメントを使用していましたが、会社で使用する最初のバージョンでは、処理中のテンプレートプロセッサを使用していました。ブートストラップフェーズは4時間未満で終了しました。プロセッサがほとんど役に立たない出力を生成できるようになるとすぐに、独自の言語で書き直し、コンパイルし、非テンプレートバージョンを破棄しました。


4
あなたはまだすべての段階を持っていますか?私はそれらを見て、お互いに比較したいと思います。ただあなたが経験したプロセスの感触をつかむために。
マルジャンヴェネマ

3
@MarjanVenemaいいえ、もう持っていません-1998年に構築し、2005年にStringTemplateを発見するまで使用し続けました。最初の使用可能なバージョンを目指して作業していたので、前のフェーズを次のフェーズで上書きしていました。私の開発サイクルは、新しいものをコーディングし、コードジェネレーターを実行して別のディレクトリに自分自身を構築diffし、現在のコードジェネレーターに対して実行して、コードの生成された部分が予期しない方法で変更されないことを確認し、コードを所定の場所に置き換え、もう一度実行して、サイクルを終了します。
dasblinkenlight

残念だが理解できる:)あなたがしたことを説明してくれてありがとう(そしてリンク)。
マルジャンヴェネマ

3
何らかのブートストラップチェーンを維持する必要があると思います。マシンコード=>限定ASM =>完全ASM =>言語。それ以外の場合、バイナリを紛失すると、途中の段階でネジが締められます。(実際には、すべてのCコンパイラバイナリが一度に消えるわけではないため、Cクロスコンパイルバージョンを使用することもできます。)
edA-qa mort-ora-y

3
アセンブラが「実際の」アセンブラである必要がある唯一の「機能」は、アセンブルすることです。
マイルルーティング14

23

ウィキペディアによると、ナサニエルロチェスターが IBM 701向けに初めてアセンブラー/アセンブリ言語を実装しました。(日付は、それはロチェスターは1948年にIBMに入社しましたと述べている。Wikipediaの記事から少し不確かですが、701は公に1952年に発表されたことを別のWikipediaのページ状態このIBMのページと述べ、「[A] ctualデザインは2月に開始しました1、1951年後に完成されました」。)

ただし、David Salomonによる「Assemblers and Loaders」(7ページ)では、EDSACにもアセンブラーがあると述べています。

「最初の保存プログラムコンピューターの1つは、1949年にケンブリッジ大学でモーリスウィルクスとW.レンウィックによって開発されたEDSAC(電子遅延ストレージ自動計算機)でした。最初の日からEDSACには初期注文と呼ばれるアセンブラがありました。回転式電話セレクターのセットで構成される読み取り専用メモリに格納され、各命令は1文字のニーモニック、10進数のアドレス、および文字である3番目のフィールドで構成されていました。プログラマーによって事前設定された定数は、アセンブリ時にアドレスに追加されます。」 (参照は省略されています...オリジナルを参照してください。)

「初期順序」が優先されることを受け入れると仮定すると、最初のアセンブラマシンコードで実装されたという明確な証拠があります。

このパターン(最初のアセンブラーをマシンコードで記述する)は、1950年代の標準でした。しかし、Wikipediaによると、「[a] semblersは自分自身をブートストラップする最初の言語ツールでした」。また、原始アセンブラーで記述されたマシンコードを使用して、アセンブリ言語でコーディングされたより高度なアセンブラーをブートストラップする方法を説明するこのセクションも参照してください。

最近のアセンブラーとコンパイラーは高水準言語で書かれており、通常、新しいマシンアーキテクチャー用のアセンブラーまたはコンパイラーは異なるアーキテクチャーで開発され、クロスコンパイルされます。

(FWIW-自明でないプログラムをマシンコードで記述してデバッグするのは非常に面倒なプロセスです。マシンコードでアセンブラーを開発する人は、できるだけ早くアセンブラーで書かれたアセンブラーにブートストラップするでしょう。)

コンパイラーとアセンブラーのブートストラップに関するこのウィキペディアのページは読む価値があります...これがすべてあなたを困惑させているなら。


単なる推測ではなく、実際の回答に賛成です。これは本当に興味深い読書です!
ジャックB

14

最初のアセンブラはマシンコードで書かれていたと思います。あなたが言うように、当時は他に何もなかったからです。

しかし、今日では、新しいCPUアーキテクチャが登場したとき、クロスコンパイラと呼ばれるものを使用します。これは、実行中のアーキテクチャではなく、異なるアーキテクチャ用のマシンコードを生成するコンパイラです。

(実際、あなたが読んでいる本の後半であなたが知ることになると確信しているように、それが実行されているアーキテクチャ用のマシンコードを生成するのにコンパイラを本質的に適したものにするものは絶対にありません他のアーキテクチャ。それは、コンパイラの作成者として、どのアーキテクチャをターゲットにするかという問題です。)

そのため、今日では、(少なくとも理論的には)まったく新しいアーキテクチャを作成し、そのアーキテクチャ用のアセンブラを使用する前に、高レベル言語コンパイラをネイティブに実行(クロスコンパイラを使用して他のアーキテクチャでコンパイル)することさえ可能です。


12

最初は「アセンブリ」が紙に書かれてから、手動でパンチカードに「コンパイル」されました。

私の祖父はZRA1で働いていました(申し訳ありませんが、ページはドイツ語でしか存在しませんが、Googleの翻訳は、最も重要な事実を実際に拾うことができる点までは問題ありません:D)。
手口は、アセンブリ言語のようなコードを紙に書き留めることであり、秘書は実際にカードにパンチする転写を行い、それをオペレーターに渡し、結果は翌朝に返されます。

これは基本的に、プログラマーがキーボードからデータを入力して画面に表示する贅沢をする前のことでした。


3
私が大学で勉強していたとき、彼らはまだマシンコードを書くために使用される紙のブロックを持っていました。右側にプログラムを記述します。左側に命令を16進数に変換する列があります。そして、現在の住所の列。最初のアセンブラーは実際には人間でした。
フロリアンF 14年

9

それはおよそ確信するのは難しい非常に(でも何であったかを定義するのは難しい)最初のアセンブラ。数年前、アセンブラーのないマシン用にいくつかのアセンブラーを作成したとき、私はまだアセンブリー言語でコードを作成しました。それから、コードのセクションを適度に完成させた後、手作業でマシンコードに翻訳しました。ただし、これらはまだ完全に独立した2つのフェーズでした。コードを書いていたとき、マシンコードレベルで作業したり考えたりしていませんでした。

いくつかのケースでそれを追加する必要があります、私はさらに一歩進みました:私は使いやすいとわかったアセンブリ言語でほとんどのコードを書いてから、小さなカーネルを書いた(今や仮想マシンと呼ぶものを多かれ少なかれ)ターゲットプロセッサでそれを解釈します。それは致命的に遅い(特に1 MHz、8ビットプロセッサ)が、通常は1回(または最大で数回)しか実行されなかったため、それほど重要ではありませんでした。


8

アセンブリ言語コードをマシンコードに手動でアセンブルするためにアセンブラは必要ありません。アセンブリ言語コードを記述するためにエディターが必要ないように。

歴史的視点

最初のアセンブラはおそらくアセンブリ言語で記述され、その後マシンコードに手でアセンブルされました。プロセッサに公式の「アセンブリ言語」がない場合でも、プログラマーはおそらく、そのコードをマシン命令に変換する前に、何らかの疑似コードを使用してプログラミングのほとんどの仕事をしたでしょう。

コンピューティング初期の時代でさえ、プログラマーは一種の記号表記でプログラムを作成し、それをマシンコードに変換してからコンピューターに送りました。オーガスタ・エイダ・キングの場合、彼女はそれらをバベッジ分析エンジン用のパンチれたカードに変換する必要があったでしょうが、残念ながらそれは決して構築されませんでした。

個人的体験

私が最初に所有したコンピューターは、シンクレアZX81(米国ではTimex 1000)でした。マニュアルの裏には、Z80アセンブリ言語をマシンコードに変換するために必要なすべての情報が含まれていました(Z80に含まれていたすべての奇妙なインデックスモードのオペコードも含まれていました)。

プログラムを(紙に)アセンブリ言語で書き、コードをドライランします。自分のプログラムにバグがなかったことに満足したら、マニュアルの裏にある各命令を調べて、それをマシンコードに変換し、マシンコードも紙に書き留めました。最後に、テープに保存して実行する前に、ZX81にすべてのマシンコード命令を入力します。

うまくいかなかった場合は、ハンドアセンブリを再確認し、翻訳が間違っていた場合は、テープからロードしたバイトにパッチを適用してから再保存し、プログラムを再度実行します。

経験から、機械語よりもアセンブリ言語で記述した方がコードをデバッグする方がはるかに簡単であることがわかります。したがって、逆アセンブラーの人気があります。あなたがアセンブラを持っていなくても、ハンドアセンブルはマシンコードを直接書こうとするよりもエラーが少ない傾向がありますが、Melのような本物のプログラマは同意しないかもしれません。* 8 ')


5

その時も今も違いはありません。新しいプログラミング言語を発明したい場合、最初に使用できる言語の1つを選択して最初のコンパイラを作成します。しばらくの間、それがプロジェクトの目標である場合、その言語でコンパイラを作成し、自己ホストすることができます。

最初と次の新しい命令セットへのユーザーインターフェイスとして、鉛筆と紙といくつかのスイッチまたはパンチカードしかなかった場合、使用可能なアイテムの1つまたはすべてを使用しました。アセンブリ言語を紙に書いてから、アセンブラーを使用してマシンコードに変換し、おそらく8進数にして、ある時点でマシンへのインターフェースに入ります。

今日、まったく新しい命令セットが発明されたとき、会社/個人、慣習などに応じて、ハードウェアエンジニアがおそらくverilogまたはvhdlでプログラミングしている最初の数個のテストプログラムをマシンコードで書いている可能性が高い(おそらく16進数またはバイナリ)。ソフトウェアチームの進捗状況に応じて、非常に迅速に、または非常に長い間、アセンブリ言語に切り替えてからコンパイラに切り替える可能性があります。

最初のコンピューティングマシンは、アセンブラやコンパイラの作成に使用できる汎用マシンではありませんでした。前のaluの出力と次のaluの入力の間でいくつかのワイヤを移動することにより、それらをプログラムしました。最終的には、アセンブリでアセンブラーを記述し、それを手作業でアセンブルし、マシンコードとしてフィードし、それを使用してebcdic、asciiなどを解析し、セルフホストできる汎用プロセッサがありました。後でマシンのコードを手動でフィードするためにスイッチを切り替えずに読み取り/ロードできるいくつかのメディアにバイナリを保存します。

パンチカードと紙テープを考えてください。スイッチを切り替える代わりに、完全に機械的なマシン、省力デバイスを作成して、コンピューターが読み取るメディアを作成することができます。代替のようなスイッチでマシンコードビットを入力する代わりに、代わりに紙テープまたはパンチカードを送り込むことができます(プロセッサ駆動ではなく、メモリまたはプロセッサに送り込む機械的なものを使用するか、ブートローダで書かれた小さなマシンコードを使用します)。これは悪いアイデアではありませんでした。紙テープまたはパンチカードを機械的に作成し、それらを送り返すことができるコンピューターによって駆動される何かを作成できるからです。パンチカードの2つのソース、非コンピューターベースの機械的省力化デバイス、およびコンピューター駆動のマシン。どちらもコンピューターの「バイナリー」を生成します。


1
「アセンブラー、あなた」のコメントに対して+1。単語の1つの定義(つまり、アセンブラ=ソフトウェア)に簡単に結びつくことができますが、あなたのコメントは本当に明らかな視点に戻っています。「アセンブリプロセス」は単なるシステム/ルーチンであり、人間のアセンブラー。
The111

1
また、初期のコンピューターには命令セットがあるという考えに固執しています。初期のコンピューターは、鉛筆と紙を使った数学の優れた女性でした。それがコンピューターと呼ばれていました。次に、それらの女性(または特に女性)は、命令セットを使用せずにワイヤを接続してエニアックをプログラムしました。命令セットを使用したプログラミングは、順調に進んでいます。はい、非常に簡単に、アセンブラーやコンピューターなどの単語や用語の使用に簡単に巻き込まれます。
old_timer

4

Brookのコンピューター動物園には1つまたは2つのインスタンスがあり、「ニーモニックは私たちの発明であり、デザイナーは単に数値オペコードまたはコードがオペコードであるキャラクターを使用した」などのように言ったので、アセンブリ言語。

プログラムを入力すると、フロントパネルでデバッグが終了します(まだ実行していない人にとっては、メモリを設定する方法であり、いくつかのスイッチをアドレスに設定し、他のスイッチを値に設定してボタンまたは別のボタンを押します)値を読み取ります)はずっと後に一般的でした。一部の古いタイマーは、広く使用しているマシンのブートコードを入力できると自慢しています。

マシンコードを直接記述し、メモリダンプからプログラムを読み取ることの難しさは、マシン言語に大きく依存します。それらの一部は比較的簡単です(最も難しい部分はアドレスを追跡することです)。


pdp-11にはノブの贅沢さえありませんでした。8個のトグルスイッチにバイナリアドレスを入力し、16個のトグルスイッチに値を入力してボタンを押すと、ストレージを変更できます。私は実際に誰かがこのようにループプログラムを修正するのを見ました!
ジェームズアンダーソン

2

コンピューターを16進数で入力し、ビデオモニターでこのコードを表示することでプログラムを入力できる「モニターROM」があったため、1975年にコンピューターを構築しました。 Altairの各機械命令は、スイッチの列を使用して少しずつ入力する必要がありました。

そのため、はい、コンピューターの初期、そして再びパーソナルコンピューターの初期に、人々はマシンコードでアプリケーションを作成しました。


2

逸話:

Appleでアセンブリ言語を学んだとき、] [、ROMにはマイクロアセンブラと呼ばれるプログラムが含まれていました。入力したとおりに、アセンブリ命令をバイトに即座に変換しました。これは、ラベルがなかったことを意味します。ジャンプまたはロードする場合は、オフセットを自分で計算する必要がありました。ただし、命令レイアウトを検索して16進値を入力するよりもはるかに簡単でした。

間違いなく、実際のアセンブラーは最初にマイクロアセンブラー、または他の完全ではない環境を使用して作成されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.