Google的新语言"Go" 在其网站上说:
该语言设计为易于分析,无需符号表即可解析
我当然不是这些问题的专家,但我认为符号表是使用变量的语言的所有编译器共同的基本结构,Go显然使用变量.我不明白的是什么?
解析意味着只计算程序结构:将模块分离为语句/声明,将表达式分解为子表达式等.最终得到一个树结构,称为"解析树"或"抽象语法树"( AST).
显然,C++需要一个符号表来进行解析.
本页讨论了C++需要符号表进行解析的一些原因.
当然,解析只是编译的一部分,您需要一个符号表来进行完整的编译.
但是,解析本身在编写分析工具(例如,哪个模块导入哪些模块)时非常有用.因此,简化解析过程意味着编写代码分析工具更容易.
解释和编译绝对需要符号表或类似表.几乎所有语言都是如此.
在C和C++中,即使解析语言也需要符号表.
@Justice是对的.为了进一步扩展,在C中,唯一真正棘手的部分是告诉类型除变量之外.特别是当你看到这个:
T t;
您需要知道这T
是一种合法解析的类型.这是你必须在符号表中查找的东西.只要在解析继续时将类型添加到符号表中,这就相对简单了.您不需要在编译器中做太多额外的工作:T
表中存在或者不存在.
在C++中,事情要复杂得多.存在大量模糊或可能含糊不清的结构.最明显的是这一个:
B::C (c);
除了不清楚B
是a class
,a typedef
还是a之外namespace
,还不清楚是否C
是该类型的类型和c
对象,或者是否C
是c
作为参数的函数(或构造函数)(或者即使C语言)是一个operator()
重载的对象).您需要符号表进行解析,尽管仍然可以足够快地继续,因为符号的类型在符号表中.
当模板进入组合时,事情变得更加糟糕得多.如果C (c)
在模板中,您可能不知道模板的实际定义,如果C是类型或函数/对象.那是因为模板可以声明C
为类型或变量.这意味着你需要的符号表,但你不有一个-你不能有一个,直到模板实际上是宣告.更糟糕的是,仅仅具有符号类型并不一定足够:您可以提出需要符号所代表类型的完整信息的情况,包括大小,对齐和其他机器特定信息.
所有这些都有几个实际效果.我要说的两个最重要的是:
编译速度要快得多.我认为Go的编译速度比C快,而C++在涉及大量模板的情况下编译速度很慢.
您可以编写不依赖于完整编译器的解析器.这对于进行代码分析和重构非常有用.