ตัวอย่างของเมื่อใดที่เราจะใช้ภาษาที่แปลแล้วสำหรับภาษาที่คอมไพล์แล้ว?


11

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

คำตอบ:


11

มี (ความรู้ของฉัน) ไม่มีสิ่งเช่น "ภาษา" ตีความหรือ "ภาษา" เรียบเรียง

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

ตอนนี้ถ้าคุณมีคำถามคือเมื่อคุณใช้ตัวแปลภาษากับล่ามภาษามันจะลงไปที่โปร / คอนของคอมไพเลอร์กับล่ามและวัตถุประสงค์ของโครงการ

ตัวอย่างเช่นคุณอาจใช้ JRuby คอมไพเลอร์เพื่อการรวมที่ง่ายขึ้นกับไลบรารี java แทน MRI ruby ​​interpreter มีแนวโน้มที่จะมีเหตุผลในการใช้ MRI ruby ​​interpreter สำหรับ JRuby ฉันไม่คุ้นเคยกับภาษา แต่ไม่สามารถพูดกับสิ่งนี้ได้

ประโยชน์ที่ได้รับการขนานนามของล่าม:

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

ประโยชน์ของผู้เรียบเรียง:

  • รหัสเนทีฟที่คอมไพล์ไม่มีค่าใช้จ่ายของล่ามดังนั้นโดยทั่วไปจะมีประสิทธิภาพมากขึ้นในเรื่องเวลาและสถานที่
  • ความสามารถในการทำงานร่วมกันมักจะดีกว่าวิธีเดียวสำหรับการทำงานร่วมกันแบบ in-proc กับสคริปต์คือผ่านทางล่ามมากกว่า FFI มาตรฐาน
  • ความสามารถในการสนับสนุนสถาปัตยกรรมที่ล่ามไม่ได้ถูกรวบรวมไว้ (เช่นระบบฝังตัว)

อย่างไรก็ตามฉันจะเดิมพันใน 90% ของกรณีที่มันเป็นอย่างนี้:ฉันต้องการเขียนซอฟต์แวร์นี้ในร้องไห้สะอึกสะอื้นเพราะฉันรู้ดีและควรทำงานได้ดี ฉันจะใช้ล่าม blub (หรือคอมไพเลอร์) เพราะมันเป็นวิธีที่ยอมรับโดยทั่วไปสำหรับการเขียนซอฟต์แวร์ในร้องไห้สะอึกสะอื้น

ดังนั้นTL; DRนั้นโดยพื้นฐานแล้วการเปรียบเทียบพื้นฐานเป็นกรณี ๆ กันของล่ามเทียบกับคอมไพเลอร์สำหรับกรณีการใช้งานเฉพาะของคุณ

นอกจากนี้ FFI: อินเตอร์เฟซฟังก์ชั่นต่างประเทศในคำอื่น ๆ อินเตอร์เฟซสำหรับการทำงานร่วมกับภาษาอื่น ๆ อ่านเพิ่มเติมที่วิกิพีเดีย


2
สำหรับความรู้ของฉันภาษาสคริปต์บางอย่างสำหรับ OS เช่น ksh สำหรับ UNIX ไม่สามารถรวบรวมได้
NoChance

@delnan จุดของฉันไม่สามารถรวบรวมผ่านทางการค้าหรือซอฟต์แวร์ฟรีที่ฉันรู้ไม่ใช่ว่าไม่สามารถรวบรวมได้เนื่องจากเหตุผลทางเทคนิค
NoChance

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

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

2
@EmmadKareem หากคุณต้องการคุณสามารถใช้ข้อมูลจำเพาะภาษา ksh และเขียนคอมไพเลอร์ที่อ่านและสร้างไบนารีดั้งเดิม ภาษาที่กำลังรวบรวมหรือตีความไม่ได้อยู่ในความหมายของภาษาคือจุดของฉันที่นี่
จิมมี่ฮอฟฟา

8

