เมื่อใดที่จะใช้ภาษาสคริปต์ภายในโปรแกรมที่มีขนาดใหญ่กว่าจะมีประโยชน์?


70

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


1
ทำไมบางคนถึงลงคะแนนคำถามนี้ IMHO เป็นคำถามที่ดี
KK

28
มันมีประโยชน์มากสำหรับการสร้างซอฟต์แวร์ที่ซับซ้อนอย่างไร้เหตุผลซึ่งต้องใช้ที่ปรึกษาราคาแพงในการดูแลรักษาโดยเฉพาะอย่างยิ่งเมื่อภาษาสคริปต์แย่มาก
whatsisname

2
ฉันไม่มี "คำตอบ" ต่อการพูดคุย แต่ Pragmatic Programmer มีบทเกี่ยวกับเรื่องนี้ (# 12 - ภาษาของโดเมน) อาจให้ข้อมูลเชิงลึกบางอย่างสำหรับคุณ
Craige

1
มีคำตอบที่ดีสำหรับคำถามที่คล้ายกันเกี่ยวกับการพัฒนาเกม: gamedev.stackexchange.com/questions/2913/…
celion

6
บางครั้งมันจะดีกว่าถ้ามีระบบขนาดใหญ่ภายใน lanugage สคริปต์ - เรียกว่า " วิธี Unix " คุณสามารถติดระบบย่อยที่แตกต่างกันจำนวนมากเข้าด้วยกันโดยใช้เลเยอร์สคริปต์เล็ก ๆ สถาปัตยกรรมนี้มีความแข็งแกร่งและสามารถปรับขนาดได้
SK-logic

คำตอบ:


66

เมื่อคุณมีพฤติกรรมที่คุณไม่ต้องการให้คอมไพล์โปรแกรมซ้ำอีกครั้งเพื่อเปลี่ยน นี่คือเหตุผลที่เกมจำนวนมากใช้ Lua เป็นภาษาสคริปต์ / modding


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

2
ยัง sandboxing ดูที่การรวมกันของ Pender ของ Blender
meawoppl

@meawoppl ... หรือเพื่อเพิ่มฟังก์ชันการทำงานให้กับโปรแกรม ดูการรวม Python ของ IDA (ขนานกับ IDAPython)
Cole Johnson

ทำไมไม่ทำอย่างนั้นเพื่อที่คุณจะต้องคอมไพล์ไลบรารีอีกหนึ่งอันเท่านั้น (เช่นส่วนประกอบของเกมลอจิกเฉพาะ)?
ชัด

หากคุณดูเครื่องมืออื่น ๆ เช่น AutoCAD, Sparx Enterprise Architect, MS Word คุณจะไม่ต้องคอมไพล์พวกมันใหม่เพื่อเขียนสคริปต์พวกมันใน C #
Pete Kirkham

28

เทคนิคนี้สามารถใช้ในการใช้ตรรกะหลักที่พกพาได้ง่ายระหว่างสภาพแวดล้อมภาษาที่แตกต่างกัน ตัวอย่างเช่นฉันมีเครื่องคิดเลขจำลองที่ใช้ตรรกะเครื่องคิดเลขภายในทั้งหมดใน JavaScript 100% รหัสส่วนต่อประสานผู้ใช้แตกต่างกันในแต่ละแพลตฟอร์ม:

  • เว็บเบราว์เซอร์ (JavaScript)
  • iOS (วัตถุประสงค์ - C)
  • Windows (C ++ พร้อม Qt)
  • Mac OS X (C ++ พร้อม Qt)
  • Java Swing (Java)

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


18

ในวงกว้างมีสองสถานการณ์ที่คุณจะใช้รูปแบบนี้:

  1. สิ่งนี้ใช้ภายในเพื่อยกระดับคุณภาพของภาษาที่ฝังตัว
  2. สิ่งนี้ใช้เพื่อจัดเตรียมความสามารถในการโปรแกรมภายนอก

ภายใน

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

ตัวอย่างนี่คือ Lua ที่ใช้ใน Adobe Lightroom

ดังนั้นสิ่งที่เราทำกับ Lua คือเหตุผลทั้งหมดของแอปพลิเคชันตรรกะจากการเรียกใช้ UI เพื่อจัดการสิ่งที่เราทำจริงในฐานข้อมูล โค้ดในแอพที่สามารถอธิบายได้ว่าเป็นเรื่องการตัดสินใจหรือการนำคุณสมบัติไปใช้นั้นมีอยู่ใน Lua จนกว่าคุณจะได้รับการประมวลผลแบบดิบซึ่งอยู่ใน C ++ ( สัมภาษณ์ Mark Hamburg: Adobe Photoshop Lightroom )

อย่างผิวเผิน

  • อนุญาตให้ผู้ใช้ขยายพฤติกรรมของแอปพลิเคชันของคุณโดยไม่ต้องใช้เครื่องมือพิเศษและ / หรือไลบรารี่และ / หรือการเข้าถึงซอร์สโค้ดของคุณ
  • จัดเตรียม API ที่กำหนดไว้อย่างดีและสภาพแวดล้อมแบบ sandbox สิ่งนี้สามารถทำได้ในภาษาของแอปพลิเคชัน แต่การฝังล่ามสามารถทำให้สิ่งนี้ง่ายขึ้น

ไอบีเอ็มใช้ภาษาสคริปต์ประสบความสำเร็จมากในระบบปฏิบัติการเมนเฟรมของพวกเขาVM-CMS EXEC , EXEC / 2และRexx ที่ใหม่กว่านั้นถูกใช้ทั่วทั้งระบบทั้งภายในและภายนอก แอปพลิเคชันที่แตกต่างกัน (เช่นXEDIT ) สามารถใช้สคริปต์ได้โดยใช้ภาษาเดียวกันและแอปพลิเคชั่น / ยูทิลิตี้ภายใน (เช่นอีเมล) ถูกเขียนในภาษาสคริปต์และยกระดับการผนวกรวมกับ OS และเครื่องมืออื่น ๆ อย่างแน่นหนา ลูกค้าสร้างและแบ่งปันเครื่องมือและแอปพลิเคชั่นสคริปต์มากมาย DEC จัดเตรียมDCLด้วย หลังจากนั้น Microsoft สนับสนุนVBscriptเป็นภาษาสคริปต์ในแอปพลิเคชันส่วนใหญ่และPowerShellเมื่อเร็ว ๆ นี้(เช่นไฟล์แบตช์ MS / DOS ) Unix shells มีสคริปต์เหมือนกัน

แนวโน้มในวันนี้ดูเหมือนจะเปิดเผย API ในทางใดทางหนึ่งและปล่อยให้ตัวเลือกของภาษาสคริปต์ขึ้นอยู่กับผู้ใช้ที่สามารถใช้การเชื่อมโยงที่แตกต่างกันหรือวิธีการอื่นในการเข้าถึง API


9

ตัวอย่างในโลกแห่งความเป็นจริงจะรวมถึง: -

  • เว็บเบราว์เซอร์ส่วนใหญ่ที่รองรับ JavaScript แบบฝัง

  • Microsoft Office Suite - Excel Word และอื่น ๆ ทั้งหมดสนับสนุนสคริปต์ VBA แบบฝัง

  • เราเตอร์เครือข่ายหลายแห่งรวมถึงสคริปต์ API ในภาษาต่างๆ TCL, Perl, Lua

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


@ antony.trupe ชื่อที่ใช้กันทั่วไปเพื่ออ้างถึง ECMAscript - en.wikipedia.org/wiki/ECMAScript
James Anderson

4

บางครั้งสคริปต์จะถูกฝังในแอปพลิเคชันเนื่องจากเป็นวิธีการขยายแอปพลิเคชันโฮสต์โดยนักพัฒนาอื่น ๆ เพื่อให้สามารถใช้ทักษะการเขียนโปรแกรมภาษาได้หลากหลายเท่าที่เป็นไปได้โฮสต์สนับสนุนภาษาสคริปต์หลายภาษาสามารถรองรับได้ ตัวอย่างเช่นบน JVM คุณสามารถฝังทั้งภาษาที่เข้ากันได้กับ JSR-223รวมถึง Python, Ruby, JavaScript, และอื่น ๆ

อีกเหตุผลที่ไม่ได้กล่าวถึงคือภาษาที่ฝังมีคุณสมบัติอย่างน้อยหนึ่งอย่างที่ภาษาโฮสต์ไม่สามารถทำซ้ำได้ง่าย ตัวอย่างของสิ่งนี้คือฟังก์ชันการแยกวิเคราะห์หรือการสร้าง DSL (ภาษา / ภาษาเฉพาะโดเมน) ที่ง่ายดายซึ่งสามารถพบได้ในภาษาเช่น Rebol


3

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

หากภาษาโฮสต์ของคุณมี runtime ที่มีการสะท้อนแสงมากมักจะมีประโยชน์ในการฝังภาษาอย่างง่ายด้วย REPL ในแอปพลิเคชันของคุณเชื่อมต่อกับซ็อกเก็ตและให้การเข้าถึงระบบทั้งหมด

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


มีประสิทธิภาพมากกว่า Debugger ปกติหรือไม่ อย่างไหนล่ะ, แบบไหนล่ะ? "ภาษาสคริปต์ภายนอกแบบง่าย" ได้อย่างไรโดยที่ไม่มีความรู้ที่แท้จริงเกี่ยวกับสำนวนภาษาแม่ข่ายของคุณ, รูปแบบหน่วยความจำ, รูปแบบวัตถุ, ชนิดข้อมูลพื้นฐาน ฯลฯ อาจมีสิ่งอำนวยความสะดวกที่เป็นประโยชน์ที่ดีบักเกอร์ที่ออกแบบมา
Mason Wheeler

@MasonWheeler คุณสามารถสลับรหัสกับโปรแกรมดีบั๊กได้หรือไม่? คุณสามารถทำการสืบค้นที่ซับซ้อนที่โปรแกรมได้เองเกี่ยวกับสถานะของ runtime ของคุณหรือไม่? คุณสามารถทำการทดลองที่ควบคุมที่ซับซ้อนได้หรือไม่? และคุณคิดผิดว่าสมมติว่าภาษาสคริปต์ไม่มี "ความรู้ที่แท้จริงของสำนวนภาษาเจ้าบ้าน ... " หากทั้งโฮสต์และภาษาสคริปต์กำลังทำงานใน VM เดียวกัน (.NET, JVM, V8, อะไรก็ตาม) จะมีการเข้าถึงความกล้าทั้งหมดจากภาษาสคริปต์ของคุณ
SK-logic

1

สถานการณ์เฉพาะของฉันเมื่อฉันใช้ภาษาสคริปต์ที่ตีความในแอปพลิเคชันหลัก:

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

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

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

ดังนั้นแทนที่จะมีสถานะของ "ดำเนินการฟังก์ชั่นที่ไม่รอ", "ดำเนินการฟังก์ชั่นการปิดกั้น", "รันฟังก์ชั่นการแยก / เงื่อนไข / กระโดด" ในเครื่องสถานะ จำกัด อาจหกรัฐทั้งหมด และมีสคริปต์ควบคุมที่กำหนดเวลาดำเนินการจากนั้นดำเนินการโดยล่ามที่ควบคุมอุปกรณ์ภายนอกและวางผลลัพธ์ไว้ในตำแหน่งที่ต้องการ

โดยสรุปแล้วแอพพลิเคชั่น: ใน RTOS การใช้ภาษาสคริปต์ที่ตีความภายในอาจลดความซับซ้อนของการปฏิบัติงานมากมายในสถานะรอคอย (ฟังก์ชันการบล็อก)


1

จากประสบการณ์ของฉันเราเคยพัฒนาแอปพลิเคชั่นขนาดใหญ่ที่เขียนรหัสต้นฉบับของ "โบราณ" เพื่อให้เข้ากันได้กับ Unicode ทำใน C # ฉันลงเอยด้วยการเขียนเอ็นจิ้นเท่านั้น (ที่สร้างโมเดลข้อมูลและให้หมายถึงทำตามขั้นตอนที่จำเป็นสำหรับกระบวนการเขียนใหม่) ใน C # - "รหัสกาว" สำหรับการดำเนินการสิ่งต่าง ๆ ใน IronPython

จุดที่ใหญ่ที่สุดสำหรับ IronPython แบบรวม: สมมติว่าคุณโหลดโมเดลข้อมูลขนาดใหญ่ (เวลาโหลดประมาณหนึ่งชั่วโมง) จากนั้นคุณต้องการ - รวบรวมข้อมูลด้วยตนเองและค้นหาสิ่งต่างๆ การทำสิ่งนี้กับสคริปต์ Python จากคอนโซลแบบโต้ตอบนั้นดีกว่าการคลิกผ่านตัวแบบข้อมูลด้วยตัวดีบั๊ก (บวกกับมันสามารถเล่นซ้ำได้)


-2

มีเหตุผลสองประการ

  • โค้งการเรียนรู้ ทุกคนสามารถเรียนรู้และเขียนด้วยจาวาสคริปต์
  • ความปลอดภัย เป็นการยากที่จะควบคุมบริบทความปลอดภัยของรหัสสคริปต์ใน C # หรือ Java Javascript นั้นสมบูรณ์แบบสำหรับสิ่งนั้น ผู้เขียนสคริปต์ไม่สามารถเข้าถึงดิสก์หรือที่ใดก็ได้หากไม่อนุญาต Core javascript engine เป็นเพียงเครื่องคิดเลขขั้นสูง
  • คุณภาพ. คุณใส่รหัสสคริปต์หนามาก ระดับ "รหัสสปาเก็ตตี้" นั้นแตกต่างกันมากสำหรับ Javascript หรือ C # / Java (ซึ่งป้องกันไม่ให้คุณเปิดประตูแห่งนรก)
  • ประเภทความปลอดภัย C # / Java เป็นสภาพแวดล้อมที่ปลอดภัยชนิดคุณส่วนใหญ่ไม่ชอบในสภาพแวดล้อมการเขียนสคริปต์ การแสดงออกเช่น "12" + 3 ให้ "123" ในจาวาสคริปต์ แต่ C # / Java จะไม่ได้รวบรวม ผู้เขียนสคริปต์ส่วนใหญ่ไม่แม้แต่สิ่งที่ "พิมพ์"
  • พลวัต วัตถุใด ๆ สามารถมีคุณสมบัติ / วิธีการใด ๆ และอาจเปลี่ยนแปลงประเภทของมันในเวลา ตัวอย่างเช่นฉันสามารถมอบวัตถุพร็อกซี C # ให้กับสภาพแวดล้อมการสร้างสคริปต์ที่แสดงโหนด XML เป็นคุณสมบัติ
  • ผลผลิต โดยปกติการเขียนสคริปต์นั้นง่ายกว่า C # / Java ไม่ต้องรวบรวมหรือ "ลงทะเบียนปลั๊กอิน" คุณสามารถแก้ไขเนื้อหาสคริปต์โดยตรงภายในแอปพลิเคชันด้วยผลลัพธ์ทันที
  • ผู้จัดการ การใช้ C # / Java ต้องการ SDK เพื่อเชื่อมโยงกับปลั๊กอินที่เปิดเผยคลาสภายในสู่โลก สถาปัตยกรรมปลั๊กอินนี้ต้องใช้ "ความเข้ากันได้แบบย้อนหลัง" สำหรับ SDK รุ่นเก่า สถาปัตยกรรมนี้บังคับให้คุณสร้างวัตถุโดเมน "เสมือน" ที่มีกลไกภายในของแอปพลิเคชันในบริบทโดเมน สามารถจัดการ / ยืดหยุ่นได้มากกว่าการเปิดเผย API

3
สิ่งนี้พลาดจุดคำถามของการฝังสคริปต์ภายในโปรแกรมที่มีขนาดใหญ่กว่า ตัวอย่างเช่นทำไมหนึ่งนักพัฒนาเลือกที่จะเพิ่มสคริปต์ -fuimp หรือมีการดัดแปลง Civ V พร้อม lua - ทำไมผู้พัฒนาเลือกที่จะเพิ่มการเขียนสคริปต์ลงในแอปพลิเคชัน

-3

เมื่อ? ระหว่างปีพ. ศ. 2491 ถึง 2551 - ภาษาที่คอมไพล์ในขั้นต้นใช้เวลาในการรวบรวมและเชื่อมโยงอย่างมากดังนั้นจึงเป็นเรื่องธรรมดาที่จะสร้างภาษาสคริปต์เพื่อให้ผู้ใช้สามารถปรับแต่งและกำหนดค่าได้ หากคุณดูประวัติของ AutoLisp คำตอบคือตอนแรก AutoCAD จัดส่งมาพร้อมกับภาษาสคริปต์ภายในนั้น แต่สิ่งนี้จะค่อย ๆ ออกมาในความโปรดปรานของการเปิดเผยอินเตอร์เฟซสคริปต์ไปยัง VBA แล้ว. net

ด้วย CLR การเปิดใช้งานโปรแกรม C # หรือการเรียกใช้โปรแกรม Lua ในระบบที่มีอยู่นั้นไม่แตกต่างกันอย่างมากในต้นทุนการพัฒนาและรันไทม์. net มาพร้อมกับเครื่องมือในการสร้างและคอมไพล์ได้ทันที

คุณไม่จำเป็นต้องมีภาษาสคริปต์ในโปรแกรมที่มีขนาดใหญ่กว่า แต่ให้แสดงโปรแกรมที่ใหญ่ขึ้นไปยังส่วนช่วยสร้างสคริปต์ของรันไทม์

ในสภาพแวดล้อมที่ไม่มีในการสร้างและรวบรวมรหัสการบินและเป็นที่พึงปรารถนาที่จะเสนอภาษาการทำงานอัตโนมัติทั่วไปแทนที่จะเป็นโดเมนที่เฉพาะเจาะจงคุณจะยังคงได้รับการเขียนสคริปต์ Lua หรือ Python สำหรับเครื่องมือที่มีส่วนต่อประสาน COM แล้วภาษาสคริปต์นั้นจะเป็น C # หรือ VB.net (MS Office, Sparx Enterprise Architect) ดังนั้นการมีภาษาสคริปต์สำหรับโปรแกรมที่เขียนในภาษาที่เรียบง่ายพอที่จะเป็นภาษาสคริปต์จึงไม่จำเป็น


การค้นหา google สำหรับเกม XNA ที่ใช้สคริปต์ Lua ได้นั้นจะไม่ให้ผลลัพธ์เป็นศูนย์
user16764

@ user16764 และการค้นหา google สำหรับจักรยานที่ทำจากเมอแรงค์กลับกลายเป็นหกล้าน
Pete Kirkham
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.