文字列 “Hello World”を出力するのは新しいプログラミング言語を学ぶ時に一番最初に紹介する定番のプログラムです。ここでもやはり最初に “Hello World” と出力するプログラムを動かしてみます。
helloworld.py ← リンクされているPythonのサンプルコードはダウンロードすることができます。
# File: helloworld.py
print("Hello World")ターミナルで実行するには以下のようにします。
$ python helloworld.py
Hello World
コマンド python (もしくは python3)は、プログラムファイル helloworld.pyを実行するためのインタプリタのプログラムです。
一般にプログラムを実行する方法は大きく分類して3つのタイプがあります。
インタプリタ方式 – プログラムのコードをそのまま逐次的に実行するインタプリタによって処理される方法で、コンパイル方式、バイトコード方式よりも処理が遅くなります。
コンパイル方式 – プログラムのコードをCPUの命令に翻訳するコンパイラによってバイナリー形式の実行ファイルが生成されます。CPU命令を直接実行するので処理効率が良く、さらにコンパイルの際に最適化処理を加えることにより、より処理効率の高い実行ファイルを生成することができます。インタプリタ方式、バイトコード方式よりもプログラムの処理効率が高くなります。
バイトコード方式(ハイブリッド方式) – コンパイラで中間形式のコードを生成し、そのバイトコードを仮想マシンで実行する両方の利点を取ったハイブリッドな方式です。処理効率はインタプリタ方式より高く、種類によってはコンパイル方式に近い早い処理が可能です。また特定のCPUアーキテクチャーに依存しないため、生成済みのバイトコードをアーキテクチャーの違うCPUで実行することが可能です。
Pythonの実行はインタプリタ方式、コンパイル方式、ハイブリット方式なのかということでいえば、「どの方式もある」が答えになります。プログラムを動かす処理系はインタプリタ方式の実行系、バイトコード方式の実行系、またまたコンパイル方式の実行系のいずれも存在しています。
Pythonとはプログラミング言語仕様のことであり、Pythonの実行系の実装とは独立しているからです。
先程は、プログラムをファイルとして与えていたので、どのような方式で処理されたのかイメージがつかめなかったかもしれません。今度は、コマンドの形でpythonを使いインタラクティブ(対話的に)に実行してみます。
$ python
Python 3.7.3 (default, Mar 27 2019, 22:11:17)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Hello World")
Hello World
>>> (control-Dを入力)
バイトコードにコンパイルをした後に実行する例です。helloworld.cpython-37.pyc がバイトコードになります。バイトコードを実行する方が処理が速いのですが、今回のような処理が少ないコードでは差は人間が認知できないレベルです。
$ ls
helloworld.py
$ python helloworld.py
Hello World
$ python -m py_compile helloworld.py
$ ls
__pycache__ helloworld.py
$ python __pycache__/helloworld.cpython-37.pyc
Hello World
コンパイルしてバイナリファイルを作成し実行する例です。ここではコマンドpyinstallerを使っています。あまり一般的ではありません。この例ではGNU/Linux環境でコンパイルしているので、他のプラットフォーム (例えば Windows や Mac ) でのメッセージなどとは異なる可能性があります。
$ pyinstaller helloworld.py --onefile
pyinstaller helloworld.py --onefile
948 INFO: PyInstaller: 4.5.1
948 INFO: Python: 3.7.3 (conda)
949 INFO: Platform: Linux-5.11.0-41-generic-x86_64-with-debian-bullseye-sid
...
7965 INFO: Building EXE from EXE-00.toc completed successfully.
$ ls
__pycache__ build dist helloworld.py helloworld.spec
$ ls -l dist/helloworld
-rwxr-xr-x 1 hironobu hironobu 7662576 Dec 12 05:51 dist/helloworld
$ file dist/helloworld
dist/helloworld: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=f6af5bc244c001328c174a6abf855d682aa7401b, for GNU/Linux 2.6.32, stripped
$ ./dist/helloworld
Hello World
UNIX系の環境上で実行ファイルとして動かしたいときはハッシュバング(シバンとも呼ぶ)を使って実行ファイル化することが出来ます。
$ cat ./helloworld
#!/usr/bin/python
print("Hello World")
$ ./helloworld
Hello World