インタプリタとは? コードを1行ずつ実行する
インタプリタは、ソースコードを読み、別個の実行可能ファイルを先に生成せずに、文ごとに直接実行するプログラムです。
Python、Ruby、そして (古典的には) JavaScriptのような言語は、インタプリタによって実行されます。プログラム全体を前もって翻訳する代わりに、インタプリタは実行時にコードをたどり、遭遇するたびに各命令を実行します。これは高速な反復と容易なデバッグをもたらしますが、生の実行速度は多少犠牲になります。
インタプリタがコードを実行する方法
現代のインタプリタは通常、ソースを内部表現 (多くの場合bytecode) にparseし、その表現をループで実行します。別個の事前buildがないため、1行変えてすぐに再実行できます。
インタプリタ vs コンパイラ
コンパイラは実行前にすべてを翻訳しartifactを生成します。インタプリタは進みながら翻訳し実行します。多くの実在の言語は両方を混ぜています。Pythonはbytecodeにコンパイルしてからそれを解釈し、JavaScriptエンジンはまず解釈し、ホットなパスをjust in timeでコンパイルします。
インタプリテーションのトレードオフ
- 開発中はより速い起動と、より素早い編集実行ループ。
- エラーは、問題のある行が実際に走ったときにしか現れないことが多い。
- 重い計算では一般にコンパイル済みコードより遅い。
- 同じソースがインタプリタのある場所ならどこでも走るため、移植性が高い。
なぜ1行ずつのモデルが重要か
インタプリタは不正な行に到達したときにしか失敗しないため、めったに使われないbranchの奥にある構文エラーは、そのbranchが走るまで隠れることがあります。これこそ、インタプリタ言語でテストとlintingが非常に重要な理由です。
簡単な例
python app.py を実行すると、ファイルがPythonインタプリタに渡され、上から下へ実行されます。200行目のタイプミスは、linterやtype checkerが先に捕捉しない限り、実行が200行目に到達するまで報告されません。
CIにおけるインタプリタ
インタプリタ言語では、ほとんどのエラーが現れるのがテスト実行のときなので、buildがそのままテスト実行であることが多いです。flakyな環境セットアップや一時的なパッケージ取得は、あなたのコードのせいでなくこれらの実行を壊すことがあります。マネージドrunner (Latchkey) はそうした一時的な失敗を自動でリトライするため、依存関係インストール中のネットワークの不調でpipelineが失敗することがありません。
重要なポイント
- インタプリタは、先にartifactを構築するのではなく、実行時にソースを直接実行します。
- 多くの言語は、内部でインタプリテーションとコンパイルを混在させています。
- エラーは実際にその行が走ったときにしか現れないことが多いため、テストとlintingが不可欠です。