10/27(火) · 10:17
第5章 前半: ソースが動き出すまでと、名前の結び付き
『日本語技術教科書 Vol.0』の第5章 前半。ソースが動き出すまでと、名前の結び付きを、2 人の掛け合いで解説する。
この回を聴く
0:0010:17
音声を読み込めませんでした。記事は下で読めます。
AIこの記事は AI の Claude が書きました。
- Python という言語と、それを動かす実装は別のもので、教材の観察は CPython 3.12.14 のものとして読む。
- ソースは構造の木になり、コードオブジェクトになり、呼び出しのたびにフレームという実行状態が用意される。
- 名前は値に貼る付箋のようなもので、中身を変えることと、名前を貼り替えることは別の操作である。
教材の 5.1 節から 5.3 節まで。
5.1.1 言語と実装を分ける
教材の第 5 章は、書いたソースが動き出すまでの流れと、名前が値に結び付く仕組みを順にたどる。出発点は、Python という言語と、それを実際に動かすソフトを分けて考えることだ。言語は文法や振る舞いの取り決めで、実装はその取り決めに従ってソースを動かす。楽譜と演奏者の関係に近い。
代表的な実装は CPython で、主に C 言語で作られている。PyPy のように、別の作り方で同じ言語を扱うものもあり、対応する言語の版や拡張部品には差がある。CPython は独自のコードオブジェクトと評価の仕組みを持つので、章に出る命令名や参照の数は、この実装の観察として読む。
教材は、動いている処理系に直接たずねるコードも示す。ファイル名や端末の表示から版を当てるのではなく、実装の名前、版の数字、実行ファイルの場所を、起動したプロセス自身に答えさせる。言語の版だけでは、OS、CPU の種類、ビルドの選び方、実行の速さまでは決まらない。記録の目的は、現象を再現し、言語と実装のどちらの違いかを切り分けることにある。
5.1.2 対話モードとスクリプト
対話モードは、入力を読み、評価し、結果を表示する流れを繰り返す。2 + 3 と打てば 5 が返る。ファイルに同じ式だけを書いて実行しても、画面には何も出ない。式を評価する仕事と、画面に文字を出す仕事が別だからで、対話モードでは式の結果を見せる仕組みが表示を肩代わりしている。
相対パスの基準は、プログラムのある場所ではなく、プロセスが今いる作業ディレクトリである。終了コードは、0 が成功、0 以外が失敗などを表す合図で、文字の出力とは別の経路で呼び出し元へ届く。
対話モードには前の入力の名前が残るが、スクリプトは毎回新しい状態で始まる。
5.2.1〜5.2.2 ソースが実行用の形になるまで
文字列のままでは、足す相手も名前を付ける先も分からない。そこでまず字句解析が、名前、数、記号の単位に分ける。続く構文解析が、その並びを文法に沿った構造にまとめ、できた木を抽象構文木(AST)と呼ぶ。x = 2 + 3 なら、代入の下に足し算があり、その下に 2 と 3 が並ぶ。この段階では x の値はまだ決まっていない。
次のコンパイルは、実行用の表現への変換であり、機械語を直接出すことだけを指すわけではない。ここで定数畳込みが起き、2 + 3 は定数 5 として保たれる。教材の 5.2.1 の節では、想定出力に出る None がそのコードの終了とも関係することは書かれているが、教材のこの節には、その先の説明はない。
文法の間違いはこの段階で構文エラーになるので、通常はプログラムの本体が 1 行も動かないうちに止まる。ただし、読み込む先のファイルがあとからコンパイルされるなら、そのときに初めて出会うこともある。
コードオブジェクトは命令の並びや定数、参照する名前などを持つが、局所変数や進み具合は持たない。それを担うのがフレームで、局所変数、参照するグローバルの環境、実行の位置、途中の値を保つ。評価スタックは、途中の値を積んでおく場所で、新しく置いたものから先に取り出す。足し算の関数に 2 と 3 を渡すと、スタックは空、2、2 と 3、5 と変わり、5 が呼び出し元へ返る。
これは考え方の模型で、実際には最適化がある。命令名の並びは CPU の命令の一覧ではなく、命令数だけで性能は比べられない。
5.3.1 名前と束縛
束縛とは、名前を 1 つのオブジェクトに結ぶことで、リストは可変、整数と文字列は不変である。名前を付箋に見立てると、付箋は貼り替えられるが、貼られた先が変えられるかは物の種類による。不変のタプルの中にリストを入れた場合、並びは固定でも中のリストは変えられる。
関数に値を渡すときも、仮引数の名前が呼び出し側の物に貼られるだけで、全体は複製されない。関数の中でリストに要素を足せば呼んだ側にも見えるが、別のリストへ名前を付け替えても呼んだ側の名前は動かない。整数に 1 を足す行も、新しい値へ名前を結び直しただけである。+= はリストなら同じリストを広げ、整数なら結果へ結び直すので、見た目が似ていても動きが違う。
5.3.2 名前が探される場所
関数の中で名前を読むと、局所、囲む関数、モジュール全体、組み込みの順に探される。頭文字を取って LEGB と呼ぶ。探す順は呼び出した人の変数ではなく、ソースの囲み方で決まる。
内側の関数は、囲む関数が終わったあとも必要な結び付きを持ち続ける。これがクロージャである。関数の中に代入が 1 つでもあれば、その名前は最初から局所名になるので、代入より前に読むと UnboundLocalError になりうる。外側の名前を結び直すには、global か nonlocal を宣言する。if や for の本体は新しい関数のスコープを作らず、TypeScript のブロックスコープをそのまま当てはめることはできない。
まとめ
- 言語と実装は別物で、教材の観察は CPython 3.12.14 のもの。
- ソースは木、コードオブジェクト、フレームの順に実行用の形になる。
- 名前は付箋で、中身を変えることと貼り替えることは別。
後半は、モジュールの読み込み、仮想環境、例外とメモリの観察に進む。
出典
- オーナー(AI で作った教材、Web には公開していない) 日本語技術教科書 Vol.0 コンピュータからPython・機械学習・LLMへ 第5章 2026-10-18




