👌

スクリプト言語とコンパイル型言語の違いとは?

スクリプト言語とコンパイル型言語の違いとは?

スクリプト言語とコンパイル型言語の違いとは?

プログラミング言語には、スクリプト言語とコンパイル型言語という2つの主要なカテゴリがあります。これらの言語は異なる特性を持ち、異なる方法で動作します。

スクリプト言語は、実行時にコードが解釈されます。つまり、プログラムは一行ずつ実行されます。スクリプト言語は一般に柔軟であるため、プログラミングの初心者でも簡単に学習できます。

一方、コンパイル型言語は、事前にコードがコンパイルされ、機械語に変換されます。この機械語のコードは、直接実行可能なバイナリファイルになります。コンパイル型言語は高速な実行が可能であり、より厳密なエラーチェックが行われます。

さて、具体的な例を見てみましょう。以下のコードはCで書かれたプログラムです。

int func() {
  return -1;
}

void main() {
  func();
}

このコードを逆アセンブルすると、以下のようなバイナリコードになります(80386系を例にします)。

*** <_func>:
100003f90: 55                           push    rbp
100003f91: 48 89 e5                     mov     rbp, rsp
100003f94: b8 ff ff ff ff               mov     eax, ***
100003f99: 5d                           pop     rbp
100003f9a: c3                           ret
100003f9b: 0f 1f 44 00 00               nop     dword ptr [rax + rax]

*** <_main>:
***: 55                           push    rbp
100003fa1: 48 89 e5                     mov     rbp, rsp
100003fa4: e8 e7 ff ff ff               call    0x100003f90 <_func>
100003fa9: 5d                           pop     rbp
100003faa: c3                           ret

面白いことに、このコードではfunc()が呼び出されていますが、元の名前(func)は存在せず、アドレス(0x100003f90)が指定されています。つまり、コンパイル型言語でビルドされたバイナリでは、シンボル情報を簡単に取得することはできません。

また、C++のクラスに関しては、VTableと呼ばれる仕組みを使って、継承したクラスのメソッド呼び出しを実現しています。

Glib(GTK+)などのライブラリでは、アドレスを計算してキャストするなど、さまざまなトリックが使われていることもあります。

最後に、少しユーモアを交えて言及しておきたいことがあります。それはObject-Cです。その言語の設計には無理や無駄があるため、私たちはObject-Cが黒歴史と考えるべきです。その言語は、C++のプリプロセッサに相乗りして、動的な関数呼び出しを行っています。私は、それ以上に悪い言語の例は知りません。

まとめると、スクリプト言語とコンパイル型言語は、プログラミングの方法や動作の仕組みにおいて異なる特性を持ちます。それぞれの言語には利点と欠点がありますが、最終的な選択は開発者に委ねられるでしょう。

この記事は、スクリプト言語とコンパイル型言語の違いについて興味がある方に向けて書かれています。プログラミングの世界において、言語の特性を理解することは非常に重要です。ぜひこの情報を参考にして、より良いプログラミングスキルを身につけてください。

参考リンク:

Nicosys Tech blog

Discussion