Вітаю всіх у новому 2020 році.
З моменту публікації першого
За цей рік мова була сильно доопрацьована, було продумано багато її аспектів та визначено вектор розвитку.
Цим усім я радий поділитися із спільнотою.
відмова
Даний проект розробляється виключно на ентузіазмі та не претендує на світове панування у сфері динамічних мов програмування!
Не варто розглядати цю розробку як зразок, якого потрібно прагнути, проект — не ідеальний, проте розвивається.
Новий компілятор
У гілці /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
...
Якщо відбувається успадкування, то у нас з'являється можливість легко робити ув'язнені виклики (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