Mash เป็นภาษาโปรแกรมที่รวบรวมตัวเอง

Mash เป็นภาษาโปรแกรมที่รวบรวมตัวเอง

สวัสดีทุกคนในปีใหม่ 2020

นับตั้งแต่มีการพิมพ์ครั้งแรก โพสต์ เกือบ 1 ปีผ่านไปแล้วเกี่ยวกับ Mash

ในระหว่างปีนี้ ภาษาได้รับการปรับปรุงอย่างมาก มีการพิจารณาแง่มุมต่างๆ มากมาย และกำหนดเวกเตอร์ของการพัฒนา

ฉันยินดีที่จะแบ่งปันทั้งหมดนี้กับชุมชน

ข้อจำกัดความรับผิดชอบ

โปรเจ็กต์นี้ได้รับการพัฒนาด้วยความกระตือรือร้นเท่านั้น และไม่ได้เสแสร้งว่าเป็นผู้ครอบครองโลกในด้านภาษาการเขียนโปรแกรมแบบไดนามิก!

การพัฒนานี้ไม่ควรถือเป็นมาตรฐานที่จะต้องมุ่งมั่น โครงการนี้ไม่เหมาะ แต่กำลังพัฒนาอยู่

GitHub
เว็บไซต์
ฟอรั่ม

คอมไพเลอร์ใหม่

ในสาขา /mashc ของที่เก็บโปรเจ็กต์ คุณสามารถดูเวอร์ชันใหม่ของคอมไพเลอร์ ซึ่งเขียนด้วยภาษา Mash (เวอร์ชันแรกของภาษา)

คอมไพเลอร์มีตัวสร้างโค้ดในรายการ asm (สำหรับแอสเซมเบลอร์สำหรับ VM แบบสแต็ก)
ขณะนี้ฉันกำลังพัฒนาเวอร์ชันของตัวสร้างสำหรับ Java (JDK 1.8)

คอมไพเลอร์เวอร์ชันใหม่รองรับฟังก์ชันการทำงานของภาษาเวอร์ชันแรกอย่างสมบูรณ์และเสริมด้วย

อ๊อฟใหม่

ในภาษาเวอร์ชันใหม่ การทำงานกับคลาสได้รับการออกแบบใหม่บางส่วน
วิธีการเรียนสามารถประกาศได้ทั้งในเนื้อหาของชั้นเรียนและภายนอก
ขณะนี้คลาสมี Constructor ที่ชัดเจน: 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

อย่างไรก็ตาม super Operator จะทำงานได้อย่างถูกต้องเมื่อถูกเรียกด้วยวิธีนี้

ข้อยกเว้น

ในภาษาเวอร์ชันใหม่ พวกเขาจะถือว่าเป็นคลาส:

...
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 มีสภาพแวดล้อมรันไทม์ - VM แบบสแต็กที่คอมไพล์เป็นไลบรารีไดนามิกพร้อม API เต็มรูปแบบ

สิ่งที่คุณต้องทำคือเพิ่มมันลงในการพึ่งพาโปรเจ็กต์และโทรออกสองสามครั้ง

ภาษานั้นมีฟังก์ชันการทำงานเป็นภาษาฝังตัว
ในเวลาเดียวกัน ประสิทธิภาพการทำงานร่วมกับภาษาและไลบรารีของบริษัทอื่นจะไม่ได้รับผลกระทบ
เราได้รับภาษาฝังตัวที่สามารถใช้พลังเต็มรูปแบบของกรอบงานต่างๆ ที่เขียนลงไปได้

มาช + JVM

ฉันเริ่มพัฒนาเวอร์ชันของนักแปลสำหรับ JVM
บางทีหลังจากผ่านระยะเวลา N โพสต์ในหัวข้อนี้จะปรากฏบนHabré

ผลของการ

ไม่มีผลลัพธ์ที่เฉพาะเจาะจง นี่คือการแสดงผลลัพธ์ระดับกลาง
ขอให้ทุกคนโชคดีในปี 2020

ที่มา: will.com

เพิ่มความคิดเห็น