aの概念runtime library
、特にPythonの概念を理解するのに問題があります。それで、私はいくつかのhello world pythonプログラムを書き、それを実行するつもりなので、を書きpython ./hello_world.py
ます。
Enterボタンを押してから、Pythonコードから生成されたマシンコードがCPUで実行されるまでに、どのような手順が発生しますか?そして、これはPythonランタイムシステムおよび/またはライブラリとどのように関係していますか?
aの概念runtime library
、特にPythonの概念を理解するのに問題があります。それで、私はいくつかのhello world pythonプログラムを書き、それを実行するつもりなので、を書きpython ./hello_world.py
ます。
Enterボタンを押してから、Pythonコードから生成されたマシンコードがCPUで実行されるまでに、どのような手順が発生しますか?そして、これはPythonランタイムシステムおよび/またはライブラリとどのように関係していますか?
回答:
多種多様であるため、すべての真面目で最新のプログラミング言語が共有する共通の概念がいくつかあります。そのうちの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
、独自に実装します!)この一連の関数は、通常、実行時にコードが呼び出すことができる共有ライブラリに収集されます。言語ランタイムライブラリとして、または単に「ランタイム」として。