如何为动态类型语言构建编译器

how to build a compiler for a dynamically typed language?

本文关键字:型语言 构建 编译器 类型 动态      更新时间:2023-10-16

我有一个大学项目,我必须为老师们在c++中使用Bison和Flex选择的语言构建一个编译器。

该语言是面向对象的垃圾回收动态类型语言。

问题是,当我们只知道运行时的类型时,我和我的朋友只是对如何为a.x编写mips代码感到困惑。让我们看看这个伪代码:

class A{private x;public A(){x=10}}
class B{public x;public B(){x=2}}
class C
{
public static main(args)
{
n=input('integer');
if(n>5)
a=new A();
else
a=new B();
write(a.x);
}
}

我们问了老师,她说我们把变量的类型存储在符号表中,但我们只在运行时给出这些类型,这意味着我们必须建立一个解释器,她就是这么说的。但她似乎忘记了,我们在某个寄存器或$sp(堆栈指针)中的mips代码中只有n的值,在c++代码中没有n的值,所以除非有tell the c++ program that the value of n is 1的mips码,否则我们无法知道a的类型。

我们可以给出a的类型的可能性,在上面的代码中,aAB的类型,a.x的mips代码可以是这样的:

beq type(a) A label1
li $a0,0(a)
li $v0 //code for print integer
syscall 
label1:raise exception

但是在CCD_ 11中,事情变得复杂了,所以这种方法很可怕。

我的朋友要求老师强迫程序员写类型,所以对于a.b.c,他必须写A<a>.B<b>.C<c>,结果要么是异常(错误的强制转换或私有访问),要么是a.b.c,但老师拒绝了,我无论如何都不喜欢。

我知道的方法

1-将值存储在符号表中:这将使生成mips变得毫无用处,并且程序是纯c++(它不再是编译器也不再是解释器)。

2-为符号表中的符号定义一个值属性,但让mips代码更改该值,如果我们在c++int n中说,然后在生成代码时说(在c++中)printf("sw $v0,0(%d)",&x),那么mips代码将真正更改x,因为它将v0的值存储在与x地址相同的地址中。

但这种方法需要汇编程序和编译器并行工作,而并行对我们来说非常复杂

那么,处理这个问题的最佳方法是什么呢?

如果您正在将动态语言转换为C++,您可以放置您的语言对象,如:

class DynamicLanguageObject
{
int m_type;
void* m_pValue; // stores int, double, char*, etc. depending on m_type
map<string, DynamicLanguageObject*> m_fields;
};

然后动态语言中的表达式CCD_ 17对应于C++中的CCD_。这种字段字典方法是指有多少动态语言(包括JavaScript和Python)实现对象。

您";只是";需要弄清楚如何用MIPS汇编语言实现哈希表。