# TypePHP: PHP'yi Kalıba Dökmek, Dinamizmi Rehin Vermek

- Yazar: [Halit Yeşil](https://halityesil.com/)
- Yayın tarihi: 2026-10-01
- Dil: Türkçe
- Kaynak adres: https://halityesil.com/typephp-php-aot-derleyici/
- İngilizce sürümü: https://halityesil.com/en/typephp-php-aot-compiler.md
- Kategori: PHP
- Etiketler: açık kaynak, AOT derleyici, derleyici, native binary, performans, php, Swoole, TypePHP
- Lisans: https://creativecommons.org/licenses/by-nc/4.0/
- Atıf: Halit Yeşil. “TypePHP: PHP'yi Kalıba Dökmek, Dinamizmi Rehin Vermek”. halityesil.com, 2026-10-01. https://halityesil.com/typephp-php-aot-derleyici/

---

Geçen hafta sunucudaki PHP'yi [8.1'den 8.5'e taşıdım](https://halityesil.com/php/php-surum-yukseltme-8-1-den-8-5-e/) ve bunu bir bakım işi olarak yazdım. Bu hafta radara giren araç, o sürümü bir ön koşul olarak istiyor. **[TypePHP](https://github.com/swoole/typephp)**, PHP kaynak kodunu C++'a, oradan da native makine koduna çeviren bir AOT (ahead-of-time) derleyici. Yani yazdığınız PHP'yi yorumlanacak bir betik olmaktan çıkarıp çalıştırılabilir bir ikili dosyaya dönüştürüyor.

Metafor hazır zaten: erimiş metal. PHP'nin bütün cazibesi akışkanlığında. TypePHP o akışkan şeyi bir kalıba döküp soğutuyor. Çıkan parça çok daha hızlı ve çok daha sağlam. Sadece artık istediğiniz şekli almıyor.

Peşinen söyleyeyim: bu tur depoyu klonlayıp kaynağı ve uyumsuzluk listesini okudum, derleyiciyi çalıştırıp kendi ölçümümü almadım. Aşağıdaki sayılar projenin kendi deposundan, tarih damgasıyla.

## TypePHP tam olarak ne yapıyor?

TypePHP, PHP kaynak kodunu C++17'ye indirip native derleyiciyle makine koduna çeviren, açık kaynak bir AOT derleyicisidir. Üç çıktı üretebiliyor: çalıştırılabilir ikili dosya, PHP eklentisi (`.so` / `.dll`) ve paylaşımlı kütüphane.

İlginç tarafı şu: derleyicinin kendisi tamamen PHP ile yazılmış ve kendi kendini derliyor. `tpc` ikilisi, TypePHP'nin kendi PHP kaynağının TypePHP ile derlenmesiyle üretiliyor; bootstrap zincirinde C veya C++ yapıştırıcısı yok. Bu gösteriş değil, testtir: kendi derleyicisini derleyemeyen derleyici sizinkini de derleyemez.

Dinamik değerler, dahili fonksiyonlar ve reflection tarafı ise PHPX köprüsüyle Zend çalışma zamanına bağlı kalıyor. "PHP'yi tamamen terk ettik" iddiası yok: kullanıcı fonksiyonlarınız derlendikten sonra Zend opcode'u olarak çalışmıyor, gerisi yerinde duruyor.

## Kurulum: üç komut, bir de derleyici zinciri

Composer tarafı gerçekten üç satır. Asıl iş, makinede bir C++ zincirinin ve PHP geliştirme başlıklarının bulunmasında.

```bash
# Ubuntu/Debian tarafındaki ön koşullar
sudo apt install build-essential cmake pkg-config libgmp-dev libmpfr-dev

# Projeye derleyiciyi ekle
composer require --dev swoole/typephp

# Derle
vendor/bin/tpc.php project.yml
```

Resmi gereksinim listesi net: PHP 8.4–8.5 CLI, geliştirme başlıkları ve `php-config`; ikili dosya için eşleşen `libphp.so`; GCC 9+ veya Clang ile C++17; CMake 3.24+; Composer 2; GMP ve MPFR. Sunucunuzda hâlâ PHP 8.1 duruyorsa kapıdan içeri giremiyorsunuz.

İkili dosya modunda bir `main()` fonksiyonu zorunlu. En küçük örnek şöyle görünüyor:

```php
<?php

function main(): void
{
    echo "Hello World!\n";
    var_dump(PHP_VERSION);
}
```

## Kalıbın şekli: neyi rehin veriyorsunuz?

Bir radar yazısında en çok okunması gereken bölüm burasıdır; depo sayfasındaki hız tablosu bunu anlatmaz. TypePHP, PHP'nin tamamını değil, tanımlı ve test edilebilir bir alt kümesini destekliyor. Uyumsuzluk listesinden öne çıkanlar:

- **Global kapsamda çalıştırılabilir kod yok.** Global seviyede yalnızca bildirim, `use`, `declare` ve sabit tanımı olabiliyor. Her satırın bir fonksiyonun içinde olması gerekiyor.
- **`main()` imzası katı.** Ya parametresiz ya da `(int $argc, array $argv)`, ve dönüş tipi `void`.
- **Değişken değişkenler yok.** `$$var` desteklenmiyor.
- **Closure esnekliği kırpılmış.** `Closure::bind()`, `bindTo()` ve `call()` desteklenmiyor; closure ve ok fonksiyonları referans parametresi almıyor.
- **Referans oyunları bitiyor.** Değişken sayıda referans parametresi (`&...$args`) desteklenmiyor.
- **Generator yerine FiberGenerator.** Bu da `instanceof` kontrollerini ve reflection uyumunu bozuyor.
- **Tip çıkarımı geri alınamıyor.** 0.8.0 ile birlikte çıkarılan `int`, `float` ve `bool` yerel değişkenleri sabit native depolama kullanıyor. `$i = 100` yazdıysanız o değişken kalıcı olarak tamsayı; aynı değişkeni `foreach` anahtarı olarak yeniden kullanmanız reddediliyor.

Deponun kendi uyarısı da nazik değil: bir özelliğin README'de geçmemesi desteklendiği anlamına gelmiyor, [uyumsuzluk listesine](https://github.com/swoole/typephp/blob/master/docs/en/INCOMPATIBLE_PHP_FEATURES.md) bakmanız isteniyor. Dürüst bir tavır. Ama pratikte şu demek: mevcut bir PHP projesini alıp derlemeye çalışmak bir "deneme" değil, yeniden yazma projesi.

## Hız rakamları kimin ölçümü?

Depodaki tabloda php-src ile gelen resmi dil benchmark'ları var: `bench.php` için 5,034 saniyeden 0,603 saniyeye (yaklaşık 8 kat), `micro_bench.php` için 13,045 saniyeden 2,021 saniyeye (yaklaşık 6,5 kat), `-O3` ile derlenmiş hâlde. Konteyner tarafında ise 10000×100000 elemanlık bir güncelleme döngüsünde PHP dizisi 67,6 saniye, TypePHP'nin `std::array`'i 6,4 saniye, elle yazılmış C++ `std::vector` 6,2 saniye.

Rakamlar etkileyici. Ama ölçen, projenin kendisi. README'de de şu not duruyor: bu sayılar bir ölçüm anlık görüntüsüdür, performans garantisi değildir; PHP sürümü, derleyici, CPU ve bayraklar sonucu değiştirir, karar vermeden önce aynı makinede karşılaştırın. Bir projenin bunu kendi vitrinine yazması sık görülen bir şey değil, hakkını verelim.

## Lisans, sürüm ve bakım durumu

29 Eylül 2026 itibarıyla depo 1.417 yıldız, 79 çatal ve 0 açık konu gösteriyor. Depo 11 Mayıs 2026'da açılmış, son commit aynı gün, yani 29 Eylül 2026. Packagist'teki son sürüm **v0.9.3** ve yayın tarihi 24 Eylül 2026; kaynaktaki sürüm sabiti de 0.9.3 diyor. Kurulum sayısı 19.091. Kısacası proje dört buçuk aylık ve hâlâ 0.x'te.

Lisans **GPL-3.0-only**. Bu, radar yazılarında genelde tek satırla geçilen ama burada geçilmemesi gereken bir ayrıntı: karşılaştırdığımız alternatiflerin hepsi MIT veya Apache-2.0. Projenin kendi tanıtım sayfası ücretsiz, açık kaynak (GPL) ve serbestçe ticari kullanılabilir diyor. Kapalı kaynak bir ürün dağıtacaksanız bu cümleyle yetinmeyin, lisans metnini okuyun.

Emeğin sahibi: proje Swoole ekibinden geliyor. `composer.json`'daki telif sahibi 上海识沃网络科技有限公司 (Swoole), Packagist'teki paket bakımcısı ise [Tianfeng Han (matyhtf)](https://github.com/matyhtf). Aynı ekibin [swoole-src](https://github.com/swoole/swoole-src) deposu 18.923 yıldızla ve Apache-2.0 lisansıyla ayrıca duruyor; yani bu, dün kurulmuş bir ekibin ilk denemesi değil.

## Alternatiflerle nerede ayrışıyor?

"PHP'yi binary yapmak" cümlesi piyasada en az dört farklı şeyi anlatıyor ve karıştırıldığı için yanlış araç seçiliyor. Yıldız sayıları 29 Eylül 2026 itibarıyla.

<figure class="wp-block-table"><table><thead><tr><th>Araç</th><th>Gerçekte ne yapıyor</th><th>Lisans</th><th>Yıldız</th><th>Şu iş için</th></tr></thead><tbody><tr><td>TypePHP</td><td>PHP'yi C++ üzerinden makine koduna derler</td><td>GPL-3.0-only</td><td>1.417</td><td>CPU'ya yüklenen hesap döngüleri</td></tr><tr><td>FrankenPHP</td><td>Yorumlayıcıyı ve uygulamayı tek binary'ye gömer, derlemez</td><td>MIT</td><td>11.371</td><td>Dağıtımı tek dosyaya indirmek</td></tr><tr><td>static-php-cli</td><td>Taşınabilir statik PHP ikilisi üretir; kodunuz yine yorumlanır</td><td>MIT</td><td>1.947</td><td>Bağımlılıksız CLI aracı dağıtmak</td></tr><tr><td>Zephir</td><td>PHP benzeri ayrı bir dilden C eklentisi üretir</td><td>MIT</td><td>3.385</td><td>Sıfırdan yazılacak eklenti</td></tr><tr><td>Swoole</td><td>Coroutine tabanlı eşzamanlılık kütüphanesi; derleme yok</td><td>Apache-2.0</td><td>18.923</td><td>G/Ç ile boğulan servisler</td></tr></tbody></table>

</figure>Ayrım şu: FrankenPHP ve static-php-cli *dağıtımı* kolaylaştırır, Swoole *bekleme süresini* kısaltır, TypePHP ise *hesabı* hızlandırır. Derdiniz "tek dosya olsun" ise TypePHP'ye ihtiyacınız yok; "bu döngü CPU'yu yiyor" ise diğerleri size bir şey vermez.

## Benim tarafımda nereye oturur?

Gündelik işimin ağırlığı çerçevesiz düz PHP, MariaDB, biraz Vue ve Linux tarafı. Bu yığında TypePHP'nin adresi belli: gecelik toplu işler. Katalog içe aktarımı, fiyat ve kâr marjı yeniden hesaplama, rapor üretimi gibi, tek bir CLI betiğinin milyonlarca satırın üstünden geçtiği yerler. Şekilleri zaten TypePHP'nin istediği kalıba yakın: her şey fonksiyonlarda, tipler belli, dinamik numara yok.

```php
<?php

function kdvEkle(float $net, float $oran): float
{
    return $net * (1.0 + $oran / 100.0);
}

function toplam(array $netler, float $oran): float
{
    $sonuc = 0.0;
    foreach ($netler as $net) {
        $sonuc += kdvEkle((float) $net, $oran);
    }

    return $sonuc;
}

function main(): void
{
    $netler = [1299.0, 89.9, 4550.0];
    printf("%.2f\n", toplam($netler, 20.0));
}
```

Bu parça düz PHP olarak geçerli (`php -l` ile doğruladım) ve dokümandaki kurallara göre biçimlendirildi: global kapsamda tek satır çalıştırılabilir kod yok, tipler açık, giriş noktası `main()`. Derleyip ölçmediğim için "şu kadar hızlandı" demiyorum.

Bir de dürüst olalım: bu betiklerde darboğaz çoğu zaman PHP değil. [N+1 sorgu problemi](https://halityesil.com/php/mysql/mysqlde-kral-katili-n1-sorgu-problemini-cozmek/) veya [yanlış sıralanmış WHERE koşulları](https://halityesil.com/php/mysql/mysql-where-kosullari-sirasi-1-milyon-satirda-100-kat-performans-farki/) duruyorken derleyici almak, tıkalı lavaboya daha güçlü musluk takmaktır.

Son bir not, codebase'ini ajanlara teslim edenler için: bu uyumsuzluk listesi bir stil tercihi değil, derleyicinin sözleşmesi. Ajan gayet emin bir tonla `$$field` kullanan kod üretir, o kod PHP olarak çalışır ve `tpc` tarafından reddedilir. Kuralı proje kural dosyasına yazmadan başlamayın.

## Ne zaman işe yarar, ne zaman yaramaz?

**Yarar:** hesap ağırlıklı toplu işler; yeni yazılacak bir CLI aracı; PHP'den çağrılacak sıcak bir yolu eklenti hâline getirmek; PHP 8.4/8.5 ve tam bir derleyici zincirinin bulunduğu kendi sunucunuz.

**Yaramaz:** mevcut bir WordPress, Laravel veya eski bir kurumsal uygulamayı olduğu gibi derlemek; paylaşımlı hostingte çalışan projeler; darboğazı veritabanı veya ağ olan işler; GPL'in sizi rahatsız ettiği kapalı kaynak ürünler; 0.x sürüm numarasını kabul edemeyeceğiniz kritik sistemler.

Bu haftaki seri bölümünde [lokal modellerin faturayı kaldırmadığını, sadece kalemlerini değiştirdiğini](https://halityesil.com/yapay-zeka-ai/vibe-coding/vibe-coderin-el-kitabi/vibe-coder-3-3-lokal-llm/) yazmıştım. TypePHP de aynı ailedendir: kalıba döktüğünüz parça hızlanır, karşılığında PHP'yi PHP yapan esnekliği kalıbın içinde bırakırsınız. Kayıp değil, takas. Yeter ki neyi verdiğinizi bilerek verin.

Ölçmeden karar vermeyin, sürümü sabitleyin, lisansı okuyun. Teknolojiyle kalın.
