Термін походить від асемблерної мови. Я не можу перевірити етимологію, але я здогадуюсь, що назва походить від іншого використання розділу. Тоді як .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()
, ви створюєте цілий новий набір коду.
Хоча модель програмування може викликати відчуття, що код є змінним, фактичний самомодифікуючий код на рівні інструкцій процесора є небезпечним і рідко зустрічається за межами тем вуду ОС, як переключення контексту процесу.
.text
- це директива складання. Збірка - це текст.