จุดสำคัญที่นี่คือการใช้งานภาษาจำนวนมากทำไฮบริดของทั้งคู่ ภาษาที่ใช้กันมากในปัจจุบันทำงานโดยการรวบรวมโปรแกรมเป็นรูปแบบกลางเช่น bytecode แล้วดำเนินการในล่าม นี่คือวิธีการใช้ Java, C #, Python, Ruby และ Lua อันที่จริงแล้วนี่เป็นวิธีการใช้งานภาษาส่วนใหญ่ในปัจจุบัน ดังนั้นความจริงก็คือภาษาวันนี้ทั้งตีความและรวบรวมรหัสของพวกเขา ภาษาเหล่านี้บางภาษามีคอมไพเลอร์ JIT เพิ่มเติมเพื่อแปลงไบต์เป็นโค้ดเนทีฟสำหรับการดำเนินการ

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

เมื่อคุณถามเกี่ยวกับข้อดีของการตีความและรวบรวมภาษาคุณอาจหมายถึงอย่างอื่น คุณอาจถามเกี่ยวกับข้อดีของการพิมพ์แบบสแตติก / ไดนามิกข้อดีของการแจกจ่ายโปรแกรมแบบเนทีฟข้อดีของการรวบรวม JIT และ AOT เหล่านี้เป็นปัญหาทั้งหมดที่ได้รับการ conflated กับการตีความ / การรวบรวม แต่เป็นปัญหาที่แตกต่างกัน


2

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

ตอนนี้ก่อนที่ทุกคนจะสงสัย ... ใช่สามารถตีความ C / C ++ / C # / Java ได้และสามารถรวบรวมสคริปต์ JavaScript และ Bash ได้ ไม่ว่าจะมีล่ามหรือคอมไพเลอร์ที่ใช้งานได้สำหรับภาษาเหล่านี้เป็นคำถามอื่นหรือไม่

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

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

อย่างไรก็ตามมีบางสิ่งที่ถือได้ว่าเป็นตัวอย่างในโลกแห่งความจริง: ซอร์สโค้ด hidnig เมื่อนำไปใช้งาน ด้วยวิธีดั้งเดิมโค้ดที่คอมไพล์แล้วผู้พัฒนาได้ปรับใช้โค้ด macine ที่สามารถเรียกใช้งานได้ของโปรแกรมและข้อมูล ด้วยโค้ดที่แปลแล้วซอร์สโค้ดเองนั้นจะต้องถูกปรับใช้ซึ่งสามารถตรวจสอบและวิศวกรรมย้อนกลับได้ด้วยความพยายามน้อยกว่าสิ่งที่มันเป็นรหัสเครื่องจักรพื้นเมืองวิศวกรย้อนกลับ สิ่งหนึ่งที่ยกเว้นคือภาษาเช่น C # และ Java ซึ่งรวบรวมเป็นภาษา / bytecode ทันที (MSIL สำหรับ C # และ Java bytecode สำหรับ Java) ซึ่งได้รับการปรับใช้และเรียบเรียง "ทันเวลา" ในขณะใช้งานจริงชนิดที่ล่ามทำ อย่างไรก็ตามมี decompilers ที่เรียกว่าสำหรับ MSIL และ Java Bytecode ซึ่งสามารถสร้างซอร์สโค้ดต้นฉบับใหม่ด้วยความแม่นยำที่ค่อนข้างดีและเช่นเดียวกันกับวิศวกรรมย้อนกลับผลิตภัณฑ์ดังกล่าวมีความสำคัญมากกว่าผลิตภัณฑ์วิศวกรรมย้อนกลับซึ่งติดตั้งในเครื่องรหัสดั้งเดิม


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

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

