เทคโนโลยีที่อนุญาตให้เขียนโปรแกรมภายในเกมคืออะไร


27

มีบางเกมที่ให้ผู้เล่นที่จะเขียนเป็น / สร้างสคริปต์ในเกมตัวอย่างเช่น: วิศวกรอวกาศหรือPsi

ฉันต้องการใช้สิ่งที่คล้ายกับอย่างใดอย่างหนึ่ง แต่ฉันมีความยากลำบากในการค้นหาข้อมูลดังนั้นคำถามของฉันคือ:

มีสาขาการเขียนโปรแกรมที่ครอบคลุมความสามารถของซอฟต์แวร์เมื่อรวบรวมเพื่อเรียกใช้รหัสใหม่ที่สร้างโดยผู้ใช้หรือไม่

ตามสาขาของการเขียนโปรแกรมฉันหมายถึงบางสิ่งบางอย่างเช่น PTG (กระบวนงานภูมิประเทศรุ่น)

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


22
อาจเป็น "การเขียนล่าม" หรือไม่?
MatthewRock

2
ฉันตอบคำถามที่คล้ายกันเมื่อเร็ว ๆ นี้โดยพูดถึง " Virtual Machine " เป็นคำศัพท์สำหรับระบบที่เรียกใช้รหัสผู้ใช้และยังอ้างถึงบทความรูปแบบการเขียนโปรแกรมเกมในรูปแบบ Bytecodeเพื่อใช้งานได้เร็วกว่าล่ามธรรมดา
DMGregory

3
มักเรียกว่า "การเขียนสคริปต์" คุณจะพบเนื้อหามากมายเกี่ยวกับวิธีการใช้สคริปต์ในเกมรวมถึงตัวอย่างโอเพ่นซอร์สและโค้ดจริงมากมาย ในขอบเขตที่กว้างขึ้นมีฟิลด์ทั้งหมดของการเขียนโปรแกรมคอมไพเลอร์ (ซึ่งรวมถึง lexing, การแยกวิเคราะห์, รวบรวม, การเชื่อมโยง, การตีความ ... ) ในขอบเขตที่กว้างที่สุด (ไม่จำเป็นว่ามีประโยชน์) สิ่งนี้มีความสัมพันธ์กับผู้ใช้งานแอพพลิเคชั่นของคุณมากทีเดียว - เอ็นจิ้นการเขียนสคริปต์เป็นวิธีที่ซับซ้อนกว่าในการเลือกจากเมนู
Luaan

2
โปรแกรม Python สามารถโฮสต์สคริปต์ Python ได้ นั่นเรียกว่า metaprogramming ภาษาที่ตีความส่วนใหญ่มีสิ่งนั้น
user6245072

1
AFAIK ในวิศวกรอวกาศโค้ดนั้นได้รวบรวมรหัส C # ในสภาพแวดล้อมแบบแซนด์บ็อกซ์ (เกมดังกล่าวเป็นโอเพ่นซอร์สดังนั้นคุณสามารถตรวจสอบวิธีการทำงานออนไลน์: github.com/KeenSoftwareHouse/SpaceEngineers ) โดยพื้นฐานแล้วเกมมาพร้อมกับคอมไพเลอร์ C # และรหัสอนุญาตให้เข้าถึงฟังก์ชั่น API ของเกมเท่านั้นดังนั้นขอบเขตของโปรแกรมจะ จำกัด เฉพาะคุณเท่านั้น และถ้าคุณกำลังเล่นหลายคนรหัสจะทำงานบนเครื่องของคุณเท่านั้น (ผู้เล่นคนอื่น / เซิร์ฟเวอร์เพิ่งเห็นผลที่ตามมาในเกม)
Florian Castellane

คำตอบ:


42

สคริปต์ที่เขียนด้วยภาษาสคริปต์ / แบบฝัง / ตีความเช่น "Lua", "Lisp" หรือ "AngelScript" ( เพิ่มเติมที่นี่ ) สามารถอัปเดตระหว่างเกม[*]จากนั้นตีความ (= ดำเนินการ) ได้ทันที

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

คำถามที่เชื่อมโยงบางคำถามที่เกี่ยวข้อง:


