ภาษาแบบไดนามิกถูกตีความเสมอหรือไม่


18

มองไปที่ภาษาไดนามิกส่วนใหญ่ (ถ้าไม่ใช่ทั้งหมด) (เช่น Python, PHP, Perl และ Ruby) พวกมันจะถูกตีความทั้งหมด ช่วยแก้ให้ด้วยนะถ้าฉันผิด. มีตัวอย่างของภาษาแบบไดนามิกที่ผ่านขั้นตอนการรวบรวมหรือไม่ ภาษาไดนามิกมีความเหมือนกันกับภาษาที่ตีความหรือไม่


4
กำหนดภาษาแบบไดนามิกมันพิมพ์แบบไดนามิกหรือไม่
BenjaminB

3
Objective-C แสดงคุณสมบัติ "ไดนามิก" มากมาย
Edward Strange

4
@ งานหนึ่งสามารถทำได้ด้วยเสียงกระเพื่อมมานานหลายทศวรรษ และมันก็รวบรวมและพิมพ์แบบไดนามิก ดังนั้นจึงไม่เคยมีเขตแดนที่แน่นอนระหว่างการรวบรวมและการตีความ
SK-logic

2
@Darien คุณสามารถคอมไพล์เวลารันไทม์และรันโค้ดหลังจากนั้น พูดอย่างเคร่งครัดมันไม่ใช่การตีความ
xmm0

3
@Darien ไม่มีอะไรป้องกันคอมไพเลอร์จากการจัดเก็บข้อมูลตารางสัญลักษณ์ในไบนารีที่คอมไพล์แล้วและสร้างรหัสเพื่อเข้าใช้ในเวลาทำงาน มันเป็นความจริงที่บางภาษาให้ยืมเพื่อตีความมากกว่าการรวบรวม แต่ประเด็นทั้งหมดก็คือมันเป็นไปได้ที่จะมีคอมไพเลอร์สำหรับภาษานั้น อีกสิ่งสำคัญที่ควรทราบคือบางคนคิดว่าคอมไพเลอร์มีการสร้างรหัสเครื่อง ในทางปฏิบัติมีคอมไพเลอร์ที่ทำการแปลงระดับซอร์สในสองภาษา (หรือแม้แต่ภาษาเดียวกันเช่นตัวแปลงจาวาสคริปต์บางตัว)
xmm0

คำตอบ:


33

ดูแบบไดนามิกภาษาส่วนใหญ่ (ถ้าไม่ทั้งหมด) [เช่น Python, PHP, Perl และ Ruby] พวกเขาจะตีความทั้งหมด

ไม่จริง. คุณสามารถรวบรวมแหล่ง Python นั่นคือหลักฐานที่มีอยู่จริง

มีล่ามสำหรับภาษาที่พิมพ์แบบคงที่และคอมไพเลอร์สำหรับภาษาที่พิมพ์แบบไดนามิก แนวคิดสองประการนี้มีฉากตั้งฉาก

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


19
ความแม่นยำใดที่จะต้องเยื้องการจับคู่บนไวท์บอร์ดเพื่อให้ Python มีความถูกต้องทางไวยากรณ์หรือไม่ ;)
edA-qa mort-ora-y

1
คุณไม่สามารถรวบรวม Python ได้ PYC เร่งเฉพาะการโหลดของโมดูล และ py2exe ก็ฝังตัวแปลลงใน exe ด้วยไฟล์ต้นฉบับ
BenjaminB

8
@ Ubiquité: .pycไฟล์เป็น bytecode รหัสแหล่ง Python ถูกแยกวิเคราะห์ปรับให้เหมาะสมและรวบรวมเพื่อสร้าง คำแนะนำ bytecode ค่อนข้างสูงและการใช้งานที่นิยมมากที่สุดของมันคือล่ามธรรมดา (สำหรับความคมชัดดู PyPy ซึ่ง JIT รวบรวม bytecode กับรหัสเครื่องที่ฉลาดมากตอนรันไทม์) แต่ Python ไม่ได้รวบรวมน้อยกว่า Java หรือ ค#. Python เป็นเพียง "ไม่เรียบเรียง" หาก "การรวบรวม" ถูก จำกัด ให้รวบรวมก่อนเวลาแต่ไม่มีใครพูดอะไรเกี่ยวกับเรื่องนั้นและโดยทั่วไปมันสามารถอ้างถึงการแปลง lanugage เป็นภาษาใด ๆ

4
@ Ubiquité: ใช่ถูกต้อง แต่ไม่เกี่ยวข้องกับการอ้างสิทธิ์ของคุณว่า "คุณไม่สามารถรวบรวม Python" หรือว่าเป็นไปได้ที่จะรวบรวม Python แรกและสำคัญที่สุดที่คุณกำลังผสมPythonและในขณะที่หลังคือการดำเนินการของอดีตก็เป็นอย่างนั้นCPython PyPy
phant0m

2
@ClemC คุณสมบัติทั้งหมดของภาษานั้นสร้างไว้ในคอมไพเลอร์หรือล่ามไม่เช่นนั้นล่ามหรือคอมไพเลอร์ก็เป็นอีกภาษาหนึ่งสำหรับภาษาอื่น
Pieter B

15

