Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Compiler construction 编译器和语言规范/语法是否相同?_Compiler Construction_Grammar_Language Specifications - Fatal编程技术网

Compiler construction 编译器和语言规范/语法是否相同?

Compiler construction 编译器和语言规范/语法是否相同?,compiler-construction,grammar,language-specifications,Compiler Construction,Grammar,Language Specifications,可以编写一个编译器,从中不能对输入语言的语法和含义进行反向工程 i、 你总能从编译器那里得到语言的规范吗 假设我想从??对于某些语言,但我不希望阅读编译器的人能够阅读和理解 我个人有一种感觉,编译器和语言规范是同构的,但我从学术角度对这是否是错误感兴趣。我认为编译器总是揭示它编译的语言的规范(我知道这是非常复杂的) 但是,可能没有算法可以这样做(即,它是不可判定的),因为,例如,该算法需要找出编译器将在哪些程序上停止。假设您说它们只能访问二进制: 简短的回答:如果一个人足够关心,就不会 长句回答

可以编写一个编译器,从中不能对输入语言的语法和含义进行反向工程

i、 你总能从编译器那里得到语言的规范吗

假设我想从??对于某些语言,但我不希望阅读编译器的人能够阅读和理解


我个人有一种感觉,编译器和语言规范是同构的,但我从学术角度对这是否是错误感兴趣。

我认为编译器总是揭示它编译的语言的规范(我知道这是非常复杂的)


但是,可能没有算法可以这样做(即,它是不可判定的),因为,例如,该算法需要找出编译器将在哪些程序上停止。

假设您说它们只能访问二进制:

简短的回答:如果一个人足够关心,就不会

长句回答:如果一个人很有兴趣并且有很多空闲时间,那么总是有可能将编译器分解到字节级别,并将其完全映射。从那里,您可以找出逻辑树,并重建语言

这将是痛苦的,但这与“我能不能做一个算法来防止专用用户破解cd密钥验证”属于同一类

现在,如果你从来没有真正把编译器给过一个人(想象一下某种代理系统?),那么可以合理地说,如果用户能够生成能够完全执行语言规范的东西,那么他将不得不花费非常、非常长的时间来强制执行语言规范

如果您暗示他们可以访问源代码:

不可以。您可以混淆它,但是编译器仍然必须构造相同的逻辑树,无论阅读有多困难


可能有一些深奥的方法可以做到这一点。如果您以某种加密的二进制形式单独提供语言树…并且没有提供编译器的源代码。而且您的用户不会对NSA类型感到厌烦。

不,它们是不同的。但是编译器不可避免地理解输入语言的语法,并且(希望)非常精确地遵循语言规范。因此,理解编译器意味着理解它们

当然,可能会严重混淆编译器源代码,以至于没有人会费心去阅读并提取语法和语言规则。当然,这也会伤害到开发人员(祝你好运,继续保持这一点!)


此外,如果我想了解某种语言(不是关于如何实现它,而是如何在更抽象的层次上定义它),阅读编译器的源代码将是我最后的选择——我会阅读规范或其他权威源代码(官方文档等),因为即使编译器的代码非常容易理解,这也会容易得多。

我的直觉是,您可以通过检查编译器的输出来确定其语义行为。但是如果没有文档或访问编译器源代码,就无法获得实际语法。如果你有源代码,这就变得微不足道了,所以我假设你没有编译器的源代码,只需要作为工具访问它。

一般来说,如果代码中有关于语义的信息(并且在任何解释器或编译器中都定义了操作语义),那么总是可以提取这些信息。唯一的问题是这种逆向工程的复杂性。因此,您需要一种模糊语言和一个模糊编译器


以Malbolge“反编译器”为例。

我也这么认为。问题很简单,我不知道有没有聪明的方法可以实现从语言到编译器的单向连接,而不是相反的方式。从来都不是真正的单向连接。最好的方法是混淆编译器的代码,让它从加密的二进制文件中读取语言规范,而不是提供源代码。但是一个专门的用户/团队仍然可以将其拆分。但是这样做的成本已经增加到了我认为没有人会愿意的程度。有时候你甚至不需要拆掉编译器。有一次,我发现一个特定的编译器支持内嵌汇编语句,因为我得到了一条语法错误消息,其中列出了有效的关键字。一个小的尝试和错误实验给了我语法,更多的揭示了调用约定。YACC源文件非常接近地模拟了一种语言的BNF语法。是的,这仍然是最后的手段,但随着最后手段的发展,这是一个很好的手段。因此,从根本上说,您确实可以对编译器的用户隐藏语言语法(语义+语法)。