มองไปที่ภาษาไดนามิกส่วนใหญ่ (ถ้าไม่ใช่ทั้งหมด) (เช่น Python, PHP, Perl และ Ruby) พวกมันจะถูกตีความทั้งหมด ช่วยแก้ให้ด้วยนะถ้าฉันผิด. มีตัวอย่างของภาษาแบบไดนามิกที่ผ่านขั้นตอนการรวบรวมหรือไม่ ภาษาไดนามิกมีความเหมือนกันกับภาษาที่ตีความหรือไม่
มองไปที่ภาษาไดนามิกส่วนใหญ่ (ถ้าไม่ใช่ทั้งหมด) (เช่น Python, PHP, Perl และ Ruby) พวกมันจะถูกตีความทั้งหมด ช่วยแก้ให้ด้วยนะถ้าฉันผิด. มีตัวอย่างของภาษาแบบไดนามิกที่ผ่านขั้นตอนการรวบรวมหรือไม่ ภาษาไดนามิกมีความเหมือนกันกับภาษาที่ตีความหรือไม่
คำตอบ:
ดูแบบไดนามิกภาษาส่วนใหญ่ (ถ้าไม่ทั้งหมด) [เช่น Python, PHP, Perl และ Ruby] พวกเขาจะตีความทั้งหมด
ไม่จริง. คุณสามารถรวบรวมแหล่ง Python นั่นคือหลักฐานที่มีอยู่จริง
มีล่ามสำหรับภาษาที่พิมพ์แบบคงที่และคอมไพเลอร์สำหรับภาษาที่พิมพ์แบบไดนามิก แนวคิดสองประการนี้มีฉากตั้งฉาก
หมายเหตุด้านข้าง: โดยทั่วไปภาษาเป็นเพียงแค่นั้น: ภาษาที่มีชุดของโครงสร้างประโยคเพื่อแสดงความหมาย ถ้าคุณเขียน Python บนไวท์บอร์ดมันก็ยังเรียกว่า Python! เป็นการนำไปปฏิบัติซึ่งสามารถเป็นล่ามหรือผู้แปล การพิมพ์แบบสแตติกหรือพิมพ์แบบไดนามิก (ชนิดไฮบริดของทั้งสอง) เป็นคุณสมบัติของภาษาในขณะที่รันโปรแกรมโดยการตีความหรือการรวบรวมเป็นทรัพย์สินของการดำเนินงาน
.pyc
ไฟล์เป็น bytecode รหัสแหล่ง Python ถูกแยกวิเคราะห์ปรับให้เหมาะสมและรวบรวมเพื่อสร้าง คำแนะนำ bytecode ค่อนข้างสูงและการใช้งานที่นิยมมากที่สุดของมันคือล่ามธรรมดา (สำหรับความคมชัดดู PyPy ซึ่ง JIT รวบรวม bytecode กับรหัสเครื่องที่ฉลาดมากตอนรันไทม์) แต่ Python ไม่ได้รวบรวมน้อยกว่า Java หรือ ค#. Python เป็นเพียง "ไม่เรียบเรียง" หาก "การรวบรวม" ถูก จำกัด ให้รวบรวมก่อนเวลาแต่ไม่มีใครพูดอะไรเกี่ยวกับเรื่องนั้นและโดยทั่วไปมันสามารถอ้างถึงการแปลง lanugage เป็นภาษาใด ๆ
Python
และในขณะที่หลังคือการดำเนินการของอดีตก็เป็นอย่างนั้นCPython
PyPy
C # 4.0 รองรับประเภทไดนามิก (การผูกปลาย) และมันถูกคอมไพล์
node.js ขึ้นอยู่กับเครื่องมือจาวาสคริปต์ V8 ของ Google V8 ทำการรวบรวมรันไทม์ V8 นั้นตอบสนองได้เร็วมาก เพียงตรวจสอบhttp://shootout.alioth.debian.orgและเปรียบเทียบ V8 กับภาษาตีความใด ๆ ข้างต้น
ไม่ - เป็นไปได้ที่จะรวบรวมภาษาไดนามิก
แม้จะมีภาษาแบบไดนามิกบางภาษา รวบรวมโดยการออกแบบเสมอ (เช่น Clojure)
อย่างไรก็ตามคำถามสัมผัสกับจุดสำคัญที่เกี่ยวข้อง: แม้ว่าภาษาแบบไดนามิกสามารถรวบรวมได้ แต่มักเป็นกรณีที่ langauges แบบไดนามิก ไม่สามารถรวบรวมลงในรหัสที่เป็นที่มีประสิทธิภาพเป็นภาษาพิมพ์แบบคงที่ นี่เป็นเพราะมีคุณสมบัติบางอย่างในภาษาแบบไดนามิกที่ต้องใช้การตรวจสอบรันไทม์ที่จะไม่จำเป็นในการรวบรวมแบบคงที่
ตัวอย่างของสิ่งนี้: ภาษาที่อนุญาตให้มีการแก้ไขรันไทม์ของวัตถุ (เช่น Ruby) มักต้องการวัตถุที่จะตรวจสอบ (ด้วยการค้นหา hashtable หรือคล้ายกัน) เมื่อใดก็ตามที่คุณเรียกใช้วิธีการบนวัตถุ แม้ว่าจะเป็นการคอมไพล์คอมไพเลอร์จะต้องสร้างโค้ดเพื่อทำการค้นหาเมธอดที่รันไทม์ การค้นหาวิธีนี้ไม่ได้แตกต่างจากล่ามที่จะต้องทำ
สิ่งนี้จะเพิ่มค่าใช้จ่ายที่สำคัญเมื่อเปรียบเทียบกับการเรียกใช้เมธอดในภาษาเช่น Java ซึ่งวิธีการที่ถูกต้องสามารถกำหนดได้โดยคอมไพเลอร์จากคำจำกัดความของคลาสและลดลงเป็นการเรียกใช้ฟังก์ชันอย่างง่ายในโค้ดเนทีฟ
ฉันเชื่อว่านี่เป็นผลกระทบมากกว่าสิ่งอื่นใดที่ทำให้ภาษาแบบไดนามิกมีประสิทธิภาพโดยเฉลี่ยช้ากว่าคู่ที่รวบรวมแบบคงที่ ดังที่คุณเห็นจากเกณฑ์มาตรฐานที่มีข้อบกพร่องมันเป็นภาษาที่พิมพ์แบบคงที่ (C, Java, Fortran ฯลฯ ) ซึ่งมีแนวโน้มที่จะเร็วที่สุดด้วยภาษาแบบไดนามิก (Perl, Python, Ruby, PHP ฯลฯ ) ที่ด้านล่างของการจัดอันดับ
กาลครั้งหนึ่งเบสิกถูกตีความ และบางรุ่นของ BASIC มีการพิมพ์แบบไดนามิก และคุณสามารถรวบรวมคอมไพเลอร์ให้พวกเขาได้เช่นกัน
(ย้อนกลับไปในช่วง 100 ฟลอปปี้ไดรฟ์เมื่อไดโนเสาร์ยังท่องไปทั่วโลกและกินนักพัฒนา s / w ที่ไม่สงสัยสำหรับอาหารเช้า)
การใช้งาน Smalltalk ที่แตกต่างกันจัดการสิ่งนี้แตกต่างกันไป แต่หลาย ๆ โปรแกรมนั้นคอมไพล์ด้วยไบต์โค้ดที่ทำงานบน VM ประสิทธิภาพสูง
ในความเป็นจริงภาษาที่เรียกว่า "ตีความ" ส่วนใหญ่ผ่าน / อนุญาตการรวบรวมแบบทันเวลาเพื่อให้ทำงานได้เร็วขึ้น และบางส่วนจะต้องมีการคอมไพล์เป็นรหัสไบต์ก่อนจึงจะสามารถรันได้
ในความเป็นจริงแบบไดนามิกและตีความเป็นความคิดที่แตกต่างกันโดยสิ้นเชิง 2 แม้ว่าจะมีความสัมพันธ์ เหตุผลที่ผู้ที่เคยรู้สึกว่าการพิมพ์แบบไดนามิกทำให้งานของพวกเขาง่ายขึ้นและเร็วขึ้นพวกเขาจะไม่สนใจรหัสที่จะทำงานช้าลงเล็กน้อย แต่พกพาได้
Chrome, IE9 และ Firefox 3.1+ รวบรวม JavaScript ทั้งหมดไปยังไบนารีเนทีฟและ JavaScript ถูกพิมพ์แบบไดนามิก
ฉันคิดว่าเหตุผลที่ภาษาไดนามิกส์ในอดีตมีแนวโน้มที่จะตีความได้เนื่องจากการพิมพ์และการตีความแบบไดนามิก (หรือโดยเฉพาะอย่างยิ่งการขาดการรวบรวม) ทั้งสองมีแนวโน้มที่จะมีคุณสมบัติที่เป็นประโยชน์กับภาษาสคริปต์และงานเขียนสคริปต์โดยทั่วไป
ประสิทธิภาพยังไม่ได้ (ไม่ใช่) เป็นเรื่องที่น่ากังวลสำหรับโปรแกรมประเภทต่างๆที่เขียนในภาษาเหล่านี้ดังนั้นอีกครั้งค่าใช้จ่ายในการพิมพ์แบบไดนามิกและการตีความไม่ได้เป็นปัญหาใหญ่เท่าที่ควรจะเป็นในภาษา ประสิทธิภาพที่คุ้มค่า
โดยทั่วไปแล้ว Python จะถูกคอมไพล์ รวบรวมเป็นรหัสไบต์ที่ถูกตีความแล้ว
Perl ทำงานในลักษณะที่คล้ายกัน
Common Lisp จะโดยทั่วไปจะคอมไพล์เป็นหนึ่งในโค้ดเนทีฟหรือไบต์ สิ่งนี้แตกต่างระหว่างการนำไปใช้งาน (และในระดับหนึ่งขึ้นอยู่กับการนำไปใช้งานขึ้นอยู่กับการตั้งค่าการเพิ่มประสิทธิภาพต่างๆ)
ใช่. ภาษาไดนามิกทั้งหมดเป็นภาษาที่ตีความ (แต่ภาษาที่ตีความอาจไม่ใช่แบบไดนามิก)
เหตุผลนั้นง่าย: ถ้าเป็นพลวัตมันต้องการล่ามเพื่อทำการพลวัตในระดับของการคอมไพล์ไบนารี
อดีต : เมื่อเราใส่ข้อมูลในตัวแปร PHP หลังจากนั้นอีกหนึ่งประเภทที่แตกต่างกันโปรแกรมของเราไม่สามารถคอมไพล์ลงในรหัสไบนารี่ได้เนื่องจากแต่ละประเภทมีรูปแบบการแสดงไบนารีของตัวเอง ล่ามจะจัดการการเปลี่ยนแปลงในระดับไบนารี่ในแบบไดนามิก