สร้างภาษาโปรแกรมของคุณเอง (I)

วิวัฒนาการของภาษาโปรแกรม

หลังจากเขียนบทความแรกเมื่อ วิธีสร้างระบบปฏิบัติการของคุณเองมีคนบอกฉันว่าฉันสามารถทำบทความเกี่ยวกับ วิธีสร้างภาษาโปรแกรม. ตอนแรกฉันไม่ได้ให้ความสนใจมากนัก แต่ตอนนี้และในทางอื่น ๆ ฉันได้เรียนรู้เพิ่มเติมเกี่ยวกับการสร้างภาษาโปรแกรม ลองทำดู ภาษาโปรแกรมพื้นฐานสามารถฝังในโปรแกรมอื่น ๆ ได้อย่างง่ายดายและทำงานร่วมกับเครื่องเสมือนที่เราจะออกแบบด้วย วันนี้เราต้องทำ virtual machine พื้นฐานที่สุด

คุณอาจสงสัยว่า: เครื่องเสมือน? แต่มันไม่ได้ยากมากและยังทำให้โปรแกรมช้าลงด้วย” ในทางตรงกันข้ามเครื่องเสมือนธรรมดานั้นง่ายมากและค่อนข้างเร็ว ฉันเลือกแล้ว สนิม เป็นภาษาสำหรับเครื่องเสมือน แต่มันคืออะไร สนิม?

สนิม เป็นภาษาการเขียนโปรแกรมที่เน้นไปที่ความปลอดภัยในการดำเนินการดังนั้นการใช้ภาษานี้จะเป็นไปไม่ได้เลยที่ใครบางคนจะสามารถปิดเครื่องเสมือนได้ เป็นภาษาที่รวบรวมในการพัฒนาที่สร้างขึ้นโดย Mozilla. เซอร์โวแทน Geco,enกำลังพัฒนาในตัวเขา คุณยังคงสามารถเปลี่ยนไวยากรณ์ของคุณได้ แต่รหัสที่ฉันจะใช้จะยังคงอยู่จนกว่าจะมีการเผยแพร่ที่เสถียรครั้งแรก

สนิม ติดตั้งใน ลินุกซ์ ด้วยวิธีง่ายๆ อย่างไรก็ตามไม่มีพัสดุอย่างเป็นทางการ ผู้ใช้ของ อูบุนตู คุณสามารถเพิ่มทั้งสองนี้ PPA: ppa: hansjorg / สนิม  y ppa: cmrx64 / ขนส่งสินค้า, ผู้ใช้ โค้ง สามารถใช้ AUR (ขนส่งสินค้า เป็นแพ็คเกจที่ติดตั้งทุกอย่าง) ส่วนที่เหลือสามารถใช้:

curl -s https://static.rust-lang.org/rustup.sh | sudo sh

เครื่องเสมือนทำงานอย่างไร?

ถ้าคุณรู้ว่าโลกของแอสเซมเบลอร์ทำงานอย่างไรมันเหมือนกันทุกประการกับสแต็กหรือสแต็ก ถ้าไม่ฉันจะอธิบายให้คุณฟัง ลองนึกภาพรหัสต่อไปนี้:

พิมพ์ 2 + 3

คอมพิวเตอร์ไม่เข้าใจว่า 2 + 3 หมายถึงอะไรและไม่รู้ว่าต้องปฏิบัติตามคำสั่งใด คอมพิวเตอร์ทำงานกับแบตเตอรี่หรือสแต็คซึ่งข้อมูลถูกสะสมและดึงข้อมูลออกมาอย่างต่อเนื่อง รหัสนั้นในเครื่องเสมือนของเราควรมีลักษณะดังนี้:

PUSH 2 PUSH 3 ADD PRINT

โดยพื้นฐานแล้วเราจะวาง 2 บนสแต็กไว้ด้านบน 3 เช่นกัน ADD จะดึง (เช่นลบออกจากสแต็กและรับค่า) 2 รายการสุดท้ายในสแต็กและเพิ่มผลลัพธ์ที่ด้านบนสุดของสแต็ก PRINT จะใช้รายการสุดท้ายในสแตกและใช้เพื่อแสดงให้เราเห็น ทีนี้มาทำใน สนิม.

ก่อนอื่นเราต้องกำหนดภาษาสำหรับ รหัสไบต์เราสามารถใช้อันที่มีอยู่เหมือนใน ชวา ทั้ง CLR ของ. NET / Mono แต่เราจะสร้างพื้นฐานเพิ่มเติม

https://gist.github.com/a01de8904fd39a442c20

