gpt4 book ai didi

compiler-construction - 类是如何在编译器中实现的

转载 作者:行者123 更新时间:2023-12-04 10:57:57 24 4
gpt4 key购买 nike

我想为我自己的小语言实现一个类类型,但一开始我认为不会太难的事情让我很难过。我有解析器,这是我遇到问题的代码生成方面。任何人都可以阐明解决此问题的最佳/正确方法吗?具体来说,我想在 LLVM 中执行此操作,因此虽然我需要了解这个我应该使用的任何特定 LLVM 代码的一般性,但这将是非常棒的。

谢谢T。

注:我在 LLVM 方面的经验基本上来自 Kaleidoscope 教程和一些额外的经验,但我对 LLVM API 的理解还很远。

最佳答案

一个非常非常不完整的概述:

类(class) 是一个结构(你知道 C/C++ 不是吗?)

方法 其他方面是普通函数,除了它们接收一个额外的隐式参数:对象本身。该参数通常在函数中称为“this”或“self”。默认情况下,类范围符号可能(C++、JavaScript)或不可能(PHP、Python)在方法中可访问。

继承本质上是将结构粘合在一起,也可能还合并符号表,因为通常情况下,基类的符号默认情况下可以从您现在正在解析的类的方法中访问。当您在方法中遇到符号(字段或方法)时,您需要进行升序查找,从当前类开始向上层次结构。或者您可以实现它,以便您仅在一个作为合并结果的符号表中查找它。

虚拟方法被间接调用。在某些语言中,默认情况下所有方法都是虚拟的。实现将取决于它是否是一种完全动态的语言,在这种情况下,您总是在运行时在类中查找函数名称,因此您的所有方法都会自动变为虚拟;或者在静态语言的情况下,编译器通常会构建所谓的虚拟方法表。我不确定你是否需要这个,所以我不会在这里详细介绍。

build 者是在构造新对象时调用的特殊方法(通常使用“new”),或者作为构造函数调用链的一部分从后代构造函数中调用。这里可能有许多不同的实现,一个是构造函数采用隐式的“this”参数,如果尚未创建对象,则该参数可能为 NULL,并返回它。

破坏者是通常在对象超出范围时隐式调用的普通方法。同样,您需要考虑析构函数的上升调用链的可能性。

接口(interface) 很棘手,除非你的语言是完全动态的。

关于compiler-construction - 类是如何在编译器中实现的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4043436/

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