この用語はアセンブリ言語に由来します。語源を確認することはできませんが、私の推測では、この名前はセクションの他の使用法に由来していると思われます。.data
セクションは実行中に変化する可能性のある変数を示しますが、セクションには実行.text
中に変化しないデータが含まれており、必要に応じてROMに入れることができます。そうすると、コードにとっては便利ですが、変更されないテキストの文字列にとっても便利です。それはおそらく用語の由来です。
ファーストクラス関数に関するGriffinのコメントに対処するには、次のPython 3コードを検討してください。
def counter():
x = 0
def increment(y):
nonlocal x
x += y
print(x)
return increment
実際に実行するコードは、increment
内部的に次のようになります。
self.func_dict['x'] += y
print(self.func_dict['x'])
その実行可能コードはROMに入れることができます。呼び出し回数に関係なく、プログラムの実行中に変更されることはありませんcounter()
。何ん変更することでself
ポインタとそのメンバ変数。それらを入れる必要があります.data
。の場合return increment
、実際にはインクリメント関数オブジェクトの新しいインスタンスを返しています。毎回新しい実行可能コードを動的に作成しているわけではありません。コードへのポインタがそうでなくても、コード自体は不変です。
セクションに格納する必要があるコードは、プログラムの開始時にコンパイラーまたはJITコンパイラーに.data
認識されeval()
ないため、によって生成されるコードのみです。ただし、そのコードでさえ不変です。文字列を変更してeval()
再度呼び出すと、前回呼び出したときのコードは変更されずeval()
、まったく新しいコードセットが作成されます。
プログラミングモデルは、コードが変更可能であるように感じるかもしれませんが、プロセッサ命令レベルでの実際の自己修正コードは危険であり、プロセスコンテキストスイッチングなどのOSブードゥートピック以外ではめったに見つかりません。
.text
アセンブリディレクティブです。アセンブリはテキストです。