PHP รวบรวมหรือตีความหรือไม่?
PHP รวบรวมหรือตีความหรือไม่?
คำตอบ:
PHP เป็นภาษาที่ตีความ ไบนารีที่ให้คุณแปล PHP ถูกคอมไพล์ แต่สิ่งที่คุณเขียนถูกตีความ
คุณสามารถดูเพิ่มเติมได้ที่หน้า Wikipedia สำหรับภาษาที่ตีความ
ทั้งสอง PHP ถูกคอมไพล์ลงไปเป็น bytecode ระดับกลางซึ่งตีความโดยโปรแกรมรันไทม์
หน้าที่ของคอมไพเลอร์ PHP คือการแยกวิเคราะห์รหัส PHP ของคุณและแปลงเป็นรูปแบบที่เหมาะสมสำหรับเอ็นจิ้นรันไทม์ ระหว่างงาน:
ขึ้นอยู่กับการตั้งค่า PHP ของคุณโดยทั่วไปขั้นตอนนี้จะทำเพียงครั้งเดียวครั้งแรกที่มีการเรียกใช้สคริปต์ คอมไพเลอร์เอาท์พุทแคชเพื่อเพิ่มความเร็วในการเข้าถึงการใช้งานในภายหลัง อย่างไรก็ตามหากมีการแก้ไขสคริปต์ขั้นตอนการรวบรวมจะทำอีกครั้ง
เอ็นจินรันไทม์เดินตาม AST และ bytecode เมื่อสคริปต์ถูกเรียก ตารางสัญลักษณ์ใช้เพื่อเก็บค่าของตัวแปรและระบุที่อยู่ bytecode สำหรับฟังก์ชั่น
กระบวนการของการคอมไพล์ไปยัง bytecode และการตีความที่รันไทม์เป็นปกติสำหรับภาษาที่รันบนเครื่องรันไทม์เสมือนบางประเภทรวมถึง Perl, Java, Ruby, Smalltalk และอื่น ๆ
โดยทั่วไปจะมีการตีความ แต่บางครั้งสามารถใช้เป็นข้อมูลรวบรวมและเพิ่มประสิทธิภาพจริงๆ เครื่องมือโอเพนซอร์สเพื่อดำเนินการนี้: hhvm.com
PHP เป็นภาษาที่ตีความ แม้ว่ามันสามารถคอมไพล์ด้วย bytecode โดยเครื่องมือของบุคคลที่สามได้
รหัสเรียบเรียงสามารถดำเนินการได้โดยตรงโดย CPU ของคอมพิวเตอร์ นั่นคือรหัสที่ปฏิบัติการได้จะถูกระบุในภาษาดั้งเดิมของ CPU
รหัสของภาษาที่แปลต้องแปลในเวลาทำการจากรูปแบบใด ๆ ไปยังคำแนะนำของเครื่อง CPU การแปลนี้ทำโดยล่าม
มันจะไม่เหมาะสมที่จะบอกว่าภาษาถูกตีความหรือเรียบเรียงเพราะการตีความและการรวบรวมเป็นทั้งคุณสมบัติของการใช้งานของภาษานั้น ๆ และไม่ใช่คุณสมบัติของภาษาเอง ดังนั้นภาษาใด ๆ ที่สามารถรวบรวมหรือตีความ - มันขึ้นอยู่กับว่าการใช้งานเฉพาะที่คุณใช้ทำอะไร
PHP การดำเนินการใช้กันอย่างแพร่หลายมากที่สุดคือการขับเคลื่อนด้วยZend เครื่องยนต์และเป็นที่รู้จักแค่ในฐานะ PHP.The Zend เครื่องยนต์รวบรวมแหล่ง PHP ในรูปแบบที่จะสามารถดำเนินการจึงZend เครื่องยนต์ทำงานเป็นล่าม
นี่เป็นคำถามที่ไร้ความหมาย PHP ใช้ yacc (bison) เช่นเดียวกับ GCC yacc เป็น "คอมไพเลอร์คอมไพเลอร์" ผลลัพธ์ของ yacc เป็นคอมไพเลอร์ ผลลัพธ์ของคอมไพเลอร์คือ "รวบรวม" PHP ถูกแยกวิเคราะห์โดยผลลัพธ์ของ yacc ดังนั้นจึงเป็นคำจำกัดความที่รวบรวม
หากไม่เป็นไปตามที่ควรพิจารณา ทั้ง php (ไบนารี) และ gcc อ่านซอร์สโค้ดของคุณและสร้างทรีไวยากรณ์ที่เป็นนามธรรม ในเวอร์ชัน 4 และ 5 php จะเดินแผนผังเพื่อแปลโปรแกรมเป็น bytecode (ขั้นตอนการรวบรวม) ท่านสามารถเข้าดู bytecode แปลเพื่อ opcodes (ซึ่งคล้ายกับการชุมนุม) โดยใช้วัลลอจิก Dumper ในที่สุด php (โดยเฉพาะ Zend engine) ตีความ bytecode gcc ในการเปรียบเทียบเดินต้นไม้และการชุมนุมเอาท์พุท; มันยังสามารถเรียกใช้แอสเซมเบลอร์และลิงเกอร์เพื่อทำให้กระบวนการเสร็จสิ้น การเรียกโปรแกรมที่จัดการโดย "ตีความ" และอีกโปรแกรมที่จัดการโดย "รวบรวม" อีกโปรแกรมหนึ่งนั้นไม่มีความหมาย ท้ายที่สุดแล้วโปรแกรมต่างก็ทำงานผ่าน "คอมไพเลอร์" พร้อมทั้งสองอย่าง
คุณควรถามคำถามที่คุณต้องการถามแทน ("ฉันต้องจ่ายค่าปรับประสิทธิภาพเนื่องจาก PHP คอมไพล์ซอร์สโค้ดของฉันสำหรับทุกคำขอหรือไม่" ฯลฯ )
ฉันรู้ว่าคำถามนี้เก่า แต่มันเชื่อมโยงกันทั่วสถานที่และฉันคิดว่าคำตอบทั้งหมดที่นี่ไม่ถูกต้อง (อาจเป็นเพราะพวกเขาแก่)
นอกจากนี้ไม่มีสิ่งเช่นแปลภาษาหรือภาษาที่รวบรวม ภาษาการเขียนโปรแกรมใด ๆ ที่สามารถตีความและ / หรือรวบรวม
ก่อนอื่นภาษาเป็นเพียงชุดของกฎดังนั้นเมื่อเรากำลังพูดถึงการรวบรวมเราหมายถึงการใช้งานเฉพาะของภาษานั้น
ตัวอย่างเช่นHHVMคือการนำ PHP ไปใช้ มันใช้การรวบรวม JIT เพื่อแปลงรหัสเป็น HipHop bytecode ระดับกลางแล้วแปลเป็นรหัสเครื่อง มันเพียงพอแล้วหรือยังที่จะบอกว่ามันถูกรวบรวม? Java implementations (ไม่ใช่ทั้งหมด) ก็ใช้ JIT เช่นกัน Google V8 ยังใช้ JIT
การใช้คำจำกัดความเก่าของการรวบรวมกับการตีความไม่ได้ทำให้รู้สึกในปัจจุบัน
"PHP คอมไพล์แล้วหรือยัง?" เป็นคำถามที่ไม่ไวต่อความรู้สึกเนื่องจากไม่มีตัวคั่นที่ชัดเจนและตกลงกันระหว่างสิ่งที่เป็นภาษาที่คอมไพล์เทียบกับภาษาที่แปล
วิธีหนึ่งที่เป็นไปได้ในการกำหนดเขตเหล่านั้นคือ (ฉันไม่พบความหมายใด ๆ ในขั้วต่อนี้):
ภาษาที่คอมไพล์ใช้การรวบรวมล่วงหน้า (C, C ++)
ภาษาที่แปลใช้การรวบรวมแบบทันเวลาหรือไม่มีการรวบรวมเลย (Python, Ruby, PHP, Java)
in most cases
ใช่ ในทุกกรณีไม่มี ดังนั้นคุณจึงไม่สามารถวาดเส้นที่มีความหมายและตกลงกันได้
อย่างน้อยมันก็ไม่ได้คอมไพล์ (หรือฉันควรจะบอกว่าการเพิ่มประสิทธิภาพ) โค้ดมากที่สุดเท่าที่หนึ่งอาจต้องการมัน
รหัสนี้ ...
for($i=0;$i<100000000;$i++);
echo $i;
... โปรแกรมล่าช้ามากเท่า ๆ กันในแต่ละครั้งที่เรียกใช้
อาจตรวจพบว่าเป็นการคำนวณที่ต้องทำในครั้งแรกเท่านั้น
คำตอบที่ยอมรับนั้นเป็นเท็จอย่างโจ๋งครึ่ม รวบรวม PHP IS ตอนจบของเรื่อง. อาจไม่ใช่คำสั่งพื้นฐาน แต่แปลโดยรหัสที่แปล