Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Fahami prinsip pembangunan asas PHP7: proses penukaran daripada bytecode kepada kod mesin

Fahami prinsip pembangunan asas PHP7: proses penukaran daripada bytecode kepada kod mesin

王林
王林asal
2023-09-08 16:13:52773semak imbas

Fahami prinsip pembangunan asas PHP7: proses penukaran daripada bytecode kepada kod mesin

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的和。下面是将这段代码转换成字节码的过程:

  1. 解析器将源代码转化为一个由一系列抽象语法树节点组成的抽象语法树。
  2. 编译器根据抽象语法树生成相应的opcode,然后生成字节码。

具体的字节码如下所示:

number 3
number 4
add
return

上面的字节码由一系列的指令构成,每个指令都是一个操作码(opcode)和一个或多个操作数(operand)。例如,number 3 表示将3压入运行时栈中,add 表示从栈中弹出两个数相加,并将结果压回栈中。return

    Penghurai menukar kod sumber kepada pokok sintaks abstrak yang terdiri daripada satu siri nod pokok sintaks abstrak.

    Pengkompil menjana opcode yang sepadan berdasarkan pepohon sintaks abstrak, dan kemudian menjana bytecode.

Kod bait khusus adalah seperti berikut:

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.
  • Untuk meringkaskan, PHP7 mencapai pelaksanaan yang lebih cekap dengan menyusun kod PHP menjadi kod bait, dan kemudian menukar kod bait kepada kod mesin melalui pengkompil JIT. Dalam proses ini, penganalisis leksikal, penganalisis sintaks dan penyusun memainkan peranan penting dalam menukar kod sumber kepada kod bait. Pengkompil JIT menukar kod bait kepada kod mesin dengan memanggil perpustakaan LLVM.
  • Memahami prinsip pembangunan asas PHP7 adalah sangat penting. Ia boleh membantu kami mengoptimumkan kod dengan lebih baik dan meningkatkan prestasi program. Dengan perkembangan teknologi yang berterusan, pemahaman dan penguasaan prinsip asas akan menjadi kemahiran yang amat diperlukan untuk pembangun.
Rujukan: 🎜🎜🎜PHP Internals Book (n.d. Dipetik daripada https://www.phpinternalsbook.com/🎜🎜PHP dan JIT - Nikita Popov (2015, Jun). github.io/2015/06/19/PHP-7-0-JIT-FAQ.html🎜🎜

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn