ฉันดูเหมือนจะไม่เข้าใจเหตุผลว่าทำไมภาษาหลาย ๆ ภาษาที่ใช้ในผลิตภัณฑ์หรือซอฟต์แวร์เดียวกัน
มันค่อนข้างง่าย: ไม่มีภาษาการเขียนโปรแกรมเดียวที่เหมาะสำหรับทุกความต้องการและเป้าหมาย
อ่านหนังสือการเขียนโปรแกรมภาษาเชิงวัจนปฏิบัติของ Michael L. Scott
บางคนเขียนโปรแกรมภาษาโปรดปรานลึกซึ้งและdeclarativity (จำนวนมากของภาษาสคริปต์ แต่ยังระดับสูงเช่นการเขียนโปรแกรมภาษาAGDA , เปิดฉาก , ชัด , Haskell, Ocaml, ... ) เมื่อค่าใช้จ่ายในการพัฒนามีความสำคัญ (เวลาและค่าใช้จ่ายของผู้พัฒนา) เป็นสิ่งที่เหมาะสมที่จะใช้พวกเขา (แม้ว่าประสิทธิภาพของรันไทม์จะไม่เหมาะสมที่สุด)
ภาษาการเขียนโปรแกรมอื่น ๆ ชอบประสิทธิภาพการทำงาน (ภาษาระดับต่ำจำนวนมากที่มีการใช้งานที่คอมไพล์แล้วเช่น C ++, Rust, Go, C, แอสเซมเบลอร์และภาษาเฉพาะเช่น OpenCL ... ); มักจะเปคของพวกเขาช่วยให้บางพฤติกรรมที่ไม่ได้กำหนด เมื่อประสิทธิภาพของรหัสมีความสำคัญควรใช้ภาษาเหล่านี้
ห้องสมุดภายนอกบางแห่งเขียนขึ้นในและสำหรับภาษาเฉพาะและABIและเรียกประชุมในใจ คุณอาจจำเป็นต้องใช้ภาษาอื่นและทำตามฟังก์ชั่นต่างประเทศอินเตอร์เฟซที่ประชุมอาจจะโดยการเขียนบางรหัสกาว
ในทางปฏิบัติมันไม่น่าเป็นไปได้ที่จะมีภาษาโปรแกรมซึ่งแสดงออกอย่างสูง (เพื่อปรับปรุงประสิทธิภาพการทำงานของนักพัฒนาโดยสมมติว่าทีมนักพัฒนาฝีมือดีพอ) และมีประสิทธิภาพในการทำงานจริง ในทางปฏิบัติมีการแลกเปลี่ยนระหว่างความชัดเจนและประสิทธิภาพ
หมายเหตุ:อย่างไรก็ตามมีความคืบหน้าช้าในภาษาการเขียนโปรแกรม: สนิมมีความหมายมากกว่า C หรือบางทีแม้แต่ C ++ แต่การติดตั้งของมันเกือบจะเป็นตัวแสดงและอาจจะปรับปรุงเพื่อสร้างไฟล์ที่รันได้อย่างรวดเร็ว ดังนั้นคุณต้องเรียนรู้ภาษาการเขียนโปรแกรมใหม่ ๆ ในช่วงชีวิตการทำงานของคุณ อย่างไรก็ตามไม่มีกระสุนเงิน
ขอให้สังเกตว่าค่าใช้จ่ายในการพัฒนามีความสำคัญมากขึ้นเรื่อย ๆ ในทุกวันนี้ (ไม่ใช่ในปี 1970- ในเวลานั้นคอมพิวเตอร์ที่มีราคาแพงมากหรือในแอพพลิเคชั่นแบบฝังตัวบางตัวที่มีผลิตภัณฑ์จำนวนมาก) กฎง่ายๆ (โดยประมาณมาก) คือนักพัฒนาที่มีทักษะสามารถเขียนเกี่ยวกับ 25,000 บรรทัดของรหัสที่มา (debugged & เอกสาร) ในแต่ละปีและไม่ขึ้นอยู่กับภาษาการเขียนโปรแกรมที่ใช้มากนัก
วิธีการทั่วไปคือการฝังภาษาสคริปต์บางภาษา (หรือบางภาษาเฉพาะโดเมน ) ในแอปพลิเคชันขนาดใหญ่ แนวคิดการออกแบบนี้ (เกี่ยวข้องกับภาษาเฉพาะโดเมน) มีการใช้มานานหลายทศวรรษ (ตัวอย่างที่ดีคือEmacs source code editorโดยใช้ Elisp สำหรับการเขียนสคริปต์ตั้งแต่ทศวรรษ 1980) จากนั้นคุณจะใช้ล่ามแบบฝังได้อย่างง่ายดาย (เช่นGuile , Lua , Python, ... ) ภายในแอปพลิเคชันขนาดใหญ่ การตัดสินใจที่จะฝังล่ามในแอพพลิเคชั่นขนาดใหญ่นั้นจะต้องทำเร็วมากและมีผลกระทบทางสถาปัตยกรรมที่แข็งแกร่ง จากนั้นคุณจะใช้สองภาษา: สำหรับเนื้อหาระดับต่ำที่ต้องทำงานอย่างรวดเร็วภาษาระดับต่ำเช่น C หรือ C ++; สำหรับสคริปต์ระดับสูง, DSL หรือภาษาสคริปต์อื่น ๆ
โปรดสังเกตว่าซอฟต์แวร์ที่ให้สามารถทำงานได้ภายในระบบปฏิบัติการส่วนใหญ่ในปัจจุบัน(รวมถึง Linux, Windows, Android, MacOSX, Hurd, ... ) ในกระบวนการร่วมมือหลายแห่งโดยใช้เทคนิคการสื่อสารระหว่างกระบวนการบางประเภท สามารถใช้กับคอมพิวเตอร์หลายเครื่อง (หรือหลายเครื่อง) โดยใช้เทคนิคการคำนวณแบบกระจาย (เช่นcloud computing , HPC, ไคลเอนต์เซิร์ฟเวอร์, เว็บแอปพลิเคชั่น , ฯลฯ ... ) ในทั้งสองกรณีมันง่ายที่จะใช้ภาษาการเขียนโปรแกรมหลายภาษา (เช่นรหัสแต่ละโปรแกรมที่รันบนกระบวนการเดียวหรือคอมพิวเตอร์ในภาษาโปรแกรมของตัวเอง) อ่านระบบปฏิบัติการ: สามชิ้นง่ายสำหรับเพิ่มเติม นอกจากนี้อินเตอร์เฟซฟังก์ชั่นต่างประเทศ(เช่นJNI ), ABI s, การเรียกประชุมฯลฯ ... อำนวยความสะดวกในการผสมหลายภาษาในโปรแกรมเดียวกัน (หรือปฏิบัติการ ) - และคุณจะพบรหัสกำเนิดเช่นSWIGเพื่อช่วย
ในบางกรณีคุณจะต้องผสมเขียนโปรแกรมภาษาต่างๆ: การใช้งานเว็บต้อง Javascript หรือ Webassembly (ภาษาเท่านั้นทำงานภายในเว็บเบราเซอร์ส่วนใหญ่) เพื่อเป็นส่วนหนึ่งที่ทำงานอยู่ในเบราว์เซอร์ (มีกรอบการสร้างเหล่านี้เช่นocsigen ) รหัสเคอร์เนลต้องการสิ่งบางอย่าง (เช่นการจัดตารางเวลาหรือการจัดการในระดับต่ำของการขัดจังหวะ) ที่จะเขียนบางส่วนในการประกอบเพราะ C หรือ C ++ ไม่สามารถแสดงสิ่งที่เป็นสิ่งจำเป็นที่มีคำสั่ง RDBMS ควรใช้ SQL, GPGPU s ความต้องการเมล็ดคอมพิวเตอร์เขียนในOpenCLหรือCUDAจัดการด้วยรหัสโฮสต์ C หรือ C ++ ฯลฯ บางภาษาได้รับการออกแบบมาเพื่ออำนวยความสะดวกในการผสม (เช่นasm
คำสั่งใน C,โค้ดชิ้นในGCC MELTปลายของฉันฯลฯ ... )
ในบางกรณีคุณใช้เทคนิคmetaprogramming : บางส่วนของโครงการซอฟต์แวร์ขนาดใหญ่ของคุณจะมีรหัส (เช่นใน C หรือ C ++) ที่สร้างขึ้นโดยเครื่องมืออื่น ๆ (อาจเป็นเครื่องมือเฉพาะโครงการ) จากการทำให้เป็นระเบียบแบบ ad-hoc: parser generators คอมไพเลอร์) เช่นกระทิงหรือANTLRเข้ามาในใจ แต่ยังเป็น SWIG หรือ RPCGEN และสังเกตว่าGCCมีเครื่องสร้างรหัส C ++ มากกว่าหนึ่งโหล (หนึ่งสำหรับ DSL ภายในภายใน GCC) ทั้งหมดภายในเครื่อง ดูตัวอย่างนี้ด้วย ขอให้สังเกตว่าmetabugsหายาก อ่านเพิ่มเติมเกี่ยวกับคอมไพเลอร์ bootstrappingและเกี่ยวกับhomoiconicityและreflection(มันคุ้มค่าที่จะเรียนรู้Lispเล่นกับSBCLและอ่านSICPดูที่ไลบรารีที่รวบรวม JITเช่นGCCJITในโปรแกรมขนาดใหญ่บางโปรแกรมคุณอาจสร้างรหัสที่รันไทม์โดยใช้กฎเหล่านี้โปรดระวังกฎที่สิบของ Greenspun ) ดูการพูดคุยของCircuit Less Traveledที่ FOSDEM2018
บางครั้งคุณต้องการให้คำอธิบายประกอบอย่างเป็นทางการของรหัสของคุณ (เช่นเพื่อช่วยให้ผู้วิเคราะห์นักวิเคราะห์คงที่คอมไพเลอร์) โดยใช้ภาษาคำอธิบายประกอบพิเศษบางอย่าง (ซึ่งอาจถูกมองว่าเป็น DSL บางส่วน) มองหาACSLด้วยFrama-Cเพื่อใส่คำอธิบายประกอบโปรแกรม C (โปรแกรมที่สำคัญต่อความปลอดภัย) หรือOpenMP pragmas สำหรับ HPC Caveat: การเขียนคำอธิบายประกอบดังกล่าวอาจต้องใช้ทักษะและเวลาในการพัฒนาจำนวนมาก
BTW นี่แสดงให้เห็นว่าทักษะบางอย่างเกี่ยวกับคอมไพเลอร์และล่ามมีประโยชน์สำหรับนักพัฒนาซอฟต์แวร์ทุกคน (แม้จะไม่ได้ทำงานกับคอมไพเลอร์) ดังนั้นอ่านDragon Bookแม้ว่าคุณจะไม่ได้ทำงานกับคอมไพเลอร์ หากคุณใช้รหัสล่ามของคุณเอง (หรือถ้าคุณออกแบบ DSL) ให้อ่านเสียงกระเพื่อมเป็นชิ้นเล็กชิ้นน้อย
ดูเพิ่มเติมนี้และว่าและว่าและว่าคำตอบของฉันที่เกี่ยวข้องกับคำถามของคุณ
ศึกษาซอร์สโค้ดของโครงการซอฟต์แวร์ฟรีขนาดใหญ่หลายโครงการ (บนGitHubหรือจากการแจกจ่าย Linuxของคุณ) เพื่อเป็นแรงบันดาลใจและการตรัสรู้
นอกจากนี้ภาษาการเขียนโปรแกรมบางภาษามีการพัฒนาโดยการเพิ่มคำอธิบายประกอบ (เป็น pragmas หรือความคิดเห็น ) ให้กับภาษาที่มีอยู่ สำหรับตัวอย่างคิดACSL (ความคิดเห็นนามสกุลอธิบายโปรแกรม C เพื่อเปิดใช้งานการพิสูจน์ของพวกเขาโดยม่า-C ) หรือของOpenCL (ภาษา C ในการเขียนโปรแกรม GPGPUs) หรือOpenMPหรือOpenACC #pragma
sหรือสามัญประเภทคำอธิบายประกอบเสียงกระเพื่อม
PS:นอกจากนี้ยังมีเหตุผลทางสังคมหรือองค์กรหรือประวัติศาสตร์ในการผสมภาษาการเขียนโปรแกรม ฉันไม่สนใจพวกเขาที่นี่ แต่ฉันรู้ว่าในทางปฏิบัติด้วยเหตุผลดังกล่าวมีความโดดเด่น อ่านยังเดือนตำนานคน