PHP derlenmiş veya yorumlanmış mı?


142

PHP derlenmiş veya yorumlanmış mı?

Yanıtlar:


127

PHP yorumlanmış bir dildir. PHP'yi yorumlamanızı sağlayan ikili dosya derlenir, ancak yazdıklarınız yorumlanır.

Yorumlanan diller için Wikipedia sayfasında daha fazlasını görebilirsiniz


26
Php (veya windows php.exe üzerinde) adlı yardımcı program derlendi anlamına gelir.
sepp2k

7
@nicky PHP'yi yorumlamak için kullanılan programın derlendiği, ancak PHP'nin kendisinin yorumlandığı anlamına gelir.
Andrew Song

5
Ama wikipedia'da neden böyle bahsedildi? goo.gl/YOwZ PHP 4'ten bu yana, PHP ayrıştırıcı Zend Engine tarafından işlenmek üzere bayt kodu üretmek için girdiyi derleyerek tercüman öncülüne göre daha iyi performans sağlar.
kiranvj

5
@kiranvj Gerçekten daha iyi performanslar için derlenmiştir, ancak çalışma zamanında. "Derlenmiş diller" i "önceden derlenmiş" ve yorumlanmış dilleri "Çalışırken derlendi" olarak düşünün. Bu ikisi arasındaki fark: - JIT ("Tam zamanında"), burada sadece gerekli olan kod gerektiğinde derlenir (ancak, yorumlayıcıdan çıktıktan sonra derlenen kodun çok olduğuna dikkat edin) - AOT (" Zamanın ötesinde "), burada tüm kod çalıştırılmadan önce derlenir.
Thibault Martin-Lagardette

4
@kiranvj: OP'nin PHP'nin yerel koda derlenmiş olup olmadığını bilmek istediğine inanıyorum. Daha sonra tekrar Zend tarafından yorumlanan bayt koduna derleme, derleme maliyeti ve çalışma zamanı performansı açısından ortada bir yerdedir. Lol, bu oldukça eski bir konu, sadece fark ettim.
Groo

66

Her ikisi de. PHP daha sonra çalışma zamanı motoru tarafından yorumlanan bir ara bayt koduna derlenir.

PHP derleyicisinin işi, PHP kodunuzu ayrıştırmak ve çalışma zamanı motoru için uygun bir forma dönüştürmektir. Görevleri arasında:

  • Yorumları yoksay
  • Değişkenleri, işlev adlarını vb. Çözün ve sembol tablosunu oluşturun
  • Programınızın soyut sözdizimi ağacını oluşturma
  • Bayt kodunu yazın

PHP kurulumunuza bağlı olarak, bu adım genellikle komut dosyası ilk kez çağrıldığında yalnızca bir kez yapılır. Derleyici çıktısı sonraki kullanımlarda erişimi hızlandırmak için önbelleğe alınır. Ancak komut dosyası değiştirilirse, derleme adımı yeniden gerçekleştirilir.

Çalışma zamanı motoru, komut dosyası çağrıldığında AST ve bayt kodunu yürür. Sembol tablosu, değişkenlerin değerlerini saklamak ve işlevler için bayt kodu adreslerini sağlamak için kullanılır.

Bayt kodunu derleme ve çalışma zamanında yorumlama işlemi Perl, Java, Ruby, Smalltalk ve diğerleri de dahil olmak üzere bir tür sanal çalışma zamanı makinesinde çalışan diller için tipiktir.


Değişken bağlama, derleme zamanında değil, çalışma zamanında gerçekleşir.
jrockway

PHP derleme zamanında hangi isimlerin kapsamda olduğunu çözmeye bile çalışmaz mı?
Barry Brown

17

Genelde yorumlanır, ancak bir süre onu derlenmiş olarak kullanabilir ve gerçekten performansı arttırır. Bu işlemi gerçekleştirmek için açık kaynak aracı: hhvm.com


15

