ฉันเคยได้ยินหลาย ๆ สถานการณ์ของผู้ใช้ที่ใช้คำพูด, จาวาสคริปต์หรือ Python (หรือบางอย่าง), ภายในโปรแกรมที่เขียนด้วย C # เมื่อใดที่จะใช้ภาษาเช่น JavaScript เพื่อทำบางอย่างในโปรแกรม C # จะดีกว่าถ้าเป็นเช่นนั้นใน C #
ฉันเคยได้ยินหลาย ๆ สถานการณ์ของผู้ใช้ที่ใช้คำพูด, จาวาสคริปต์หรือ Python (หรือบางอย่าง), ภายในโปรแกรมที่เขียนด้วย C # เมื่อใดที่จะใช้ภาษาเช่น JavaScript เพื่อทำบางอย่างในโปรแกรม C # จะดีกว่าถ้าเป็นเช่นนั้นใน C #
คำตอบ:
เมื่อคุณมีพฤติกรรมที่คุณไม่ต้องการให้คอมไพล์โปรแกรมซ้ำอีกครั้งเพื่อเปลี่ยน นี่คือเหตุผลที่เกมจำนวนมากใช้ Lua เป็นภาษาสคริปต์ / modding
เทคนิคนี้สามารถใช้ในการใช้ตรรกะหลักที่พกพาได้ง่ายระหว่างสภาพแวดล้อมภาษาที่แตกต่างกัน ตัวอย่างเช่นฉันมีเครื่องคิดเลขจำลองที่ใช้ตรรกะเครื่องคิดเลขภายในทั้งหมดใน JavaScript 100% รหัสส่วนต่อประสานผู้ใช้แตกต่างกันในแต่ละแพลตฟอร์ม:
ด้วยข้อตกลงนี้การทำให้รุ่นของโปรแกรมของฉันสำหรับสภาพแวดล้อมการทำงานที่แตกต่างกันและโดยเฉพาะอย่างยิ่งการปรับปรุงให้ทันสมัยอยู่เสมอ
ในวงกว้างมีสองสถานการณ์ที่คุณจะใช้รูปแบบนี้:
ภายใน
ตัวอย่างนี่คือ Lua ที่ใช้ใน Adobe Lightroom
ดังนั้นสิ่งที่เราทำกับ Lua คือเหตุผลทั้งหมดของแอปพลิเคชันตรรกะจากการเรียกใช้ UI เพื่อจัดการสิ่งที่เราทำจริงในฐานข้อมูล โค้ดในแอพที่สามารถอธิบายได้ว่าเป็นเรื่องการตัดสินใจหรือการนำคุณสมบัติไปใช้นั้นมีอยู่ใน Lua จนกว่าคุณจะได้รับการประมวลผลแบบดิบซึ่งอยู่ใน C ++ ( สัมภาษณ์ Mark Hamburg: Adobe Photoshop Lightroom )
อย่างผิวเผิน
ไอบีเอ็มใช้ภาษาสคริปต์ประสบความสำเร็จมากในระบบปฏิบัติการเมนเฟรมของพวกเขาVM-CMS EXEC , EXEC / 2และRexx ที่ใหม่กว่านั้นถูกใช้ทั่วทั้งระบบทั้งภายในและภายนอก แอปพลิเคชันที่แตกต่างกัน (เช่นXEDIT ) สามารถใช้สคริปต์ได้โดยใช้ภาษาเดียวกันและแอปพลิเคชั่น / ยูทิลิตี้ภายใน (เช่นอีเมล) ถูกเขียนในภาษาสคริปต์และยกระดับการผนวกรวมกับ OS และเครื่องมืออื่น ๆ อย่างแน่นหนา ลูกค้าสร้างและแบ่งปันเครื่องมือและแอปพลิเคชั่นสคริปต์มากมาย DEC จัดเตรียมDCLด้วย หลังจากนั้น Microsoft สนับสนุนVBscriptเป็นภาษาสคริปต์ในแอปพลิเคชันส่วนใหญ่และPowerShellเมื่อเร็ว ๆ นี้(เช่นไฟล์แบตช์ MS / DOS ) Unix shells มีสคริปต์เหมือนกัน
แนวโน้มในวันนี้ดูเหมือนจะเปิดเผย API ในทางใดทางหนึ่งและปล่อยให้ตัวเลือกของภาษาสคริปต์ขึ้นอยู่กับผู้ใช้ที่สามารถใช้การเชื่อมโยงที่แตกต่างกันหรือวิธีการอื่นในการเข้าถึง API
ตัวอย่างในโลกแห่งความเป็นจริงจะรวมถึง: -
เว็บเบราว์เซอร์ส่วนใหญ่ที่รองรับ JavaScript แบบฝัง
Microsoft Office Suite - Excel Word และอื่น ๆ ทั้งหมดสนับสนุนสคริปต์ VBA แบบฝัง
เราเตอร์เครือข่ายหลายแห่งรวมถึงสคริปต์ API ในภาษาต่างๆ TCL, Perl, Lua
อุปกรณ์สมองกลฝังตัวจำนวนมากถูกนำมาใช้โดยใช้ฟังก์ชั่นชุด C หลักขนาดเล็กมากซึ่งติดกันด้วยภาษาสคริปต์เช่น Lua ดังนั้นคุณจึงมีชุดของฟังก์ชั่น C ขนาดเล็กที่รวดเร็วซึ่งโต้ตอบกับฮาร์ดแวร์และตรรกะการควบคุมส่วนใหญ่ในสคริปต์สคริปต์แบบยืดหยุ่นและง่ายต่อการแก้ไข
บางครั้งสคริปต์จะถูกฝังในแอปพลิเคชันเนื่องจากเป็นวิธีการขยายแอปพลิเคชันโฮสต์โดยนักพัฒนาอื่น ๆ เพื่อให้สามารถใช้ทักษะการเขียนโปรแกรมภาษาได้หลากหลายเท่าที่เป็นไปได้โฮสต์สนับสนุนภาษาสคริปต์หลายภาษาสามารถรองรับได้ ตัวอย่างเช่นบน JVM คุณสามารถฝังทั้งภาษาที่เข้ากันได้กับ JSR-223รวมถึง Python, Ruby, JavaScript, และอื่น ๆ
อีกเหตุผลที่ไม่ได้กล่าวถึงคือภาษาที่ฝังมีคุณสมบัติอย่างน้อยหนึ่งอย่างที่ภาษาโฮสต์ไม่สามารถทำซ้ำได้ง่าย ตัวอย่างของสิ่งนี้คือฟังก์ชันการแยกวิเคราะห์หรือการสร้าง DSL (ภาษา / ภาษาเฉพาะโดเมน) ที่ง่ายดายซึ่งสามารถพบได้ในภาษาเช่น Rebol
มีวิธีหนึ่งที่น่าสนใจในการใช้ภาษาสคริปต์ในแอปพลิเคชันซึ่งยังไม่ได้กล่าวถึงโดยคนอื่น
หากภาษาโฮสต์ของคุณมี runtime ที่มีการสะท้อนแสงมากมักจะมีประโยชน์ในการฝังภาษาอย่างง่ายด้วย REPL ในแอปพลิเคชันของคุณเชื่อมต่อกับซ็อกเก็ตและให้การเข้าถึงระบบทั้งหมด
สามารถใช้สำหรับการดีบักแบบโต้ตอบ (และมีประสิทธิภาพมากกว่าการดีบักเกอร์ตามปกติของคุณ) การปะแก้รหัสร้อนจุดประสงค์ในการตรวจสอบต่าง ๆ แม้แต่แบ็คดอร์ (ถ้าคุณทำไม่ดี)
สถานการณ์เฉพาะของฉันเมื่อฉันใช้ภาษาสคริปต์ที่ตีความในแอปพลิเคชันหลัก:
มีอุปกรณ์ภายนอกที่ทำหน้าที่หลายอย่าง การวัดการควบคุมการอ่านข้อมูล เป็นเรื่องที่ค่อนข้าง "โง่" และต้องการการควบคุมที่แม่นยำทีละขั้นตอนรวมถึงสถานะรอจำนวนมากและการตัดสินใจแบบเฉพาะกิจในด้านกลไกการควบคุม
ฟังก์ชั่นต่างๆของอุปกรณ์นั้นจำเป็นต้องใช้ในจุดต่าง ๆ ของแอพพลิเคชั่นหลักในเวลาที่ต่างกันซึ่งมักจะเป็นไปตามความต้องการ แอปหลักไม่อนุญาตให้รอสถานะเช่นนี้ทุกอย่างจะต้องทำด้วยเครื่องจักรสถานะ จำกัด
ตอนนี้ใครก็ตามที่เขียนเครื่องจักรสถานะ จำกัด รู้ว่าการใช้สถานะรอนั้นมีประสิทธิภาพอย่างน้อยสองหรือสามหรือสี่สถานะภายในของเครื่อง การนำยี่สิบรอสถานะสำหรับฟังก์ชั่นต่าง ๆ (และรอการตอบสนองของพวกเขาและตอบสนองตาม) ของอุปกรณ์ภายนอกจะเป็นประสบการณ์ที่น่าผิดหวังมาก
ดังนั้นแทนที่จะมีสถานะของ "ดำเนินการฟังก์ชั่นที่ไม่รอ", "ดำเนินการฟังก์ชั่นการปิดกั้น", "รันฟังก์ชั่นการแยก / เงื่อนไข / กระโดด" ในเครื่องสถานะ จำกัด อาจหกรัฐทั้งหมด และมีสคริปต์ควบคุมที่กำหนดเวลาดำเนินการจากนั้นดำเนินการโดยล่ามที่ควบคุมอุปกรณ์ภายนอกและวางผลลัพธ์ไว้ในตำแหน่งที่ต้องการ
โดยสรุปแล้วแอพพลิเคชั่น: ใน RTOS การใช้ภาษาสคริปต์ที่ตีความภายในอาจลดความซับซ้อนของการปฏิบัติงานมากมายในสถานะรอคอย (ฟังก์ชันการบล็อก)
จากประสบการณ์ของฉันเราเคยพัฒนาแอปพลิเคชั่นขนาดใหญ่ที่เขียนรหัสต้นฉบับของ "โบราณ" เพื่อให้เข้ากันได้กับ Unicode ทำใน C # ฉันลงเอยด้วยการเขียนเอ็นจิ้นเท่านั้น (ที่สร้างโมเดลข้อมูลและให้หมายถึงทำตามขั้นตอนที่จำเป็นสำหรับกระบวนการเขียนใหม่) ใน C # - "รหัสกาว" สำหรับการดำเนินการสิ่งต่าง ๆ ใน IronPython
จุดที่ใหญ่ที่สุดสำหรับ IronPython แบบรวม: สมมติว่าคุณโหลดโมเดลข้อมูลขนาดใหญ่ (เวลาโหลดประมาณหนึ่งชั่วโมง) จากนั้นคุณต้องการ - รวบรวมข้อมูลด้วยตนเองและค้นหาสิ่งต่างๆ การทำสิ่งนี้กับสคริปต์ Python จากคอนโซลแบบโต้ตอบนั้นดีกว่าการคลิกผ่านตัวแบบข้อมูลด้วยตัวดีบั๊ก (บวกกับมันสามารถเล่นซ้ำได้)
มีเหตุผลสองประการ
เมื่อ? ระหว่างปีพ. ศ. 2491 ถึง 2551 - ภาษาที่คอมไพล์ในขั้นต้นใช้เวลาในการรวบรวมและเชื่อมโยงอย่างมากดังนั้นจึงเป็นเรื่องธรรมดาที่จะสร้างภาษาสคริปต์เพื่อให้ผู้ใช้สามารถปรับแต่งและกำหนดค่าได้ หากคุณดูประวัติของ AutoLisp คำตอบคือตอนแรก AutoCAD จัดส่งมาพร้อมกับภาษาสคริปต์ภายในนั้น แต่สิ่งนี้จะค่อย ๆ ออกมาในความโปรดปรานของการเปิดเผยอินเตอร์เฟซสคริปต์ไปยัง VBA แล้ว. net
ด้วย CLR การเปิดใช้งานโปรแกรม C # หรือการเรียกใช้โปรแกรม Lua ในระบบที่มีอยู่นั้นไม่แตกต่างกันอย่างมากในต้นทุนการพัฒนาและรันไทม์. net มาพร้อมกับเครื่องมือในการสร้างและคอมไพล์ได้ทันที
คุณไม่จำเป็นต้องมีภาษาสคริปต์ในโปรแกรมที่มีขนาดใหญ่กว่า แต่ให้แสดงโปรแกรมที่ใหญ่ขึ้นไปยังส่วนช่วยสร้างสคริปต์ของรันไทม์
ในสภาพแวดล้อมที่ไม่มีในการสร้างและรวบรวมรหัสการบินและเป็นที่พึงปรารถนาที่จะเสนอภาษาการทำงานอัตโนมัติทั่วไปแทนที่จะเป็นโดเมนที่เฉพาะเจาะจงคุณจะยังคงได้รับการเขียนสคริปต์ Lua หรือ Python สำหรับเครื่องมือที่มีส่วนต่อประสาน COM แล้วภาษาสคริปต์นั้นจะเป็น C # หรือ VB.net (MS Office, Sparx Enterprise Architect) ดังนั้นการมีภาษาสคริปต์สำหรับโปรแกรมที่เขียนในภาษาที่เรียบง่ายพอที่จะเป็นภาษาสคริปต์จึงไม่จำเป็น