Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 围棋中没有符号表?_Go_Symbol Tables - Fatal编程技术网

Go 围棋中没有符号表?

Go 围棋中没有符号表?,go,symbol-tables,Go,Symbol Tables,谷歌的新语言“Go”说: 该语言被设计为易于分析,并且可以在没有符号表的情况下进行解析 我当然不是这方面的专家,但我认为符号表是所有使用变量的语言的编译器所共有的基本构造,Go显然使用变量。我不明白什么?解释和编译绝对需要符号表或类似工具。这几乎适用于所有语言 在C和C++中,即使解析语言也需要符号表。 解析意味着只需解析程序结构:将模块分成语句/声明,将表达式分解为子表达式等。最后,你得到一个树结构,称为“解析树”或“抽象语法树”(AST)。 显然,C++需要符号表进行解析。 本页讨论了一些原

谷歌的新语言“Go”说:

该语言被设计为易于分析,并且可以在没有符号表的情况下进行解析


我当然不是这方面的专家,但我认为符号表是所有使用变量的语言的编译器所共有的基本构造,Go显然使用变量。我不明白什么?

解释和编译绝对需要符号表或类似工具。这几乎适用于所有语言


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

解析意味着只需解析程序结构:将模块分成语句/声明,将表达式分解为子表达式等。最后,你得到一个树结构,称为“解析树”或“抽象语法树”(AST)。 显然,C++需要符号表进行解析。 本页讨论了一些原因

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


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

@Justice是正确的。对此进行一点扩展,在C语言中,唯一实际棘手的部分是区分类型和变量。特别是当您看到以下内容时:

T t;
您需要知道,
T
是一种合法解析的类型。这是您必须在符号表中查找的内容。只要在解析过程中将类型添加到符号表中,这就相对容易理解。您不需要在编译器中做太多额外的工作:表中存在或不存在
t

C++中的事物复杂得多。存在大量模棱两可或潜在模棱两可的结构。最明显的是:

B::C (c);
除了不清楚
B
、是
typedef
、还是
命名空间
,也不清楚
C
是否是一个类型和
C
该类型的对象,或者
C
是否是一个以
C
为参数的函数(或构造函数)(或者即使C是一个重载了
operator()
的对象)。您需要符号表来进行解析,尽管仍然可以足够快地继续,因为符号的类型在符号表中

当模板出现在混合中时,情况会变得越来越糟。如果
C(C)
在模板中,在模板的实际定义中,您可能不知道C是类型还是函数/对象。这是因为模板可以将
C
声明为类型或变量。这意味着您需要符号表,但您没有符号表,而且在模板实际取消之前,您无法拥有符号表更糟糕的是,仅仅拥有符号的类型并不一定足够:您可以想出需要符号所代表类型的完整信息的情况,包括大小、对齐方式和其他特定于机器的信息

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

    编译速度快得多。我假设GO比C编译更快,C++对于涉及很多模板的情况有着非常慢的编译时间。
  • 您可以编写不依赖于完整编译器的解析器。这对于代码分析和重构非常有用

要解析大多数语言,您需要知道名称何时是变量、类型或函数,以消除某些结构的歧义。Go没有此类歧义结构

例如:

int x=Foo(巴)


Foo可以是一个类型或一个函数,它们由不同的AST类型表示。基本上,解析器不必查找符号就可以知道如何构造AST。语法和AST比大多数语言都简单。真的很酷。

符号表速度慢,通常不需要。所以选择放弃它。其他函数式语言也不需要。 快速查找需要散列,但要支持嵌套作用域,您需要将名称推送/弹出到堆栈上。简单的符号选项卡实现为线性搜索堆栈,更好的符号选项卡实现为每个符号都有一个堆栈的散列。但是,搜索仍然必须在运行时完成


词汇范围语言的解释和编译绝对不需要符号表或类似的表。 只有动态范围的符号需要符号表, 一些使用严格类型语言的编译器需要某种内部符号表来保存类型注释

在C和C++中,即使解析语言也需要符号表,因为需要存储全局和函数的类型和声明。 词汇范围的符号不存储在symtab中,而是作为块框架中名称的索引列表存储在函数语言中。这些索引是在编译时计算的。因此运行时访问是即时的。离开该范围会使这些变量自动无法访问,因此您不需要从名称空间/symtab中推送/弹出名称


没有一流函数的函数式语言通常需要将其函数名存储在符号表中。作为语言设计师,您尝试将函数绑定到词汇表,以避免在符号表中进行动态名称查找。

我就是这么想的。那么,它们的说法怎么可能是真的呢?我想一定是真的,但我不明白怎么回事。@Dinah:慢慢地再读一遍这个语句,然后再读一遍这个答案。它们并不矛盾。@Dinah:编译比解析更重要。解析建立了程序结构的树表示形式。语义分析和代码生成然后对树进行操作以生成编译后的输出。老实说,这只是第一次(或第二)来自GoogleNote的结果也是对t的回复