我们编写编程语言,第4部分:结构和类的表示形式,分配器的生成

图片

对于那些决定阅读我的下一篇文章的人来说,这是美好的一天。

首先,我发布指向先前各部分的链接:
第1部分:编写语言VM
第2部分:程序的中间表示
第3部分:转换器架构。 语言结构和数学表达式的分析

还值得发布指向存储库小型评论文章的链接,我在其中简要介绍了整个工作。

因此,在上一篇文章中,我描述了从某种或多种高级编程语言到中间表示形式以及应用程序的进一步组装的转换器的创建。

现在,我们面临着向语言添加结构和类的任务,以使其具有现代类似物的功能。 本文将不提供描述的代码
功能自 它很多,很无聊,并不是每个人都对钻研感兴趣。 仅理论。 和一些图片。

让我们开始创建...


类视图


值得一开始的事实是,任何结构都可以表示为数组。 数组元素的索引可以与特定的类变量或其方法相关联。

考虑一个简单的代码示例(自然在Mash上):
图片

这是一个简单的类示例,该类存储a和b值的副本,这些副本在构造函数中传递给它。 它还具有一个析构函数和一个summ函数,该函数将返回a和b的和。
但是在中间表示中,没有OOP,在VM级别甚至没有。
如果我们更深入地了解MyClass实际上是什么,那么我们将看到以下图片:
图片

太好了 译者通过简单的操作和咒语将我们的结构转换为简单的数组。

动态分类输入


同样值得考虑的是,为类及其相关的工作进行快速动态类型设置,因为在具有动态类型的语言中,这是非常重要的一点。

最简单,最有效的解决方案是类组件的虚拟表。 即 在翻译器中,您可以实现所有类定义的处理,并列出类变量名称和方法。 因此,由于 我们的类以数组的形式表示-列表中的每个名称都相当于一个索引。 填写名称列表时-您可以为每个类指定数组的大小,以更经济地分配内存。

基本类分配器


为了能够将类与虚拟方法表一起使用,除了简单地分配内存外,您还需要在该表中填充指向类方法的入口点的指针。

一种简单而有效的方法是为每个类生成一个分配器。 这是一种简单的方法,可以为类结构的数组分配内存,部分填充它,然后返回指向该类的指针。

创建类的实例时即调用分配器。 在上面的示例中,呼叫将在第24行-“ new MyClass(10,20)”进行。 在分配器之后,您可以调用该类的构造函数。 在Mash中,如果新构造在类名后包含方括号(...),则调用构造函数。

内省


可能不是每个人都熟悉这个定义,但是遇到了很多。
内省-在代码执行期间执行工作的对象类型的定义。 一个示例是同一JavaScript中的typeof()。


混搭具有充分的内省性,即 用于简单的数据类型和类。
事不宜迟,下面是一些代码示例:
图片

对于班级:
图片

通过对每个类的字段添加类型(指向其类型的指针)来实现对类的自省。

完成时间


我试图用简单的语言解释在Mash转换器中如何组织类的工作。 在具有动态类型的许多其他语言中,类似的技术也是固有的。

我希望您觉得这篇文章有趣。 谢谢您的阅读。 目前,这可能是我最后一篇有关Mash语言创建的文章(只要我不精通JIT编译)。 我的后续文章将考虑该项目的其他方面,或者完全涉及其他主题。

Source: https://habr.com/ru/post/zh-CN436224/


All Articles