Termin pochodzi z języka asemblera. Nie mogę zweryfikować etymologii, ale domyślam się, że nazwa pochodzi od innego zastosowania tej sekcji. Podczas gdy .data
sekcja oznacza zmienne, które mogą się zmieniać w trakcie wykonywania, .text
sekcja zawiera dane, które nie zmieniają się podczas wykonywania, co pozwala w razie potrzeby umieścić je w pamięci ROM. To sprawia, że jest przydatny do kodu, tak, ale także użyteczny dla ciągów tekstu, które się nie zmieniają. Prawdopodobnie stąd pochodzi ten termin.
Aby odpowiedzieć na komentarz Griffina na temat funkcji pierwszej klasy, rozważ następujący kod w języku Python 3:
def counter():
x = 0
def increment(y):
nonlocal x
x += y
print(x)
return increment
Kod, który faktycznie wykonujesz increment
, wygląda wewnętrznie na coś takiego:
self.func_dict['x'] += y
print(self.func_dict['x'])
Ten kod wykonywalny można umieścić w pamięci ROM. Nigdy się nie zmienia podczas wykonywania programu, bez względu na to, ile razy dzwonisz counter()
. Co robi zmian jest self
wskaźnik i jego zmienne składowe. Te muszą być włożone .data
. Gdy tak return increment
naprawdę zwracasz nową instancję obiektu funkcji przyrostowej. Za każdym razem nie tworzysz dynamicznie nowego kodu wykonywalnego. Sam kod jest niezmienny, mimo że wskaźnik do niego nie jest.
Jedyny kod, który musi być przechowywany w .data
sekcji, to kod wygenerowany przez eval()
, ponieważ nie jest on znany kompilatorowi ani kompilatorowi JIT na początku programu. Jednak nawet ten kod jest niezmienny. Jeśli zmienisz ciąg i zadzwonisz eval()
ponownie, nie zmieniasz kodu z poprzedniego wywołania eval()
, tworzysz zupełnie nowy zestaw kodów.
Chociaż model programowania może sprawiać wrażenie, że kod jest zmienny, faktyczny samodmodyfikujący się kod na poziomie instrukcji procesora jest niebezpieczny i rzadko można go znaleźć poza tematami voodoo systemu operacyjnego, takimi jak przełączanie kontekstu procesu.
.text
to dyrektywa dotycząca montażu. Zgromadzenie jest tekstem.