Термин происходит от языка ассемблера. Я не могу проверить этимологию, но я предполагаю, что название происходит от другого использования раздела. Принимая во внимание, что .data
раздел обозначает переменные, которые могут изменяться в ходе выполнения, .text
раздел содержит данные, которые не изменяются во время выполнения, что позволяет помещать их в ПЗУ при необходимости. Это делает его полезным для кода, да, но также делает его полезным для строк текста, которые не меняются. Это, вероятно, откуда пришел термин.
Чтобы ответить на комментарий Гриффина о функциях первого класса, рассмотрим следующий код на 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'])
Этот исполняемый код может быть помещен в ПЗУ. Он никогда не меняется на протяжении всего выполнения программы, независимо от того, сколько раз вы звоните counter()
. Что делает изменение является self
указателем и его переменные - члены. Те должны быть помещены в .data
. Когда вы return increment
, вы на самом деле возвращаете новый экземпляр объекта функции приращения. Вы не создаете динамически новый исполняемый код каждый раз. Сам код является неизменным, хотя указатель на него нет.
Единственный код, который должен храниться в .data
разделе, - это код, созданный eval()
, поскольку он не известен компилятору или JIT-компилятору в начале программы. Однако даже этот код является неизменным. Если вы измените строку и позвоните eval()
снова, вы не измените код по сравнению с предыдущим вызовом , вы создаете eval()
новый набор кода.
Хотя программная модель может показаться, что код изменчив, но самодифицирующийся код на уровне команд процессора опасен и редко встречается вне тем OS voodoo, таких как переключение контекста процесса.
.text
это директива по сборке. Сборка текстовая.