创建自己的编程语言(I)

编程语言的演变

在写完第一篇文章之后 如何创建自己的操作系统,有人告诉我,如果我可以写一篇 如何创建编程语言。 最初,我并没有特别注意,但是现在以及通过其他方式,我对编程语言的创建有了更多的了解。 所以做吧 基本的编程语言,可轻松嵌入其他程序中,并且可与我们还将设计的虚拟机一起使用。 今天,我们必须制造最基本的虚拟机。

您可能想知道: «虚拟机? 但这不是很困难,它还会使程序变慢吗?” 相反,简单的虚拟机非常简单且相对较快。 我已经选择 作为虚拟机的语言。 那是什么 ?

它是一种专注于执行安全性的编程语言,因此使用它几乎不可能使某人能够关闭虚拟机。 它是开发人员开发的一种编译语言 Mozilla的. 伺服,替代 壁虎,正在他身上发展。 您仍然可以更改语法,但是我要使用的代码将一直保留到第一个稳定版本。

安装在 Linux 以一种简单的方式。 但是,没有官方包裹。 的用户 Ubuntu 可以添加这两个 PPA: ppa:hansjorg / rust  y ppa:cmrx64 /货物,的用户 可以使用 AUR (货物-吉特 是安装所有内容的软件包)。 其余的可以使用:

curl -s https://static.rust-lang.org/rustup.sh | sudo sh

虚拟机如何工作?

如果您知道汇编程序世界是如何工作的,那么对于堆栈或堆栈,它是完全相同的。 如果没有,我将向您解释。 让我们想象以下代码:

打印2 + 3

计算机不了解2 + 3的含义,也不知道遵循的顺序。 计算机使用电池或电池堆工作,在其中累积并连续提取数据。 我们的虚拟机中的代码应如下所示:

推2推3添加打印

基本上,我们会将2放在栈顶,也将3放在栈顶。 ADD会拉(即从堆栈中删除并获得其值)堆栈中的最后2个项目,并将结果添加到堆栈顶部。 PRINT会拿走堆栈中的最后一个项目,并用它来显示给我们。 现在让我们来做 .

我们必须首先为 字节码,我们可以使用现有的 爪哇岛 ØEL CLR .NET / Mono,但我们将创建一个更基本的版本。

https://gist.github.com/a01de8904fd39a442c20

我们为每条指令使用十六进制表示法。 高,我们把 #[派生(FromPrimitive)],是 它将帮助我们以后能够直接将枚举与字节进行比较。

现在我们必须创建一个函数来执行每个指令。 为此,我们必须读取一个字节并将其与枚举中的指令进行比较。 如果找到任何存在的内容,则必须执行操作。

https://gist.github.com/8950ce212a2de2f397f9

我们这样做是为了分别读取每个字节并执行它们:

https://gist.github.com/12e24a1f0dd65e4cd65d

如您所见,我们区分之前是否给过PUSH命令(我们的INTEGER命令),下一个字节将被完全带入堆栈。 在这里,我们使用了两个我没有教过的功能, self.pop() y self.push(),显然负责处理堆栈。

https://gist.github.com/54147f853a8a2b8c01d9

它们不是很复杂,但是pop函数具有错误检测机制。 实际上,在 ,如果我们删除这些机制,则会给我们带来编译错误。 现在我们只需要调用一个程序 佩林 (我们的虚拟机)并执行字节码。

https://gist.github.com/99b1ab461318b3a644d0

该字节码可以从文件中读取,但是为了简单起见,我将其存储在变量中。 如果执行它,它将给我们预期的结果:

Perin v0.1 Perin VM执行FlopFlip字节码启动PerinVM实例PerinVM v0.1.0整数值5

所有代码均可在 GitHub上Apache许可2.0: https://github.com/AdrianArroyoCalle/perin。 要进行编译,他们必须具备 货物 安装并放置:

收费构建&& ./target/main

在下一章中,我们将更多地了解我们的编程语言。


发表您的评论

您的电子邮件地址将不会被发表。 必填字段标有 *

*