เราใช้สัญกรณ์ฐานสิบหกสำหรับแต่ละคำสั่ง ที่สูงเราได้วาง # [ได้มา (FromPrimitive)]เป็นลักษณะเฉพาะของ สนิม และจะช่วยให้เราสามารถเปรียบเทียบการแจงนับกับไบต์ได้โดยตรงในภายหลัง

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

https://gist.github.com/8950ce212a2de2f397f9

เราทำเช่นนั้นเพื่ออ่านแต่ละไบต์ทีละรายการและดำเนินการ:

https://gist.github.com/12e24a1f0dd65e4cd65d

อย่างที่คุณเห็นเราแยกความแตกต่างว่าเราได้รับคำสั่ง PUSH (คำสั่ง INTEGER ของเรา) มาก่อนหรือไม่ไบต์ถัดไปจะถูกนำไปที่สแต็กอย่างสมบูรณ์ เรากำลังใช้สองฟังก์ชั่นที่ฉันไม่ได้สอนคุณ self.pop () y self.push ()ซึ่งเห็นได้ชัดว่ารับผิดชอบในการจัดการกองซ้อน

https://gist.github.com/54147f853a8a2b8c01d9

ไม่ซับซ้อนมากนัก แต่ฟังก์ชันป๊อปมีกลไกการตรวจจับข้อผิดพลาด ในความเป็นจริง สนิมถ้าเราลบกลไกเหล่านั้นออกมันจะทำให้เรามีข้อผิดพลาดในการคอมไพล์ ตอนนี้เราต้องโทรในโปรแกรม เปริน (เครื่องเสมือนของเรา) และเรียกใช้ bytecode

https://gist.github.com/99b1ab461318b3a644d0

bytecode นั้นสามารถอ่านได้จากไฟล์ แต่เพื่อความง่ายฉันเก็บไว้ในตัวแปร หากเราดำเนินการมันจะให้ผลลัพธ์ที่คาดหวัง:

Perin v0.1 Perin VM รัน FlopFlip bytecode เริ่มต้นอินสแตนซ์ PerinVM PerinVM v0.1.0 ค่าจำนวนเต็ม 5

รหัสทั้งหมดมีอยู่ที่ GitHub ภายใต้ Apache License 2.0: https://github.com/AdrianArroyoCalle/perin. ในการรวบรวมพวกเขาต้องมี สินค้า ติดตั้งและใส่:

ชาร์จบิลด์ && ./target/main

ในบทถัดไปเราจะดูเพิ่มเติมเกี่ยวกับภาษาโปรแกรมของเรา


แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. ผู้รับผิดชอบข้อมูล: Miguel ÁngelGatón
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา

  1.   โรเดอร์ dijo

    ความอยากรู้อยากเห็นที่น่าสนใจแม้ว่าในความเป็นจริงจะไม่มีประโยชน์มากนัก แต่ก็ไม่เจ็บที่จะรู้

    เป็นเรื่องดีที่คุณโฆษณา Rust มันเป็นภาษาที่ให้คำมั่นสัญญามากมายไม่เพียง แต่จะปลอดภัยกว่า c ++ เท่านั้น แต่ (สำหรับตอนนี้) มีความชัดเจนในไวยากรณ์

    สำหรับภาพถ่ายฉันจะไม่พิจารณา java evolution XD

    1.    โรเดอร์ dijo

      และจาก Fortran ฉันไม่เคยใช้เลย แต่ฉันไม่เคยได้ยินสิ่งดีๆมากมายเกี่ยวกับมัน ...

      1.    ฉาวโฉ่ dijo

        ฉันทำและมีประโยชน์อย่างยิ่งในด้านวิศวกรรมแม้ว่า Python จะได้รับความนิยม

      2.    Juan dijo

        ฟอร์แทรนอาจเป็นภาษาที่ยอดเยี่ยมอื่น ๆ พร้อมกับภาษาซีแม้ว่าในวันนี้คำถามที่สำคัญจริงๆจะเป็นหนึ่งหรืออื่น

        และคงจะเป็นที่ถกเถียงกันอยู่ว่า Fortran เป็นเหมือน 'วิวัฒนาการ' ของ C ซึ่งอาจจะเป็นไปในทางอื่นเนื่องจาก C ใหม่กว่าทันสมัยกว่าและมีความเป็นไปได้มากกว่า แม้ว่าจะไม่ได้แยกออกจากกันอย่างน้อยที่สุด

        แม้ว่าตำแหน่งสุดท้ายจะเป็นที่ถกเถียงกันในบางมุมมอง

    2.    ฟรานซิส dijo

      +1 ไปยัง Java

  2.   Portaro dijo

    ลองดูว่าฉันชอบสิ่งนี้หรือไม่ฉันให้บางอย่างกับการเขียนโปรแกรม แต่พื้นฐานเพื่อดูว่าฉันเข้าใจมากขึ้นหรือไม่

  3.   ผู้ใช้ dijo

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

  4.   เยลลี่ dijo

    เพื่อนเกิดอะไรขึ้นกับความต่อเนื่องของ "ระบบปฏิบัติการของคุณเอง"? อย่าทิ้งไว้ที่นั่นโปรดดำเนินการต่อ

    อันที่จริงคุณเป็นผู้เชี่ยวชาญและมีเพียงสองเพลงนี้เท่านั้นที่ดึงดูดความสนใจของฉันได้อย่างสมบูรณ์ แต่ฉันไม่ต้องการให้พวกเขาหยุดกลางคัน

    ฉันรู้ว่าพวกเราหลายคนคิดเหมือนกันและเรากำลังรอความต่อเนื่องและข้อสรุปของหัวข้อที่น่าสนใจเหล่านี้

  5.   คริสเตียนเดวิด dijo

    น่าสนใจมากขอบคุณมาก 🙂

  6.   ตรงไปตรงมา dijo

    ฉันไม่ถือว่า java เป็นภาษาโปรแกรมแทนที่จะเป็นตัวแปลคำสั่งเนื่องจากไม่สามารถคอมไพล์ได้

    1.    มาริโอ dijo

      [ภาษาโปรแกรมเป็นภาษาทางการที่ออกแบบมาเพื่อแสดงกระบวนการที่สามารถดำเนินการโดยเครื่องจักรเช่นคอมพิวเตอร์]

      ด้วยเหตุนี้ Java จึงเป็นภาษาโปรแกรม แม้แต่ภาษา bash (ภาษา linux shell) ก็เป็นภาษาโปรแกรมในตัวเอง

      ภาษามีสองประเภท:
      - เรียบเรียง
      - ตีความ
      - ผสม (เครื่องเสมือนไลบรารีดั้งเดิมถูกรวบรวมและตีความรหัสการทำงาน)

      ล่ามมีประโยชน์มากเมื่อพูดถึงหลายแพลตฟอร์มและไม่มีผลงานที่น่ากลัวสำหรับสิ่งนั้น Java, VB.NET, C ++ .NET, F #, C # เป็นภาษาผสมทั้งหมด ภาษา bash, bat, PHP, Javascript และอื่น ๆ อีกมากมายเป็นภาษาที่ตีความได้

      หากคุณไม่ถือว่า Java เป็นภาษาเนื่องจากมีการตีความ (ซึ่งไม่ใช่) คุณไม่ควรพิจารณาภาษาอื่น ๆ อีกมากมายที่ใช้ในการสร้างโปรแกรม ยิ่งไปกว่านั้นโดยกฎสามข้อนี้คุณไม่ควรพิจารณาว่ามีภาษาโปรแกรมใด ๆ ยกเว้นภาษาเครื่องเอง

      แล้วทำไมล่ะถึงไม่ถือว่าภาษาเครื่องเป็นภาษาเนื่องจากเป็นเพียงชุดคำสั่งที่โปรเซสเซอร์ "ตีความ"

      เนื่องจากอย่างมีประสิทธิภาพภาษาทั้งหมดจึงไม่มีอะไรมากไปกว่าชุดคำสั่งที่โปรเซสเซอร์ตีความ

      คุณอาจชอบภาษามากหรือน้อย (ในกรณีนี้คือ Java) ดูเหมือนมีประโยชน์และมีประสิทธิภาพมากหรือน้อย แต่จะบอกว่าไม่ใช่ภาษาโปรแกรมเพราะไม่ได้คอมไพล์ ... มันขัดกับคำจำกัดความของภาษาโปรแกรมทั้งหมด

    2.    มาริโอ dijo

      😐ฉันหวังว่าฉันจะไม่ดูหยาบคายเกินไป

      1.    Maria Antonieta de Manuela Cardenas dijo

        ไม่มีความเงียบสงบคุณทำลายชีวิตเราเท่านั้น

      2.    มาริโอ dijo

        ฮ่า ๆ ๆ ๆ ๆ ๆ ๆ มันไม่ใช่ความตั้งใจของฉัน xD

    3.    คาร์ลอ dijo

      java เป็นภาษาโปรแกรม เนื่องจากคุณสามารถพัฒนาแอปพลิเคชันและเมื่อคุณรวบรวมคุณสร้าง. jar ที่ตีความโดย JVM จากนั้นตามตรรกะ python ของคุณจะไม่ถูกตีความเช่นกัน แต่จะรวบรวมไปยังไฟล์ปฏิบัติการที่แตกต่างกัน ...

  7.   อีเลียส มองเกลอส dijo

    ข้อมูลดีมาก

  8.   Carlos Arturo dijo

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