向大家致以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年好運。
來源: www.habr.com