*

  1. 负责数据:MiguelÁngelGatón
  2. 数据用途:控制垃圾邮件,注释管理。
  3. 合法性:您的同意
  4. 数据通讯:除非有法律义务,否则不会将数据传达给第三方。
  5. 数据存储:Occentus Networks(EU)托管的数据库
  6. 权利:您可以随时限制,恢复和删除您的信息。

  1.   路人

    有趣的好奇心,尽管在现实中虽然不是很有用,但知道这一点也无害。

    宣传Rust真是太好了,它是一种语言,它不仅承诺比c ++更安全,而且(目前)使它的语法更清晰,这是一个承诺。

    至于照片,我不会考虑Java Evolution XD。

    1.    路人

      从fortran中,我从未使用过它,但是对此却听不见很多...

      1.    可笑的

        我愿意,即使Python在不断发展,它在工程设计中也特别有用。

      2.    约翰

        Fortran也许是与C一起使用的另一种很棒的语言。即使到了今天,真正关键的问题还是一个。

        Fortran是C的“进化论”是有争议的,也许它应该是相反的,因为C是更新的,更现代的,并且具有更多的可能性。 尽管一个至少没有与另一个分离。

        尽管从某些角度来看,最终职位仍有待商bat。

    2.    旧金山

      +1到Java

  2.   波塔罗

    让我们看看我是否喜欢这种方式,我为编程提供了一些东西,但基本的目的是了解我是否了解更多。

  3.   用户登录

    创建一种新的编程语言的真正目的是什么?在我看来,隐藏源代码是一种策略。

  4.   耶利

    朋友,“您自己的操作系统”的延续发生了什么? 不要把它留在那里,请继续。

    实际上,您是一位大师,仅这两首歌就完全吸引了我的注意力,但我不希望它们停留一半。

    我知道我们很多人都这么认为,我们正在等待这些非常有趣的话题的延续和结论。

  5.   克里斯蒂安·戴维(Cristian David)

    非常有趣,非常感谢。 🙂

  6.   坦率

    我不认为Java是一种编程语言,而是命令解释器,因为它不是可编译的

    1.    马里奥

      [编程语言是一种正式的语言,旨在表达可以由计算机等机器执行的过程。]

      因此,Java是一种编程语言。 甚至Bash语言(Linux Shell语言)本身就是一种编程语言。

      有两种类型的语言:
      -编译
      -口译
      -混合(编译虚拟机,本机库并解释功能代码)

      对于多平台而言,口译员非常有用,并且不会造成灾难性的影响。 Java,VB.NET,C ++ .NET,F#和C#都是混合语言。 bash语言,bat,PHP,Javascript等是解释型语言。

      如果您不因为Java是一种解释语言而将其视为一种语言,则不应考虑使用许多其他语言来编写程序。 而且,按照这三个规则,您不应认为除了机器语言本身以外,没有任何编程语言。

      那为什么不呢?甚至机器语言也不能被认为是一种语言,因为它实际上只是处理器“解释”的一组命令。

      因为有效地,所有语言不过是处理器解释的一组命令而已。

      您可能或多或少地喜欢一种语言(在这种情况下为Java),似乎或多或少地有用且功能强大,但是您可以说它不是一种编程语言,因为它不是经过编译的……它违背了所有编程语言的定义。

    2.    马里奥

      😐我希望我看起来不太粗鲁

      1.    玛丽亚·安东尼奥·德·曼纽拉·卡德纳斯

        不安静,你只是摧毁了我们的生活

      2.    马里奥

        哈哈哈哈哈,perdoooon。 这不是我的意图xD

    3.    卡洛斯

      java是一种编程语言。 因为您可以开发应用程序,并且在编译时制作一个由JVM解释的.jar,然后根据您的python逻辑,它也不会被解释,但是会被编译为不同的可执行文件...

  7.   埃里亚斯·蒙格洛斯(Elias Mongelos)

    很好的信息

  8.   卡洛斯·阿图罗(Carlos Arturo)

    很好的信息,但我对此表示怀疑,是否有可能从头创建新的编程语言而不必依赖其他类比或软件。 我说的方式与制作其他语言(如Java或HTML)的方式相同。
    非常感谢您在这个问题上的帮助。