当前位置:  开发笔记 > 编程语言 > 正文

Go中没有符号表?

如何解决《Go中没有符号表?》经验,为你挑选了3个好方法。

Google的新语言"Go" 在其网站上说:

该语言设计为易于分析,无需符号表即可解析

我当然不是这些问题的专家,但我认为符号表是使用变量的语言的所有编译器共同的基本结构,Go显然使用变量.我不明白的是什么?



1> hasen..:

解析意味着只计算程序结构:将模块分离为语句/声明,将表达式分解为子表达式等.最终得到一个树结构,称为"解析树"或"抽象语法树"( AST).

显然,C++需要一个符号表来进行解析.

本页讨论了C++需要符号表进行解析的一些原因.

当然,解析只是编译的一部分,您需要一个符号表来进行完整的编译.

但是,解析本身在编写分析工具(例如,哪个模块导入哪些模块)时非常有用.因此,简化解析过程意味着编写代码分析工具更容易.



2> yfeldblum..:

解释和编译绝对需要符号表或类似表.几乎所有语言都是如此.

在C和C++中,即使解析语言也需要符号表.


@Dinah:慢慢再读一遍,再读一遍这个答案.他们并不矛盾.

3> quark..:

@Justice是对的.为了进一步扩展,在C中,唯一真正棘手的部分是告诉类型除变量之外.特别是当你看到这个:

T t;

您需要知道这T是一种合法解析的类型.这是你必须在符号表中查找的东西.只要在解析继续时将类型添加到符号表中,这就相对简单了.您不需要在编译器中做太多额外的工作:T表中存在或者不存在.

在C++中,事情复杂得多.存在大量模糊或可能含糊不清的结构.最明显的是这一个:

B::C (c);

除了不清楚B是a class,a typedef还是a之外namespace,还不清楚是否C是该类型的类型和c对象,或者是否Cc作为参数的函数(或构造函数)(或者即使C语言)是一个operator()重载的对象).您需要符号表进行解析,尽管仍然可以足够快地继续,因为符号的类型在符号表中.

当模板进入组合时,事情变得更加糟糕得多.如果C (c)在模板中,您可能不知道模板的实际定义,如果C是类型或函数/对象.那是因为模板可以声明C类型或变量.这意味着你需要的符号表,但你不一个-你不能有一个,直到模板实际上是宣告.更糟糕的是,仅仅具有符号类型并不一定足够:您可以提出需要符号所代表类型的完整信息的情况,包括大小,对齐和其他机器特定信息.

所有这些都有几个实际效果.我要说的两个最重要的是:

编译速度要快得多.我认为Go的编译速度比C快,而C++在涉及大量模板的情况下编译速度很慢.

您可以编写不依赖于完整编译器的解析器.这对于进行代码分析和重构非常有用.

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有