berk_gun PHP yorumlanan, dinamik ve zayıf yazılı bir dildir. Buradaki dinamik o dinamik; zayıf da o zayıf değil. O yüzden bir ön açıklama yapayım:
Ön Bilgi
PHP dinamik bir dildir:
Dinamik dillerde bir değişkeni tanımlarken tip belirlemenize gerek yoktur. $x = 1
derseniz $x integer; $x = "1a"
derseniz $x string olur. Statik dillerde ise değişken tipini belirtmeniz gerekir. var x int = 1
gibi. Javascript, Perl, Ruby, Python, Visual Basic, Erlang PHP gibi dinamik dillerdir. C# ve Java örneğin statik dillerdir.
PHP zayıf bir dildir (weakly-typed):
Zayıf yazılmış ya da zayıf yazılı diller, weakly-typed diye geçer, değişkenlerin sonradan tip değiştirmesine izin verir. PHP'de şu gayet geçerlidir:
$x = 1;
$x = "1a";
echo $x; // "1a"
Güçlü yazılı ya da strongly-typed dillerde ise bu mümkün değildir. x int ise int kalır. C, C++, Javascript, Visual Basic, Perl de PHP gibi weakly-typed dillerdir. C#, Java, Python örneğin strongly-typed dillerdir.
Hangi dil hangi grupta şu tabloyu inceleyebilirsiniz, tüm dilleri içermiyor elbette:
+---------+-------------------------------+----------------------+
| | Weakly-Typed | Strongly-Typed |
+---------+-------------------------------+----------------------+
| Dinamik | PHP, Perl, VBasic, JavaScript | Ruby, Python, Erlang |
| Statik | C, C++ | C#, F#, Java, Haskel |
+---------+-------------------------------+----------------------+
PHP yorumlanan bir dildir:
Bildiğiniz gibi PHP bir script dili. Bir dosyanın içine php kodunu yazarsanız ve sayfayı yenilersiniz, anında sonucu görürsünüz. Derlemenize gerek yoktur ama bu derlenmediği anlamına gelmez, o da derlenir ama çalışma anı sırasında derlenir. Yorumlanan dillerin aksine derlenen diller ise çalışmadan önce makine diline çevrilmeleri gerekir.
Eleştiriler
Bunlar ayrıca benim eleştirilerimdir.
PHP üstte bahsettiğim gibi dinamik ve zayıf yazılı bir dildir arkadaşlar. Yani ne yazık ki strict yani katı bir dil değildir. Bu anlamda dışarıdan serkeeeeeeş, avareeeeeee gibi gözükür ama bu, dil için bir problem değil dili kullananlar ile ilgilidir. Kariyerine PHP ile başlayan insanlar PHP ile çok hızlı kod yazıp çık hızlı çıktı aldıkları için genellikle bilgisayar bilimlerindeki bir çok şeyden habersiz kodlama öğrenirler ve düşünmezler. Onlar için sadece int vardır; int8, uint32 kavramları bilmezler, önemsemezler. Bu yüzden bilinçsiz kod yazarlar, sonra çeteresini çekerler.
Kafanıza göre değişken tanımlayabilir ve değiştirebilirsiniz, bu amatör programcılara genellikle bug ya da içinden çıkılmaz durumlar olarak geri döner. Sebebini bulmak için saatlerinizi harcarsınız, bir noktada yaptığınız bir işlem sonucunda x'in int yerine boolean ya da string değere dönüştüğünüzü görürsünüz, değer de o şekilde veritabanına girmiştir, o şekilde 1 hafta binlerce yanlış kayıt işlemiştir sizin yeni haberiniz olmuştur vs... "Adamın yaşını hesaplatmışsınız, 89. satırdan sonra bir işlemden dolayı false olmuş." Ne güzel... Go'da kullanmadığınız bir değişkeni tanımlayamazsınız, kullanmadığınız bir kütüphanesi import edemezsiniz, derlemenize izin vermez ama bir PHP koduna statik analiz atıyoruz, kodun 1/3 ü kullanılmıyor bile çünkü ne de olsa garbage collector var, bellek otomatik temizleniyor. dil izin veriyor mu veriyor, o zaman bok gibi kod yazmaya devam.
PHP yorumlanan bir dildir. O yüzden derleme işi çalışırken gerçekleşir. Bu durumda sonuç almak için derlemenin bitmesini beklemeniz gerekir. Evet, derleme yapmadan sonucu görmek güzel bir şey ama ne yazık ki bu kötü bir performans demek. Opcache, JIT vs gibi geliştirmelerin sebebi bundan kaynaklı performans problemlerinin önüne geçmektir.
PHP 90'larda sadece bireysel, küçük bir amaç için ortaya çıkmış bir dil olduğu için doğumu zaten zayıftır. Buradaki zayıf gerçek anlamda zayıf. Amacı hiçbir zaman yaygın olarak kullanılması düşünülen bir dil olmamıştır. O yüzden geliştirilmesi, büyümesi, topluluk tarafından sahiplenilmesi vs. hep yavaş ve sancılı olmuştur. O yüzden önemli gelişmeler son 6-7 yılda gerçekleşmiştir. Yani maça yenik başlamıştır. O yüzden birçok dilde olan en basit şeyler bile sonradan eklenmiş ya da değiştirilmiştir. O yüzden üzerindeki eleştiriler geçmişe gittikçe daha da şiddetlenir. Şu an gidişat iyi ama.
Sonuç
PHP yazanlar diğer dillere göre daha rahat bok gibi kod yazabilir çünkü PHP bunu engellemede zayıftır. Zayıf olmasının sebebi ise özündedir çünkü HTTP ile çalışması düşünülen küçük kapsamlı bir dil olarak ortaya çıkmıştır. HTTP parametreleri daima string olarak gelir o yüzden dinamik/zayıf yazılı bir dil olarak ortaya çıkmak zorunda kalmıştır. Günümüzde ise topluluk bu durumu düzeltmek için uğraşmaktadır ve PHP 7 ile başlayan bu adımlar PHP 8 ile hızla devam etmektedir.
PHP bu üstte yazdıklarımı toparlarsanız suistimale açık bir dildir ve acemiler, juniorlar bir şeyleri suistimal etme konusunda seniordur. Dil izin veriyor diye paldır küldür yazarlar. Diğer diller sizi daha iyi programcı yapmaz sadece size eğer ve at gözlüğü takarlar; eşek yine eşektir. O yüzden uzmanlaşmak ve ne yaptığını bilmek bu işte önemli. Ben her ne kadar yan kulvardan Go öğreniyor olsam da PHP'yi bırakmam çünkü benim gözümde gün geçtikçe değeri artan bir dil ve 15 sene boyunca bana sağolsun doğruları ve yanlışları bir arada gösterdi. Memory leak yemeden memory kontolünü öğrenemezsiniz, tipleri belirlemeden belirsiz tip hatalarını öğrenemezsiniz.
Son olarak; dil, sadece bir araçtır.