[*] โดยผู้ใช้เป็นส่วนหนึ่งของการเล่นเกมหรือโดย devs สำหรับการทำซ้ำ / ทดสอบอย่างรวดเร็วโดยไม่ต้องรีสตาร์ทแอปพลิเคชัน


14
ฉันจะระมัดระวังเมื่อเรียกบางอย่าง "ภาษาที่ตีความ" ที่ดีที่สุดมันเป็นคำโต้แย้งมาก
wondra

1
Computercraft (minecraft mod) ใช้ LUA เป็นภาษาสคริปต์เพื่อตั้งโปรแกรมงานภายในเกม
Tikeb

20
ฉันไม่เข้าใจความยุ่งยาก เสียงกระเพื่อมสามารถตีความและเรียบเรียงได้ เราไม่ได้อยู่ที่นี่เพื่อแยกแยะวิธีแยกแยะภาษาและว่าinterpretedเป็น clasisfication ที่ดีหรือไม่ เรากำลังบอก OP ผู้ที่ไม่ทราบความจริงว่าภาษานี้ไม่จำเป็นต้องรวบรวม แต่สามารถตีความได้ - และเราให้ตัวอย่างภาษา เสียงกระเพื่อมตีความ? ใช่. มันรวบรวมหรือไม่ ใช่แล้ว! แต่นั่นอยู่นอกขอบเขต คำตอบอาจไม่ถูกต้องหากใช้ถ้อยคำ แต่มันก็ดีสำหรับวัตถุประสงค์ มันผลัก OP ในทิศทางที่ถูกต้องและนั่นคือสิ่งที่นับ ที่นี่ลอง +1 ของฉัน
MatthewRock

1
แม้ว่าภาษาจะคอมไพล์เท่านั้นสิ่งที่จะหยุดคุณจากการฝัง IDE, คอมไพเลอร์และรันไทม์ในเกมของคุณ? ยกเว้นงบประมาณนั่นคือ
59

3
@DanielJour ในขณะที่ฉันจะยอมรับว่าในทางทฤษฎีภาษาสามารถแตกต่างจากการดำเนินงานของมัน (รวบรวมไปยังรหัสเครื่องเทียบกับรวบรวมเพื่อ bytecode สำหรับ vm) ก็ยังคงเป็นข้อสันนิษฐานการประหยัดเวลาที่เป็นประโยชน์ที่ C จะรวบรวมเว้นแต่จะระบุไว้เป็นอย่างอื่น หน้าตาที่คุณจะได้รับถ้าถามว่า "รอคอมไพล์ C หรือตีความ C?" ทุกครั้ง) สำหรับจุดประสงค์ของ OP เขาต้องการดูภาษาที่รองรับการตีความ ไม่ว่าพวกเขาจะสามารถรวบรวมได้หรือไม่ก็ไม่ใช่ปัญหาเพราะนั่นไม่ใช่วิธีที่เขาจะใช้
Blackhawk

12

ภาษาแบบฝังเป็นคำศัพท์ทางเทคนิคที่เหมาะสม ในทางปฏิบัติภาษาที่ใช้ในแอพพลิเคชั่นอื่น ๆ (เช่นเกม) มักจะถูกเรียกว่าสคริปต์หรือแม้กระทั่งการตีความภาษาแม้ว่าพวกเขาจะไม่จำเป็นต้องตีความหรือใช้สำหรับการทำงานอัตโนมัติตามปกติ Googling "ภาษาสคริปต์สำหรับเกม" น่าจะให้ผลลัพธ์ที่มีประโยชน์มากกว่าการค้นหา "ภาษาที่ฝัง"


11

คุณกำลังมองหาวิธีในการเปลี่ยนรหัสเป็นการกระทำบางอย่าง นี่คือสิ่งที่ล่ามทำ

ดู Python คุณเรียกใช้และแบม! คุณที่ดินในREPL ( Rอี๊ดE Val P rint L OOP)

คุณกำหนดฟังก์ชั่น "สวัสดี" ซึ่งพิมพ์ "Hello, world" และคุณมีมัน!

