Câu trả lời:
PHP là một ngôn ngữ được giải thích. Nhị phân cho phép bạn diễn giải PHP được biên dịch, nhưng những gì bạn viết được diễn giải.
Bạn có thể xem thêm trên trang Wikipedia cho các ngôn ngữ được giải thích
Cả hai. PHP được biên dịch thành mã byte trung gian, sau đó được giải thích bởi công cụ thời gian chạy.
Công việc của trình biên dịch PHP là phân tích mã PHP của bạn và chuyển đổi nó thành một biểu mẫu phù hợp với công cụ thời gian chạy. Trong số các nhiệm vụ của nó:
Tùy thuộc vào thiết lập PHP của bạn, bước này thường được thực hiện chỉ một lần, lần đầu tiên tập lệnh được gọi. Đầu ra của trình biên dịch được lưu trữ để tăng tốc truy cập vào các lần sử dụng tiếp theo. Tuy nhiên, nếu tập lệnh được sửa đổi, bước biên dịch được thực hiện lại.
Công cụ thời gian chạy đi bộ AST và mã byte khi tập lệnh được gọi. Bảng ký hiệu được sử dụng để lưu trữ các giá trị của các biến và cung cấp địa chỉ mã byte cho các hàm.
Quá trình biên dịch thành mã byte và giải thích nó khi chạy là điển hình cho các ngôn ngữ chạy trên một số loại máy chạy ảo bao gồm Perl, Java, Ruby, Smalltalk và các ngôn ngữ khác.
PHP là một ngôn ngữ được giải thích. Mặc dù vậy, nó có thể được biên dịch sang mã byte bởi các công cụ của bên thứ ba.
Một mã được biên dịch có thể được thực thi trực tiếp bởi CPU của máy tính. Đó là, mã thực thi được chỉ định bằng ngôn ngữ bản địa của CPU
Mã của các ngôn ngữ được dịch phải được dịch trong thời gian chạy từ bất kỳ định dạng nào sang hướng dẫn máy CPU. Bản dịch này được thực hiện bởi một thông dịch viên.
Sẽ không đúng khi nói rằng một ngôn ngữ được diễn giải hoặc biên dịch bởi vì giải thích và biên dịch là cả hai thuộc tính của việc thực hiện ngôn ngữ cụ thể đó và không phải là một thuộc tính của chính ngôn ngữ đó. Vì vậy, bất kỳ ngôn ngữ nào cũng có thể được biên dịch hoặc diễn giải - nó chỉ phụ thuộc vào việc triển khai cụ thể mà bạn đang sử dụng.
Việc triển khai PHP được sử dụng rộng rãi nhất được cung cấp bởi Zend Engine và được gọi đơn giản là PHP. Zend Engine biên dịch nguồn PHP thành định dạng mà nó có thể thực thi, do đó công cụ Zend hoạt động như một trình thông dịch .
Đây là một câu hỏi vô nghĩa. PHP sử dụng yacc (bison), giống như GCC. yacc là một "trình biên dịch trình biên dịch". Đầu ra của yacc là một trình biên dịch. Đầu ra của một trình biên dịch được "biên dịch". PHP được phân tích cú pháp bởi đầu ra của yacc. Vì vậy, theo định nghĩa, được biên soạn.
Nếu điều đó không thỏa mãn, hãy xem xét những điều sau đây. Cả php (nhị phân) và gcc đều đọc mã nguồn của bạn và tạo ra một cây cú pháp trừu tượng. Trong phiên bản 4 và 5, php sau đó đi trên cây để dịch chương trình sang mã byte (bước biên dịch). Bạn có thể thấy mã byte được dịch sang opcodes (tương tự như lắp ráp) bằng cách sử dụng Trình quét logic Vulcan . Cuối cùng, php (đặc biệt là công cụ Zend) diễn giải mã byte. gcc, trong so sánh, đi bộ cây và đầu ra lắp ráp; nó cũng có thể chạy các trình biên dịch và trình liên kết để kết thúc quá trình. Gọi một chương trình được xử lý bởi một "phiên dịch" và một chương trình khác được xử lý bởi "biên dịch" khác là vô nghĩa. Rốt cuộc, các chương trình đều chạy qua một "trình biên dịch" với cả hai.
Thay vào đó, bạn thực sự nên hỏi câu hỏi bạn muốn hỏi. ("Tôi có phải trả tiền phạt hiệu suất khi PHP biên dịch lại mã nguồn của tôi cho mọi yêu cầu không?", V.v.)
Tôi biết câu hỏi này đã cũ nhưng nó được liên kết ở mọi nơi và tôi nghĩ tất cả các câu trả lời ở đây đều không chính xác (có thể vì chúng đã cũ).
Có NO những điều như một ngôn ngữ giải thích hoặc một ngôn ngữ biên dịch. Bất kỳ ngôn ngữ lập trình có thể được giải thích và / hoặc biên dịch.
Trước hết, một ngôn ngữ chỉ là một bộ quy tắc, vì vậy khi chúng ta nói về việc biên dịch, chúng ta đề cập đến việc triển khai cụ thể của ngôn ngữ đó.
HHVM , ví dụ, là một triển khai của PHP. Nó sử dụng trình biên dịch JIT để chuyển đổi mã thành mã byte trung gian HipHop và sau đó được dịch thành mã máy. Có đủ để nói nó được biên dịch? Một số triển khai Java (không phải tất cả) cũng sử dụng JIT. V8 của Google cũng sử dụng JIT.
Sử dụng các định nghĩa cũ của biên dịch so với giải thích ngày nay không có ý nghĩa.
"PHP có được biên dịch không?" là một câu hỏi không nhạy cảm được đưa ra rằng không còn sự phân định rõ ràng và đồng ý giữa ngôn ngữ được biên dịch so với ngôn ngữ được dịch.
Một cách có thể để phân định chúng là (Tôi không tìm thấy bất kỳ ý nghĩa nào trong cách phân đôi này):
ngôn ngữ biên dịch sử dụng biên dịch trước thời gian (C, C ++);
các ngôn ngữ được giải thích sử dụng biên dịch Just in Time hoặc không biên dịch gì cả (Python, Ruby, PHP, Java).
in most cases
, vâng. trong mọi trường hợp, không. vì vậy bạn không thể vẽ một dòng có ý nghĩa về mặt ngữ nghĩa và được đồng ý.
Ít nhất là nó không biên dịch (hoặc tôi nên nói là tối ưu hóa) mã nhiều như người ta có thể muốn nó.
Mã này ...
for($i=0;$i<100000000;$i++);
echo $i;
... trì hoãn chương trình nhiều như nhau mỗi lần nó chạy.
Nó có thể đã phát hiện ra rằng đó là một tính toán chỉ cần được thực hiện lần đầu tiên.