Почему раздел кода называется текстовым разделом?


14

Раздел исполняемого файла, который содержит код, иногда называется .textразделом. В архитектурах с сегментированной памятью сегмент, отображаемый как код, иногда называют текстовым сегментом. Unix сообщение об ошибке «text file busy» ( ETXTBSY) означает «этот файл - программа, которая выполняется».

Как текст стал означать исполняемый (машинный) код ?

Идеальный ответ: объяснил бы связь между словом и его значением; предоставить ссылку на происхождение или хотя бы историю этого термина; дать некоторое представление о том, какие сообщества используют его.


.textэто директива по сборке. Сборка текстовая.
Остин Хенли,

6
Аналогичный вопрос был задан и дан ответ на StackOverflow 3 года назад: stackoverflow.com/questions/1282506/…
Стивен C

@StephenC Спасибо за ссылку. Легко найти, прибегая к помощи «текстового сегмента», я пробовал в основном «текстовый раздел», но он не появился. Так что это относится, по крайней мере, ко дням Дженерал Электрик, но все еще не ясно, как значение было установлено.
Жиль "ТАК - перестать быть злым"

Ответы:


5

Термин происходит от языка ассемблера. Я не могу проверить этимологию, но я предполагаю, что название происходит от другого использования раздела. Принимая во внимание, что .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, таких как переключение контекста процесса.


Так что же происходит, когда вы используете функциональный язык, учитывая, что код также является изменяемым / 1-го класса?
Гриффин

1
Смотрите мои правки о функциях первого класса.
Карл Билефельдт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.