Mash は自動的にコンパイルされるプログラミング言語です

Mash は自動的にコンパイルされるプログラミング言語です

2020年新年のご挨拶を申し上げます。

第一弾の出版以来、 断食 マシュについてはちょうど1年が経ちました。

この年の間に、言語は大幅に改良され、多くの側面が検討され、開発のベクトルが決定されました。

これらすべてをコミュニティと共有できることを嬉しく思います。

免責事項

このプロジェクトは熱意だけで開発されており、動的プログラミング言語の分野で世界征服を目指すものではありません。

この開発は、努力すべき標準として考慮されるべきではありません。プロジェクトは理想的ではありませんが、それでも開発は進んでいます。

GitHubの
Сайт
フォーラム

新しいコンパイラ

プロジェクト リポジトリの /mashc ブランチには、Mash (言語の最初のバージョン) で書かれた新しいバージョンのコンパイラが表示されます。

コンパイラには、asm リストにコード ジェネレーターがあります (スタックベース VM のアセンブラー用)。
現在、Java 用のジェネレーター (JDK 1.8) のバージョンを開発しています。

新しいバージョンのコンパイラは、言語の最初のバージョンの機能を完全にサポートし、それを補完します。

新しい OOP

この言語の新しいバージョンでは、クラスの操作が部分的に再設計されました。
クラス メソッドは、クラス本体内とクラス本体外の両方で宣言できます。
このクラスには、明示的なコンストラクター 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
...

継承が発生した場合、継承された呼び出し (スーパー) を簡単に行うことができます。

サンプルコード:

...
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 には、完全な API を備えた動的ライブラリとしてコンパイルされたスタックベースの VM であるランタイム環境があります。

必要なのは、それをプロジェクトの依存関係に追加し、いくつかの呼び出しを行うことだけです。

言語自体は、組み込み言語として機能する機能を提供します。
同時に、言語およびサードパーティのライブラリと組み合わせた場合のパフォーマンスは影響を受けません。
組み込まれた言語で書かれたさまざまなフレームワークの能力を最大限に活用できるようになります。

マッシュ + JVM

私は、JVM 用のトランスレーターのバージョンの開発を開始しました。
おそらく、N 時間が経過すると、このトピックに関する投稿が Habré に表示されるでしょう。

結果

特に結果はありません。 これは結果の中間表現です。
2020 年も皆様のご多幸をお祈り申し上げます。

出所: habr.com

コメントを追加します