アセンブラー、コンパイラー、インタープリターについて話す

著者:

ハードコアファラオ

プログラミングの歴史的進化について簡単に説明してください。

--Erik O'shaughnessy(作成者)

コンピューターの初期の頃、ハードウェアは非常に高価で、プログラマーは安価でした。これらの安価なプログラマーは「プログラマー」という称号すら持っておらず、数学者や電気技師でいっぱいになることがよくあります。初期のコンピューターは複雑な数学的問題を迅速に解決するために使用されていたため、数学者は当然「プログラミング」の仕事に適していました。

プログラムとは何ですか?

まず、少し背景。コンピューターはそれ自体では何もできず、そのアクションには、コンピューターをガイドするプログラムが必要です。プログラムは、入力を受け取り、対応する出力を生成する非常に正確なレシピと考えることができます。レシピの各ステップは、データを操作する命令で構成されています。複雑に聞こえますが、おそらく次のステートメントの意味をご存知でしょう。

1 + 2 = 3

プラス記号は「指示」であり、数字の1と2はデータです。数学的な等号は、方程式の両辺が「等価」であることを意味しますが、ほとんどのプログラミング言語では、変数に等号を使用することは「代入」を意味します。コンピュータが上記のステートメントを実行すると、加算の結果(別名「3」)がメモリのどこかに保存されます。

コンピュータは、数値を使って数学を行う方法と、メモリ構造内でデータを移動する方法を知っています。ここではメモリについて詳しく説明しません。メモリは一般に「高速/小スペース」と「低速/大スペース」の2つのカテゴリに分類されることを知っておく必要があります。CPUレジスタの読み取りと書き込みの速度は非常に高速ですが、スペースは非常に小さいため、簡単なメモに相当します。メインメモリには通常多くのスペースがありますが、読み取りと書き込みの速度はレジスタよりもはるかに劣ります。プログラムが実行されると、CPUは必要なデータをメインメモリからレジスタに移動し続け、結果をメインメモリに戻します。

アセンブラ

当時、コンピューターは高価で、人手も安かった。プログラマーは、手書きの数式をコンピューターが実行できる命令に変換するのに多くの時間を費やします。最初のコンピューターのユーザーインターフェイスは非常に悪く、フロントパネルにトグルスイッチが付いているコンピューターもありました。これらのスイッチは、メモリ「セル」の「0」と「1」を表します。プログラマーは、メモリー装置を構成し、保管場所を選択してから、装置をメモリーにコミットする必要があります。これは時間がかかり、エラーが発生しやすいプロセスです。

プログラマーのBettyJeanJennings(左)とFran Bilas(右)の行動

次に、電気技師は自分の時間が貴重であると考え、人間が読める「レシピ」のような入力をコンピューターが読めるバージョンに変換できるプログラムを作成しました。これは元々の「アセンブラー」であり、当時かなりの論争を引き起こしていました。これらの高価なマシンの所有者は、人々がすでに実行できるタスクにコンピューティングリソースを浪費することを望んでいません(遅くてエラーが発生しやすいですが)。しかし、時間の経過とともに、アセンブラーを使用する方が機械語を手動で作成するよりも高速で正確であることが明らかになり、コンピューターによる「実際の作業」が増加しました。

アセンブラは、マシンパネルのビットの状態を切り替えるよりも大幅に改善されていますが、このプログラミング方法は依然として非常に専門的です。上記の追加の例は、アセンブリ言語では多かれ少なかれ次のようになります。

01 MOV R0、1 
02 MOV R1、2 
03 ADD R0、R1、R2 
04 MOV 64、R0 
05 STO R2、R0

各行はコンピューター命令であり、その前に命令の省略形があり、その後にその命令が操作するデータが続きます。この小さなプログラムは、最初に値1をレジスタR0に「移動」し、次に2をレジスタR1に移動します。行03は、2つのレジスタR0とR1に値を追加し、結果をR2レジスタに格納します。最後に、行04と05は、結果をメインメモリ(この場合はアドレス64)のどこに配置するかを決定します。データがメモリ内のどこに格納されているかを管理することは、プログラミングで最も時間とエラーが発生しやすい部分の1つです。

翻訳者

アセンブラはすでに手書きのコンピュータ命令よりもはるかに優れていましたが、初期のプログラマーは、まるで数式であるかのように、慣れ親しんだ方法でプログラムを記述できることを望んでいました。この必要性により、高レベルのコンパイル型言語の開発が促進されました。その一部は過去のものであり、その他は現在も使用されています。たとえば、ALGOは過去のものですが、FortranやCなどの言語は実用的な問題を解決し続けています。

ALGOおよびFortranプログラミング言語の系図ツリー

これらの「高級」言語により、プログラマーはより簡単な方法でプログラムを書くことができます。Cでは、追加プログラムは次のようになります。

int x; 
x = 1 + 2;

最初のステートメントは、プログラムが使用するメモリのブロックを記述しています。この例では、メモリはxという名前の整数のサイズである必要があります。2番目のステートメントは、逆に書かれていますが、加算です。Cプログラマーは、これは「Xには値1+2が割り当てられている」と言うでしょう。プログラマーはメモリ内のどこにxを格納するかを決定する必要はなく、このタスクはコンパイラーに任されていることに注意してください。

「コンパイラ」と呼ばれるこの新しいプログラムは、高級言語で記述されたプログラムをアセンブリ言語に変換し、アセンブラを使用してアセンブリ言語を機械可読プログラムに変換することができます。このプログラムの組み合わせは、あるプログラムの出力が別のプログラムの入力になるため、「ツールチェーン」と呼ばれることがよくあります。

