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年好運。

來源: www.habr.com

添加評論