ขอโทษไม่เป็นไรจุดแรกฉันเข้าใจผิดบางอย่าง แม่ culpa สำหรับประเด็นที่สอง: ฉันใช้ "เทียบเท่า" เพื่ออ้างถึงโค้ดที่แปลหรือเรียบเรียง (และการเปรียบเทียบคอมไพเลอร์และล่ามไม่ได้ทำให้รู้สึกมากเพราะพวกเขาทำสิ่งต่าง ๆ โดยพื้นฐาน) ผมไม่คิดว่าใครควรจะเสียเวลารายละเอียดกรณีต่างชาติเช่นตัวอย่างของฉัน แต่ฉันไม่ต้องการทิ้ง "เสมอ" ในความโปรดปรานของการใช้ถ้อยคำที่อธิบายว่าทำไมมันสามารถจะเร็วขึ้นในสถานที่แรก: ไม่มีล่ามค่าใช้จ่าย [ที่ควรจะเป็น IMHO ที่กำหนด] และโอกาสในการดำเนินการปรับให้เหมาะสมก่อนรันไทม์

1

ฉันนึกถึงสถานการณ์ต่อไปนี้เมื่อคุณใช้ภาษาที่ตีความ :

  • ที่ไหนที่ไม่มีคอมไพเลอร์ที่มีอยู่เช่น Linux / Unix เชลล์สคริปต์
  • สคริปต์ที่รวดเร็วและสกปรกที่แก้ปัญหาเล็กน้อย
  • ภาษาที่ทำให้ง่ายต่อการเขียนหน้า HTML แบบไดนามิกและถูกตีความทั่วไปเช่น JSP (Tomcat รวบรวมไว้ในเซิร์ฟเวอร์ที่ทำงานบนเซิร์ฟเวอร์), PHP, ASP และอื่น ๆ

ฉันสามารถคิดถึงสถานการณ์ต่อไปนี้เมื่อคุณต้องการรวบรวมรหัสของคุณ:

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

3
ล่ามภาษาทำให้ภาษาไม่ได้พิมพ์อย่างยิ่ง Haskell มีการพิมพ์อย่างมากและคุณสามารถใช้ GHCI เพื่อตีความมันได้อย่างมีประสิทธิภาพ การพิมพ์ที่เข้ม / อ่อนเป็นแง่มุมของภาษาไม่ใช่ด้านของคอมไพเลอร์หรือล่าม
จิมมี่ฮอฟฟา

1
-1 สำหรับข้อดีของการคอมไพล์: (1) การคอมไพล์โค้ดไม่ได้ป้องกันวิศวกรรมย้อนกลับมันแค่ทำให้ยากขึ้นเล็กน้อย (2) การรวบรวม (การลบค่าใช้จ่ายของล่าม, การเพิ่มประสิทธิภาพอัตโนมัติของรหัสแอปพลิเคชัน) เป็นเพียงแหล่งเดียวของประสิทธิภาพและถูกแซงโดยการเพิ่มประสิทธิภาพขนาดใหญ่โดยผู้เชี่ยวชาญโดยมนุษย์ (3) การตรวจสอบประเภทในขณะที่มักจะควบคู่กับการรวบรวมเป็นอิสระจากมัน ตัวตรวจสอบชนิดคือการวิเคราะห์แบบสแตติก มันสามารถเกิดขึ้นได้โดยไม่ต้องเปล่งรหัสและก่อนที่จะตีความรหัส (4) ดูเหมือนว่าเก๊ คุณ "นึกภาพไม่ออก" ใช่มั้ย ทำไม? มันจำเป็นต้องเป็นอย่างไร

1
มีการตีความภาษาอื่น ๆ เมื่อใดก็ตามที่มีล่ามในโปรแกรมอื่น เมื่อใดก็ตามที่มีการใช้รูปแบบของล่ามก็จะมีภาษาที่ตีความหมายของความซับซ้อนบางอย่าง

3
"สคริปต์" ไม่จำเป็นต้องตีความ ภาษา "การเขียนสคริปต์" จำนวนมากถูกคอมไพล์ไปเป็น bytecode สำหรับเครื่องเสมือนที่ดำเนินการแล้ว (ดู lua, perl, python, ruby) ไม่มีความแตกต่างที่แท้จริงระหว่างสิ่งนี้กับ java นอกเหนือจากเมื่อคอมไพล์เกิดขึ้น

