Suchmos7
@Suchmos7

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Python(インタプリンタ型言語)の動作の仕組み

解決したいこと

Pythonのソースコードを実行した後のメモリやディスクへの配備やワークフローについて教えてください。
※OSについて素人なことをお許しください。

自分が考えていること

①ソースコードを実行
②Python.exeが中間コードを生成、その後ライブラリと中間コードのリンクを行い実行ファイル(バイナリファイル)を作成。このとき変数などのメモリ領域を確保し、それらの情報(PCやPSW)をまとめたものをプログラムとしてディスクに配備。
③Python.exeはシステムコールによりプログラムをメモリにロードする(プロセスの生成)。
④CPUはメモリを順次読み込んでいき実行する。

気になること

・Python.exeというソフトの中にコンパイル、リンク、システムコールなどの機能が詰まっているのでしょうか?

・Pythonは対話型モードを持っていますが、これは1行ごとに上記ワークフローが行われ独立したプロセスが生成されるのでしょうか?

また参考URLなどがありましたらご教授いただけると幸いです。

0

1Answer

Pythonインタプリタは、Pythonスクリプト実行開始時に中間コード(バイトコード)にコンパイルして__pycache__ ディレクトリ配下に中間コードファイルをキャッシュします。
ライブラリも同様にコンパイルされた中間コードファイルがライブラリ配下の __pycache__ディレクトリにあり、import命令を実行することでメモリ上にロードされます。
それらの中間コードを実行するのもPythonインタプリタです。Pythonインタプリタが仮想機械(VM: Virtual Machine)のCPUとなって中間コード(仮想マシン語)を1バイトずつ解釈(インタプリット)しながら実行します。
CPUが実行するのはPythonインタプリタです。

PyPyなら、JIT (Just-In-Time) コンパイラでCPUネイティブコードにコンパイルしながらCPUが実行します。

拙作の記事も参考にしてみてください。

2Like

Comments

  1. @Suchmos7

    Questioner

    ありがとうございます。

    CPythonの動作原理はjavaのjvmの仕組みにかなり近いような気がしますが、これらの違いは
    javaはコンパイルと実行を切り離して行う静的言語なのに対し、Pythonは同時に行う動的言語。という認識でいいのでしょうか?

    P.S.リンクを参照させていただきました。Pythonでは定数がオブジェクトとしてあり、変数はそれに対するポインタであるなど、知らないことが多くてとても勉強になりました!
  2. > javaはコンパイルと実行を切り離して行う静的言語なのに対し、Pythonは同時に行う動的言語。という認識でいいのでしょうか?

    そんな感じですね。
    スクリプトを1文字1文字解釈しながら実行するのは処理に時間がかかるので、加算ならバイトコード01、for文ならバイトコード3f、変数アクセスは変数配列のインデックス番号などに事前変換してから実行開始する感じです。
    中間コード(バイトコード)命令は公式ドキュメントに記載されています。
    https://docs.python.org/ja/3/library/dis.html#python-bytecode-instructions

Your answer might help someone💌