在写完第一篇文章之后 如何创建自己的操作系统,有人告诉我,如果我可以写一篇 如何创建编程语言。 最初,我并没有特别注意,但是现在以及通过其他方式,我对编程语言的创建有了更多的了解。 所以做吧 基本的编程语言,可轻松嵌入其他程序中,并且可与我们还将设计的虚拟机一起使用。 今天,我们必须制造最基本的虚拟机。
您可能想知道: «虚拟机? 但这不是很困难,它还会使程序变慢吗?” 相反,简单的虚拟机非常简单且相对较快。 我已经选择 锈 作为虚拟机的语言。 那是什么 锈?
锈 安装在 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
在下一章中,我们将更多地了解我们的编程语言。
有趣的好奇心,尽管在现实中虽然不是很有用,但知道这一点也无害。
宣传Rust真是太好了,它是一种语言,它不仅承诺比c ++更安全,而且(目前)使它的语法更清晰,这是一个承诺。
至于照片,我不会考虑Java Evolution XD。
从fortran中,我从未使用过它,但是对此却听不见很多...
我愿意,即使Python在不断发展,它在工程设计中也特别有用。
Fortran也许是与C一起使用的另一种很棒的语言。即使到了今天,真正关键的问题还是一个。
Fortran是C的“进化论”是有争议的,也许它应该是相反的,因为C是更新的,更现代的,并且具有更多的可能性。 尽管一个至少没有与另一个分离。
尽管从某些角度来看,最终职位仍有待商bat。
+1到Java
让我们看看我是否喜欢这种方式,我为编程提供了一些东西,但基本的目的是了解我是否了解更多。
创建一种新的编程语言的真正目的是什么?在我看来,隐藏源代码是一种策略。
朋友,“您自己的操作系统”的延续发生了什么? 不要把它留在那里,请继续。
实际上,您是一位大师,仅这两首歌就完全吸引了我的注意力,但我不希望它们停留一半。
我知道我们很多人都这么认为,我们正在等待这些非常有趣的话题的延续和结论。
非常有趣,非常感谢。 🙂
我不认为Java是一种编程语言,而是命令解释器,因为它不是可编译的
[编程语言是一种正式的语言,旨在表达可以由计算机等机器执行的过程。]
因此,Java是一种编程语言。 甚至Bash语言(Linux Shell语言)本身就是一种编程语言。
有两种类型的语言:
-编译
-口译
-混合(编译虚拟机,本机库并解释功能代码)
对于多平台而言,口译员非常有用,并且不会造成灾难性的影响。 Java,VB.NET,C ++ .NET,F#和C#都是混合语言。 bash语言,bat,PHP,Javascript等是解释型语言。
如果您不因为Java是一种解释语言而将其视为一种语言,则不应考虑使用许多其他语言来编写程序。 而且,按照这三个规则,您不应认为除了机器语言本身以外,没有任何编程语言。
那为什么不呢?甚至机器语言也不能被认为是一种语言,因为它实际上只是处理器“解释”的一组命令。
因为有效地,所有语言不过是处理器解释的一组命令而已。
您可能或多或少地喜欢一种语言(在这种情况下为Java),似乎或多或少地有用且功能强大,但是您可以说它不是一种编程语言,因为它不是经过编译的……它违背了所有编程语言的定义。
😐我希望我看起来不太粗鲁
不安静,你只是摧毁了我们的生活
哈哈哈哈哈,perdoooon。 这不是我的意图xD
java是一种编程语言。 因为您可以开发应用程序,并且在编译时制作一个由JVM解释的.jar,然后根据您的python逻辑,它也不会被解释,但是会被编译为不同的可执行文件...
很好的信息
很好的信息,但我对此表示怀疑,是否有可能从头创建新的编程语言而不必依赖其他类比或软件。 我说的方式与制作其他语言(如Java或HTML)的方式相同。
非常感谢您在这个问题上的帮助。