sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-12-05 00:35:24 30 4
mua khóa gpt4 Nike

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

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

我现在面临的问题是 bool 值的特殊情况。如果有 nếu như陈述:

if(10 > 5 || 12 < 10)

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

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

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

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

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

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

    30 4 0
    行者123
    Hồ sơ cá nhân

    Tôi là một lập trình viên xuất sắc, rất giỏi!

    Nhận phiếu giảm giá Didi Taxi miễn phí
    Mã giảm giá Didi Taxi
    Giấy chứng nhận ICP Bắc Kinh số 000000
    Hợp tác quảng cáo: 1813099741@qq.com 6ren.com