สังเกตว่าคุณไม่ได้รวบรวมอะไรเลย ล่ามทำเวทมนต์เพื่อสร้างฟังก์ชั่นการบิน (ระหว่างรันไทม์) และตอนนี้คุณสามารถเรียกมันได้แล้ว

เช่นเดียวกับเกม แทนที่จะมี REPL คุณมีเกมที่มีโมดูล REPL เกมอาจเริ่มเล่น REPL แล้วรันทุกอย่างใน REPL นี้ดังนั้นคุณจึงสามารถเข้าถึงข้อมูลและสามารถแก้ไขได้

หากคุณกำลังทำงานกับภาษาขนาดใหญ่เช่น C ++ พวกเขามีแนวโน้มที่จะมีพลังน้อยและรวบรวม คุณต้องการได้ง่ายขึ้น คุณสร้างภาษาของคุณเองหรือใช้บางอย่างที่มีอยู่ (เช่น CoffeScript, Squirrel, Lua, Scheme, ... )

เหล่านี้มักจะเรียกว่าภาษาสคริปต์เนื่องจากคุณใช้พวกเขาในการเขียนสคริปต์ที่สร้างขึ้นบนเครื่องมือเกมที่พัฒนาในภาษาอื่น ๆ (เช่น C ++)


2

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

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

เพียงแค่เรียกใช้รหัสผู้ใช้ที่ไม่ได้รับอนุญาตในภาษาที่ใช้งานทั่วไป (เช่น python หรือ perl) จากภายในเกมของคุณคุณสามารถอนุญาตให้ผู้ใช้ยุ่งกับสิ่งที่เขาไม่ควรทำ แต่มันก็ขึ้นอยู่กับเกมของคุณ หากคุณไม่รังเกียจผู้ใช้ที่ทำสิ่งต่าง ๆ เช่นการเปิดหน้าต่างใหม่จากภายในเกมของคุณหรือสิ่งที่พวกเขาต้องการคุณสามารถใช้ภาษาที่ใช้งานทั่วไปและแสดงการผูกกับคุณสมบัติบางอย่างของโลกเกมของคุณ


1

มีสองตัวอย่างที่ฉันสามารถนึกได้จากส่วนบนของหัว ทั้งคู่ดูเหมือนจะทำสิ่งที่คุณขอ

ที่แรกก็คือหินกรวด https://screeps.com/คุณสามารถอ่านได้มากมายเกี่ยวกับการบรรลุเป้าหมายนี้ที่http://support.screeps.com/hc/en-us/articles/205960931-Server-side-architecture-overview

ประการที่สองคือ ComputerCraft http://www.computercraft.info/ พวกเขาไม่ได้ลงรายละเอียดมากเท่าที่มันทำงาน แต่สามารถเห็นเล็กน้อยที่ wiki ของพวกเขาhttp://www.computercraft.info/wiki/Main_Page

ในสาระสำคัญเกมหลักรันล่ามในเธรดแยกต่างหากจากนั้นอนุญาตให้เธรดนั้นจัดการโลกของเกมผ่านการเรียก API

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

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

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

ไม่มีโปรแกรมสาขาเดียวที่จัดการข้อกังวลเหล่านี้ทั้งหมด แต่คุณจะต้องมีรากฐานที่แข็งแกร่งในการทำมัลติเธรดและความรู้ทั่วไปเกี่ยวกับการทำงานของล่าม


0

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

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

parser ได้รับการแก้ไข (เรียบเรียง) แต่ทำงานกับรหัสภายนอกที่ยืดหยุ่นได้

ความสามารถในการประมวลผลที่คอมไพล์ต้องมีAPI ภายในเนื่องจากเป็นฟังก์ชันการทำงานที่เกี่ยวข้อง เพื่อให้ parser สามารถดำเนินการได้ เป็นไปได้ว่าจะต้องมีการเข้าถึงข้อมูลภายในของปฏิบัติการ (สองทิศทาง) หรือ parser ต้องจัดเก็บข้อมูลและดูแลทำความสะอาดบางประเภท