アセンブリ言語に対するコンパイル言語の利点は、あるコンピューターから別のモデルまたはブランドの別のコンピューターへの移行に反映されています。コンピューティングの初期には、IBM、DEC、Texas Instruments、UNIVAC、およびHewlett-Packardを含む多くの企業が、さまざまな種類のコンピューターハードウェアを製造していました。これらのコンピュータは、すべて電源に接続する必要があることを除けば、あまり共通点はありません。それらはメモリとCPUアーキテクチャがかなり異なり、プログラムをあるコンピュータから別のコンピュータに変換するのに何年もかかることがよくありました。

高水準言語では、コンパイラツールチェーンを新しいプラットフォームに移行する必要があります。高水準言語で書かれたプログラムは、コンパイラーが利用可能である限り、せいぜいわずかな変更を加えて新しいコンピューターで再コンパイルできます。高水準言語の編集は、真に革命的な成果です。

1983年にリリースされたIBMPCXTは、ハードウェア価格の下落の初期の例でした。

プログラマーの生活は大きく改善されました。対照的に、彼らが解決したい問題を高水準言語で表現すると、物事がはるかに簡単になります。半導体技術の進歩と集積チップの発明により、コンピュータハードウェアの価格は劇的に下がった。コンピュータはより速く、より強力に、そしてはるかに安くなっています。その後のある時点(おそらく80年代後半)に、事態は好転し、プログラマーは使用したハードウェアよりも価値が高くなりました。

通訳者

時間が経つにつれて、プログラミングの新しい方法が出現しました。「インタプリタ」と呼ばれる特別なプログラムは、プログラムを直接読み取り、それをコンピュータ命令に変換してすぐに実行することができます。コンパイラのように、インタプリタはプログラムを読み取り、それを中間形式に変換します。ただし、コンパイラとは異なり、インタプリタはこの中間形式のプログラムを直接実行します。インタープリター言語は、実行されるたびにこのプロセスを実行します。コンパイルされたプログラムは1回だけコンパイルする必要があり、コンピューターはコンパイルされたマシン命令を毎回実行するだけで済みます。

ちなみに、この機能がインタプリタプログラムの動作を遅くしているのです。しかし、最近のコンピューターは非常に強力であるため、ほとんどの人はコンパイルされたプログラムと解釈されたプログラムの違いを区別できません。

インタプリタされたプログラム(「スクリプト」と呼ばれることもあります)は、さまざまなハードウェアプラットフォームへの移植がさらに簡単です。スクリプトにはマシン固有の命令が含まれていないため、同じバージョンのプログラムを変更せずに多くの異なるコンピューターで直接実行できます。ただし、もちろん、インタープリターは最初に新しいマシンに移植する必要があります。

非常に人気のあるインタプリタ言語はperlです。perlでの加算問題の完全な表現は、次のようになります。

$ x = 1 + 2

プログラムはCバージョンに似ており、同じように実行されますが、変数を初期化するためのステートメントがありません。(この記事の範囲を超えて)他にもいくつかの違いがありますが、コンピュータープログラムの書き方は、数学者がペンと紙を使って数式を書く方法に非常に近いことに気付くはずです。

仮想マシン

プログラミングの最新の方法は、仮想マシン(VMと略されることが多い)です。仮想マシンは、システム仮想マシンとプロセス仮想マシンの2つのカテゴリに分類されます。両方の仮想マシンは、スコープは異なりますが、「実際の」コンピューティングハードウェアとは異なるレベルの抽象化を提供します。システム仮想マシンは、物理ハードウェアの代替手段を提供するソフトウェアですが、プロセス仮想マシンは、「システムに依存しない」方法でプログラムを実行するように設計されています。したがって、この例では、プロセス仮想マシン(将来このタイプの仮想マシンを参照します)のスコープは、プログラムが最初に中間形式にコンパイルされ、次に仮想マシンがコンパイルされるため、インタープリターのスコープと似ています。この中間形式が実行されます。

仮想マシンとインタープリターの主な違いは、仮想マシンが仮想CPUと仮想命令セットを作成することです。この抽象化レイヤーを使用すると、さまざまな言語のプログラムを仮想マシンで受け入れ可能なプログラムにコンパイルするためのフロントエンドツールを作成できます。おそらく最も人気があり、よく知られている仮想マシンはJava仮想マシン(JVM)です。JVMは元々1990年代にJava言語のみをサポートしていましたが、今日では、Scala、Jython、JRuby、Clojure、Kotlinなどの多くの一般的なプログラミング言語を実行できます。他にもあまり一般的ではない例がありますが、ここでは取り上げません。また、最近、私のお気に入りの言語であるPythonは通訳言語ではなく、仮想マシン上で実行される言語であることを学びました。

仮想マシンは、プログラマーがドメイン固有のプログラミング言語を使用して、特定のコンピューティングプラットフォームに関する知識がますます少なくなる問題を解決できるようにするという歴史的な傾向を続けています。

それでおしまい

ソフトウェアが舞台裏でどのように機能するかを簡単に説明するこの短い記事を楽しんでいただけたでしょうか。次に話し合いたいトピックは他にありますか?コメントで教えてください。


経由:https://opensource.com/article/19/5/primer-assemblers-compilers-interpreters

著者:Erik O'Shaughnessyトピック:lujun9972翻訳者:chen-ni校正:wxy

この記事は元々LCTTによって編集され、LinuxChinaによって名誉をもって立ち上げられました。

おすすめ

転載: blog.csdn.net/daocaokafei/article/details/124029369