Fahami prinsip pembangunan asas PHP7: proses penukaran daripada bytecode kepada kod mesin
Dengan perkembangan pesat Internet, PHP, sebagai bahasa pembangunan yang cekap dan berskala, telah digemari oleh majoriti pembangun . Peningkatan dan kemas kini bahasa PHP sentiasa menjadi tumpuan pembangun Sebagai versi terkini, PHP7 bukan sahaja mempunyai peningkatan yang ketara dalam prestasi, tetapi juga memperkenalkan perubahan dalam prinsip pembangunan yang mendasari. Artikel ini akan bermula dengan proses penukaran daripada bytecode kepada kod mesin untuk mendapatkan pemahaman yang mendalam tentang prinsip pembangunan asas PHP7.
Dalam versi sebelum PHP7, PHP ialah bahasa yang ditafsirkan dan kod itu akan ditafsirkan secara langsung dan dilaksanakan oleh penghurai. Dalam PHP7, enjin serba baharu diperkenalkan, iaitu Zend Engine 3.0, yang menyusun kod PHP menjadi kod bait, dan kemudian menukar kod bait kepada kod mesin melalui teknologi kompilasi JIT (Just-In-Time) untuk mencapai pelaksanaan yang lebih cekap. Proses penukaran ini akan diterangkan secara terperinci di bawah.
Mula-mula, mari kita lihat cara menyusun kod PHP ke dalam kod bait. Kod PHP mula-mula akan dibahagikan kepada unit melalui penganalisis leksikal, seperti pengecam, kata kunci, pengendali, dll. Kemudian hubungan dan struktur antara unit ini dianalisis melalui penganalisis sintaks, dan Pokok Sintaks Abstrak (AST) dijana. AST ialah struktur data seperti pokok yang mencerminkan struktur kod PHP Ia terdiri daripada satu siri nod, setiap nod mewakili unit struktur sintaks.
Setelah AST dijana, langkah seterusnya ialah proses menukar AST kepada bytecode. Bytecode ialah bentuk perantaraan kod Tidak seperti kod mesin, ia bukan kod binari yang terdiri daripada 0s dan 1s, tetapi format bersiri tertentu yang boleh dihuraikan dan dilaksanakan dengan mudah oleh enjin Zend. Bytecode ialah pembawa sebenar yang dibaca dan dilaksanakan oleh enjin Zend.
Contoh kod adalah seperti berikut:
<?php function sum($a, $b) { return $a + $b; } $result = sum(3, 4); echo "结果:{$result} "; ?>
Dalam kod di atas, kami mentakrifkan fungsi mudah sum
untuk mengira jumlah dua nombor, dan memanggil fungsi ini untuk mengira jumlah 3 dan 4 . Berikut ialah proses menukar kod ini kepada kod bait: sum
来计算两个数字的和,并调用该函数来计算3和4的和。下面是将这段代码转换成字节码的过程:
具体的字节码如下所示:
number 3 number 4 add return
上面的字节码由一系列的指令构成,每个指令都是一个操作码(opcode)和一个或多个操作数(operand)。例如,number 3
表示将3压入运行时栈中,add
表示从栈中弹出两个数相加,并将结果压回栈中。return
rrreee
Kod bait di atas terdiri daripada satu siri arahan, setiap arahan ialah kod operasi (opcode) dan satu atau lebih operan (operand ). Sebagai contoh,nombor 3
bermaksud menolak 3 ke dalam timbunan masa jalan dan menambah
bermaksud mengeluarkan dua nombor daripada timbunan, menambahnya dan menolak hasilnya ke dalam tindanan. return
bermaksud mengembalikan hasil di bahagian atas tindanan. Seterusnya, kami akan meneroka cara bytecode ditukar kepada kod mesin oleh pengkompil JIT. Pengkompil JIT ialah pengkompil khas yang menukar kod bait secara dinamik kepada kod mesin semasa masa jalan. Dalam PHP7, enjin Zend melaksanakan kompilasi JIT dengan memanggil perpustakaan LLVM (Mesin Maya Tahap Rendah). Pustaka LLVM ialah infrastruktur pengkompil sumber terbuka yang menyediakan rangka kerja kompilasi modular yang fleksibel yang boleh menukar kod bait kepada kod mesin. Ia menggunakan borang perwakilan perantaraan (IR) untuk menterjemah kod bait daripada bahasa sumber ke dalam perwakilan perantaraan ini, dan kemudian menukarnya lagi kepada kod mesin. Semasa proses penyusunan JIT, LLVM akan mula-mula menukar kod bait kepada IR, dan kemudian melakukan satu siri pengoptimuman, seperti perambatan berterusan, pengembangan gelung, dll., untuk akhirnya menjana kod mesin yang cekap. Dengan cara ini, kecekapan pelaksanaan program PHP telah bertambah baik. Atas ialah kandungan terperinci Fahami prinsip pembangunan asas PHP7: proses penukaran daripada bytecode kepada kod mesin. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!