หลังจากเขียนบทความแรกเมื่อ วิธีสร้างระบบปฏิบัติการของคุณเองมีคนบอกฉันว่าฉันสามารถทำบทความเกี่ยวกับ วิธีสร้างภาษาโปรแกรม. ตอนแรกฉันไม่ได้ให้ความสนใจมากนัก แต่ตอนนี้และในทางอื่น ๆ ฉันได้เรียนรู้เพิ่มเติมเกี่ยวกับการสร้างภาษาโปรแกรม ลองทำดู ภาษาโปรแกรมพื้นฐานสามารถฝังในโปรแกรมอื่น ๆ ได้อย่างง่ายดายและทำงานร่วมกับเครื่องเสมือนที่เราจะออกแบบด้วย วันนี้เราต้องทำ virtual machine พื้นฐานที่สุด
คุณอาจสงสัยว่า: เครื่องเสมือน? แต่มันไม่ได้ยากมากและยังทำให้โปรแกรมช้าลงด้วย” ในทางตรงกันข้ามเครื่องเสมือนธรรมดานั้นง่ายมากและค่อนข้างเร็ว ฉันเลือกแล้ว สนิม เป็นภาษาสำหรับเครื่องเสมือน แต่มันคืออะไร สนิม?
สนิม ติดตั้งใน ลินุกซ์ ด้วยวิธีง่ายๆ อย่างไรก็ตามไม่มีพัสดุอย่างเป็นทางการ ผู้ใช้ของ อูบุนตู คุณสามารถเพิ่มทั้งสองนี้ 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
ในบทถัดไปเราจะดูเพิ่มเติมเกี่ยวกับภาษาโปรแกรมของเรา
ความอยากรู้อยากเห็นที่น่าสนใจแม้ว่าในความเป็นจริงจะไม่มีประโยชน์มากนัก แต่ก็ไม่เจ็บที่จะรู้
เป็นเรื่องดีที่คุณโฆษณา Rust มันเป็นภาษาที่ให้คำมั่นสัญญามากมายไม่เพียง แต่จะปลอดภัยกว่า c ++ เท่านั้น แต่ (สำหรับตอนนี้) มีความชัดเจนในไวยากรณ์
สำหรับภาพถ่ายฉันจะไม่พิจารณา java evolution XD
และจาก Fortran ฉันไม่เคยใช้เลย แต่ฉันไม่เคยได้ยินสิ่งดีๆมากมายเกี่ยวกับมัน ...
ฉันทำและมีประโยชน์อย่างยิ่งในด้านวิศวกรรมแม้ว่า Python จะได้รับความนิยม
ฟอร์แทรนอาจเป็นภาษาที่ยอดเยี่ยมอื่น ๆ พร้อมกับภาษาซีแม้ว่าในวันนี้คำถามที่สำคัญจริงๆจะเป็นหนึ่งหรืออื่น
และคงจะเป็นที่ถกเถียงกันอยู่ว่า Fortran เป็นเหมือน 'วิวัฒนาการ' ของ C ซึ่งอาจจะเป็นไปในทางอื่นเนื่องจาก C ใหม่กว่าทันสมัยกว่าและมีความเป็นไปได้มากกว่า แม้ว่าจะไม่ได้แยกออกจากกันอย่างน้อยที่สุด
แม้ว่าตำแหน่งสุดท้ายจะเป็นที่ถกเถียงกันในบางมุมมอง
+1 ไปยัง Java
ลองดูว่าฉันชอบสิ่งนี้หรือไม่ฉันให้บางอย่างกับการเขียนโปรแกรม แต่พื้นฐานเพื่อดูว่าฉันเข้าใจมากขึ้นหรือไม่
จุดประสงค์ที่แท้จริงของการสร้างภาษาโปรแกรมใหม่คืออะไรสำหรับฉันโดยส่วนตัวแล้วดูเหมือนว่าเป็นอุบายในการซ่อนซอร์สโค้ด
เพื่อนเกิดอะไรขึ้นกับความต่อเนื่องของ "ระบบปฏิบัติการของคุณเอง"? อย่าทิ้งไว้ที่นั่นโปรดดำเนินการต่อ
อันที่จริงคุณเป็นผู้เชี่ยวชาญและมีเพียงสองเพลงนี้เท่านั้นที่ดึงดูดความสนใจของฉันได้อย่างสมบูรณ์ แต่ฉันไม่ต้องการให้พวกเขาหยุดกลางคัน
ฉันรู้ว่าพวกเราหลายคนคิดเหมือนกันและเรากำลังรอความต่อเนื่องและข้อสรุปของหัวข้อที่น่าสนใจเหล่านี้
น่าสนใจมากขอบคุณมาก 🙂
ฉันไม่ถือว่า java เป็นภาษาโปรแกรมแทนที่จะเป็นตัวแปลคำสั่งเนื่องจากไม่สามารถคอมไพล์ได้
[ภาษาโปรแกรมเป็นภาษาทางการที่ออกแบบมาเพื่อแสดงกระบวนการที่สามารถดำเนินการโดยเครื่องจักรเช่นคอมพิวเตอร์]
ด้วยเหตุนี้ Java จึงเป็นภาษาโปรแกรม แม้แต่ภาษา bash (ภาษา linux shell) ก็เป็นภาษาโปรแกรมในตัวเอง
ภาษามีสองประเภท:
- เรียบเรียง
- ตีความ
- ผสม (เครื่องเสมือนไลบรารีดั้งเดิมถูกรวบรวมและตีความรหัสการทำงาน)
ล่ามมีประโยชน์มากเมื่อพูดถึงหลายแพลตฟอร์มและไม่มีผลงานที่น่ากลัวสำหรับสิ่งนั้น Java, VB.NET, C ++ .NET, F #, C # เป็นภาษาผสมทั้งหมด ภาษา bash, bat, PHP, Javascript และอื่น ๆ อีกมากมายเป็นภาษาที่ตีความได้
หากคุณไม่ถือว่า Java เป็นภาษาเนื่องจากมีการตีความ (ซึ่งไม่ใช่) คุณไม่ควรพิจารณาภาษาอื่น ๆ อีกมากมายที่ใช้ในการสร้างโปรแกรม ยิ่งไปกว่านั้นโดยกฎสามข้อนี้คุณไม่ควรพิจารณาว่ามีภาษาโปรแกรมใด ๆ ยกเว้นภาษาเครื่องเอง
แล้วทำไมล่ะถึงไม่ถือว่าภาษาเครื่องเป็นภาษาเนื่องจากเป็นเพียงชุดคำสั่งที่โปรเซสเซอร์ "ตีความ"
เนื่องจากอย่างมีประสิทธิภาพภาษาทั้งหมดจึงไม่มีอะไรมากไปกว่าชุดคำสั่งที่โปรเซสเซอร์ตีความ
คุณอาจชอบภาษามากหรือน้อย (ในกรณีนี้คือ Java) ดูเหมือนมีประโยชน์และมีประสิทธิภาพมากหรือน้อย แต่จะบอกว่าไม่ใช่ภาษาโปรแกรมเพราะไม่ได้คอมไพล์ ... มันขัดกับคำจำกัดความของภาษาโปรแกรมทั้งหมด
😐ฉันหวังว่าฉันจะไม่ดูหยาบคายเกินไป
ไม่มีความเงียบสงบคุณทำลายชีวิตเราเท่านั้น
ฮ่า ๆ ๆ ๆ ๆ ๆ ๆ มันไม่ใช่ความตั้งใจของฉัน xD
java เป็นภาษาโปรแกรม เนื่องจากคุณสามารถพัฒนาแอปพลิเคชันและเมื่อคุณรวบรวมคุณสร้าง. jar ที่ตีความโดย JVM จากนั้นตามตรรกะ python ของคุณจะไม่ถูกตีความเช่นกัน แต่จะรวบรวมไปยังไฟล์ปฏิบัติการที่แตกต่างกัน ...
ข้อมูลดีมาก
ข้อมูลที่ดี แต่ฉันมีข้อสงสัยเป็นไปได้ที่จะสร้างภาษาโปรแกรมใหม่ตั้งแต่เริ่มต้นโดยไม่ต้องพึ่งพาการเปรียบเทียบหรือซอฟต์แวร์อื่น ๆ ฉันพูดในลักษณะเดียวกับที่ภาษาอื่นสร้างขึ้นเช่น java หรือ HTML
ฉันขอขอบคุณอย่างยิ่งที่คุณช่วยตอบคำถามนี้