3
+1, ฉันคิดว่านั่นเป็นคำตอบที่ OP ใช้จริง ๆ หลังจากนั้นและแม้ว่าคะแนนอาจไม่เป็นจริง 100% ตามที่ระบุไว้มีอย่างน้อย 95% จริงสำหรับการพิจารณาในทางปฏิบัติ
Doc Brown

1

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

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

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

เมื่อรู้อย่างนี้แล้วภาษาที่ตีความจะเหมาะกับ:

  1. การพัฒนาที่มีประสิทธิผล: การพัฒนาเว็บที่รวดเร็ว (PHP, Javascript) หรือการสร้างต้นแบบ
  2. ข้ามแพลตฟอร์ม; ตัวอย่างเช่น JavaScript ได้รับการสนับสนุนในทุกเบราว์เซอร์ (รวมถึงเบราว์เซอร์มือถือ)

และภาษาที่คอมไพล์มีความเหมาะสมเมื่อ:

  1. ประสิทธิภาพเป็นสิ่งสำคัญ (ระบบปฏิบัติการ) หรือทรัพยากรมีน้อย (ไมโครคอนโทรลเลอร์)
  2. ระบบที่จะสร้างนั้นซับซ้อน เมื่อสร้างระบบขนาดใหญ่ (ระบบองค์กร) ภาษาที่คอมไพล์เป็นสิ่งจำเป็นในการจัดการข้อบกพร่องที่เป็นไปได้จำนวนมากที่อาจปรากฏในภาษาที่ตีความ โปรแกรมที่ซับซ้อนต้องการทรัพยากรจำนวนมากและความสมดุลมีแนวโน้มที่จะรวบรวมภาษาด้วย

-1 เนื่องจากคุณแปลว่าภาษาที่แปลทั้งหมดจะถูกพิมพ์แบบไดนามิกและภาษาที่รวบรวมทั้งหมดจะถูกพิมพ์แบบคงที่ซึ่งไม่จริงอย่างสมบูรณ์
Daniel Pryden

@DanielPryden มันจะต้องเป็นเรื่องบังเอิญแท้ๆแล้วความจริงที่ว่าภาษาที่ตีความเกือบทั้งหมดถูกพิมพ์แบบไดนามิกและคนที่คอมไพล์พิมพ์แบบคงที่? มันเป็นเรื่องบังเอิญที่โมเดลแบบไดนามิกเหมาะสำหรับภาษาที่ตีความหรือไม่?
m3th0dman

ด้วยเหตุผลต่าง ๆ มีความสัมพันธ์กัน แต่ก็ไม่ได้เป็นข้อกำหนด มีการถามเรื่องนี้จริง ๆ เกี่ยวกับ StackOverflow: เพราะเหตุใดการตีความที่เกิดขึ้นส่วนใหญ่จะมีลักษณะเป็นเป็ดในขณะที่คอมไพล์มีการพิมพ์ที่ดี
Daniel Pryden

1
Erlang ถูกคอมไพล์และพิมพ์แบบไดนามิก Haskell ถูกพิมพ์แบบคงที่และสามารถรวบรวมหรือตีความ
Zachary K

1
@ ZacharyK Erlang มีระบบเวลาทำงาน Haskell รวบรวมในกรณีส่วนใหญ่ (โปรแกรมที่เขียน)
m3th0dman

1

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

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

สิ่งนี้ใช้กับภาษาของเอเจนต์ตัวอย่างเช่นหรือสำหรับวิธีการพูด Tcl / Tk โดยปกติจะใช้

อีกเหตุผลที่เป็นไปได้สำหรับการผสานกับการตีความคือเมื่อมีการใช้ตัวแปลภาษาสำหรับการบู๊ตตัวเองหรือภาษาที่ซับซ้อนกว่าระดับสูงกว่าและความเรียบง่ายนั้นสำคัญกว่าประสิทธิภาพของกระบวนการบูทสแตรป

สำหรับเกือบทุกกรณีที่เป็นไปได้อื่น ๆ การรวบรวม (หรือวิธีไฮบริด) เป็นแบบที่ดีกว่า

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