Apakah PHP dikompilasi atau ditafsirkan?

142

Apakah PHP dikompilasi atau ditafsirkan?

Nicky
sumber

Jawaban:

127

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

Thibault Martin-Lagardette
sumber
26
Ia berarti utilitas yang disebut php (atau di windows php.exe) dikompilasi.
sepp2k
7
@nicky Ini berarti bahwa program yang digunakan untuk menafsirkan PHP dikompilasi, tetapi PHP itu sendiri ditafsirkan.
Andrew Song
5
Tapi mengapa disebutkan seperti ini di wikipedia? goo.gl/YOwZ Sejak PHP 4, parser PHP mengkompilasi input untuk menghasilkan bytecode untuk diproses oleh Zend Engine, memberikan kinerja yang lebih baik daripada pendahulunya.
kiranvj
5
@kiranvj Ini memang dikompilasi untuk meningkatkan kinerja, tetapi saat runtime. Pikirkan "bahasa yang dikompilasi" sebagai "yang telah dikompilasi", dan bahasa yang ditafsirkan sebagai "Dikompilasi saat dijalankan". Perbedaan antara keduanya: - JIT ("Tepat pada waktunya"), di mana hanya kode yang diperlukan yang dikompilasi ketika dibutuhkan (perlu dicatat, namun, setelah penerjemah berhenti, kode yang dikompilasi adalah banyak) - AOT (" Di depan waktu "), di mana semua kode dikompilasi sebelum dijalankan.
Thibault Martin-Lagardette
4
@kiranvj: Saya percaya OP ingin tahu apakah PHP dikompilasi dengan kode asli. Mengompilasinya menjadi bytecode, yang kemudian ditafsirkan kembali oleh Zend, berada di tengah-tengah dalam hal biaya kompilasi dan kinerja runtime. Lol, ini utas yang agak lama, baru menyadarinya.
Groo
66

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:

  • Abaikan komentar
  • Atasi variabel, nama fungsi, dan sebagainya dan buat tabel simbol
  • Bangun pohon sintaksis abstrak dari program Anda
  • Tulis bytecode

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.

Barry Brown
sumber
Pengikatan variabel terjadi saat runtime, bukan waktu kompilasi.
jrockway
PHP bahkan tidak berusaha untuk menentukan nama mana yang berada dalam ruang lingkup pada waktu kompilasi?
Barry Brown
17

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

Maks
sumber
15

PHP adalah bahasa yang diartikan. Itu bisa dikompilasi menjadi bytecode oleh alat pihak ketiga.

code_burgar
sumber
2
"bytecode" adalah istilah yang digunakan untuk instruksi pseudo spesifik VM, yang bukan asli maka tidak dapat dianggap sebagai "kompilasi" dalam konteks ini.
Sedat Kapanoglu
7
"kode objek" hanya bytecode untuk dekoder instruksi CPU. (Anda tidak berpikir bahwa CPU benar-benar memiliki petunjuk asli seperti "CMPSB", kan?)
jrockway
11

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 .

Gaurang Deshpande
sumber
2
" Yaitu, kode yang dapat dieksekusi ditentukan dalam bahasa asli CPU " .. Kode yang dapat dieksekusi tidak ditentukan dalam bahasa asli CPU tetapi dalam format biner, bahasa asli CPU bisa berupa apa saja dan ketika perangkat lunak biner tidak datang seperti itu untuk ini CPU atau CPU itu .. Kode yang sepenuhnya dikompilasi dan dapat dieksekusi akan berada dalam format biner ..
hagrawal
10

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.)

jrockway
sumber
5
Mematenkan kode sumber tidak dikompilasi. Bahkan VBScript dapat dianggap sebagai bahasa yang dikompilasi dengan definisi Anda.
Sedat Kapanoglu
5
Saya dengan jrockway tentang ini, meskipun tidak benar-benar menjawab pertanyaan OP. Sangat menggoda untuk membuat taksonomi bahasa di mana setiap bahasa ditempatkan dengan rapi di setiap kategori. Tetapi kenyataannya tidak begitu rapi. Hampir setiap bahasa merupakan perpaduan karakteristik. Plus, ketika Anda langsung melakukannya, bahkan kode mesin asli "ditafsirkan" oleh prosesor.
Barry Brown
4
Penegasan tingkat tinggi Anda benar, ini adalah pertanyaan yang tidak berarti. Namun argumen Anda tidak terlalu membantu, semua yang Anda lakukan adalah mengambil definisi fuzzy dan membawanya ke ekstrem. Kompilasi adalah transformasi sumber menjadi kode objek. Ya, Anda dapat menganggap kompilasi sumber menjadi sintaksis konkret / abstrak sebagai kompilasi, tetapi bukan itu yang dimaksud kebanyakan orang? Bagaimanapun juga, ini adalah pertanyaan yang tidak berarti karena suatu bahasa tidak dikompilasi atau ditafsirkan secara INHERENT , implementasi suatu bahasa dikompilasi atau ditafsirkan.
Falaina
6
jangan mengawasi bahwa pria itu adalah pemula. ini membuat saya menafsirkan pertanyaan sebagai "apakah implementasi Zend menghasilkan kode asli dari sumber PHP?". lihat jawaban saya. saya pikir Anda terlalu ketat tentang cara pertanyaan diajukan. Anda tahu, kami berusaha membantu, bukan untuk mengganggu beberapa pemula.
Sedat Kapanoglu
3
Saya sepenuhnya setuju dengan Sedat. Anda dapat membagikan pengetahuan Anda tanpa menjadi
penipu
10

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.

"Apakah PHP dikompilasi?" adalah pertanyaan yang tidak masuk akal mengingat bahwa tidak ada lagi pembatas yang jelas dan disepakati antara apa yang merupakan bahasa yang dikompilasi vs yang ditafsirkan.

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).

Claudiu Creanga
sumber
Namun, tidakkah Java menggunakan kompilasi lebih awal dalam kebanyakan kasus? Saya seorang pengembang Java yang cukup baru dan kami biasanya mengkompilasi cara kode kami sebelum runtime.
aCarella
@ aCarella in most cases, ya. dalam semua kasus, tidak. jadi Anda tidak dapat menarik garis yang secara semantik signifikan dan disepakati.
Claudiu Creanga
2

Setidaknya itu tidak mengkompilasi (atau harus saya katakan mengoptimalkan) kode sebanyak yang diinginkan.

Kode ini ...

for($i=0;$i<100000000;$i++);
echo $i;

... menunda program sama banyak setiap kali dijalankan.

Itu bisa mendeteksi bahwa itu adalah perhitungan yang hanya perlu dilakukan pertama kali.

Magnus Andersson
sumber
Sekarang kita memiliki opsi yang disebut generator.
Ankit Vishwakarma
1

Jawaban yang diterima jelas salah. PHP IS dikompilasi. Akhir dari cerita. Mungkin bukan untuk instruksi asli tetapi untuk bytecode ditafsirkan.

RichieHH
sumber