โปรแกรมแยกวิเคราะห์สามารถอ่านโค้ดโปรแกรมภายนอกเมื่อเริ่มต้นการทำงานของโปรแกรมหรือสามารถอ่าน (บางส่วน) มันเฉพาะกิจหรือสามารถอ่านซ้ำได้ในแต่ละเฟรม (จะไม่มีประสิทธิภาพ) หรือรหัสสามารถพิมพ์ด้วยมือและ โพสต์ไปที่ parser เมื่อพร้อมแล้ว (เช่น: "ย้ายหน่วย X ไปข้างหน้า 5 ขั้นตอน" [ใส่])

เป็นหลักรหัสภายนอกไม่คงที่ - มันสามารถเปลี่ยนปีวันหรือนาทีใด ๆ แต่ก็ยังคงไม่จำเป็นต้องคอมไพล์ปฏิบัติการใหม่อีกครั้ง เฉพาะพฤติกรรมที่เกิดขึ้นซึ่งโฮสต์โดยไฟล์ที่เรียกทำงานได้เท่านั้นที่เปลี่ยนแปลง

ข้อความที่คุณกำลังอ่านอยู่ในขณะนี้คือ (ชนิดและยิ่งถ้ามันถูกพูด) ตีความเพราะคุณ "รัน" มันในสมองของคุณในขณะที่อ่านมันโดยไม่ทราบว่าประโยคถัดไปพูดว่า (หรือแม้ว่ามันอาจเป็นไปได้ ตอนนี้) ตรงข้ามกับ Stack Overflow (ก่อน) รวบรวมเรื่องราวทั้งหมดเป็น bytecode ในสมองของคุณซึ่งดำเนินการแล้ว - และ ofc แล้วมันไม่สามารถเปลี่ยนแปลงได้อีกต่อไป

phenomen อย่างต่อเนื่องเป็น interpretion การเขียนสคริปต์เป็นเพียงการกระทำของการสร้างคำอธิบายหรือเขียน การเขียนโปรแกรมคอมพิวเตอร์ทั้งหมดเป็นการเขียนสคริปต์ imo - เราอธิบายสิ่งที่เราต้องการจะเกิดขึ้น คำว่า "การเขียนสคริปต์" มีความหมายค่อนข้างเอียง แต่ก็ไม่เป็นไร เรารู้ว่าเราหมายถึงอะไร

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

sock = Socket.New (AddressFamily.InterNetwork, SocketType.Stream ProtocolType.Tcp) [ENTER]

... และจากนั้นไปเป็นเวลา 30 ... ไม่หยุดพักกาแฟ 45 นาที :-) เมื่อกลับมามี "ถุงเท้า" อยู่และพร้อมสำหรับการใช้งานต่อไปโดยพิมพ์ด้วยมือมากขึ้นหรือปล่อยให้ระบบอัตโนมัติของล่ามดำเนินต่อไป


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

แน่นอนว่าภาษาที่ตีความอาจทำงานได้เร็วขึ้นด้วยเช่นกันเพราะเป็นโค้ดไบต์ที่ประมวลผลและการประมวลผลอาจได้รับการปรับให้เหมาะสมที่สุดขึ้นอยู่กับระบบอัตโนมัติของล่าม นอกจากนี้ล่ามบางคนสามารถรวบรวมจากรหัสชิ้นส่วนของรหัสไปเป็น bytecode (และดำเนินการ), ad hoc ตัวอย่างนี้เป็นเพียงตัวอย่างของอิสรภาพ "ไปหนึ่งคำสั่งในเวลา"? นั่นคือการทำให้ใหญ่เกินไปอาจเพิ่ม "ในขณะที่รหัสในอนาคตมีความยืดหยุ่น"
Stormwind

คิดว่า "สคริปต์" มากกว่าสคริปต์ภาพยนตร์ - คุณยังต้องการนักแสดงและสิ่งเหล่านี้ถูกกำหนดโดยตรงในแง่ของชีววิทยาและสังคมวิทยาไม่ใช่วิทยาศาสตร์ภาพยนตร์ (แม้ว่าท้ายที่สุดจะอิงตามชีววิทยาและสังคมวิทยา) เพราะภาษาเหล่านี้มีมากกว่า เหมาะสำหรับจุดประสงค์นั้น แต่ไม่ใช่ของอื่น :)
rackandboneman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.