コンパイラ、インタプリタ、アセンブラとは?


コンパイル系高級言語、インタプリタ系高級言語、機械語に近い低級言語

ご存じの通り、コンパイル系、インタプリタ系、機械語に近い低級言語系によって、異なるプログラミング用語があります。

その軽~いお話(独自解)。


~言語、スクリプト?、アセンブリ

いわゆるソースコードと呼ばれる「人間が理解できる言葉で書かれた言語」です。

C言語、C#言語、Java言語、Ruby、Perl、PHPなどいろいろありますが、コンパイル系・インタプリタ系含め、人間の理解できる言葉に近いので「高級言語」と呼ばれます。

でも、最近の言語ってどちらかというと、特殊な人しか理解できなさそうな言語もあるのですが、それって中級言語とか呼ばないんでしょうかね?

ラムダ式やらLINQやら関数式やら、もはや特殊な人にしかわからないような気がするよ...

低級言語は「アセンブリ言語」の他に、中間言語も一応それに入りそうです。

人間にとって、理解しやすいか、しにくいかといったところの区別だけなので。

インタプリタ系で実行するプログラムは、スクリプトと呼ばれることが多々ありますが、どうなのでしょうか。

このあたりが結構曖昧な感じがします。

バッチ、スクリプトとか結構曖昧な感じもします。バッチスクリプト?スクリプト?...難しいです。

ちなみに、バッチというと単体で実行して直ぐに終わるような一過性の処理という意味合いで使われます。

データベースに書き込まれたデータを1日1回集計して別のデータベースへ突っ込むとか。

スクリプト(インタプリタ系の言語で書かれること)が多いのですが、C言語等でコンパイルされたもので動かすこともあります。

こちらもバッチと呼ばれますね。

うん、意味不明...。

プログラミング関係の用語はなかなかややこしいです。

ちなみに、アセンブリ言語はいくつも種類があります。当たり前ですが...。

CPUのアーキテクチャによって命令の形が違います。Intel 8086(x86), AMD64(x86-64), ARM, PowerPC, MIPS, RISC-Vなど、いろいろなアーキテクチャがあり、それぞれ機械語の命令が異なります。そのため、アセンブリ言語と行っても、環境が違えば全く違う構文になります。あと、同じアーキテクチャでもアセンブラが違うと、書き方が変わる場合がありますが、これはC言語等でもあることなので、それは環境差異という感じでしょうか。

「~級言語」の対義語は「機械語」や「ネイティブ」や「バイナリ」です。

機械語とは、CPUが理解できる 1 と 0 の数値の羅列になったもので、簡単に言えば、CPUの理解できる言葉=機械語(ネイティブ)ですね。


コンパイラ、インタプリタ、アセンブラ

プログラマーが書いたソースコードを、他の言語や機械語に変換するソフトウェアのことです。

ちなみに、ソース(Source=元の)、コード(Code=記号)という意味になります。

コンパイラやインタプリタについては、構文解析やら意味解析などいろいろあったり、ライブラリなどをくっつけるリンカー、最適化処理を行う機能などもあり、こちらはかなり複雑です。

一方のアセンブラは、基本は機械語と一対一の変換です。ただ、マクロという機能があり、その処理があったり、高級言語のような機能もあったりするので、一概に言えませんね。

基本、アセンブリは最適化がないはずですが、あるんでしょうか(並び替えとかするのかな?)


コンパイル、何?、アセンブル

上のコンパイラやインタプリタやアセンブリが「行うこと」、つまりソースコードを別の記号や数字や文字列に置き換えることを言います。

ただ、インタプリタの場合はなんと言えばいいんでしょうか。翻訳?実行?

JITコンパイルやAOTコンパイルなどと、最近はコンパイルするタイミングが変わってきたので、用語が増えたような気がします。

アセンブリ、アセンブラは、良く聞くのですが、まぁ、実行する形態なのでアセンブルという言葉はあまり聞かないですね。

アセンブリ言語を扱える人がそれほど多くもないのも起因してたりしますが...


まとめ

何故こんな記事を書いたかというと、仕事中に雑談程度に聞かれたからです(ぁ