Warum wird der Codeabschnitt als Textabschnitt bezeichnet?

14

Der Abschnitt einer ausführbaren Datei, der Code enthält, wird manchmal als .textAbschnitt bezeichnet. In segmentierten Speicherarchitekturen wird ein als Code abgebildetes Segment manchmal als Textsegment bezeichnet. Die Unix-Fehlermeldung "text file busy" ( ETXTBSY) bedeutet "Diese Datei ist ein Programm, das gerade ausgeführt wird".

Wie kam Text kommen , um meine ausführbare Datei (Maschine) Code ?

Eine ideale Antwort würde: den Zusammenhang zwischen dem Wort und seiner Bedeutung erklären; Geben Sie einen Hinweis auf die Herkunft oder zumindest die Geschichte des Begriffs. geben Sie eine Vorstellung davon, welche Communities es verwenden.

Gilles 'SO - hör auf böse zu sein'
quelle
.textist eine Montageanweisung. Versammlung ist Text.
Austin Henley
6
Eine ähnliche Frage wurde vor 3 Jahren auf StackOverflow gestellt
Stephen C
@StephenC Danke für den Link. Leicht zu finden, indem ich "Textsegment" google. Ich habe es hauptsächlich mit "Textabschnitt" versucht und es ist nicht aufgetaucht. Es geht also zumindest auf die Zeit von GE zurück, aber es ist immer noch nicht klar, wie die Bedeutung festgestellt wurde.
Gilles 'SO- hör auf böse zu sein'

Antworten:

5

Der Begriff stammt aus der Assemblersprache. Ich kann die Etymologie nicht verifizieren, aber ich vermute, dass der Name von der anderen Verwendung des Abschnitts stammt. Während der .dataAbschnitt Variablen kennzeichnet, die sich während der Ausführung ändern können, .textenthält der Abschnitt Daten, die sich während der Ausführung nicht ändern, sodass sie bei Bedarf in das ROM gestellt werden können. Das macht es nützlich für Code, ja, aber es macht es auch nützlich für Textfolgen, die sich nicht ändern. Das ist wahrscheinlich, woher der Begriff kam.

Beachten Sie den folgenden Python 3-Code, um Griffins Kommentar zu erstklassigen Funktionen zu beantworten:

def counter():
    x = 0
    def increment(y):
        nonlocal x
        x += y
        print(x)
    return increment

Der Code, den Sie tatsächlich ausführen increment, sieht intern ungefähr so ​​aus:

self.func_dict['x'] += y
print(self.func_dict['x'])

Dieser ausführbare Code kann in das ROM geschrieben werden. Es ändert sich nie während der Ausführung des Programms, egal wie oft Sie aufrufen counter(). Was sich ändert, sind der selfZeiger und seine Mitgliedsvariablen. Die müssen rein .data. Wenn Sie dies tun return increment, geben Sie tatsächlich eine neue Instanz eines Inkrementfunktionsobjekts zurück. Sie erstellen nicht jedes Mal dynamisch neuen ausführbaren Code. Der Code selbst ist unveränderlich, obwohl der Zeiger nicht darauf ist.

Der einzige Code, der in dem Abschnitt gespeichert werden muss , .dataist der von generierte Code eval(), da er dem Compiler oder JIT-Compiler beim Start des Programms nicht bekannt ist. Allerdings ist auch dieser Code unveränderlich. Wenn Sie die Zeichenfolge ändern und eval()erneut aufrufen , ändern Sie den Code nicht gegenüber dem vorherigen Aufruf , sondern eval()erstellen eine ganz neue Codemenge.

Obwohl das Programmiermodell den Eindruck erweckt, dass Code veränderlich ist, ist der tatsächliche selbstmodifizierende Code auf Prozessoranweisungsebene gefährlich und wird außerhalb von OS Voodoo-Themen wie dem Umschalten des Prozesskontexts selten gefunden.

Karl Bielefeldt
quelle
Was passiert also, wenn Sie eine funktionale Sprache verwenden, wenn Sie bedenken, dass der Code auch wandelbar ist / 1. Klasse?
Griffin
1
Siehe meine Bearbeitung über erstklassige Funktionen.
Karl Bielefeldt