Esploranta PHP kaj Zend Motoro Internals

Superrigardo: Versio 1.0 De la Zend Motoro estas tre grava parto kiel la koro kaj cerbo de PHP 4.0. Ĝi havas la procezon kiu provizas la sub-strukturo kaj servoj al la praktikaj kapsuloj. Ĝi ankaŭ efektivigas la lingvan sintakson ankaŭ. La Zend Motoro 1.0 Estas efektive la dua revizio de la PHP scripting motoro. Ĝi estas ankoraŭ bazita sur la samaj reguloj kiel la PHP 3.0 Motoro kiu estis resume Zend Motoro 0.5. Nun ĝi estas permesebla migri la vojon de PHP 3.0 Al 4.0. La evoluado havas la saman ‘staton de menso' kiel por PHP 3.0. Ni sentas ĝin estas ĝusta tempo komenci laboranta al revizio de la Zend Motoro. Ĝi ankaŭ inkluzivus novajn strukturojn kaj solvojn al kelkaj de la plej malfacilaj problemoj alfrontita de la PHP designer aŭ ellaborantoj.

En ĉi tiu artikolo mi diskutos pri la Zend Motoro internals bazita sur PHPa platformo.

Enkonduko: Zend Motoro estas malferma fonto scripting motoro kiu agas kiel interpretisto por la PHPa programara lingvo. Tio ĉi estis komence evoluigita de du studentoj ĉe la Technion – Israela Instituto de Teknologio. Zend motoro estas virtuala maŝino aŭ VM. Kiel ni scias ke Virtuala maŝino estas nenio sed softvaro kiu ŝajnigas fizikan komputilon. La Zend motoro konsistas de multoblaj eroj ekz. compiler, ZFMI (ZFino FUnction MOdule INterface) Kaj virtuala CPU aŭ executor.

Kiom Zend Motoraj Laboroj:

Zend motoro konsistas de tri gravaj eroj –

  • Vortfarada analyzer aŭ lexer
  • Parser
  • Executor

Ni scias ke Zend estas scripting motoro kaj ĝi laboras kiel interpretisto. Tiel lasita nin kontroli malsamajn fazojn de skribo kiu estas submetita al Zend motoro. La skribaj transludoj tra la sekvantaj paŝoj kaj fine akiras efektivigita de Zend motoro –

  • Paŝo 1Vortfarada Analizo – En ĉi tiu paŝo la skribo estas pasita tra vortfarada analyzer ankaŭ sciita kiel lexer. Ĉi tie la skribo kiu estas homa legebla estas migrita al tokens kiu estas komprenita kaj akceptita de la maŝino. Unufoje la tuta skribo estas tokenized, La tokens estas pasita al la parser.
  • Paŝo 2Analizanta – En ĉi tiu paŝo, La parser analizas la tokens kiu ĝi ricevas de la lexer kaj produktas instruan aron kiu kuras sur la Zend motoro. La Zend motoro estas nenio sed virtuala maŝino (VM) Kun instrua aro kiu estas simila al asemblea lingvo kaj efektivigas ĝin. Parser produktas la abstraktan sintaksan arbon kiu povas esti optimumigita antaŭ ol pasanta al la koda generatoro. Ĉi tiu tuta mekanismo estas komune vokita Kompilo. La produktado de la kompilo estas meza kodo kiu estas maŝino sendependa kodo por Zend virtuala maŝino. Ĉi tiu meza kodo enhavas aron de instruo fiksita por la Zend Virtuala maŝino ankaŭ sciita kiel Operaciaj kodoj Aŭ en mallonga Opcodes. Ĉi tiuj opcodes estas tri adresaj kodoj – Du operands por la enigo kaj unu por la produktado. Krom ĉi tiuj la opcodes ankaŭ enhavas prizorganton kiu pretigas la operands. Ĉi tiuj opcodes enhavas instruojn elfari ĉiuj specoj de operacioj varianta de baza operacio sur la du enigoj kaj entenanta la produktadon al la tria operand al kompleksa scenaro kiu postulas efektiviganta fluan kontrolon.
  • Paŝo 3Ekzekuto – Unufoje la meza kodo estas produktita, Ĝi estas pasita al la executor kiu legas ĉiun de la instruoj de la aro kaj efektivigas ilin.

La kompilo kaj ekzekutaj fazoj estas efektivigita de du apartaj funkcioj ene de la Zend motoro. Ĉi tiuj estas Zend_kompilas Kaj Zend_efektivigas.
Retservila Interrilatado okupanta Zend motoro:
La interna arkitekturo de la Zend motoro estas montrita sub en la skemo –

Zend engine Architecture

Zend motora Arkitekturo

Bildo 1: Zend motora Arkitekturo

Internaj eroj de Zend Motoro: Nun lasita nin kontroli la internajn erojn de Sendi Motoron unu de unu.

ZMFI aŭ Zend Funkcia Kapsulo Fasado:
Ĉi tiuj fasadaj agoj kiel komunikada kanalo inter la funkciaj kapsuloj. Funkciaj kapsuloj estas nenio sed PHPaj etendaĵoj kiu havas iun kapsulon skribita kaj inkluzivita ene de ili.

Opcode Konservejo: Opcode konservejo estas kolektiva konservejo kiu loĝas ene de la Zend motoro kaj konservejoj la opcode de dosiero. Se la dosiero estas petita denove ĝin nur akiras efektivigita de la konservejo se estas neniu ŝanĝo en la dosiero.
Kelkaj Ekzemploj: Lasi nin preni ekzemplon kontroli malsamajn fazojn de PHPa kodo kiam ĝi iras tra Zend Motoro.
Unue, Ni diskutos simplan ekzemplon kiel montrita sub.

