Mash 是一种可以自行编译的编程语言

Mash 是一种可以自行编译的编程语言

向大家致以2020年新的一年的问候。

自第一期发布以来 四旬期 关于马修,已经快过去一年了。

这一年,语言得到了很大的改进,很多方面都得到了思考,并确定了发展方向。

我很高兴与社区分享这一切。

免责声明

该项目的开发完全是出于热情,并不假装在动态编程语言领域称霸世界!

这种发展不应被视为要争取的标准;该项目并不理想,但仍在发展。

GitHub上
网站
论坛

新编译器

在项目存储库的 /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

添加评论