Mash یک زبان برنامه نویسی است که خود را کامپایل می کند

Mash یک زبان برنامه نویسی است که خود را کامپایل می کند

با سلام به همه در سال جدید 2020.

از زمان انتشار اولین پست تقریباً 1 سال از مش می گذرد.

در این سال، زبان بسیار پیشرفت کرد، بسیاری از جنبه های آن مورد بررسی قرار گرفت و بردار توسعه مشخص شد.

من خوشحالم که همه اینها را با جامعه به اشتراک می گذارم.

سلب مسئولیت

این پروژه صرفاً با اشتیاق در حال توسعه است و تظاهر به سلطه جهانی در زمینه زبان های برنامه نویسی پویا ندارد!

این توسعه نباید به عنوان استانداردی در نظر گرفته شود که باید برای آن تلاش کرد؛ پروژه ایده آل نیست، اما با این وجود در حال توسعه است.

GitHub
محل
انجمن

کامپایلر جدید

در شاخه mashc / مخزن پروژه، می توانید نسخه جدیدی از کامپایلر را مشاهده کنید که به زبان Mash (نسخه اول زبان) نوشته شده است.

کامپایلر دارای یک مولد کد در لیست asm است (برای اسمبلر برای یک ماشین مجازی مبتنی بر پشته).
در حال حاضر من در حال توسعه نسخه ای از ژنراتور برای جاوا هستم (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 یک Runtime Environment دارد - یک VM مبتنی بر پشته که به عنوان یک کتابخانه پویا با یک API کامل کامپایل شده است.

تنها کاری که باید انجام دهید این است که آن را به وابستگی پروژه اضافه کنید و چند تماس برقرار کنید.

خود زبان قابلیتی را برای کار به عنوان یک زبان جاسازی شده فراهم می کند.
در عین حال، عملکرد در ارتباط با زبان و کتابخانه های شخص ثالث تحت تأثیر قرار نمی گیرد.
ما یک زبان تعبیه شده دریافت می کنیم که می تواند از تمام قدرت فریمورک های مختلف نوشته شده در آن استفاده کند.

Mash + JVM

من شروع به توسعه نسخه ای از مترجم برای JVM کردم.
شاید پس از N مدت زمان، پستی در مورد این موضوع در Habré ظاهر شود.

نمایش نتایج: از

هیچ نتیجه خاصی وجود ندارد. این یک نمایش متوسط ​​از نتایج است.
برای همه در سال 2020 موفق باشید.

منبع: www.habr.com

اضافه کردن نظر