TypePHP: Compiler AOT untuk Mengubah PHP Menjadi Binary Native

TypePHP adalah compiler Ahead-Of-Time atau AOT dari Swoole yang menerjemahkan source code PHP menjadi C++, lalu mengompilasinya menjadi machine code native. Pendekatan ini membuat aplikasi dapat dikirim sebagai executable, PHP extension, atau shared library tanpa mengeksekusi user function sebagai opcode Zend setelah proses compile.

Proyek ini tetap menggunakan sintaks PHP yang familiar, tetapi menyediakan informasi tipe saat compile agar jalur kode tertentu dapat dioptimalkan. TypePHP masih aktif dikembangkan dan mendukung subset PHP yang terdefinisi, sehingga bukan berarti semua aplikasi PHP dinamis dapat langsung dipindahkan tanpa perubahan.

Ringkasnya: TypePHP bukan sekadar OPcache atau JIT. Source PHP diturunkan ke C++17 dan dikompilasi menjadi output native, dengan runtime PHPX/Zend tetap digunakan untuk interoperabilitas yang didukung.

Bagaimana TypePHP bekerja?

Alur TypePHP dimulai dari source PHP, deklarasi stub opsional, serta source C/C++ bila diperlukan. Compiler mem-parsing dan memvalidasi deklarasi, menurunkan function body serta konstanta ke C++17, lalu memakai compiler native dan cache object atau precompiled header sebelum menghasilkan output.

Output yang tersedia meliputi executable native, PHP extension, shared library, dan target WASI component. Mode yang dipilih bergantung pada cara aplikasi akan didistribusikan.

Keunggulan dibanding runtime PHP biasa

  • Binary dapat berjalan tanpa proses interpreter PHP CLI terpisah pada mode executable.
  • Jalur numerik dan container bertipe dapat diturunkan menjadi operasi native.
  • Source code tidak dikirim sebagai file PHP yang mudah dibaca.
  • Startup dan warm-up JIT dapat dikurangi karena binary sudah dikompilasi.
  • Kode PHP dan C++ dapat diintegrasikan untuk kernel yang membutuhkan performa.

Perlindungan source bukan pengganti keamanan aplikasi. Binary masih perlu didistribusikan dengan aman, dependency harus dipindai, dan secret tidak boleh ditanam ke dalam source atau artefak build.

Kebutuhan environment

README resmi mencantumkan PHP CLI 8.4–8.5, development headers, php-config, PHP embed library untuk binary atau shared-library build di Unix, GCC 9 atau Clang dengan C++17, CMake 3.24+, Composer 2, serta GMP dan MPFR untuk fitur numerik tertentu.

Ketersediaan target tetap bergantung pada sistem operasi, toolchain, PHP embed, dan library pihak ketiga. Linux x64 menjadi platform development dan CI utama, sementara repository juga mencantumkan target Linux ARM64, macOS ARM64, Windows x64, dan WASI.

Instalasi melalui Composer

Untuk mencoba compiler pada project, README resmi menyediakan instalasi development dependency berikut:

composer require --dev swoole/typephp
vendor/bin/tpc.php project.yml

Jika bekerja dari repository TypePHP sendiri, entry point lokalnya adalah bin/tpc.php. Pastikan versi PHP, compiler C++, CMake, dan library yang digunakan cocok dengan target build.

Contoh program PHP sederhana

Mode binary membutuhkan fungsi global main(): void. Statement executable tidak diletakkan langsung di global scope. Contoh berikut mengikuti quick start resmi:

<?php

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

Simpan sebagai hello.php, kemudian compile dan jalankan:

bin/tpc.php hello.php
./hello

Versi PHP dan informasi platform pada output bergantung pada runtime yang terhubung. Contoh ini menunjukkan perbedaan penting TypePHP: executable binary memiliki entry point yang eksplisit.

Contoh fitur code generation

TypePHP juga menyediakan attribute untuk menghasilkan method bertipe seperti getter, setter, constructor, printer, dan array conversion. Contoh berikut berasal dari pola yang dijelaskan di dokumentasi resmi:

<?php

#[Printer(fields: ['id', 'name'])]
#[Arrayable(fields: ['id', 'name'])]
final class User
{
    #[Constructor, Getter, With]
    public int $id;

    #[Constructor, Getter, Setter]
    public string $name = 'guest';
}

