为什么将代码段称为文本段?


14

包含代码的可执行文件.text部分有时称为部分。在分段存储器体系结构中,映射为代码的段有时称为文本段。Unix错误消息“文本文件正忙”(ETXTBSY)表示“此文件是正在执行的程序”。

是怎样的文字来意味可执行(机器)码

理想的答案是:解释单词及其含义之间的联系;提供该术语的起源或至少历史的引文;给出一些社区使用它的想法。


.text是一个汇编指令。程序集是文本。
奥斯汀·亨利

6
:类似的问题被问和3年前回答StackOverflow上 stackoverflow.com/questions/1282506/...
斯蒂芬ç

@StephenC感谢您的链接。通过谷歌搜索“文本段”很容易找到,我主要尝试使用“文本段”,但是它没有出现。因此,它至少可以追溯到GE时代,但仍不清楚含义是如何建立的。
吉尔(Gilles)'所以

Answers:


5

该术语来自汇编语言。我无法验证词源,但是我猜想是该名称来自于该部分的其他用途。该.data部分表示在执行过程中可以更改的变量,而该部分.text包含在执行过程中不会更改的数据,并根据需要将其放入ROM中。是的,这不仅对代码有用,而且对不变的文本字符串也很有用。这可能是该术语的来源。

要解决格里芬对一等函数的评论,请考虑以下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'])

该可执行代码可以放入ROM。无论您调用多少次,它在程序的整个执行过程中都不会改变counter()。什么的改变是self指针和它的成员变量。那些必须放入.data。当您时return increment,您实际上是在返回一个增量函数对象的新实例。您并不是每次都在动态创建新的可执行代码。代码本身是不可变的,即使指向它的指针不是。

该部分中唯一必须存储的代码.data是由生成的代码eval(),因为编译器或JIT编译器在程序开始时并不知道该代码。但是,即使该代码也是不可变的。如果您更改字符串并eval()再次调用,则不会更改上次调用时的代码eval(),而是在创建全新的代码集。

尽管编程模型可能会使代码感觉像是可变的,但是在处理器指令级别进行实际的自修改代码是危险的,并且很少在诸如进程上下文切换之类的OS伏都教主题之外找到。


那么,当您考虑使用代码也是可变的/第一类时,在使用功能语言时会发生什么呢?
格里芬2012年

1
请参阅我有关一流功能的编辑。
Karl Bielefeldt 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.