可以编写编译器吗?您无法从中扭转输入语言的语法和含义。

即,您能始终从编译器中获取语言的规范吗?

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

我个人有一种觉得编译器和语言规格是同构的,但是从学术角度来看,我是否感兴趣。

有帮助吗?

解决方案

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

简短答案:如果一个人足够在乎。

长答案:如果一个人如此倾向于倾向于有很多空闲时间,则总是有可能将编译器撕成到字节级别并将其彻底映射。从那里,您可以找出逻辑树,并重建语言。

这会很痛苦,但是这与“我可以制作一种算法可以防止专门用户破解CD键验证”的类别。

现在,如果您从未真正将编译器交给一个人(想象某种代理系统吗?),可以说,如果他能够,如果他能够,用户必须花费很长时间来强迫语言规格曾经产生可以完全锻炼它的东西。

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

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

可能会有一些深奥的方法来做到这一点。如果您以某种加密的二进制形式分别提供了语言树...并且没有提供编译器的源。.您的用户并不是无聊的NSA类型。

其他提示

我认为编译器始终揭示其编译的语言的规范(我知道这是超级手浪)。

但是,可能没有算法要这样做(即,它是不确定的),因为对于算法,需要找出编译器将停止哪些程序。

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

当然,可以如此严重地混淆编译器源代码,以至于没有人会理会它并提取语法和语言规则。当然,这也会伤害开发人员(祝您好运保持垃圾!)。

另外,如果我想了解有关该语言的某些信息,那么阅读编译器的来源将是我的最后选择(不是关于该语言的实现方式,而是如何在更抽象的层面上定义) - 我会转向规格或其他某些权威来源(官方文档等),因为即使编译器的代码非常可以理解,也会容易得多。

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

通常,如果代码中有有关语义的信息(并且总是有任何解释器或编译器中定义的操作语义),那么始终可以提取该信息。唯一的问题是这种反向工程的复杂性。因此,您需要一种混淆的语言和一个混淆的编译器。

例如,看看Malbolge的“分解器”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top