💻

アプリケーションプログラム①:コンパイラとインタープリタ

2024/10/13に公開

本記事はコンピュータサイエンス学習サービスRecursionの学習記録です。

◀前の回:次の回▶
記事まとめ

コンピューターシステムの構成要素

構成要素
ハードウェア CPU, メモリ, ストレージ, I/Oデバイス
OS Linux, Windows, macOS, iOS, Android*+
アプリケーションプログラム ウェブブラウザ, テキストエディタ, ゲーム

// 応用情報で5大装置をパッと思い出せなかったのでメモ
// 制御装置、演算装置、記憶装置、入力装置、出力装置

コンパイラとインタープリタ

プログラミング言語を、実際にコンピュータで実行可能な形にする役割を担うのがコンパイラとインタプリタ。

コンパイラとは?

コンパイラ(compiler)は、プログラミング言語で書かれたソースコードを機械語に変換するプログラムのこと。
機械語はCPU上で実行される。CPUには複数のアーキテクチャが存在する。
そのため、プログラムをコンパイルする際にはCPUアーキテクチャ(例:Intelのx86やARMのarmなど)を指定する必要がある。
例えば、オープンソースのGCCコンパイラでは以下の方法でコンパイルする。

  • match引数を使ってCPUアーキテクチャを指定する(--match=armv7など)
  • 自動設定する。

// こちらの本の序盤でわかりやすい図があった記憶(非アフィリエイトリンク)
// Rustで作るプログラミング言語 ——コンパイラ/インタプリタの基礎からプログラミング言語の新潮流まで

インタプリタとは?

インタプリタ(interpreter)は、ソースコードを機械語にコンパイルすることなく、命令を直接実行するプログラム。
コードが逐次実行されるためコンパイルする時間が不要となる。
速度はコンパイル済みのコードと比べて遅くなることが一般的。
インタプリタは、効率を高めるために以下の技術を使うことがある。

  • バイトコード実行
    ソースコードをあらかじめ低レベルのバイトコードに変換し、そのバイトコードを実行する。
    これによりソースコードを直接解釈するよりも高速化できる。
  • ジャストインタイム(JIT)コンパイル
    実行時にコードをコンパイルし、実行環境に適した形で実行する。
    バイトコード実行よりも遅くなることもある。

メモ

JITコンパイラを使うならコンパイラでコード実行するのと同じでは?と思って調べたことのメモ。

  • コンパイルのタイミングが違う。
方法 タイミング
通常のコンパイル 事前コンパイル(Ahead-of-Time, AOT)する。
生成されたバイナリファイルはそのまま実行される。
JITコンパイル プログラムの実行中に部分的にコードをコンパイルする。
コードを解釈しながら必要に応じてその一部をコンパイルする。
  • JITコンパイルでは、コードの実行状況やデータに基づいて最適化が行われるためパフォーマンスが向上することがある。ホットスポット(何度も実行されるコード)に特化した最適化をその場で行い、高速化する。

調べたところでは、インタプリタとJITコンパイルの比較記事は多い印象。コンパイラとJITコンパイルの比較はあまりみつからず、着眼点がおかしいのかもしれない。
Pediaa on Interpreter vs JIT Compiler​ (PEDIAA.COM)

Discussion