JavaScriptを有効にしてください

[技術選定の審美眼] コンパイラ ~ インタプリタ言語

 ·  ☕ 4 分で読めます  ·  🐙 subaru

技術選定ができるようになりたい。

技術選定の審美眼 を養う前に、そもそもどんな言語が存在しているのかを知りたいんだ。

だから、言語にはどんな種類があるのかを調べてまとめた。

コンパイラ言語

事前に一括でコンパイルしてからプログラム語に翻訳する言語のことをコンパイラ言語という。

ソースプログラムをコンパイラに通し、オブジェクトプログラムを作成。その後、オブジェクトプログラムを実行する。

2回手順を踏むので少々手間だが、下記のような点で堅牢なプログラム作りに貢献している。

例えば、コンパイラ言語の代表格であるc言語の場合のコンパイルまでの流れは下記のようになる。

  1. まずcファイルを作成する

pointa.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include "./pointa.h"
int main(void)
{
    int a  = 15;     
    int b = 20;    

    pointa(&a, &b);

       /* 交換後の値を表示 */
    printf("ポインタ: a = %d, b = %d\n", a, b);
    
    return 0;
}

void pointa(int *pa, int *pb)
{
    int temporally_num;
    
    /* 値を交換する */
    temporally_num = *pa;
    *pa  = *pb;
    *pb  = temporally_num;
}
  1. コンパイルしてファイルを作成する
1
% gcc -o pointa pointa.c

もし文法にミスがあると下記のようなエラーが出て、実行ファイルが生成されない。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
% gcc -o pointa pointa.c
  
pointa.c:16:5: error: implicit declaration of function 'pointa' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    pointa(&a, &b);
    ^
   
pointa.c:35:6: error: conflicting types for 'pointa'
void pointa(int *pa, int *pb)
     ^
pointa.c:16:5: note: previous implicit declaration is here
    pointa(&a, &b);
    ^
2 errors generated.
  1. poinaというオブジェクトファイルが生成されるので、実行する
1
2
% pointa
ポインタ: a = 20, b = 15

インタプリタ言語

一行一行マシン後に翻訳してから実行する言語。コンパイラ言語と違い、実行速度が遅くなっている反面、コンパイルする手順をコーダーが考えなくていいため、比較的容易に書くことができる。

下記のようなメリットがある。

・プログラムをすぐに実行できる

・1行1行読み込むので、実行がうまくいかなかった時点で、すぐにデバックに取りかかれる

代表的な言語として、Javascript, Ruby, Python, PHPなどがある。

スクリプト言語

人間が読みやすいように書かれている言語。インタプリタ言語 includes スクリプト言語のような関係性になっているため、スクリプト言語に対して厳密な定義は存在していない。

スクリプト言語とは?コンパイラ言語との違いや種類一覧も紹介! | Modis株式会社

JITコンパイラ

JITコンパイラは、事前コンパイルで中間言語に変換し、仮想マシンを通して機械言語に変換することで処理を高速化するもので、コンパイラ言語とインタプリタ言語の中間に位置するような言語になっている。

インタプリタ言語の「一行一行翻訳する」ことによる実行速度の遅延を解消するソリューションの一つとして活躍している。

Ruby2.6以降JITコンパイラが搭載されて、Ruby 2.6.0の時点で、OptcarrotというCPU負荷中心のベンチマークにおいてRuby 2.5の約1.7倍の性能向上を達成していた。

Ruby 2.6.0 Released

また、Ruby3.1から同袍されたYJITは下記のような実績を達成している。しかし、x86-64上のUnix系プラットフォームのみで動いている。(2021年12月時点)

| Ruby標準のインタプリタと比べてrailsbenchで20%、liquidテンプレートレンダリングで39%、Active Recordで37%の性能向上を達成していると

プロと読み解く Ruby 3.1 NEWS - クックパッド開発者ブログ

「Ruby 3.1.0」がリリース ~プロセス内JITコンパイラー「YJIT」をマージ【2022年1月5日追記】/言語機能の強化やデバッグ機能の改善なども

プログラムが実行されるまで

ソースコードをコンパイルする時に、一行ずつか、一気に全てかで言語の呼び名が変わってくることは理解できた。

実際にプログラムが実行されるまでにどんな処理が発生しているのかを理解しておきたい。

プログラミング言語が「文字列を入力してからプログラム語に翻訳されていくまでの流れ」は以下の通り。

  1. 字句解析器
  2. 構文解析器(パーサ)
  3. 意味解析器(アナライザー)
  4. インタプリタ

rubyの構文はLispSmalltalkといった高度な言語のアイデアを採用しているため、下記のような流れになっている。

  1. 字句解析
  2. 構文解析
  3. コンパイル
  4. YARV

詳しく述べるとかなり時間がかかりそうなので、今回はここまでにしたいと思う。

参考記事

コンパイラ言語とは?インタプリタ・スクリプトとの違いやJITについても解説 | Modis株式会社

スクリプト言語とは?コンパイラ言語との違いや種類一覧も紹介! | Modis株式会社

プロと読み解く Ruby 3.1 NEWS - クックパッド開発者ブログ

「Ruby 3.1.0」がリリース ~プロセス内JITコンパイラー「YJIT」をマージ【2022年1月5日追記】/言語機能の強化やデバッグ機能の改善なども

「Rubyのしくみ」 第1章 字句解析と構文解析を読んで - Hit the books!!


octpsubaru
著者
subaru
Web Developer