Common เสียงกระเพื่อมเป็นแบบไดนามิก (และขอ) พิมพ์และมักจะรวบรวม

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



4

node.js ขึ้นอยู่กับเครื่องมือจาวาสคริปต์ V8 ของ Google V8 ทำการรวบรวมรันไทม์ V8 นั้นตอบสนองได้เร็วมาก เพียงตรวจสอบhttp://shootout.alioth.debian.orgและเปรียบเทียบ V8 กับภาษาตีความใด ๆ ข้างต้น


3

ไม่ - เป็นไปได้ที่จะรวบรวมภาษาไดนามิก

แม้จะมีภาษาแบบไดนามิกบางภาษา รวบรวมโดยการออกแบบเสมอ (เช่น Clojure)

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

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

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

ฉันเชื่อว่านี่เป็นผลกระทบมากกว่าสิ่งอื่นใดที่ทำให้ภาษาแบบไดนามิกมีประสิทธิภาพโดยเฉลี่ยช้ากว่าคู่ที่รวบรวมแบบคงที่ ดังที่คุณเห็นจากเกณฑ์มาตรฐานที่มีข้อบกพร่องมันเป็นภาษาที่พิมพ์แบบคงที่ (C, Java, Fortran ฯลฯ ) ซึ่งมีแนวโน้มที่จะเร็วที่สุดด้วยภาษาแบบไดนามิก (Perl, Python, Ruby, PHP ฯลฯ ) ที่ด้านล่างของการจัดอันดับ


2

กาลครั้งหนึ่งเบสิกถูกตีความ และบางรุ่นของ BASIC มีการพิมพ์แบบไดนามิก และคุณสามารถรวบรวมคอมไพเลอร์ให้พวกเขาได้เช่นกัน

(ย้อนกลับไปในช่วง 100 ฟลอปปี้ไดรฟ์เมื่อไดโนเสาร์ยังท่องไปทั่วโลกและกินนักพัฒนา s / w ที่ไม่สงสัยสำหรับอาหารเช้า)


... แต่เมื่อพวกเขาใช้ GOTO เท่านั้น (ซึ่งแน่นอนว่าเป็นเรื่องธรรมดาถ้าพวกเขาพัฒนาในภาษา AIC! นั่นอธิบายได้!)
Mason Wheeler

ภาษาเบสิกในขณะที่การออกแบบพื้นฐานคือภาษา
AProgrammer

2

การใช้งาน Smalltalk ที่แตกต่างกันจัดการสิ่งนี้แตกต่างกันไป แต่หลาย ๆ โปรแกรมนั้นคอมไพล์ด้วยไบต์โค้ดที่ทำงานบน VM ประสิทธิภาพสูง


2

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

ในความเป็นจริงแบบไดนามิกและตีความเป็นความคิดที่แตกต่างกันโดยสิ้นเชิง 2 แม้ว่าจะมีความสัมพันธ์ เหตุผลที่ผู้ที่เคยรู้สึกว่าการพิมพ์แบบไดนามิกทำให้งานของพวกเขาง่ายขึ้นและเร็วขึ้นพวกเขาจะไม่สนใจรหัสที่จะทำงานช้าลงเล็กน้อย แต่พกพาได้


1

Chrome, IE9 และ Firefox 3.1+ รวบรวม JavaScript ทั้งหมดไปยังไบนารีเนทีฟและ JavaScript ถูกพิมพ์แบบไดนามิก

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

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


1

โดยทั่วไปแล้ว Python จะถูกคอมไพล์ รวบรวมเป็นรหัสไบต์ที่ถูกตีความแล้ว

Perl ทำงานในลักษณะที่คล้ายกัน

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


-5

ใช่. ภาษาไดนามิกทั้งหมดเป็นภาษาที่ตีความ (แต่ภาษาที่ตีความอาจไม่ใช่แบบไดนามิก)

เหตุผลนั้นง่าย: ถ้าเป็นพลวัตมันต้องการล่ามเพื่อทำการพลวัตในระดับของการคอมไพล์ไบนารี

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


2
ไม่ถูกต้อง. ภาษาแบบไดนามิกสามารถรวบรวม (และบางครั้งมีประสิทธิภาพมากเช่นการใช้ JIT และเทคนิคการรวบรวมแบบปรับตัว)
Basile Starynkevitch

"การรวบรวม JIT รวมความเร็วของการคอมไพล์โค้ดกับความยืดหยุ่นในการตีความพร้อมค่าใช้จ่ายของล่าม ... " en.wikipedia.org/wiki/Just-in-time_compilationโปรแกรมของคุณไม่ได้รวบรวม: มันถูกรวบรวมโดย ล่ามให้คุณ
ClearMind

อ่านเอกสารที่เกี่ยวข้องกับSELF
Basile Starynkevitch

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

1
คอมไพเลอร์คำจำกัดความของคุณเข้มงวดเกินไป ไม่ใช่คอมไพเลอร์ทุกคนที่สร้างไฟล์เรียกทำงานไบนารี สำหรับ counterexample ที่ผ่านมาการศึกษาการดำเนินงานของSBCL อ่านหนังสือมังกรเล่มล่าสุดและเสียงกระเพื่อมเป็นชิ้นเล็กชิ้นน้อย
Basile Starynkevitch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.