Mash β€” язык программирования, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ сам сСбя

Mash — язык программирования, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ сам сСбя

ΠŸΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽ всСх Π² Π½ΠΎΠ²ΠΎΠΌ 2020-ΠΌ Π³ΠΎΠ΄Ρƒ.

Π‘ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ поста ΠΏΡ€ΠΎ Mash ΠΏΡ€ΠΎΡˆΠ΅Π» практичСски Ρ€ΠΎΠ²Π½ΠΎ 1 Π³ΠΎΠ΄.

Π—Π° этот Π³ΠΎΠ΄ язык Π±Ρ‹Π» сильно Π΄ΠΎΡ€Π°Π±ΠΎΡ‚Π°Π½, Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΌΠ°Π½Ρ‹ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΅Π³ΠΎ аспСкты ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π²Π΅ΠΊΡ‚ΠΎΡ€ развития.

Π­Ρ‚ΠΈΠΌ всСм я Ρ€Π°Π΄ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ с сообщСством.

Disclaimer

Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ разрабатываСтся ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π° энтузиазмС ΠΈ Π½Π΅ ΠΏΡ€Π΅Ρ‚Π΅Π½Π΄ΡƒΠ΅Ρ‚ Π½Π° ΠΌΠΈΡ€ΠΎΠ²ΠΎΠ΅ господство Π² сфСрС динамичСских языков программирования!

НС стоит Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½ΡƒΡŽ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π² качСствС эталона, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ ΡΡ‚Ρ€Π΅ΠΌΠΈΡ‚ΡŒΡΡ, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ β€” Π½Π΅ ΠΈΠ΄Π΅Π°Π»Π΅Π½, Π½ΠΎ Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ развиваСтся.

GitHub
Π‘Π°ΠΉΡ‚
Π€ΠΎΡ€ΡƒΠΌ

Новый компилятор

Π’ Π²Π΅Ρ‚ΠΊΠ΅ /mashc рСпозитория ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ компилятора, которая написана Π½Π° Mash’Π΅ (Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ вСрсии языка).

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΈΠΌΠ΅Π΅Ρ‚ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠ΄Π° Π² asm листинг (для ассСмблСра ΠΏΠΎΠ΄ ΡΡ‚Π΅ΠΊΠΎΠ²ΡƒΡŽ Π’Πœ).
Π’ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Π΅Π΄Ρƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ вСрсии Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΏΠΎΠ΄ 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
...

Если происходит наслСдованиС, Ρ‚ΠΎ Ρƒ нас появляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π»Π΅Π³ΠΊΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ inherited Π²Ρ‹Π·ΠΎΠ²Ρ‹ (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

К слову, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ super ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ.

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

Π’ Π½ΠΎΠ²ΠΎΠΉ вСрсии языка ΠΎΠ½ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ, ΠΊΠ°ΠΊ классы:

...
try:
  raise new Exception(
    "My raised exception!"
  )
catch E:
  if E is Exception:
    println(E)
  else:
    println("Unknown exception class!")
  end
end
...

Новый enum

Π’Π΅ΠΏΠ΅Ρ€ΡŒ элСмСнтам пСрСчислСния ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ присвоСны константныС значСния:

enum MyEnum [
  meFirst = "First",
  meSecond = 2,
  meThird
]
...
k ?= meSecond
...
if k in MyEnum:
  ...
end

ВстраиваСмый ЯП

ΠŸΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ β€” Mash ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΡΡ‚ΡŒ свою Π½ΠΈΡˆΡƒ Π² качСствС встраиваСмого языка программирования, ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ Lua.

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ использованиС Mash Π² Π΄Π°Π½Π½Ρ‹Ρ… цСлях, Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.

Π£ Mash Π΅ΡΡ‚ΡŒ Runtime Environment β€” стСковая Π’Πœ, собранная Π² качСствС динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ с ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΌ API.

ВрСбуСтся лишь Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‘ Π² зависимости ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Ρƒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ².

Π’ самом языкС прСдусмотрСн Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π», для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² качСствС встраиваСмого языка.
ΠŸΡ€ΠΈ этом, Ρ€Π°Π±ΠΎΡ‚ΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ Π² связкС с языковыми ΠΈ сторонними Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ΡΡ.
ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ встраиваСмый язык, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всю ΠΌΠΎΡ‰ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ², написанных Π½Π° Π½Π΅ΠΌ.

Mash + JVM

Начал вСсти Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ вСрсии транслятора для JVM.
Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, спустя N-Π½ΠΎΠ΅ количСство Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½Π° Ρ…Π°Π±Ρ€Π΅ появится пост Π½Π° эту Ρ‚Π΅ΠΌΡƒ.

Π˜Ρ‚ΠΎΠ³ΠΈ

Π˜Ρ‚ΠΎΠ³ΠΎΠ² особо Π½Π΅Ρ‚. Π­Ρ‚ΠΎ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ прСдставлСниС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ².
ВсСм ΡƒΠ΄Π°Ρ‡ΠΈ Π² 2020-ΠΌ Π³ΠΎΠ΄Ρƒ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