หลังจากอ่านเนื้อหาบางส่วนเกี่ยวกับเรื่องนี้แล้วฉันยังไม่แน่ใจว่าความแตกต่างระหว่างภาษาคอมไพล์และภาษาที่ตีความหมายคืออะไร ฉันบอกว่านี่เป็นหนึ่งในความแตกต่างระหว่าง Java และ JavaScript มีใครช่วยฉันทำความเข้าใจได้ไหม
หลังจากอ่านเนื้อหาบางส่วนเกี่ยวกับเรื่องนี้แล้วฉันยังไม่แน่ใจว่าความแตกต่างระหว่างภาษาคอมไพล์และภาษาที่ตีความหมายคืออะไร ฉันบอกว่านี่เป็นหนึ่งในความแตกต่างระหว่าง Java และ JavaScript มีใครช่วยฉันทำความเข้าใจได้ไหม
คำตอบ:
อะไรคือความแตกต่างระหว่างภาษาที่รวบรวมและแปลความหมาย?
ความแตกต่างไม่ได้อยู่ในภาษา มันมีอยู่ในการดำเนินการ
เมื่อนำสิ่งนั้นออกจากระบบของฉันนี่คือคำตอบ:
ในการนำไปใช้งานที่คอมไพล์โปรแกรมต้นฉบับจะถูกแปลเป็นคำสั่งของเครื่องดั้งเดิมซึ่งดำเนินการโดยตรงโดยฮาร์ดแวร์
ในการนำไปใช้งานที่มีการตีความโปรแกรมต้นฉบับจะถูกแปลเป็นอย่างอื่น โปรแกรมอื่นเรียกว่า "ล่าม" จากนั้นตรวจสอบ "อย่างอื่น" และดำเนินการตามที่เรียกร้อง "อย่างอื่น" มีอยู่หลายรูปแบบทั้งนี้ขึ้นอยู่กับภาษาและการนำไปใช้งาน จากที่นิยมมากขึ้นเป็นที่นิยมน้อยกว่า "อย่างอื่น" อาจเป็น
คำสั่งไบนารีสำหรับเครื่องเสมือนซึ่งมักเรียกว่าbytecodeเช่นเดียวกับที่ทำใน Lua, Python, Ruby, Smalltalk และระบบอื่น ๆ อีกมากมาย (วิธีนี้ได้รับความนิยมในปี 1970 โดยระบบ UCSD P และ UCSD Pascal)
การแสดงแบบต้นไม้ของโปรแกรมดั้งเดิมเช่นโครงสร้างนามธรรม - ไวยากรณ์เช่นเดียวกับที่ทำกับต้นแบบหรือล่ามเพื่อการศึกษาจำนวนมาก
การแสดงโทเค็นของโปรแกรมต้นทางคล้ายกับ Tcl
อักขระของโปรแกรมต้นทางเช่นเดียวกับที่ทำใน MINT และ TRAC
สิ่งหนึ่งที่ทำให้ปัญหาซับซ้อนคือสามารถแปล (คอมไพล์) bytecode เป็นคำแนะนำของเครื่องดั้งเดิมได้ ดังนั้นการใช้งานแบบ intepreted ที่ประสบความสำเร็จในที่สุดอาจได้รับคอมไพเลอร์ หากคอมไพลเลอร์ทำงานแบบไดนามิกเบื้องหลังมักเรียกว่าคอมไพเลอร์แบบทันเวลาหรือคอมไพเลอร์ JIT JIT ได้รับการพัฒนาสำหรับ Java, JavaScript, Lua และฉันกล้าพูดภาษาอื่น ๆ อีกมากมาย เมื่อถึงจุดนั้นคุณสามารถใช้งานแบบไฮบริดซึ่งมีการตีความโค้ดบางส่วนและมีการคอมไพล์โค้ด
Java และ JavaScript เป็นตัวอย่างที่ไม่ดีเป็นธรรมที่จะแสดงให้เห็นถึงความแตกต่างนี้เพราะทั้งสองจะถูกตีความภาษา Java (ตีความ)และ C (หรือ C ++) (คอมไพล์)อาจเป็นตัวอย่างที่ดีกว่า
ทำไมต้องเป็นข้อความขีดทับ? เนื่องจากคำตอบนี้ชี้ให้เห็นอย่างถูกต้องการตีความ / เรียบเรียงจึงเกี่ยวกับการนำภาษาไปใช้อย่างเป็นรูปธรรมไม่ใช่เกี่ยวกับภาษาต่อตัว ในขณะที่ข้อความเช่น "C เป็นภาษาคอมไพล์" มักจะเป็นจริง แต่ก็ไม่มีอะไรที่จะหยุดไม่ให้ใครบางคนเขียนล่ามภาษาซีได้ ในความเป็นจริงล่ามสำหรับ C ทำอยู่
โดยทั่วไปโค้ดที่คอมไพล์สามารถดำเนินการได้โดยตรงโดย CPU ของคอมพิวเตอร์ นั่นคือรหัสปฏิบัติการถูกระบุไว้ในภาษา "เนทีฟ" ของ CPU ( ภาษาแอสเซมบลี )
อย่างไรก็ตามรหัสของภาษาที่ตีความจะต้องได้รับการแปลในขณะทำงานจากรูปแบบใด ๆ เป็นคำแนะนำของเครื่อง CPU การแปลนี้ทำโดยล่าม
อีกวิธีหนึ่งในการใส่ก็คือภาษาที่แปลความหมายคือโค้ดจะถูกแปลเป็นคำสั่งของเครื่องทีละขั้นตอนในขณะที่โปรแกรมกำลังดำเนินการในขณะที่ภาษาที่คอมไพล์จะมีการแปลโค้ดก่อนที่จะดำเนินการโปรแกรม
นี่คือความแตกต่างพื้นฐานระหว่างภาษาคอมไพเลอร์กับภาษาล่าม
ภาษาคอมไพเลอร์
ภาษาของล่าม:
โดยทั่วไปคอมไพเลอร์จะอ่านรหัสคอมพิวเตอร์ภาษาระดับสูงกว่าและแปลงเป็นรหัส p หรือรหัสเครื่องดั้งเดิม ล่ามทำงานโดยตรงจาก p-code หรือรหัสที่ตีความเช่น Basic หรือ Lisp โดยปกติโค้ดที่คอมไพล์แล้วจะทำงานได้เร็วกว่ามากมีขนาดกะทัดรัดกว่าและพบข้อผิดพลาดทางไวยากรณ์ทั้งหมดแล้วและข้อผิดพลาดในการอ้างอิงที่ผิดกฎหมายจำนวนมาก โค้ดที่ตีความจะพบเฉพาะข้อผิดพลาดดังกล่าวหลังจากที่แอปพลิเคชันพยายามตีความรหัสที่ได้รับผลกระทบ โค้ดที่ตีความมักจะใช้ได้ดีกับแอปพลิเคชันง่ายๆที่จะใช้เพียงครั้งเดียวหรือมากที่สุดสองสามครั้งหรือแม้กระทั่งสำหรับการสร้างต้นแบบ โค้ดที่คอมไพล์ดีกว่าสำหรับการใช้งานที่จริงจัง ก่อนอื่นคอมไพเลอร์จะเข้าสู่โปรแกรมทั้งหมดตรวจสอบข้อผิดพลาดคอมไพล์แล้วเรียกใช้งาน ในขณะที่ล่ามทำสิ่งนี้ทีละบรรทัดดังนั้นจึงใช้เวลาหนึ่งบรรทัดตรวจสอบข้อผิดพลาด
หากคุณต้องการข้อมูลเพิ่มเติมเพียงแค่ Google สำหรับ "ความแตกต่างระหว่างคอมไพเลอร์และล่าม"
มันเป็นความแตกต่างที่มืดมนมากและโดยทั่วไปแล้วไม่ใช่คุณสมบัติของภาษา แต่เป็นของโปรแกรมที่คุณใช้ในการรันโค้ดในภาษานั้น
อย่างไรก็ตามภาษาส่วนใหญ่จะใช้เป็นหลักในรูปแบบใดรูปแบบหนึ่งและใช่ Java จะถูกคอมไพล์เป็นหลักเสมอในขณะที่จาวาสคริปต์จะตีความเป็นหลักเสมอ
ในการคอมไพล์ซอร์สโค้ดคือการรันโปรแกรมที่สร้างไบนารีไฟล์ที่เรียกใช้งานได้ซึ่งเมื่อรันมีลักษณะการทำงานที่กำหนดโดยซอร์ส ตัวอย่างเช่น javac รวบรวมไฟล์ human-readbale .java ลงในไฟล์. class ที่เครื่องอ่านได้
ในการตีความซอร์สโค้ดให้รันโปรแกรมที่สร้างพฤติกรรมที่กำหนดทันทีโดยไม่ต้องสร้างไฟล์ตัวกลาง ตัวอย่างเช่นเมื่อเว็บเบราว์เซอร์ของคุณโหลด stackoverflow.com มันจะแปล javascript จำนวนมาก (ซึ่งคุณสามารถดูได้จากการดูแหล่งที่มาของหน้า) และสร้างเอฟเฟกต์ที่ดีมากมายที่หน้าเหล่านี้มีเช่นการเพิ่มคะแนนหรือการแจ้งเตือนเล็กน้อย แถบด้านบน
ภาษาที่ตีความจะถูกดำเนินการในขณะรันตามคำสั่งเช่นในเชลล์สคริปต์และภาษาที่คอมไพล์เป็นภาษาที่คอมไพล์ (เปลี่ยนเป็นภาษาแอสเซมบลีซึ่ง CPU สามารถเข้าใจได้) จากนั้นดำเนินการเช่นเดียวกับใน c ++
ดังที่คนอื่น ๆ กล่าวไว้การรวบรวมและตีความมีความเฉพาะเจาะจงสำหรับการนำภาษาโปรแกรมไปใช้ พวกเขาไม่ได้มีอยู่ในภาษา ตัวอย่างเช่นมีล่ามภาษาซี
อย่างไรก็ตามเราสามารถ (และในทางปฏิบัติเราทำได้) จำแนกภาษาการเขียนโปรแกรมตามการใช้งานทั่วไป (บางครั้งก็เป็นที่ยอมรับ) ตัวอย่างเช่นเราพูดว่า C ถูกคอมไพล์
ขั้นแรกเราต้องกำหนดโดยไม่มีล่ามและคอมไพเลอร์ที่คลุมเครือ:
ล่ามภาษาXเป็นโปรแกรม (หรือเครื่องหรือเพียงแค่ชนิดของกลไกโดยทั่วไปบางคน) ที่รันโปรแกรมใด ๆPเขียนในภาษาXดังกล่าวว่าจะดำเนินการผลกระทบและประเมินผลตามข้อกำหนดของX
คอมไพเลอร์จากXไปYเป็นโปรแกรม (หรือเครื่องหรือเพียงแค่ชนิดของกลไกโดยทั่วไปบางคน) ที่แปลโปรแกรมใด ๆหน้าจากภาษาบางXลงในโปรแกรมเทียบเท่าหมายP'ในภาษาบางYในลักษณะที่การตีความพี 'กับล่ามสำหรับYจะให้ผลลัพธ์ที่เหมือนกันและมีผลเช่นเดียวกับการตีความพีกับล่ามสำหรับX
สังเกตว่าจากมุมมองของโปรแกรมเมอร์ซีพียูเป็นล่ามเครื่องสำหรับภาษาเครื่องดั้งเดิมของตน
ตอนนี้เราสามารถจำแนกภาษาการเขียนโปรแกรมเบื้องต้นได้เป็น 3 ประเภทโดยขึ้นอยู่กับการใช้งานทั่วไป:
บางครั้งภาษาที่คอมไพล์แบบอ่อนและยากจะอ้างอิงถึงการคอมไพล์อย่างง่าย ๆ ดังนั้นจึงมีการกล่าวถึง C #, Java, C, C ++
ในการจัดหมวดหมู่นี้ JavaScript เคยเป็นภาษาที่ตีความได้ แต่เมื่อหลายปีก่อน ปัจจุบันมีการรวบรวม JIT เป็นภาษาเครื่องดั้งเดิมในการใช้งาน JavaScript ที่สำคัญส่วนใหญ่ดังนั้นฉันจะบอกว่ามันเป็นภาษาที่คอมไพล์อ่อน ๆ