どうも。ケニー(tsujikenzo)です。このシリーズでは、2023年3月から始まりました「ノンプロ研Python中級講座1期」について、全6回でお届けします。今日は最終回の最終回です。
前回のおさらい
前回は、「卒業LT中編~環境変数とPath~」をお届けしました。
今回は、「卒業LT後編~Pythonの実行と正体~」をお届けします。
今日のアジェンダ
- Pythonの実行
- コンパイル言語とインタプリテッド言語
- Pythonのインタープリター
- Pythonの正体
Pythonの実行
前回、言い忘れたことがあります。
それは、「PythonのPathを通すのは、Python本体があるディレクトリ」ということです。
わたしのパソコンには、Anaconda3がインストールされています。
Anaconda3フォルダの直下にPython.exeファイルがあります。
なので、環境変数にも、このようにPathを通しています。
任意のフォルダに、メッセージを出力するだけの、かんたんなpyファイルを作成します。
# python-sample.py
print("Hello, I'm Python.")
コマンドプロンプトを起動し、カレントディレクトリを移動し、python ファイル名で実行しましょう。
前回の復習ですが、裏では、python(exeが省略されている)を、
- カレントディレクトリで探す
- なければPath変数を参照しに行く
と、いうことをやっています。
Path変数を参照しにいくと、Anaconda3というディレクトリの中にPython.exeを発見しましたので、起動して、python-sample.pyを実行できました。 という流れです。
※ちなみに、pythonを付けずに、python-sample.pyだけを実行すると、VS Codeなどのエディタが立ち上がると思います。これは、Windows上で、python-sample.pyをダブルクリックした状態と同じです。
実行可能ファイル
ここで、お気づきの方もいるかもしれませんが、Pythonファイルを実行すると、C++のような、「実行可能ファイル」が生成されません。
このように、コンパイルして実行可能ファイルを作成せず、ソースコードを読み込んで実行することを、インタープリター方式(またはインタープリテッド言語)と呼びます。
コンパイル言語とインタプリテッド言語
どんなプログラミング言語であれ、人間が書いたソースコードは、パソコンには読めません。パソコンは、01で書かれたマシン語という言葉しか理解できません。
なので、必ず、ソースコードを翻訳する必要があります。その翻訳機が「コンパイラ」です。
コンパイラのお仕事
コンパイラは、中でさまざまなことを行っています。
- 字句解析(Lexical Analysis): ソースコード(文字列)を読み取りながら、トークン(識別子、キーワード、演算子など)に分割します。
- 構文解析(Syntax Analysis): 字句解析されたトークンの順序や構造を確認し、構文的な正当性を検証します。
- 構文木(Syntax Tree):構文解析の結果、構文木が生成されます。
- 意味解析(Semantic Analysis): 構文木を解析し、変数の宣言や型チェック、スコープの管理など、言語固有の意味を持つかどうかを確認します。
- 中間表現の生成(Intermediate Code Generation): 意味解析が完了したら、中間表現(Intermediate Representation)を生成します。中間表現は、最適化やコード生成のための準備段階として使用されます。
- 最適化(Optimization): 中間表現を最適化することで、生成されるコードの効率や実行時間を改善します。
- コード生成(Code Generation): 最適化された中間表現から、ターゲットプラットフォームに対応した実行可能なコード(アセンブリ言語、機械語)を生成します。コード生成では、レジスタの割り当て、命令の配置、メモリの管理などが考慮されます。
- 最終処理(Finalization): コード生成が完了したら、必要な最終処理を実行します。
JavaScriptで聞かれる「レキシカルスコープ」とは、まさに、字句解析を行った時点で、スコープを決定するというものです。
また、構文木とは、ソースコードの構造をツリー上の階層的な形式で表現したものです。
コンパイルには、「事前コンパイル方式」と「事後コンパイル方式」の、2種類があります。
事前コンパイル方式
ファイル(アプリケーションなど)を実行するまえに、翻訳を行うのが、事前コンパイル方式です。
どのプラットフォームで動作させるのか、というのを予め決めておく必要がありますが、事前にコンパイルを済ませておくので、処理が早いというメリットがあります。
事後コンパイル方式
いっぽうで、ファイル(アプリケーションなど)を実行するときに、翻訳を行うのが、事後コンパイル方式です。
事後コンパイル方式のことを「インタープリター方式」とも呼びます。事後コンパイル方式における翻訳機のことを、インタープリターと呼びます
事後コンパイル方式は、ソースコードさえ用意しておけば、プラットフォーム側がコンパイラを用意すれば、どこでも実行できる、というメリットがあります。もちろん、実行の都度コンパイルするので、動作は遅いです。
メリット・デメリット
コンパイル言語とインタープリテッド言語には、下記のようなメリット・デメリットがあります。
プロパティ | コンパイル言語 | インタプリタ言語 |
---|---|---|
実行速度 | 高速 | 遅い |
メモリ効率 | 高 | 低 |
デバッグ | 容易 | 困難 |
コンパイル | 必要 | 不要 |
プラットフォーム依存性 | 有 | 無 |
学習難易度 | 高 | 低 |
JavaScriptなどは、サーバーからダウンロードしたソースコードを、ブラウザが翻訳して実行している言語です。
Pythonのインタープリター
Anacondaや、標準配布されている生Pythonのインタープリターは、CPythonです。
CPythonがあるおかげで、Pythonソースコードを実行できるようになっています。
CPythonは、C言語で書かれています。CPythonの公式サイトやオフィシャルなパッケージ管理システムから入手できるものは、C言語でソースコードが書かれていてコンパイルされたものが配布されている、ということです。
ちなみに、Google Apps ScriptのV8 Runtimeは、C++で作られていましたね。
その他のインタープリター
その他にも、PyPyや、IronPythonなどの特定のプラットフォーム用の実装があります。PyPyは、インタープリター方式は遅いというデメリットを解消するために、事前コンパイル方式(正確には、Just In Timeインタープリターを使用する)を提供しています。
現在はPythonも高度に進化していますので、もっとも適した実装は、一概には言い切れません。
「全てのPythonはインタープリター方式である」というわけではないので、ご注意ください。
Pythonの正体
で、結局Pythonの正体はなんなの?と聞かれたら、
- インデントでステートメントを決めたりするソースコード
- ソースコードを翻訳する翻訳機
- Windows用、Mac用などの、プラットフォーム用に実装された総合的なプログラミング開発環境
など、文脈によって違います、というのが答えでしょうか。
お粗末さまでした。
まとめ
以上で、 「卒業LT後編~Pythonの実行と正体~」 をお届けしました。
考察を通じて、Pythonの開発・保守が、少しだけできるようになったかもしれません。