Pourquoi la section de code est-elle appelée section de texte?

14

La section d'un exécutable qui contient du code est parfois appelée .textsection. Dans les architectures de mémoire segmentée, un segment mappé en tant que code est parfois appelé segment de texte. Le message d'erreur Unix «fichier texte occupé» ( ETXTBSY) signifie «ce fichier est un programme en cours d'exécution».

Comment le texte est-il devenu un code exécutable (machine) ?

Une réponse idéale serait: expliquer le lien entre le mot et sa signification; fournir une citation pour l'origine ou au moins l'histoire du terme; donnez une idée des communautés qui l'utilisent.

Gilles 'SO- arrête d'être méchant'
la source
.textest une directive d'assemblage. L'assemblage est du texte.
Austin Henley
6
Il y a 3 ans, une question similaire a été posée et répondue sur StackOverflow: stackoverflow.com/questions/1282506/…
Stephen C
@StephenC Merci pour le lien. Facile à trouver en recherchant «segment de texte» sur Google, j'avais essayé principalement avec «section de texte» et cela ne s'est pas produit. Donc, cela remonte au moins à l'époque de GE, mais on ne sait toujours pas comment le sens a été établi.
Gilles 'SO- arrête d'être méchant'

Réponses:

5

Le terme vient du langage d'assemblage. Je ne peux pas vérifier l'étymologie, mais je suppose que le nom vient de l'autre utilisation de la section. Alors que la .datasection dénote des variables qui peuvent changer au cours de l'exécution, la .textsection contient des données qui ne changent pas pendant l'exécution, ce qui permet de les mettre dans la ROM si nécessaire. Cela le rend utile pour le code, oui, mais le rend également utile pour les chaînes de texte qui ne changent pas. C'est probablement de là que vient le terme.

Pour répondre au commentaire de Griffin sur les fonctions de première classe, considérez le code python 3 suivant:

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

Le code que vous exécutez réellement incrementfinit par ressembler en interne à quelque chose comme:

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

Ce code exécutable peut être placé dans la ROM. Il ne change jamais pendant l'exécution du programme, quel que soit le nombre de fois que vous appelez counter(). Ce qui change, c'est le selfpointeur et ses variables membres. Il faut les mettre .data. Lorsque vous return increment, vous renvoyez en fait une nouvelle instance d'un objet de fonction d'incrémentation. Vous ne créez pas dynamiquement de nouveau code exécutable à chaque fois. Le code lui-même est immuable même si son pointeur ne l'est pas.

Le seul code qui doit être stocké dans la .datasection est celui généré par eval(), car il n'est pas connu du compilateur ou du compilateur JIT au début du programme. Cependant, même ce code est immuable. Si vous modifiez la chaîne et appelez à eval()nouveau, vous ne modifiez pas le code de la dernière fois que vous avez appelé eval(), vous créez un tout nouvel ensemble de code.

Bien que le modèle de programmation puisse donner l'impression que le code est modifiable, le code d'auto-modification réel au niveau des instructions du processeur est dangereux et rarement trouvé en dehors des sujets vaudous du système d'exploitation tels que le changement de contexte de processus.

Karl Bielefeldt
la source
Alors, que se passe-t-il lorsque vous utilisez un langage fonctionnel étant donné que le code est également modifiable / 1ère classe?
Griffin
1
Voir mon montage sur les fonctions de première classe.
Karl Bielefeldt