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

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

با آرزوی سالی نو برای همه در سال ۲۰۲۰.

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

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

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

رفع مسئولیت

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

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

GitHub
محل
انجمن

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

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

کامپایلر در فهرست asm یک مولد کد دارد (برای اسمبلر برای ماشین مجازی پشته).
من در حال حاضر در حال توسعه نسخه‌ای از مولد برای جاوا (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 MyEnum [
  meFirst = "First",
  meSecond = 2,
  meThird
]
...
k ?= meSecond
...
if k in MyEnum:
  ...
end

زبان برنامه‌نویسی تعبیه‌شده

به طور بالقوه، Mash می‌تواند جایگاه خود را به عنوان یک زبان برنامه‌نویسی توکار، مشابه Lua، پیدا کند.

برای شروع استفاده از Mash برای این اهداف، حتی نیازی نیست خودتان پروژه را بسازید.

Mash یک محیط زمان اجرا دارد - یک ماشین مجازی مبتنی بر پشته که به عنوان یک کتابخانه پویا با یک API کامل ساخته شده است.

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

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

مش + JVM

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

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

هیچ نتیجه خاصی وجود ندارد. این یک ارائه موقت از نتایج است.
برای همه در سال ۲۰۲۰ آرزوی موفقیت دارم.

منبع: www.habr.com

خرید هاست قابل اعتماد برای سایت های دارای حفاظت DDoS، سرورهای VPS VDS 🔥 خرید هاستینگ معتبر با محافظت در برابر حملات DDoS، سرورهای VPS و VDS | ProHoster