0コメント

インタプリタとコンパイラについて

最近よくLinuxのbash(シェルスクリプト)に触れていて、少し疑問を感じたのが
「インタプリタ」「コンパイラ」の違いについて。

コンパイルせずにプログラムを実行させるなんて、一体どういう事なんだろう・・・と興味本位で調べてまとめてみる。

そもそもインタプリタとコンパイラってなんぞや

これは余談だが、私の記事は完全に個人的な趣味であり収益目的でもなく、あくまで調べて知識として保存できればいいかなという思いで書いているので、何かしら違う事とか豆知識あれば是非コメントへ。(メルアド不要)

話が脱線したが、そもそもこの2つについて。

まずコンパイラについて。
コンパイラはソースコード(プログラムが記述されたファイル)をコンパイルするためのソフトウェア。
例えばC言語で記述されたプログラムであれば、MinGWというソフトウェアを使ってgccと呼ばれるコンパイラをインストールすることでプログラムを実行する、という仕組み。

まあ、エディターでC言語で記述したファイルの拡張子は.cとかだが、それをコンパイルすることで.exeファイル(アプリケーションファイル)に出来る。そこでようやくプログラムを実行する事が出来る。

ちなみに.exeファイルからプログラムを読み取ることは出来ない。コンピュータが二進数(1と0)しか理解できない(※簡略化されて十六進数で表示されることもあるが)ので、コンパイルすることでその0と1のバイナリコードで構成されたファイルに変換する、ということ。
バイナリコードはまあ「マシン語」「機械語」とか呼ばれる低水準言語(人間に理解しがたい言語)である。(高水準言語はC言語やPython,bashなどのスクリプト言語など人間が理解しやすく構築できる言語。)

まあ膨大なデータを扱う現在、やけにわかりにくいアセンブラ言語だの機械語を理解する必要はないけど。それよりコンピュータの仕組みを理解してった方が手っ取り早い。

・・・まあそれは置いといて、

ではインタプリタとは。
ソースコードを一行ずつ変換しながら実行する
以上。

・・・

インタプリタとコンパイルの違い

コンパイルは一括で変換しておいて、変換後のバイナリコード(プログラム)を実行する
インタプリタはソースコードを一行ずつ変換しながら実行する

これがまず大きな違いになる。インタプリタは逐次変換しないといけないので時間がかかるしメモリも消費しやすいが、コンパイルは既に変換してあるので変換する手間が無くなって軽量化にもなるのだ。

実務上、プログラムの実行スピードってあんまり気にならない。(と個人的には思っている)

ただ、コンパイルは開発中に試しに実行する、という場合その都度その都度ファイルを作らないと行かないのが面倒だ。

対しインタプリタは変換後ファイルを設置せず(メモリに保存しておいて)実行するから、編集しながら動作を確認しやすい利点がある。

ただし、大規模なファイルになるとこの差は大きく出てくる。インタプリタで大規模なコードを実行しようとするとコンピュータに大きな負担がかかり支障が出てくる。だからあらかじめ変換、コンパイルしておく方が良い。

それともう一つ、例えばMinecraftというゲームがどういう動作をしているのかプログラムを見てみよう!!!!!!
というのは不可能。

何故かというと、exeファイルにコンパイルされた後だからだ。Minecraftのインストール時にソースコードも含んでいるわけではない。
そう、暗号化…とは違うが、内容(ソースコード)を秘密にする事が出来る。ソースコードを見せてしまったらそれこそコピー品が出回りたまったものじゃないし。

じゃあ何かというと、インタプリタだとソースコードを逐次変換して実行するって言うのは何度も言ってきたが、それにある。
ソースコードがないと実行できないのだ。つまり、どうやっても隠す事が出来なくなる。

まあ、今更インタプリタで著作権が関係してくるような開発を行う人なんていないだろうけど・・・

ちなみに、MinecraftとかApex Legendsにおける「チート行為」というのはメモリに在中するプログラムにそれこそ0と1で構成されたバイナリコードを編集することでゲームに干渉するという行為である。
まあ、「ソースコードは見せないよ!!」ってプログラムに無理やり干渉してる時点でグレーなモノだという事だ。(バイナリエディターで解析すればできるというパターンがある)

ひょっとしたら混在してるかもしれないが、ソースコードとはプログラミング言語で人間によって記述されたコードの事であり、プログラムとはコンパイル後の.exeファイルの事を指す。

あとプログラムの中間にオブジェクトファイルというデータが存在し、ライブラリ(ヘッダーファイル等)を組み合わせる(リンクする)ことで(※includeでライブラリ内のヘッダファイルを指定してあるが)プログラムが完成する。詳しくは流石にややこしいのでここで留めておくが・・・

初心者なりに実際に使ってみての違い

これは個人的な感想だが、C言語、C#(Unity)とスクリプト言語(Linux bash)だけ使ったことがある身として、スクリプト言語の方がやっぱりやりやすい気がする。少し間違えてても、ミス行まで行かないとエラーは大体出ないし、わかりやすい。あとヘッダーファイルとかって概念がないのもある。

…と思ったがRubyにはincludeの代わりにrequireって言うのが存在するらしい。あれ?よく分からないな・・・

とにかく、個人で大規模な開発も隠したい情報もないのでインタプリタのプログラミング言語の方が良いんじゃないかな~と思う。

てかスクリプト言語に関しちゃ実際システム開発で使われているモノだし
インタプリタの方が開発しやすいんじゃないかな?と個人的には思ってる。

スクリプト言語のほかにPerl,Ruby,Pythonもインタプリタらしい。



まあ、この二つはそういう違いがあったんですね~って話。
ヘッダーファイルについてはちょっとよく分からない(調べる気力がない)ので、

逐次実行と一括実行という違いさえ覚えておけば二つの違いは理解できるって感じかな?

この記事へのコメント