Apakah PHP dikompilasi atau ditafsirkan?
142
PHP adalah bahasa yang diartikan. Biner yang memungkinkan Anda menafsirkan PHP dikompilasi, tetapi apa yang Anda tulis ditafsirkan.
Anda dapat melihat lebih banyak di halaman Wikipedia untuk bahasa yang diterjemahkan
Kedua. PHP dikompilasi ke bytecode antara yang kemudian ditafsirkan oleh mesin runtime.
Pekerjaan kompiler PHP adalah mem-parsing kode PHP Anda dan mengubahnya menjadi bentuk yang cocok untuk mesin runtime. Di antara tugas-tugasnya:
Bergantung pada pengaturan PHP Anda, langkah ini biasanya dilakukan hanya sekali, saat pertama kali skrip dipanggil. Output kompiler di-cache untuk mempercepat akses pada penggunaan selanjutnya. Namun, jika skrip diubah, langkah kompilasi dilakukan lagi.
Mesin runtime menjalankan AST dan bytecode ketika skrip dipanggil. Tabel simbol digunakan untuk menyimpan nilai-nilai variabel dan memberikan alamat bytecode untuk fungsi.
Proses kompilasi untuk bytecode dan menafsirkannya saat runtime adalah tipikal untuk bahasa yang berjalan pada beberapa jenis mesin runtime virtual termasuk Perl, Java, Ruby, Smalltalk, dan lain-lain.
sumber
Secara umum ditafsirkan, tetapi beberapa waktu dapat menggunakannya sebagai dikompilasi dan itu benar-benar meningkatkan kinerja. Alat open source untuk melakukan operasi ini: hhvm.com
sumber
PHP adalah bahasa yang diartikan. Itu bisa dikompilasi menjadi bytecode oleh alat pihak ketiga.
sumber
Sebuah kode dikompilasi dapat dieksekusi langsung oleh CPU komputer. Artinya, kode yang dapat dieksekusi ditentukan dalam bahasa asli CPU
Kode bahasa yang ditafsirkan harus diterjemahkan pada saat dijalankan dari format apa pun ke instruksi mesin CPU. Terjemahan ini dilakukan oleh seorang juru bahasa.
Tidaklah tepat untuk mengatakan bahwa suatu bahasa ditafsirkan atau dikompilasi karena interpretasi dan kompilasi keduanya adalah sifat dari implementasi bahasa tertentu, dan bukan properti dari bahasa itu sendiri. Jadi, bahasa apa pun dapat dikompilasi atau ditafsirkan - itu hanya tergantung pada apa implementasi tertentu yang Anda gunakan.
Implementasi PHP yang paling banyak digunakan adalah diberdayakan oleh Zend Engine dan dikenal sebagai PHP. Zend Engine mengkompilasi sumber PHP ke dalam format yang dapat dieksekusi, sehingga mesin Zend berfungsi sebagai penerjemah .
sumber
Ini adalah pertanyaan yang tidak berarti. PHP menggunakan yacc (bison), seperti halnya GCC. yacc adalah "kompiler kompiler". Output dari yacc adalah kompiler. Output dari kompiler adalah "dikompilasi". PHP diurai oleh output yacc. Jadi, secara definisi, dikompilasi.
Jika itu tidak memuaskan, pertimbangkan yang berikut ini. Baik php (biner) dan gcc membaca kode sumber Anda dan menghasilkan pohon sintaksis abstrak. Di bawah versi 4 dan 5, php kemudian berjalan pohon untuk menerjemahkan program ke bytecode (langkah kompilasi). Anda dapat melihat bytecode diterjemahkan ke opcodes (yang analog dengan rakitan) menggunakan Vulcan Logic Dumper . Akhirnya, php (khususnya, mesin Zend) menginterpretasikan bytecode. gcc, sebagai perbandingan, berjalan di pohon dan output perakitan; itu juga dapat menjalankan assembler dan linker untuk menyelesaikan proses. Memanggil program yang ditangani oleh satu "ditafsirkan" dan program lain yang ditangani oleh yang lain "dikompilasi" tidak ada artinya. Bagaimanapun, program keduanya dijalankan melalui "kompiler" dengan keduanya.
Anda seharusnya mengajukan pertanyaan yang ingin Anda tanyakan. ("Apakah saya membayar penalti kinerja karena PHP mengkompilasi ulang kode sumber saya untuk setiap permintaan?", Dll.)
sumber
Saya tahu pertanyaan ini sudah lama tetapi tertaut di semua tempat dan saya pikir semua jawaban di sini tidak benar (mungkin karena sudah lama).
Ada NO hal seperti bahasa ditafsirkan atau bahasa yang dikompilasi. Bahasa pemrograman apa pun dapat ditafsirkan dan / atau dikompilasi.
Pertama-tama bahasa hanyalah seperangkat aturan, jadi ketika kita berbicara tentang kompilasi kita merujuk pada implementasi spesifik dari bahasa itu.
HHVM , misalnya, adalah implementasi dari PHP. Menggunakan kompilasi JIT untuk mengubah kode ke bytecode HipHop menengah dan kemudian diterjemahkan ke dalam kode mesin. Apakah cukup dengan mengatakan itu dikompilasi? Beberapa implementasi Java (tidak semua) juga menggunakan JIT. Google V8 juga menggunakan JIT.
Menggunakan definisi lama dari kompilasi vs ditafsirkan tidak masuk akal saat ini.
Salah satu cara yang mungkin untuk membatasi mereka adalah (Saya tidak menemukan arti dalam dikotomi ini):
bahasa yang dikompilasi menggunakan kompilasi Ahead of Time (C, C ++);
bahasa yang diinterpretasikan menggunakan kompilasi Just in Time atau tidak ada kompilasi sama sekali (Python, Ruby, PHP, Java).
sumber
in most cases
, ya. dalam semua kasus, tidak. jadi Anda tidak dapat menarik garis yang secara semantik signifikan dan disepakati.Setidaknya itu tidak mengkompilasi (atau harus saya katakan mengoptimalkan) kode sebanyak yang diinginkan.
Kode ini ...
... menunda program sama banyak setiap kali dijalankan.
Itu bisa mendeteksi bahwa itu adalah perhitungan yang hanya perlu dilakukan pertama kali.
sumber
Jawaban yang diterima jelas salah. PHP IS dikompilasi. Akhir dari cerita. Mungkin bukan untuk instruksi asli tetapi untuk bytecode ditafsirkan.
sumber