function main(): void
{
    $user = new User(7);
    $user->setName('Alice');

    $copy = $user->withId(8);
    echo $user->getId();
    echo $copy->getId();
    echo $user;
    echo $user->toArray()['name'];
}

Attribute seperti #[Getter], #[Setter], #[With], dan #[Constructor] membantu mengurangi boilerplate. Developer tetap perlu membaca batasan versi dan kompatibilitas karena fitur tersebut bergantung pada compiler TypePHP, bukan PHP runtime standar.

Tiga mode kompilasi

1. Binary

Mode default menghasilkan executable native dan membutuhkan fungsi main(). Cocok untuk CLI tool, service, atau aplikasi standalone.

bin/tpc.php app.php -o myapp

2. PHP Extension

Mode extension menghasilkan file extension yang dapat dimuat oleh PHP SAPI. Mode ini tidak membutuhkan main().

bin/tpc.php extension/ -m ext -o my_extension

3. Shared Library

Mode library menghasilkan shared library serta file .stub.php untuk memakai API TypePHP dari project lain.

bin/tpc.php lib/ -m lib -o mylib

Project multi-file dengan project.yml

Untuk build yang dapat diulang, konfigurasi dapat disimpan dalam project.yml. Contoh minimal dari dokumentasi:

name: myapp
mode: bin
php-version: "8.5"
optimize: 2
job: 8
build-dir: build
cxx-std: c++17

sources:
  - src

ext-deps:
  - pdo_mysql
  - curl

Path dibaca relatif terhadap file YAML. CLI argument dapat menimpa konfigurasi YAML. Library linker native diletakkan di link-libs, sedangkan dependency extension Zend menggunakan ext-deps.

Batasan kompatibilitas

TypePHP secara sengaja mendukung subset PHP yang dapat dikompilasi secara AOT. Global scope bersifat declaration-only, binary membutuhkan signature main(), dan use native_types membuat deklarasi scalar memakai storage bertipe tetap.

Pola dynamic reference, closure, reflection, declaration, dan fitur dinamis tertentu dapat belum didukung. Sebelum memindahkan framework atau aplikasi lama, baca daftar incompatible features dan lakukan proof of concept kecil.

Jangan langsung mengganti production: Uji dependency, extension, queue, filesystem, database driver, logging, debugging, deployment, rollback, dan monitoring pada environment staging.

Apakah TypePHP cocok untuk Laravel?

TypePHP menarik untuk aplikasi PHP yang memiliki jalur komputasi intensif, CLI tool, atau kebutuhan distribusi binary. Namun framework yang sangat dinamis dan dependency yang mengandalkan reflection atau runtime behavior perlu diuji satu per satu.

Pendekatan realistis adalah memulai dari komponen terisolasi, bukan langsung mengompilasi seluruh aplikasi. Bandingkan waktu build, ukuran artefak, performa, penggunaan memori, kemampuan debugging, dan kompleksitas deployment dengan OPcache atau PHP JIT.

Lisensi dan keamanan distribusi

Repository resmi TypePHP menggunakan lisensi GPL-3.0. Tim bisnis perlu meninjau kewajiban lisensi sebelum mendistribusikan hasil build bersama software proprietary. Selain itu, artefak binary harus memiliki provenance, checksum, pipeline build, dan akses registry yang terlindungi.

Kesimpulan

TypePHP membawa pendekatan baru untuk ekosistem PHP: source code PHP dikompilasi secara AOT menjadi machine code native, dengan mode binary, extension, dan library. Potensinya menarik untuk performa, startup, dan distribusi source, tetapi kompatibilitasnya masih perlu dibuktikan melalui pengujian nyata.

Developer sebaiknya memulai dari project kecil, mengikuti dokumentasi resmi, memeriksa lisensi GPL-3.0, dan tidak menganggap TypePHP sebagai drop-in replacement untuk seluruh aplikasi PHP dinamis.

Sumber referensi:

Laravel News — Compile PHP to Native Binaries with TypePHP

Repository resmi Swoole TypePHP

Transparansi: Artikel ini disusun bersama Codekop AI berdasarkan dokumentasi TypePHP dan sumber yang tercantum, kemudian ditinjau dan disunting oleh Fauzan Falah. AI dapat keliru, jadi silakan cek kembali dokumentasi dan lisensi resmi sebelum digunakan.
Komentar