東北大学大学院工学研究科修士課程修了。
銀行勤務を経て、現在はWebメディア制作や運営に携わる。
「Pythonはインタプリタ型?コンパイラ型?」
「スクリプト言語、インタプリタ言語ってよく聞くけど、どういうこと?」
数多くのプログラミング言語がありますが、プログラムの実行方法はさまざまです。また、プログラムの実行方法によって処理の速さやコードの見やすさや修正のしやすさが異なります。
この記事では、Pythonの実行方式であるインタプリタ型とは何か、また、その特徴はどのようなところに現れているのかについて解説します。
Pythonの実行処理に関するメカニズムについての理解を深めましょう。
目次
そもそもPythonはどうやって動かす?
Pythonプログラムを実行するには、まずテキストエディタ(Visual Studio CodeやSublime Textなど)にコードを書き、プログラムファイルを作ります。Pythonファイルの拡張子は「.py」です。
例えば、文字列を表示させたい場合は「print」を使うと表示させる場合、Pythonファイル「sample.py」を作り、以下のコード記載します。
例 ファイル名「sample.py」
1 |
print("Hello, World") |
次に、Macならターミナル、Windowsならコマンドプロンプトでコマンドを入力することにより実行できます。
Pythonの特徴
Pythonの実行方法について詳しく解説する前に、まずはPythonのコードと実行方法に関する特徴について解説していきます。
記述がシンプルなスクリプト言語
Pythonはスクリプト言語の1つです。
スクリプトは、英語で「台本」という意味ですが、そこから転じて、台本ようにプログラムを書いたり読んだりできるようなプログラミング言語、つまり、比較的簡単に読み書きできるプログラミング言語のことを言います。
※厳密な定義はないようです
したがって、Pythonは他のプログラミング言語に比べてコードの記述を短く書くことができます。
例えば、画面に「Hello World!」を表示させる記述を他の言語と比較した例です。
Pythonの場合
1 |
print('Hello World!') |
PHPの場合
1 2 3 |
<?php echo "Hello World!"; ?> |
Javaの場合
1 2 3 4 5 |
class Hello World! { public static void main(String[] args) { System.out.println("Hello World!"); } } |
Pythonの記述が他の言語に比べて、圧倒的にコードが短く、かつ、誰が見ても理解しやすいことがわかるかと思います。実際、英語のような感覚で読める言語とも言われています。
このように、コードを短く書けることによって「初心者にも学習しやすい」「後から修正するときに楽」「コードの管理がしやすい」といったメリットがあります。
Pythonはインタプリタ型の言語
Pythonはインタプリタ言語の1つであり、開発者側としての最大の特徴は上記と同じくコードがわかりやすく、修正しやすいことです。
スクリプト言語とインタプリタ言語は特徴が同じであり、スクリプト言語の大半はインタプリタ言語であるため、「スクリプト言語=インタプリタ言語」と思われがちですが、厳密には異なります。
インタプリタとは、英語で「通訳者」という意味ですが、プログラムコードが1行ずつ解釈しながら実行されていく言語の特徴のことを言います。
これと対になるのがコンパイラ型の言語で、一度すべてのコードを翻訳してから実行されます。
次章では、インタプリタ型とコンパイラ型の言語で何が違ってくるのか詳しく見ていきます。
プログラミング言語の実行方法の分類
前提として、人間が書いたプログラムコードは機械がそのまま認識することはできません。そのため、機械が認識できる言語となるために一度翻訳される必要があり、その後に実行処理が可能になります。
人間が書いたソースコード
↓ 翻訳
機械が認識できるソースコード
↓ 実行処理
結果
プログラミング言語は、プログラムを実行する際にコードを機械語に翻訳するコンパイルが必要な「コンパイラ型」と、コンパイルが必要ない「インタプリタ型」の大きく2つに分類されます。
コードをすべて機械語に翻訳してから実行するのが「コンパイラ型」で、コードを入力するとその都度実行できるのが「インタプリタ型」です。ここでは、これらの特徴をもとに、メリットとデメリットについて解説します。
また、コンパイラ型とインタプリタ型の中間的な存在である「JIT」についても紹介します。
コンパイラ型
プログラミング言語の種類によってはハードウェアにプログラムを理解させるために、必要に応じて機械語に翻訳するコンパイル作業が必要になってきます。ソースとなるプログラムをいったん機械語に翻訳し、そのプログラムを実行するのがコンパイラ方式です。
具体的なコンパイルの流れは以下の通りです。
Aファイル(ソースコード)
↓ コンパイル
Bファイルが作成される
↓ Bファイルの実行
結果の出力
上記のように、Aファイルをコンパイルして機械語に翻訳し、作成されたBファイルのプログラムが実行される流れです。
コンパイラ方式の代表的なプログラミング言語には、CやJava・Goなどがあります。
コンパイラ型のメリット
コンパイル作業が必要で一見手間がかかりそうなコンパイラ方式ですが、メリットもあります。
ここからは、コンパイラ方式のメリットをいくつか紹介していきます。
実行速度が速い
コンパイラ方式の最大のメリットといえるのが、実行速度の速さです。コンパイラ方式は、ファイル内のプログラムをまとめて翻訳するので、実行までの時間がかかりません。
また、コンパイルが行われると、元のファイルとコンパイル後のファイルの2つに負荷が分散されるため、処理の負担がかからないことも実行速度が速い要因といえます。
文法エラーを見つけやすい
コンパイラ方式は、コードの記述ミスがあると文法エラーとして表示してくれるので、後から修正しやすいメリットがあります。
エラーの内容も、どんな種類でどの箇所にエラーがあるか一目でわかるので、長文のコードでも修正しやすいのが特徴です。
大規模開発で使いやすい
複数人で長文のソースコードを扱う大規模開発の場合、コンパイラ方式が採用されやすいです。とくに大規模開発の場合は大容量のシステムを動かすので、プログラムの処理速度が重要視されます。
インタプリタ方式でも処理自体は可能ですが、最悪の場合システム障害などにもつながる恐れがあるので、あまり採用されていません。
コンパイラ型のデメリット
続いてコンパイラ方式のデメリットを紹介していきます。
実行するまでエラーがわからない
コンパイラ方式は、すべてコンパイルしてみないとエラーがわからないので、その都度修正をすることができません。
とくに大規模開発のようなファイルやコードが複雑になっている場合は、コンパイルにも時間がかかるので、細かく修正をすることは難しいでしょう。
環境設定が必要
コンパイルを行うには専用のコンパイラをインストールしたり、開発環境を整えたりする必要があるため、インタプリタ方式に比べて手間がかかります。初心者の場合は環境設定でつまづくことも多く、コンパイル作業する環境を用意する前に挫折してしまう人も少なくありません。
初心者は扱いづらい
前述のとおり、コンパイラ方式は細かい修正のしづらさや環境設定の難しさから、初心者には扱いづらい面があります。元々コンパイラ方式は大規模開発に採用されることが多いこともあり、初心者が個人で気軽に試すのは難しいかもしれません。
インタプリタ型
インタプリタ(interpreter)とは、プログラミング言語で書かれたソースコードを1命令ずつ機械語プログラムに変換していく実行方法の一つです。直訳すると「通訳者」の意味になります。
具体的なプログラム実行までの流れは以下の通りです。
Aファイル(ソースコード)
↓ プログラムを1行ずつ翻訳
↓ プログラムを1行ずつ実行
結果の出力
上記のように、Aファイルのプログラムを1行ずつ翻訳し、プログラムを実行していく流れです。
インタプリタ方式の代表的なプログラミング言語には、RubyやJavaScript・PHPなどがあります。
インタプリタ型のメリット
インタプリタ方式は、コンパイルを行うための環境設定が必要ないため、メリットも多くあります。
ここからは、インタプリタ方式のメリットをいくつか紹介していきます。
コンパイルの手間がない
インタプリタ方式は、プログラムの実行にコンパイルの必要がないため、プログラマの負担を軽減することができます。また、難しい環境設定の必要がないので、初心者にも扱いやすいでしょう。
コードの修正が楽
インタプリタ方式は、コンパイル方式に比べてコードの修正がしやすいです。インタプリタ方式はコードを1行ずつコードを解釈してプログラムを実行していくので、必要があればいつでもコードを修正することができます。
インタプリタ型のデメリット
続いてインタプリタ方式のデメリットを紹介していきます。
実行速度が遅い
インタプリタ方式最大のデメリットが、実行速度の遅さです。コードを1行ずつ機械語に翻訳していくので、ソースコードを一括で翻訳可能なコンパイル方式より処理に時間がかかってしまいます。
ただ、最近ではインタプリタ方式の処理速度も改善してきており、コンパイラ方式との差も少なくなっています。
プログラムの実行にインタプリタが必要
インタプリタ方式の実行には、プログラミング言語ごとにインタプリタが必要です。標準でインタプリタが用意されている場合もありますが、ない場合は別途インストールする必要があります。
とはいえ、環境設定全体でみると、コンパイル型よりも手間は少ない場合が多いです。
大規模開発には不向き
インタプリタ方式は、実行速度の遅さや消費メモリの制限があるため、大規模なシステム開発には不向きといえます。
そのため、小規模開発が中心のWeb系言語に多く採用されています。
JITコンパイラ
JITコンパイラ(Just-In-Time Compiler)は、プログラムを実行すると同時にコンパイルを行う方式です。コードを一旦中間言語に変換し、それを1行ずつ翻訳して機械語として実行します。「JIT」は「中間言語」や「JVM」とも呼ばれています。
大まかにいえば、コンパイラとインタプリタの中間的な処理を行うイメージです。
具体的なプログラム実行までの流れは以下の通りです。
Aファイル(ソースコード)
↓ JITコンパイル
Bファイル(中間言語)
↓ プログラムを1行ずつ実行
結果の出力
上記のように、AファイルをJITコンパイルすることで中間言語のBファイルが作成され、そのBファイルを1行ずつ実行する流れです。
元々Javaはプログラムを1行ずつ翻訳するインタプリタ方式を採用していましたが、OSやCPUに依存しないファイル作成が可能なことから、近年ではJITコンパイラが主流になっています。
JITコンパイラのメリット
ここからは、インタプリタ方式のメリットをいくつか紹介していきます。
プログラムの実行を高速化できる
JITコンパイラを使用することでプログラムの実行を高速化することができます。プログラム実行の仕組みはインタプリタと同様ですが、内部ではコンパイルも行っているため高速に動作することが可能です。
特定のプラットフォームに依存しない
先ほども少し紹介しましたが、プログラム実行と同時にコンパイルすることで、特定のプラットフォーム(OSやCPUなどのハードウェア)に依存せずに実行することができます。
従来のコンパイルは異なるプラットフォームで使用するには再度コンパイルが必要でした。しかし、JITコンパイルは中間コードが生成された後に「JVM」という仮想マシンが識別する仕組みになっており、異なるプラットフォームでも同一のコードを生成することが可能です。
JITコンパイラのデメリット
続いてJITコンパイラのデメリットを紹介していきます。
起動までに時間がかかる
JITコンパイラは、プログラム実行と同時にコンパイルを行うので、起動までに時間がかかることがあります。また、プログラムが実行完了するまで結果がわからないので、エラーの修正がしづらいところもデメリットです。
メモリが多く必要になる
先述したとおり、JITコンパイラはもとのファイルと中間コード・コンパイル後のファイルを通して実行されるため、従来のコンパイラよりメモリが多く必要になる場合があります。
そのため、携帯電話などの使用メモリが限られている媒体では、あまり採用されていません。
まとめ:Pythonの実行処理はインタプリタ型
この記事では、スクリプト型、インタプリタ型と言われるPythonの実行方式について解説しました。Pythonをはじめとしたインタプリタ型の実行処理の特徴は以下です。
- コンパイルの手間がない
- コードの修正が楽
- 実行処理が遅い
実行処理のメカニズムを理解したら、実際に、Pythonをいじってみましょう。Pythonの始め方は以下の記事を参照ください↓↓