Dlaczego sekcja kodu nazywa się sekcją tekstową?

14

Sekcja pliku wykonywalnego zawierająca kod jest czasem nazywana .textsekcją. W architekturach pamięci podzielonej na segmenty segment odwzorowany jako kod jest czasami nazywany segmentem tekstowym. Komunikat o błędzie unixa „plik tekstowy zajęty” ( ETXTBSY) oznacza „ten plik jest wykonywanym programem”.

W jaki sposób tekst oznaczał kod wykonywalny (maszynowy) ?

Idealna odpowiedź: wyjaśniłaby związek między słowem a jego znaczeniem; przytoczyć pochodzenie lub przynajmniej historię tego terminu; dać wyobrażenie o tym, które społeczności go używają.

Gilles „SO- przestań być zły”
źródło
.textto dyrektywa dotycząca montażu. Zgromadzenie jest tekstem.
Austin Henley
6
Podobne pytanie zostało zadane i udzielono odpowiedzi na StackOverflow 3 lata temu: stackoverflow.com/questions/1282506/…
Stephen C
@StephenC Dzięki za link. Łatwy do znalezienia, przeglądając „segment tekstowy”, próbowałem głównie z „sekcją tekstową” i nie pojawił się. Tak więc pochodzi przynajmniej z czasów GE, ale wciąż nie jest jasne, w jaki sposób ustalono znaczenie.
Gilles „SO- przestań być zły”

Odpowiedzi:

5

Termin pochodzi z języka asemblera. Nie mogę zweryfikować etymologii, ale domyślam się, że nazwa pochodzi od innego zastosowania tej sekcji. Podczas gdy .datasekcja oznacza zmienne, które mogą się zmieniać w trakcie wykonywania, .textsekcja 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 selfwskaźnik i jego zmienne składowe. Te muszą być włożone .data. Gdy tak return incrementnaprawdę 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 .datasekcji, 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.

Karl Bielefeldt
źródło
Co się dzieje, gdy używasz funkcjonalnego języka, biorąc pod uwagę, że kod jest także zmienny / 1. klasa?
Griffin
1
Zobacz moją edycję na temat funkcji pierwszej klasy.
Karl Bielefeldt