PHP yorumlanmış bir dildir. Bununla birlikte, üçüncü taraf araçları tarafından bayt kodlamak için derlenebilir.


2
"bytecode", VM'ye özgü sahte talimatlar için kullanılan ve yerel olmayan bir terimdir, bu nedenle bu bağlamda "derleme" olarak kabul edilemez.
Sedat Kapanoglu

7
"nesne kodu" sadece CPU'nun talimat kod çözücüsünün bayt kodudur. (İşlemcilerin aslında "CMPSB" gibi yerel talimatlara sahip olduğunu düşünmüyorsunuz, değil mi?)
jrockway

11

Bir derlenmiş kod bilgisayarın CPU tarafından doğrudan çalıştırılabilir. Olduğunu, çalıştırılabilir kod CPU belirtilen yerli dilinde belirtilir

Yorumlanan dillerin kodu çalışma zamanında herhangi bir formattan CPU makine talimatlarına dönüştürülmelidir. Bu çeviri bir tercüman tarafından yapılır.

Bir dilin yorumlandığını veya derlendiğini söylemek doğru olmaz çünkü yorumlama ve derleme, dilin bir özelliği değil , söz konusu dilin uygulanmasının özellikleri kendisinin . Bu nedenle, herhangi bir dil derlenebilir veya yorumlanabilir - sadece kullandığınız belirli uygulamanın ne yaptığına bağlıdır.

En yaygın olarak kullanılan PHP uygulaması tarafından desteklenmektedir Zend Motoru ve PHP.The Zend Engine böylece yürütebileceği bir biçime PHP kaynak derler adıyla bilinen Zend motoru bir olarak çalışıyor tercüman .


2
" Yani, yürütülebilir kod CPU'nun ana dilinde belirtilir " .. Yürütülebilir kod CPU'nun ana dilinde değil, ikili biçimde, CPU'nun ana dili herhangi bir şey olabilir ve yazılım ikili dosyaları bunun için olduğu gibi gelmediğinde CPU veya bu CPU .. Tamamen derlenmiş ve çalıştırılabilir bir kod ikili biçimde olacaktır ..
hagrawal

10

Bu anlamsız bir soru. PHP, GCC gibi yacc (bizon) kullanır. yacc bir "derleyici derleyicisidir". Yacc çıktısı bir derleyicidir. Bir derleyicinin çıktısı "derlenir". PHP yacc çıktısı tarafından ayrıştırılır. Yani tanım gereği derlenmiştir.

Bu tatmin edici değilse, aşağıdakileri göz önünde bulundurun. Hem php (ikili) hem de gcc kaynak kodunuzu okur ve soyut bir sözdizimi ağacı oluşturur. Sürüm 4 ve 5 altında, php programı bayt koduna çevirmek için ağaç üzerinde yürür (derleme adımı). Vulcan Mantık Damperini kullanarak bayt kodunu (montaja benzer) opcode çevrilmiş olarak görebilirsiniz . Son olarak, php (özellikle Zend motoru) bayt kodunu yorumlar. gcc, buna karşılık, ağaçta yürür ve montajı çıktılar; ayrıca işlemi bitirmek için montajcıları ve bağlayıcıları çalıştırabilir. Bir "yorumlanmış" ve diğer "derlenmiş" tarafından işlenen bir programın çağrılması anlamsızdır. Sonuçta, programlar her ikisi ile birlikte bir "derleyici" üzerinden çalıştırılır.

Bunun yerine sormak istediğiniz soruyu sormalısınız. ("PHP her istek için kaynak kodumu yeniden derlediğinden performans cezası ödüyor muyum?" Vb.)


5
Bir kaynak kodun belirtilmesi derlenmemektedir. VBScript bile tanımınızla derlenmiş bir dil olarak kabul edilebilir.
Sedat Kapanoglu

