ฉันต้องการสร้างเครื่องเสมือนมีการอ้างอิงที่ดีหรือไม่? [ปิด]


22

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

เสมือนเครื่องที่ฉันรู้ในการเล่นเกมจะค่อนข้างเก่า: Infocom ของZ-เครื่อง , LucasArts' SCUMM , id ซอฟต์แวร์ของ3 Quake ในฐานะนักพัฒนา. net ฉันคุ้นเคยกับCLRและดูคำแนะนำ CILเพื่อดูภาพรวมของสิ่งที่คุณใช้จริงในระดับ VM (เทียบกับระดับภาษา) ฉันได้ขลุกอยู่ที่6502 Assemblerในช่วงปีที่แล้ว

สิ่งนี้คือตอนนี้ที่ฉันต้องการที่จะใช้หนึ่งฉันต้องขุดลึกลงไปอีกนิด ฉันรู้ว่ามี stack based และลงทะเบียน VMs แต่ฉันไม่รู้จริงๆว่าอันไหนดีกว่าในเรื่องอะไรและถ้ามีแนวทางแบบไฮบริดมากกว่านี้ ฉันต้องจัดการกับการจัดการหน่วยความจำตัดสินใจว่าประเภทระดับต่ำเป็นส่วนหนึ่งของ VM และต้องเข้าใจว่าทำไมสิ่งเช่นldstr จึงทำงานเหมือนที่เป็นอยู่

หนังสืออ้างอิงเดียวของฉัน (นอกเหนือจากสิ่งของ Z-Machine) คือมาตรฐานการทำหมายเหตุประกอบของ CLIแต่ฉันสงสัยว่ามีการบรรยายที่ดีกว่าทั่วไป / พื้นฐานสำหรับ VM หรือไม่ โดยพื้นฐานแล้วคล้ายกับDragon Bookแต่สำหรับ VMs ฉันรู้ศิลปะของการเขียนโปรแกรมคอมพิวเตอร์ของ Donald Knuth ซึ่งใช้ VM แบบลงทะเบียน แต่ฉันไม่แน่ใจว่าจะมีการใช้ชุดข้อมูลนั้นอย่างไรโดยเฉพาะอย่างยิ่งเนื่องจากยังไม่เสร็จ

การชี้แจง: เป้าหมายคือการสร้าง VM พิเศษ ตัวอย่างเช่น Z-Machine ของ Infocom มี OpCodes สำหรับตั้งค่าสีพื้นหลังหรือเล่นเสียง ดังนั้นฉันต้องคิดออกว่า VM เป็น OpCodes กับคอมไพเลอร์ที่ใช้สคริปต์ (ภาษา TBD) และสร้าง bytecode จากมันได้อย่างไร แต่ฉันต้องเข้าใจสิ่งที่ฉันกำลังทำอยู่


¹ฉันรู้ว่าเทคโนโลยีสมัยใหม่ช่วยให้ฉันสามารถตีความภาษาสคริปต์ระดับสูงได้ทันที แต่ความสนุกในนั้นอยู่ที่ไหน :) มันยากที่จะ google เพราะ Virtual Machines ในปัจจุบันมักจะเกี่ยวข้องกับการจำลองเสมือนระบบปฏิบัติการ VMWare-type ...


6
โปรดทราบว่าสำหรับเครื่องที่ใช้สแต็คที่จะใช้งานแบบทัวริงนั้นจำเป็นต้องใช้หน่วยความจำภายนอกสแต็คไม่เช่นนั้นจะเป็นเพียงPDA
ratchet freak

