向大家致以2020年新的一年的问候。
自第一期发布以来
这一年,语言得到了很大的改进,很多方面都得到了思考,并确定了发展方向。
免责声明
该项目的开发完全是出于热情,并不假装在动态编程语言领域称霸世界!
这种发展不应被视为要争取的标准;该项目并不理想,但仍在发展。
新编译器
在项目存储库的 /mashc 分支中,您可以看到新版本的编译器,它是用 Mash(该语言的第一个版本)编写的。
编译器在 asm 列表中有一个代码生成器(用于基于堆栈的 VM 的汇编器)。
目前我正在开发 Java 生成器的一个版本(JDK 1.8)。
新版本的编译器完全支持该语言第一个版本的功能并对其进行补充。
新面向对象编程
在该语言的新版本中,类的工作已经部分重新设计。
类方法既可以在类体中声明,也可以在类体外部声明。
该类现在有一个显式构造函数:init。
示例 кода:
...
class MyClass:
private:
var a, b
public:
init(a, b):
$a ?= a
$b ?= b
end
func Foo():
return $a + $b
end
end
func MyClass::Bar(c):
return $a + $b + c
end
...
如果发生继承,那么我们就有机会轻松地进行继承调用(super)。
示例 кода:
...
class MySecondClass(MyClass):
public:
var c
init(a, b, c):
super(a, b)
$c ?= c
end
func Bar():
super($c)
end
end
...
x ?= new MySecondClass(10, 20, 30)
println( x -> Bar() ) // 60
动态重写类实例上的方法:
...
func Polymorph::NewFoo(c):
return $a + $b + c
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30) // 60
包/命名空间
命名空间必须保持干净!
因此,语言必须提供这个机会。
在 Mash 中,如果类方法是静态的,则可以从代码的任何部分安全地调用它。
示例:
...
class MyPackage:
func MyFunc(a, b):
return a + b
end
end
...
println( MyPackage -> MyFunc(10, 20) ) // 30
顺便说一下,以这种方式调用超级运算符将正常工作。
Исключения
在该语言的新版本中,它们被视为类:
...
try:
raise new Exception(
"My raised exception!"
)
catch E:
if E is Exception:
println(E)
else:
println("Unknown exception class!")
end
end
...
新枚举
现在可以为枚举元素分配常量值:
enum MyEnum [
meFirst = "First",
meSecond = 2,
meThird
]
...
k ?= meSecond
...
if k in MyEnum:
...
end
嵌入式语言
Mash 有可能作为一种嵌入式编程语言找到自己的定位,类似于 Lua。
要开始使用 Mash 来实现这些目的,您甚至不需要自己组装项目。
Mash 有一个运行时环境 - 一个基于堆栈的 VM,编译为具有完整 API 的动态库。
您所需要做的就是将其添加到项目依赖项中并进行几次调用。
该语言本身提供了作为嵌入式语言工作的功能。
同时,与语言和第三方库结合使用的性能不受影响。
我们获得了一种嵌入式语言,可以充分利用用它编写的各种框架的功能。
混搭+JVM
我开始为 JVM 开发一个翻译器版本。
也许,N段时间后,关于这个主题的帖子将出现在Habré上。
结果
没有特别的结果。 这是结果的中间表示。
祝大家2020年好运。
来源: habr.com