Pythonランタイムは実際にどのように機能しますか?


26

aの概念runtime library、特にPythonの概念を理解するのに問題があります。それで、私はいくつかのhello world pythonプログラムを書き、それを実行するつもりなので、を書きpython ./hello_world.pyます。

Enterボタンを押してから、Pythonコードから生成されたマシンコードがCPUで実行されるまでに、どのような手順が発生しますか?そして、これはPythonランタイムシステムおよび/またはライブラリとどのように関係していますか?


これらの2つのスレッドは、Pythonランタイムに関する優れた洞察を提供します-Python は解釈、コンパイル、またはその両方ですか?Pythonは(JavascriptやPHPのように)解釈されますか?。ランタイムとランタイムライブラリ同じではありません。私が知っている.NETの世界へのマッピング-共通言語ランタイム(CLR)とフレームワーク/ベースクラスライブラリ(FCL / BCL)同じではありません
RBT

回答:


33

多種多様であるため、すべての真面目で最新のプログラミング言語が共有する共通の概念がいくつかあります。そのうちの2つは、上記の質問に対する答えの中核です。

Enterボタンを押してから、Pythonコードから生成されたマシンコードがCPUで実行されるまでに、どのような手順が発生しますか?

コードは解析、分析され、インタープリターに送られます。これはすべて、コンパイラ理論として知られるコンピュータサイエンスの非常に重要な分野に関するものです。コンパイラは、ある言語(ソースコード)から別の言語にコードを翻訳するプログラムです(通常、機械語ですが、高レベルの言語から別の言語に翻訳する「トランスパイラー」は存在します)。これは非常に大規模なトピックであり、長年の調査に費やすことができますが、基本的なバージョンは次のとおりです。

コンパイラは、ソースコードを読み取り、言語の構文規則を適用して、有効なPython(あなたの場合)コードとして意味があるかどうかを判断するルーチンであるパーサーから始まります。そうでない場合、パーサーはエラーをスローし、コンパイラーはベイルアウトしますが、そうであれば、パーサーは抽象構文ツリー(略してAST)と呼ばれるものを出力します。ASTは、各ノードに構文の要素が含まれるツリーデータ構造です。たとえば、あなたが言うならばx = 5、あなたが終わる可能性BinaryExpressionがあるノードoperatorの値=Leftの値ReferenceExpression(x)Rightの値IntegerLiteralExpression(5)。プログラム全体は、このような大きなツリーで表すことができます。

パーサーがASTを生成すると、2番目のフェーズはセマンティック分析になります。平易な英語では、これは「このASTの意味を理解する」ことを意味します。ASTをチェックして、有効な解析であるにもかかわらず(たとえば、3つの引数を使用して1引数の関数を呼び出そうとして)不正な操作を行ったかどうかを判断し、実行するとエラーを発生させます。それ以外の場合は、ASTを分析して編集を実行し、マシンが理解しやすくします。

3番目のフェーズはコード生成です。完全に分析され、簡素化された有効なASTを取得したら、それをジェネレーターにフィードします。ジェネレーターはASTをウォークし、出力言語でコードを生成します。これが完成品です。

Pythonでは、コンパイラではなくインタープリターを使用します。インタプリタは、コンパイラとまったく同じように機能しますが、1つ異なる点があります。コード生成の代わりに、出力をメモリにロードし、システムで直接実行します。(これがどのように起こるかの正確な詳細は、異なる言語と異なるインタープリターの間で大きく異なる可能性があります。)

そして、これはPythonランタイムシステムおよび/またはライブラリとどのように関係していますか?

非常に単純な言語を除くすべての言語には、大部分のユーザーにとって重要であり、何らかの理由でユーザーが自分で実装するのが難しい一連の定義済み関数が付属しています。それらのコードは、サードパーティのライブラリを必要とせずにこれらの関数を呼び出すことができます。(たとえば、print出力を送信するPythonではstdout、独自に実装します!)この一連の関数は、通常、実行時にコードが呼び出すことができる共有ライブラリに収集されます。言語ランタイムライブラリとして、または単に「ランタイム」として。


私のコードは別のプログラム(Pythonランタイムシステム)に送られ、それがすべてを実行し、コードが終了すると(そしてもちろん、クリーンアップ後に)終了しますか?
hgiesel

@hgiesel Pythonの場合、インタープリターはランタイムの一部だと思います。これはすべての言語に当てはまるわけではありません。もちろんですが、インタープリター言語ではかなり一般的です。
メイソンウィーラー

5

標準のPython実装は、バイトコード仮想マシンです。これは、マシンコード(プロセッサのオペコードセットからのオペコード)がプログラムから生成されないことを意味します。オペコードは、VMがバイトコードを解釈する間に仮想マシンに既にコンパイルされているオペコードからのみ選択されます。

そもそもプログラムをバイトコードに変換する方法は少し異なる質問ですが、短い答えは「他の下方言語翻訳のようにコンパイルすること」です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.