gpt4 book ai didi

compiler-construction - 使用程序进行短路评估

转载 作者:行者123 更新时间:2023-12-05 00:35:24 30 4
gpt4 key购买 nike

我目前正在为一种非常有限的面向对象语言开发编译器。我想将所有值视为对象,这些值上的运算符将作为方法实现。编译器将程序转换为基于堆栈的虚拟机的汇编程序。

在编译期间,我将整数文字转换为特殊“整数”类的对象。算术运算符被实现为该类的方法(使用内联汇编器)。这样4 + 5基本上等于4.add(5) .

我现在面临的问题是 bool 值的特殊情况。如果有 if陈述:

if(10 > 5 || 12 < 10)

这当前将转换为: 10.greaterThan(5).or(12.lessThan(10))
现在显然这些整数文字也可以调用具有副作用的函数。在这种情况下,将这些二元运算符实现为方法调用会产生问题,因为短路评估变得不可能。

所以我的问题是:
  • 其他语言如何实现短路评估但仍将每个值视为对象?
  • 根据维基百科“ALGOL 68 使用“程序”来实现用户定义的短路运算符和程序。” - 这是如何运作的?
  • 最佳答案

    我相信,通常的技术涉及 call by namecall by need .这个想法是or的参数不是比较的结果,而是比较本身转换为 thunk ,无论何时(按名称调用)或第一次(按需要调用)需要它时,都会将其转换为结果值。

    将表达式转换为 thunk 时,您基本上是在创建一个匿名函数,您可以这样处理编译问题。它涉及将表达式编译为将评估表达式的代码。它还涉及创建一个对象(thunk 本身),该对象引用(或包含其副本)表达式使用的那些局部变量,以及指向表达式的编译代码的指针。该对象需要与您的 bool 类接口(interface)兼容,以便使用它的代码不必关心它是否具有真正的 bool 值或冒充的 thunk。每当有人需要 bool 值时,thunk 将执行编译后的表达式代码并提供结果值。

    如果按名称调用对您来说就足够了,那就是它的全部。对于按需调用,缓存评估结果会增加复杂性。

    关于compiler-construction - 使用程序进行短路评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9462051/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com