5
OP'nin sorusuna gerçekten cevap vermese de, bu konuda jrockway ile birlikteyim. Her dilin her kategoriye temiz bir şekilde yerleştirildiği bir dil sınıflandırması yaratmak caziptir. Ama gerçek o kadar düzgün değil. Hemen hemen her dil bir özelliklerin karışımıdır. Artı, hemen aşağı indiğinizde, yerel makine kodu bile işlemci tarafından "yorumlanır".
Barry Brown

4
Senin yüksek seviyeli iddiası bu doğrudur olduğunu anlamsız bir soru. Ancak argümanınız pek yardımcı olmuyor, yaptığınız tek şey bulanık tanımlar ve onları aşırılıklara götürmek. Derleme, kaynağın nesne koduna dönüştürülmesidir. Evet, kaynağın somut / soyut bir sözdizimi ağacına dönüşümünü bir derleme olarak düşünebilirsiniz, ancak çoğu insanın anlamı bu değil mi? Ne olursa olsun, bu bir dil olmadığı için anlamsız bir sorudur doğal olarak derlenmiş veya yorumlanmış, bir dilin implmentations derlenmiş veya yorumlanır.
Falaina

6
Adamın yeni başlayan olduğunu denetlemeyelim. bu soruyu "Zend uygulaması PHP kaynağından yerel kod üretiyor mu?" cevabımı kontrol et. bence sorunun sorulması konusunda çok katı davranıyorsunuz. bilirsiniz, bazı yenilere basmak için değil, yardım etmeye çalışıyoruz.
Sedat Kapanoglu

3
Sedat'a tamamen katılıyorum.
Bilginizi askere

10

Bu sorunun eski olduğunu biliyorum ama her yerde bağlantılı ve bence buradaki tüm cevaplar yanlış (belki de eski oldukları için).

Orada YOK tercüme edilmiş bir dilde veya derlenmiş dil olarak böyle bir şey. Herhangi bir programlama dili yorumlanabilir ve / veya derlenebilir.

Her şeyden önce bir dil sadece bir kurallar dizisidir, bu yüzden derleme hakkında konuşurken o dilin belirli uygulamalarına atıfta bulunuruz .

Örneğin HHVM , PHP'nin bir uygulamasıdır. Kodu orta HipHop bayt koduna dönüştürmek ve daha sonra makine koduna dönüştürmek için JIT derlemesini kullanır. Derlendiğini söylemek yeterli mi? Bazı Java uygulamaları (hepsi değil) JIT kullanır. Google'ın V8'i JIT kullanıyor.

Derlenmiş ve yorumlanmış olan eski tanımları kullanmak günümüzde bir anlam ifade etmemektedir.

"PHP derlendi mi?" derlenmiş bir dil ile yorumlanan bir dil arasında açık ve anlaşılmış sınırlayıcılar olmadığı için mantıksız bir sorudur.

Onları sınırlamanın olası bir yolu (bu ikilikte bir anlam bulamıyorum):

derlenmiş diller Zamanın Ötesinde derlemeyi kullanır (C, C ++);

yorumlanan diller Tam Zamanında derleme kullanır veya hiç derleme yapmaz (Python, Ruby, PHP, Java).


Java, çoğu zaman vaktinden önce derleme kullanmıyor mu? Oldukça yeni bir Java geliştiricisiyim ve genellikle kod yolumuzu çalışma zamanından önce derleriz.
aCarella

@aCarella in most cases, evet. her durumda, hayır. böylece anlamsal olarak önemli ve kabul edilmiş bir çizgi çizemezsiniz.
Claudiu Creanga

2

En azından kodu istediği kadar derlemez (veya optimize etmeliyim).

Bu kod ...

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

... her çalıştırıldığında programı eşit derecede geciktirir.

Bunun sadece ilk kez yapılması gereken bir hesaplama olduğunu tespit etmiş olabilir.


Şimdi jeneratör diye bir seçeneğimiz var.
Ankit Vishwakarma

1

Kabul edilen cevap açık bir şekilde yanlıştır. PHP derlendi. Hikayenin sonu. Belki yerel talimatlara değil, yorumlanmış bir bayt koduna.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.