1
คำถามแรกคือคุณต้องการไปไกลแค่ไหน ฉันไม่เคยดู SCUMM / SCUMMVM แต่คิดว่ามันค่อนข้างสูงที่จะรู้เกี่ยวกับสิ่งที่เคลื่อนไหวในขณะที่ CIL คือ ... ดังนั้นคุณต้องกำหนดรูปแบบหน่วยความจำของคุณ เช่นคำสั่งแอสเซมเบลอร์) จากนั้นเวอร์ชันแรกของ VM คือลูปdo { switch(opcode) {case OP1: ... case OP2: ...} while (nextop);แล้วอาจเป็นคอมไพเลอร์ ... และจากนั้นความสนุกก็เริ่มต้น - การปรับให้เหมาะสมเพื่อให้ใช้งานได้จริง
johannes

3
ลองเริ่มต้นด้วยการใช้งาน Forth runtime แบบง่าย ๆ
SK-logic

1
วิธีการว่าเป็นQuake 3เครื่องเสมือน?
Ramhound

3
@Ramhound เอ็นจิ้นเทคโนโลยี id ได้ใช้รูปแบบของ virtualisation ภายในมานานบทความนี้หรือข้อมูลของ Wikipediaอาจอธิบายได้ดีกว่า
Daniel B

คำตอบ:


18

ฉันเริ่มต้นโดยการตรวจสอบLua ทั้งเป็นการใช้งานตัวอย่างและเป็น VM / ภาษาที่ใช้งานได้มากหากคุณตัดสินใจที่จะไม่เปิดเผยตัวเอง

รหัสที่มาเป็น readble มากและนอกจากนี้ยังมีรหัสต้นฉบับข้อเขียน และบางเอกสารการออกแบบที่เขียนโดยผู้เขียนหลัก Roberto Ierusalimschy

สุดท้ายหากคุณเลือกที่จะใช้มันแทนของคุณเองแล้วคุณจะพบว่ามันได้รับความนิยมมายาวนานในหมู่นักพัฒนาเกมและมีมากที่มีประสิทธิภาพสูงการดำเนิน JIT

เกี่ยวกับ stack- vs register-based ผมคิดว่า VM ที่อิงกับ stack นั้นง่ายต่อการออกแบบ แต่คอมไพเลอร์อาจมีความซับซ้อนมากกว่า ในฐานะที่เป็นกระดาษ Iesualimschy บันทึก Lua เป็นคนแรกที่ลงทะเบียนตามภาษาวีเอ็มวี - แต่หลังจากนั้นอีกหลายคนก็แตกหน่อโดดเด่นที่สุด LLVM, Dalvik และจาวาสคริปต์สมัยใหม่ VMs


2
เกี่ยวกับเครื่อง vs stack: ฉันจำใบเสนอราคาจาก Parrot / Perl6 devs: "การสร้างเครื่องที่ใช้การลงทะเบียนยากกว่า แต่เราได้รับประโยชน์จากการวิจัยที่มีอยู่มากมายสำหรับด้านคอมไพเลอร์ของเรา" (ไม่ใช่ตัวอักษร)
johannes

+1 Lua มีการใช้งานไบต์ที่ยอดเยี่ยมและการออกแบบที่สะอาดมากสำหรับการเรียนรู้เกี่ยวกับ VM จาก นอกจากนี้คุณจะพบว่าหลายคนปรับแต่ง Lua สำหรับความต้องการของตนเองแสดงให้เห็นว่าสามารถขยายได้ถ้าคุณไม่ต้องการเริ่มต้นจากศูนย์
CodexArcanum

ยังคงผ่านเรื่องนี้ เอกสารที่ยอดเยี่ยมอีกฉบับจากนักพัฒนาเกี่ยวกับ VM: inf.puc-rio.br/~roberto/talks/lua-ll3.pdf
Michael Stum

2

ฉันไม่มีแหล่งข้อมูลเฉพาะที่จะเชื่อมโยงคุณในขณะนี้ แต่ฉันได้ค้นคว้าหัวข้อที่คล้ายกันในอดีตและพบว่าSmalltalk VM เป็นเครื่องมือช่วยการเรียนรู้ที่ดีเช่นกัน มีบทความและบทความทางวิชาการมากมายที่เขียนเกี่ยวกับรหัสไบต์ที่ Smalltalk ใช้รวมถึงการเขียนล่ามและ VM เพื่อใช้ bytecode การค้นหาของ Google smalltalk vm implementationหรือsmalltalk bytecode interpreterควรให้เนื้อหาการอ่านจำนวนมาก

หากคุณต้องการที่จะเห็นซอร์สโค้ดหรือลองใช้งานฉันขอแนะนำ Squeak หรือ Pharo เวอร์ชัน

ภาษาที่เกี่ยวข้อง / VM Selfอาจสนใจคุณเช่นกันเนื่องจาก Self นั้นเป็น Smalltalk ที่มีออบเจ็กต์ต้นแบบ (คล้ายกับ JavaScript)


0

ฉันจะเริ่มต้นจากการวิเคราะห์ว่าซอร์สโค้ด [script] เข้าสู่เครื่องหรือสภาพแวดล้อมรันไทม์ของคุณอย่างไร

หากคุณมีสิ่งที่ชอบในเอกสาร HTML <a onclick="dosomething();">คุณจะต้องมีคอมไพเลอร์ที่เร็วมากความเร็วในการประมวลผล bytecode ไม่ได้สำคัญมากในกรณีนี้ หากกรณีการใช้งานของคุณอยู่ใกล้กับ Java / .NET มากขึ้นซึ่งคุณสามารถรวบรวมได้เต็มรูปแบบแล้วสถาปัตยกรรม VM และโครงสร้าง bytecode จะใกล้เคียงกับ Java bytecodes หรือ IL

เกณฑ์อื่นคือสิ่งที่ฉันเรียกว่า "ความงาม" แต่เดิมสคริปต์ได้รับการพัฒนาเป็นภาษากาว - สคริปต์เพียงกำหนดวิธีการเชื่อมต่อฟังก์ชั่นพื้นเมืองต่างๆเข้าด้วยกัน (Perl, Python, Ruby, JS) ในกรณีดังกล่าวประสิทธิภาพของ VM และ bytecode นั้นมีความสำคัญน้อยกว่าในกรณีของ Java / .NET เมื่อโค้ดส่วนใหญ่ของคุณเป็นฟังก์ชันที่เขียนด้วยภาษาเอง

และเกณฑ์สำคัญสุดท้ายที่ฉันจะใช้คือความสามารถในการใช้ภาษาของคุณ ถ้าคุณมีแผนที่จะเพิ่มภาษารันไทม์ของอ็อบเจกต์ / ฟังก์ชั่นที่ใช้ในการพูด C ++ สถาปัตยกรรม VM ของคุณควรจะ "สะดวก" สำหรับการรวมเข้ากับ C ++ ตัวอย่างเช่น: หากคุณวางแผนที่จะเปิดเผยไปยังวัตถุสคริปต์ C ++ เนื่องจากเป็นตัวเลือกเดียวสำหรับคุณที่จะนับการอ้างอิงเป็นการจัดการฮีป (เช่น Python ให้ดู boost :: python เป็นตัวอย่างของการรวมระบบ) หากคุณวางแผนที่จะใช้การย้าย / การบีบอัดฮีป / GC แล้วมันจะเป็นเรื่องที่แตกต่าง วิธีของ Lua ในการเพิ่มสิ่งดั้งเดิมลงในรันไทม์นั้นค่อนข้างยุ่งยากสำหรับนักพัฒนา C ++

กล่าวอีกนัยหนึ่งให้ลองกำหนดกรณีการใช้งานปกติของคุณก่อนและจะง่ายกว่าที่จะแนะนำสิ่งที่คุณควรอ่าน


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

ประสิทธิภาพการทำงานของ Javascript สำคัญ ไม่ใช่สำหรับสคริปต์เล็ก ๆ แต่สำหรับไซต์ JS-heavy ที่มีขนาดใหญ่ขึ้นซึ่งเป็นส่วนที่ได้รับความนิยมมากกว่า มีเหตุผลที่เครื่องยนต์ JS ใช้คอมไพเลอร์ JIT เป็น (V8 ไม่ได้มีล่ามมันไปตรงกับรหัสเครื่อง)

@delnan: กรณีการใช้ JS ค่อนข้างแตกต่างจากการพูด Python ใน Python เมื่อคุณต้องการบางอย่างเช่นการนำอัลกอริธึมการติดตามเรย์มาใช้คุณจะทำไลบรารี่ดั้งเดิมและเรียกมันจากสคริปต์ สิ่งนี้จะเร็วกว่า (หรืออย่างน้อยก็ไม่ช้ากว่า) เสมอกว่าโซลูชัน JIT ใด ๆ ใน JS realm คุณไม่มีความหรูหราเช่นรหัสพื้นเมืองดังนั้นทางเลือกเดียวสำหรับคุณคือพยายามทำให้ JS VM ของคุณเร็วที่สุด แต่อีกครั้งกับราคา การประเมินผลของ "dosomethingnative ()" ใน HTML "<button onclick =" dosomethingnative () "> ในล่ามง่ายสามารถเรียงตามลำดับความสำคัญได้เร็วกว่าใน V8
c-smile

@ c-smile จุดของฉันอย่างแน่นอน

@delnan: แต่ประเด็นของฉันแตกต่างกันมาก: วิเคราะห์กรณีการใช้งานทั่วไปแล้วคุณสามารถตัดสินใจได้ว่าสถาปัตยกรรมประเภทใดของ VM, ไวยากรณ์ภาษา ฯลฯ ที่คุณต้องการ
c-smile
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.