【问题标题】:If you write a compiler in pure Prolog, will it work as a decompiler also?如果您在纯 Prolog 中编写编译器,它是否也可以用作反编译器?
【发布时间】:2020-12-15 03:23:16
【问题描述】:

如果您在pure Prolog 中写入compiler(没有额外的逻辑位),它是否也可以作为decompiler 工作?

(我正在阅读的一本书对此有意见,但我想知道是否有人真正尝试过)

【问题讨论】:

  • 无关:你看过lix.polytechnique.fr/~dale/papers/apal91.pdf - “统一证明作为逻辑编程的基础”
  • 出于与 David 所述相同的原因,我对此投了赞成票。
  • 我同意近距离投票。这个问题很有趣,所以我鼓励@MaxB 以更具体的方式再次提问。也许写一个玩具编译器并寻求帮助以使其作为反编译器工作?
  • @DavidTonhofer 乍一看很像 lambda-prolog。
  • @MaxB 没错,就是它的核心思想。

标签: prolog decompiling decompiler


【解决方案1】:

我曾经写过相当于 cdecl.org 的可逆程序。这有点棘手,但我证明它是可以做到的。 (在一堆论文中的某个地方是源代码;最近,我希望将它发布在 github 上。)在使用 yacc/lex(bison/弯曲)。

对于像 cdecl 这样的东西——你在 char ** const * const xdeclare x as const pointer to const pointer to pointer to char 之间进行转换,编译/反编译是有意义的。但是,从任意机器代码转换为源代码意味着什么?甚至在一些 IR 和源代码之间进行转换似乎也没有多大意义。

【讨论】:

  • 从机器码翻译成高级语言并不难。以最简单的方式执行此操作将创建不易阅读和理解的源代码,但是具有相同行为的有效程序。 (尽管如果我们使用“可能的编译器输出集中的机器代码”而不是“任意机器代码”可能会更容易。)
  • aschepler 理论上的 IT 反编译方法是 1) 生成解释机器代码的高级语言头文件(无论机器是什么......寄存器、堆栈、lambda-reducer、图灵机) 2)在数组下面附加机器代码。 3) 午餐时间!
  • @aschepler 写道:“从机器代码翻译成高级语言并不难。”我已经编写了几个反汇编程序,但我强烈不同意这一点,至少如果您希望能够重构变量名。
  • @DavidTonhofer 你的评论让我想起了研究生院的研讨会。无论如何:“当心图灵焦油坑,在其中一切皆有可能,但没有什么是容易的。” - 艾伦·佩利斯
【解决方案2】:

这个问题需要更精确,因为我们不知道什么是“编译器”(从图 - 语言 1 中的程序 - 到另一个图 - 算法等效图的无关信息转储转换我想在语言 2 中)。它也不清楚“无额外逻辑位意味着什么”。如果你摆脱了这些,你还能构建什么样的编译器?

这样看来,编译看起来像是纯粹的演绎(Prolog 向前运行,或 CHR),而反编译看起来可能是非常困难的搜索(您会在无数可能的程序中找到一个程序,但它看起来并不令人愉快绝不像你之前的那个)。作为他脑海中新出现的定理工具箱的人当然可以说得更多。

但我不会自动地说,不。一方面,不能保证“反编译”时不会出现无限的“左递归”循环。

【讨论】:

  • “你会在无数可能的程序中得到一个程序” 一方面,这是真的。另一方面,Prolog 是一种我们经常编写程序的语言,它 (a) 可以枚举大量解决方案的序列,并且 (b) 小心翼翼地以“公平”的方式执行此操作,以便首先出现最简单的解决方案.所以是的,如果编译后的程序是add a, b, c,那么所有plus(a, plus(b, c))plus(a, plus(b, plus(c, 0)))plus(a, plus(b, plus(c, plus(0, 0))))等都是有效的反编译版本,但最好的会先出现。
  • 也就是说,我同意这个问题太宽泛了等等。
  • @IsabelleNewbie 但是反编译时什么是“最好的”?例如,当您查看反编译的 Java 代码时,它有时毫无意义。当编译通过混淆器传递时,更糟糕的是,Prolog 反编译器,与 Java 反编译器一样,必须做出决定......“最好”听起来可疑 NP-hard。
  • “你还能构建什么样的编译器?” 我认为,任何类型的编译器都基于纯 Prolog 的图灵完备性。只需从 compile(SourceAsList, AssemblyAsList) :- 开始并不断调整它直到它起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
相关资源
最近更新 更多