Mash là ngôn ngữ lập trình tự biên dịch

Mash là ngôn ngữ lập trình tự biên dịch

Xin chúc mừng tất cả mọi người trong năm mới 2020.

Kể từ khi xuất bản cuốn sách đầu tiên bưu kiện Gần 1 năm đã trôi qua với Mash.

Trong năm nay, ngôn ngữ đã được cải thiện rất nhiều, nhiều khía cạnh của nó đã được suy nghĩ thấu đáo và định hướng phát triển đã được xác định.

Tôi rất vui được chia sẻ tất cả những điều này với cộng đồng.

Từ chối trách nhiệm

Dự án này đang được phát triển chỉ dựa trên sự nhiệt tình và không hề giả vờ thống trị thế giới trong lĩnh vực ngôn ngữ lập trình động!

Sự phát triển này không nên được coi là một tiêu chuẩn để phấn đấu; dự án không lý tưởng nhưng dù sao nó cũng đang phát triển.

GitHub
website
Diễn đàn

Trình biên dịch mới

Trong nhánh /mashc của kho dự án, bạn có thể thấy phiên bản mới của trình biên dịch, được viết bằng Mash (phiên bản đầu tiên của ngôn ngữ).

Trình biên dịch có trình tạo mã trong danh sách asm (dành cho trình biên dịch mã cho máy ảo dựa trên ngăn xếp).
Hiện tại tôi đang phát triển phiên bản trình tạo cho Java (JDK 1.8).

Phiên bản mới của trình biên dịch hỗ trợ đầy đủ chức năng của phiên bản đầu tiên của ngôn ngữ và bổ sung cho nó.

OOP mới

Trong phiên bản mới của ngôn ngữ, công việc với các lớp đã được thiết kế lại một phần.
Các phương thức lớp có thể được khai báo cả trong thân lớp và bên ngoài nó.
Lớp này bây giờ có một hàm tạo rõ ràng: init.

Mã mẫu:

...
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
...

Nếu sự kế thừa xảy ra thì chúng ta có cơ hội dễ dàng thực hiện các lệnh gọi kế thừa (super).

Mã mẫu:

...
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

Ghi đè động các phương thức trên các thể hiện của lớp:

...
func Polymorph::NewFoo(c):
  return $a + $b + c  
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30)    // 60

Gói/không gian tên

Không gian tên phải sạch sẽ!
Theo đó, ngôn ngữ phải cung cấp cơ hội này.
Trong Mash, nếu một phương thức lớp là tĩnh thì nó có thể được gọi một cách an toàn từ bất kỳ phần nào của mã.

Ví dụ:

...
class MyPackage:
  func MyFunc(a, b):
    return a + b  
  end
end
...
println( MyPackage -> MyFunc(10, 20) )    // 30

Nhân tiện, toán tử siêu sẽ hoạt động chính xác khi được gọi theo cách này.

Ngoại lệ

Trong phiên bản mới của ngôn ngữ, chúng được coi như các lớp:

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

enum mới

Bây giờ các phần tử liệt kê có thể được gán giá trị không đổi:

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

Ngôn ngữ nhúng

Có khả năng Mash có thể tìm thấy vị trí thích hợp của mình như một ngôn ngữ lập trình nhúng, tương tự như Lua.

Để bắt đầu sử dụng Mash cho những mục đích này, bạn thậm chí không cần phải tự mình lắp ráp dự án.

Mash có Môi trường thời gian chạy - VM dựa trên ngăn xếp được biên dịch dưới dạng thư viện động với API đầy đủ.

Tất cả những gì bạn cần làm là thêm nó vào phần phụ thuộc của dự án và thực hiện một vài lệnh gọi.

Bản thân ngôn ngữ này cung cấp chức năng để hoạt động như một ngôn ngữ nhúng.
Đồng thời, hiệu suất kết hợp với ngôn ngữ và thư viện của bên thứ ba không bị ảnh hưởng.
Chúng tôi có được một ngôn ngữ nhúng có thể sử dụng toàn bộ sức mạnh của nhiều khung khác nhau được viết trong đó.

Mash + JVM

Tôi bắt đầu phát triển một phiên bản dịch cho JVM.
Có lẽ, sau N khoảng thời gian, một bài viết về chủ đề này sẽ xuất hiện trên Habré.

Kết quả

Không có kết quả cụ thể. Đây là một đại diện trung gian của kết quả.
Chúc mọi người may mắn vào năm 2020.

Nguồn: www.habr.com

Thêm một lời nhận xét