runtime library
の概念、特にPython 1つ)の概念を理解するのにいくつかの問題があります。そのため、hello world pythonプログラムをいくつか記述し、それを実行するため、python ./hello_world.py
と記述します。
Enterボタンを押すと、私のpython CPUで実行されているコードから生成されたマシンコード)の間にどのようなステップが発生しますか?これはPythonとどのように関連しますか?ランタイムシステムおよび/またはライブラリ?
多様性のために、すべての真剣で現代的なプログラミング言語が共有する共通の概念がいくつかあります。そのうちの2つは、上記の質問に対する回答の中核です。
Enterボタンを押すと、CPUで実行されているpythonコードから生成されたマシンコードの間にどのようなステップが発生しますか?
コードが解析、分析され、インタープリターに送られます。これは、コンパイラ理論として知られるコンピュータサイエンスの非常に重要な領域についてのすべてです。コンパイラは、ある言語(ソースコード)から別の言語(通常はマシンコードですが、1つの高級言語から別の言語に翻訳する「トランスパイラ」が存在します)にコードを翻訳するプログラムです。これは、何年もかけて調査することができる非常に大きなトピックですが、基本的なバージョンは次のとおりです。
コンパイラはparserで始まります。これは、ソースコードを読み取り、言語の構文規則を適用して、有効なPythonとして意味があるかどうかを判断するルーチンです。ケース)コード。含まれていない場合、パーサーはエラーをスローしてコンパイラーはベイルアウトしますが、含まれている場合、パーサーは抽象構文ツリー、またはASTと呼ばれるものを出力します。 ASTは、ツリーデータ構造で、各ノードには構文の要素が含まれています。たとえば、_x = 5
_と言うと、BinaryExpression
ノードのoperator
値が_=
_、Left
値がReferenceExpression(x)
およびRight
の値IntegerLiteralExpression(5)
。プログラム全体は、このような大きなツリーで表すことができます。
パーサーがASTを生成すると、2番目のフェーズはsemantic analysisになります。平易な英語では、これは「これを理解することですASTの意味」。 ASTをチェックして、有効な解析であるにもかかわらず(たとえば、1つの引数を持つ関数を3つの引数で呼び出そうとして)違法な操作を行ったかどうかを判断し、実行するとエラーが発生します。それ以外の場合は、ASTを分析し、それを編集して、マシンが理解しやすくします。
3番目のフェーズはコード生成です。完全に分析され、単純化された有効なASTを取得したら、それをジェネレーターにフィードします。ジェネレーターはASTをウォークし、出力言語でコードを生成します。これが完成品です。
Pythonでは、コンパイラーではなくインタープリターを使用します。インタープリターはコンパイラーとまったく同じように機能しますが、1つ異なる点があります。コードを生成する代わりに、出力をメモリー内にロードし、システム上で直接実行します。 (これがどのように行われるかについての正確な詳細は、言語やインタープリターによって大きく異なります。)
そして、これはPythonランタイムシステムやライブラリとどのように関係していますか?
最も単純な言語を除くすべての言語には、大部分のユーザーにとって重要であり、ユーザーが何らかの理由で自分で実装するのが難しい一連の定義済み関数が付属しています。彼らのコードは、サードパーティのライブラリを必要とせずにこれらの関数を呼び出すことができます。 (たとえば、Pythonにはprint
があり、出力をstdout
に送信します。それを自分で実装してがんばってください!)この関数のセットは、通常、コードが実行時に呼び出すことができる共有ライブラリ。これが言語ランタイムライブラリ、または単に「ランタイム」と呼ばれる理由です。
標準のPython実装はバイトコード仮想マシンです。つまり、machine code(プロセッサーのオペコードからのオペコードset)is notプログラムから生成されます。オペコードは、仮想マシンにすでにコンパイルされているオペコードからのみ選択されています一方、VMはバイトコードを解釈します。
そもそもプログラムがどのようにバイトコードに変換されるかは少し異なりますが、簡単な答えは「他の言語の翻訳と同じようにコンパイルすること」です。