Enlistiganta 1: Ekzempla PHP dosiero

[Kodo]

<?Php

$Nomo = ‘Ricardo';

Eĥa $nomo;

?>

[/Kodo]

La supra PHPa kodo kiam submetita al Zend motoro, Estas transformita en la sekvanta opcode –

Showing generated opcode

Montranta produktita opcode

Image2: Montranta produktita opcode

La executor de la Zend motoro legas ĉi tiuj opcodes unu samtempe kaj efektivigas ĝin kiel por la instruo menciita en la opcode. La supra kodo estas efektivigita en la sekvanta maniero –

  • Opnum 0 Aŭ Opcode 0 – En ĉi tiu paŝo, La sugesto al la varia – ‘nomo’ Estas asignita la Registron 0. Poste ni uzas ‘ZENDa_FETCH_W’ (Kie w starejoj por skribi) Kaj asigni ĝin al la varia.
  • Opnum 1 Aŭ Opcode 1 – En ĉi tiu paŝo, La ZEND_ASIGNAS prizorganton asignas la valoron – ‘Ricardo’ Registri 0 Kiu estas sugesto al la varia – ‘nomo’. Registro 1 Estas ankaŭ asignita sed neniam uzita. Ĝi povis esti utiligita se ni havis esprimon ŝatas –

[Kodo]

Se ($Nomi == ‘Ricardo') { }

[/Kodo]

  • Opnum 2 Aŭ Opcode 2 – En ĉi tiu paŝo, Ni re-venigi la valoron de $nomo en Registro 2. Ni uzas la opcode ZENDa_FETCH_R Kiel la varia estas uzita en legita nuran kuntekston.
  • Opnum 3 Aŭ Opcode 3 – En ĉi tiu paŝo, La instruo ‘ZENDa_EĤO’ Presas la valoron de Registro 2 De sendanta la valoron al la produktado bufranta sistemon.
  • Opnum 4 0R Opcode 4 – En ĉi tiu paŝo, La instruo ‘ZENDa_REVENO’ Estas vokita kiun fiksas la revenan valoron de la skribo al 1. Kiel ni scias eĉ se ni ne vokas la eksplicitan revenon kiu estas vera por ĉi tiu kazo ankaŭ, Ĉiu skribo enhavas implican revenon 1.

Nun ni havos rigardon en iomete komplikita ekzemplon kiel montrita sub

Enlistiganta 2: Ekzempla PHP dosiero kun konvertiĝo al supra kazo

[Kodo]

<?Php $nomo = ‘Ricardo'; Eĥi strtoupper($Nomo); ?>

[/Kodo]

Kiel ni vidas ĉi tie ĉi tiun skribon initializes varia kaj tiam presas la saman post kiam transformanta la tekston en supra kazo. La meza koda rubejo por la supra PHPa skribo estas tre simila al la pli frua unu –

Showing generated opcode

Montranta produktita opcode

Image3: Montranta produktita opcode

La opcodes en la supra du ekzemploj estas tre similaj krom la sekvantaro –

  • Opnum 3 Aŭ Opcode 3 – En ĉi tiu paŝo, La instruo ‘ZENDa_SEND_VAR’ Puŝas sugeston Registri 2 Kiu havas la varian – $Nomo En la staplo de argumentoj. Ĉi tiu argumenta staplo estas desegnita esti vokita de la funkcioj en la ordo presas la valoron de Registro 2 De sendanta la valoron al la produktado bufranta sistemon.

· Opnum 4 0R Opcode 4 – En ĉi tiu paŝo, La instruo ‘ZEND_FARI_FCALL’ Estas vokita kiun interne vokas la ‘strtoupper’ Funkcio kaj ankaŭ mencias ke la produktado devus esti sendi Registri 3. Sekvanta skemon montras la laboran fluan direkton dum PHPa skribo estas transludoj tra la Zend motoro.

Showing work flow in Zend engine

Montranta laboran fluon en Zend motoro

Bildo 4: Montranta laboran fluon en Zend motoro

Resuma:

Lasi nin resumi nian diskuton en la formo sekvi kuglojn –

  • Zend motoraj agoj kiel la koro kaj cerbo de PHP 4.0
  • Zend motoro estas virtuala maŝino kiu estis evoluigita de du studentoj ĉe Technion – Israela Instituto de Teknologio.
  • Zend motoro konsistas de tri gravaj eroj –
    • Vortfarada analyzer aŭ la Lexer – Priresponda al tokenize la skribo
    • Parser – Analizas la tokens kaj produktas la opcodes aŭ opnums
    • Executor – Efektivigas la Opcodes.
  • La Zend Motoro enhavas la sekvantajn internajn erojn –
    • ZFMI aŭ Zend Funkcia Kapsulo Fasado – La komunikada kanalo inter malsamaj kapsuloj
    • Opcode Konservejo – Konservejoj la opcodes por ke ili povas esti reused se postulita.

?

Etikedita sur: ,
============================================= ============================================== Buy best TechAlpine Books on Amazon
============================================== ---------------------------------------------------------------- electrician ct chestnutelectric
error

Enjoy this blog? Please spread the word :)

Follow by Email
LinkedIn
LinkedIn
Share