归根结底,变量标识符是完全没有必要的吗?
Are variable identifiers totally needless, at the end of the day?
我花了很多时间研究 TOC 和编译器设计,虽然还没有完成,但我对这些概念感到满意table。另一方面,我对汇编和机器代码的了解非常浅,而且我总是用 desire/need 来连接两侧(代码的 HLL 和 LLL 表示),因为我正在学习 C++,付出了很多注意性能和优化讨论。
C++ 是一种静态类型语言:
我的问题是:当我们的变量在代码语句中写为表达式时,所有这些变量(以及其他具有标识符的实体)是否在运行时变成了寻址虚拟内存位置的指令(对于静态和全局变量)和与局部变量的堆栈地址相关的寻址?
我的意思是,在包括语义和语法验证在内的成功编译之后,在运行时将数据作为目标内存字节的保证实体而不考虑任何标识符或任何检查来处理是不明智的,符号 table 不需要了?
如果我的问题似乎是由于缺乏学习努力而导致的问题类型(我希望不是这样),请告诉我这一点,并告诉我在哪里阅读。如果是这样的话,那是老实说,因为我现在专注于 C++,还没有机会对低级语言有充分的了解,我提前为此道歉。
你说得对。一旦编译为机器代码,就不再有任何变量标识符(或变量类型)的概念。它只是某个位置的字节。 哪个位置是由编译器(在编译时)根据变量名确定的,或者在全局变量的情况下由链接器(在链接时)确定的。
当然,出于调试目的,保留标识符等信息可能很有用。这正是 "compilation with debug information" 的意思:当您这样做时,编译器将以某种方式将(冗余)标识符嵌入到生成的代码中,以便调试器可以访问它们。或者将它们放在一个单独的文件中;具体取决于调试信息的格式。
是的,主要是。有一些细节将使标识符不仅仅是地址或堆栈偏移量。
首先我们在 C++ 中有 RTTI,这意味着在运行时至少类型的名称可能仍然可用。例如:
const std::type_info &info = typeid(*ptr_interface);
std::cout << info.name() << std::endl;
将打印 *ptr_interface
属于的任何类型的名称。
其次,由于程序的 linked 方式,目标文件中的符号可能仍存在于执行映像中。例如,您有 linux 内核使用它,因为它可以生成包括函数名称在内的堆栈回溯。它还使用函数名称的知识,以便能够加载和 link 模块。 Gnu C 库中存在类似的功能,与 link 编辑时相比,它能够在堆栈跟踪中检索函数名称。
在正常情况下,虽然代码不会受到变量原始名称的影响(但编译器当然会发出适合变量类型的代码)。
我花了很多时间研究 TOC 和编译器设计,虽然还没有完成,但我对这些概念感到满意table。另一方面,我对汇编和机器代码的了解非常浅,而且我总是用 desire/need 来连接两侧(代码的 HLL 和 LLL 表示),因为我正在学习 C++,付出了很多注意性能和优化讨论。
C++ 是一种静态类型语言:
我的问题是:当我们的变量在代码语句中写为表达式时,所有这些变量(以及其他具有标识符的实体)是否在运行时变成了寻址虚拟内存位置的指令(对于静态和全局变量)和与局部变量的堆栈地址相关的寻址?
我的意思是,在包括语义和语法验证在内的成功编译之后,在运行时将数据作为目标内存字节的保证实体而不考虑任何标识符或任何检查来处理是不明智的,符号 table 不需要了?
如果我的问题似乎是由于缺乏学习努力而导致的问题类型(我希望不是这样),请告诉我这一点,并告诉我在哪里阅读。如果是这样的话,那是老实说,因为我现在专注于 C++,还没有机会对低级语言有充分的了解,我提前为此道歉。
你说得对。一旦编译为机器代码,就不再有任何变量标识符(或变量类型)的概念。它只是某个位置的字节。 哪个位置是由编译器(在编译时)根据变量名确定的,或者在全局变量的情况下由链接器(在链接时)确定的。
当然,出于调试目的,保留标识符等信息可能很有用。这正是 "compilation with debug information" 的意思:当您这样做时,编译器将以某种方式将(冗余)标识符嵌入到生成的代码中,以便调试器可以访问它们。或者将它们放在一个单独的文件中;具体取决于调试信息的格式。
是的,主要是。有一些细节将使标识符不仅仅是地址或堆栈偏移量。
首先我们在 C++ 中有 RTTI,这意味着在运行时至少类型的名称可能仍然可用。例如:
const std::type_info &info = typeid(*ptr_interface);
std::cout << info.name() << std::endl;
将打印 *ptr_interface
属于的任何类型的名称。
其次,由于程序的 linked 方式,目标文件中的符号可能仍存在于执行映像中。例如,您有 linux 内核使用它,因为它可以生成包括函数名称在内的堆栈回溯。它还使用函数名称的知识,以便能够加载和 link 模块。 Gnu C 库中存在类似的功能,与 link 编辑时相比,它能够在堆栈跟踪中检索函数名称。
在正常情况下,虽然代码不会受到变量原始名称的影响(但编译器当然会发出适合变量类型的代码)。