web-dev-qa-db-ja.com

コードセクションがテキストセクションと呼ばれるのはなぜですか?

コードを含む実行可能ファイルのセクションは、.textセクションと呼ばれることもあります。セグメント化メモリアーキテクチャでは、コードとしてマップされたセグメントは、テキストセグメントと呼ばれることがあります。 UNIXのエラーメッセージ「テキストファイルがビジー」(ETXTBSY)は、「このファイルは実行中のプログラムです」を意味します。

textはどういう意味でexecutable(machine)codeを意味するようになりましたか?

理想的な答えは次のとおりです。みことばとその意味との関係を説明します。起源の引用、または少なくとも用語の歴史;どのコミュニティがそれを使用しているのかについていくつかのアイデアを提供します。

用語はアセンブリ言語に由来します。語源を確認することはできませんが、名前はセクションの他の使用に由来していると思います。 _.data_セクションは、実行中に変更される可能性のある変数を示しますが、_.text_セクションには、実行中に変更されないデータが含まれているため、ROMに入れることができます。必要。これはコードに役立ちますが、変更されないテキスト文字列にも役立ちます。それがおそらくこの用語の由来です。

ファーストクラス関数に関するグリフィンのコメントに対処するには、次の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_を実行すると、実際にはインクリメント関数オブジェクトの新しいインスタンスが返されます。毎回新しい実行可能コードを動的に作成しているわけではありません。コードへのポインタが不変であっても、コード自体は不変です。

mustが_.data_セクションに格納される唯一のコードは、eval()によって生成されたコードです。これは、コンパイラの開始時にコンパイラまたはJITコンパイラが認識していないためです。プログラム。ただし、そのコードでさえ不変です。文字列を変更してeval()を再度呼び出した場合、以前にeval()を呼び出したときのコードは変更されず、まったく新しいコードセットが作成されます。

プログラミングモデルはコードが変更可能であるかのように感じるかもしれませんが、プロセッサの命令レベルでの実際の自己変更コードは危険であり、プロセスコンテキストの切り替えなどのOSブードゥートピックの外ではほとんど見つかりません。

5
Karl Bielefeldt