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

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

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

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

ตลอดทั้งปีนี้ ภาษาได้รับการปรับปรุงอย่างมีนัยสำคัญ มีการคิดทบทวนในหลายๆ ด้าน และมีการกำหนดทิศทางการพัฒนา

ฉันมีความสุขที่ได้แบ่งปันสิ่งเหล่านี้กับชุมชน

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

โครงการนี้ได้รับการพัฒนาขึ้นด้วยความกระตือรือร้นล้วนๆ และไม่ได้อ้างความโดดเด่นระดับโลกในด้านภาษาการเขียนโปรแกรมแบบไดนามิก!

การพัฒนานี้ไม่ควรได้รับการพิจารณาให้เป็นมาตรฐานที่ใครๆ ควรพยายามบรรลุถึง แม้ว่าโครงการนี้จะไม่เหมาะสมนัก แต่ก็ยังคงพัฒนาต่อไป

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

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

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

คอมไพเลอร์มีตัวสร้างโค้ดในรายการ asm (สำหรับแอสเซมเบลอร์สำหรับสแต็ก VM)
ขณะนี้ฉันกำลังพัฒนาเวอร์ชันของเครื่องกำเนิดไฟฟ้าสำหรับ Java (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
...

หากเกิดการสืบทอด เราก็สามารถทำการเรียกแบบสืบทอดได้อย่างง่ายดาย (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 ซึ่งเป็น VM ที่ใช้สแต็กซึ่งสร้างขึ้นเป็นไลบรารีแบบไดนามิกพร้อม API เต็มรูปแบบ

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

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

แมช + เจวีเอ็ม

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

ผลของการ

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

ที่มา: will.com

ซื้อโฮสติ้งที่เชื่อถือได้สำหรับไซต์ที่มีการป้องกัน DDoS เซิร์ฟเวอร์ VPS VDS 🔥 ซื้อบริการเว็บโฮสติ้งที่เชื่อถือได้ พร้อมระบบป้องกัน DDoS และเซิร์ฟเวอร์ VPS/VDS | ProHoster