如何为动态类型语言构建编译器
how to build a compiler for a dynamically typed language?
我有一个大学项目,我必须为老师们在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
的类型的可能性,在上面的代码中,a
是A
或B
的类型,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汇编语言实现哈希表。
- C++为构建时间获取QDateTime的可靠方法
- 无法在 CLion 中构建 C++ 项目
- 函数向量_指针有不同的原型,我可以构建一个吗
- 如何使用语言包装器构建C++库?
- 使用 resource.rc 中指定的不同语言构建应用程序
- 如何翻译使用预构建的QT安装程序框架创建的安装程序,无论OS语言如何
- 无法构建以下请求的语言:C (Linux,GCC)
- 如何在泛型列表之上构建通用堆栈?C++
- 如何为动态类型语言构建编译器
- 使用 C/C++ 以外的语言构建共享库,特别是 prolog
- 可能/合理地构建具有多种语言的程序
- 使用泛型在构建时将功能附加到类
- 如何在VS2008中更改构建的语言
- 多处理Microsoft接口定义语言(.idl)的构建
- 如何为多种语言构建和维护库
- 用C语言打印时,如何圆型浮点变量
- 如何在cpp中为所有语言的全词匹配构建正则表达式
- 如何修剪带有语言支持等的 GCC "light"构建?
- Qt Creator语言 - uic 不会在构建时自动运行
- 如何构建一个泛型方法,将不同Q_PROPERTY类型的 notifySignal 从属性 char * 名称连接到空槽