Snímek 1 - Phalanger - the PHP Language Compiler for .NET

Transkript

Snímek 1 - Phalanger - the PHP Language Compiler for .NET
Tomáš M ato u šek
Lad islav P ro šek
Jan Benda
M artin M alý
P avel N o vák
V áclav N o vák
T o m áš M ato u šek , 2 3.5.2006
www.php-compiler.net
Č asto klad en é o tázky
• C o je lep ší, P H P n eb o .N E T ?
• ch yb n ě položen á otázka
 PHP je jazyk
 .N E T je p latfo rm a p ro lib ovo ln ý jazyk
• C o je lep ší, P H P n eb o C #?
• opět n ekorektn í
 P H P je d yn am ický jazyk
 n em u sí se d b át n a typ y – výh od a a zároveň n evýh od a
 volán í fu n kcí p o m o cí jm én a, vyh od n oco ván í kód u za b ěh u , …
 C# je staticky typ ovan ý jazyk
 každ á p ro m ěn n á m u sí m ít d eklaro van ý svů j typ
 záleží n a ú čelu , p ro který je jazyk zvolen , p ak lze d isku tovat o vh od n osti
volby
 “It’s th e p u rp ose, w h at d efin es u s.”
 p rob lém y P H P
 n en í jasn é, co to vlastn ě P H P je (chybí sp ecifikace, m írn ě ch ao tický d esig n )
www.php-compiler.net
M ýty
• .N E T Fram ew o rk je jen p ro staticky typ ovan é jazyky
• P H P je in terp reto van ý jazyk, n elze kom p ilovat
• .N E T Fram ew o rk je p om alý
• .N E T Fram ew ork je p ou ze kom erčn í
• P h alan g er d o kazu je, že n ic z toh o n ep latí!
www.php-compiler.net
Co je a co u m í P h alan g er?
•
Kompiláto r a b ěh o vé p ro střed í jazyk a P H P n a p latfo rm ě .N E T Fram ew o rk
- od verze 2.0 i podpora implementace Mono
•
R ozšiřu je m n o žin u jazyků p latform y .N E T o P H P verze 4 a 5
- od verze 2 .0 i o n o vé p rvky jazyka P H P 6
•
U m ožň u je b ěh existu jících P H P w eb ap likací v p ro střed í A S P .N E T
- b ez n u tn o sti zm ěn v kó d u
•
Z vyšu je výkon existu jících P H P w eb ap likací
•
Z ajišťu je vyšší sp oleh livost w eb serveru h ostu jícíh o P H P ap likace
•
R ozšiřu je m o žn o sti P H P ap likací o fu n kcion alitu p latform y .N E T
- u m o žň u je p sát kon zo lo vé a W in d ow s ap likace
- od verze 2 .0 p řím ý p řístu p k lib o vo ln ým kn ih o vn ám p latfo rm y .N E T
•
Z p řístu p ň u je zko m p ilovan é P H P fu n kce a tříd y ostatn ím .N E T jazyků m
•
N ab ízí m o žn o st vyu žití tém ěř všech P H P kn ih o ven v lib ovoln ém jazyku p latform y
•
Integruje jazyk PHP do Visual Studia .NET
- od verze 2.0 i do Visual Studia 2005
www.php-compiler.net
S ro vn án í výko n u (IIS 5 .1 )
MSDE 2000 SP3
MySQL 4.1.11
14
d o ta zů za se ku n d u
12
10
8
6
4
2
0
Phalanger 1.0
PHP + Zend Optimizer
PHP
www.php-compiler.net
S ro vn án í výko n u (A p ach e 2 .0 .5 4 )
MSDE 2000 SP3
MySQL 4.1.11
14
d o ta zů za se ku n d u
12
10
8
6
4
2
0
Phalanger 1.0
PHP + Zend Optimizer
PHP
www.php-compiler.net
Z výšen í výko n u
•
p ou žití P h alan g eru význ am n ě zvýší výkon w eb ap likace
• m ěřen o n a ap likaci p h p B B 2 .0 .1 3 (d isku sn í fóru m )
 parametry benchmarku





hardware: Intel Pentium M 1,4GHz, 1GB RAM
platforma: Windows XP Professional SP2
web servery: IIS 5.1, Apache 2.0.54
db servery: MSDE 2000 SP3, MySQL 4.1.11
Phalanger 1.0 Beta 3, PHP 5.0.4, PHP 4.3.11
• n ejvýkon n ější m ěřen á P H P kon fig u race
 zdarma: Apache, MySQL, PHP 4.3.11
 $960/rok: Apache, MySQL, PHP 4.3.11, Zend Optimizer
4,93 req/s
7,28 req/s
• n ejvýkon n ější P h alan g er kon fig u race
 Apache (mod_aspdotnet), MSDE, Managed MSSQL
12,21 req/s
• závěr
 p ou žití P h alan g eru u rych lilo p h p B B o 6 7 % resp . o 1 4 8 %
•
p ro sto r p ro další zvyšován í výko n u
• vyšší výkon s každ ou n ovou verzí .N E T Fram ew orku
 vyu žití n eu stáléh o vylep šo ván í JIT teru , C LR , A S P .N E T
• d alší op tim alizace ve P h alan g eru
www.php-compiler.net
Obsah
• P řed staven í systém u P h alan g er
• M o žn o sti ap likací založen ých n a P h alan g eru
• ko n zolové a W in d ow s ap likace
• web aplikace – integrace do ASP.NET
• konfigurace
• Phalanger Class Library
• im p lem en tace P H P fu n kcí v C #
• ro zšiřiteln ost kn ih ovn y
• Z p řístu p n ěn í P H P E xten sion s .N E T ap likacím
• vyu žití existu jícíh o n ativn íh o kó d u v m an ag ed ap likaci
• Kompilace jazyka PHP
• skripty jako jednotky kompilace
• p ro m ěn n é a fu n kce
• ob jektově orien tovan é rysy jazyka
• Verze 2.0
• ro zšířen í P H P n a p ln o h o d n otn ý jazyk p latfo rm y .N E T (P H P /C LR )
www.php-compiler.net
S o u části systém u P h alan g er
•
Phalanger Core
• kom p ilátor
 lexikáln í a syn taktická an alýza
 vyu žito nástro jů C sLex a G P P G (generáto ry lexeru a p arseru p ro C #)
 g en erátor IL kód u
 Reflection.Emit
 kó d je g en ero ván d o sou b o rů n eb o jen d o p am ěti
• p rostřed í p ro b ěh P H P ap likací
 m etod y volan é zkom p ilo van ým kód em
 integrace s ASP.NET serverem
•
Phalanger Class Library
• P H P fu n kce a tříd y im p lem en tovan é v C #
• p řes 5 0 0 PHP fu n kcí
 op erace s p oli, řetězci, reg u lárn ím i výrazy, fu n kce p ro p ráci s d atab ází M S S Q L, …
•
Extension Manager
• m od u l u m ožň u jící volat P H P fu n kce im p lem en tovan é v P H P exten sion s
•
Integrace do VS.NET 2003 a 2005
• n ový typ p rojektu , zvýrazň ován í, kon trola syn taxe, …
www.php-compiler.net
M o žn o sti pou žití
• Web aplikace v PHP
• ko n fig u race pom ocí so u b o rů W eb .con fig
• p o d p ora p ro rů zn é styly vývo je ap likace
 stan d ard n í vývoj P H P ap likací
 ap likace = m n o žin a skrip tů ve virtu áln ím ad resáři n a w eb serveru
 „p lo ch ý“ m od el (lin ear m od el)
 edit-save-refresh
 skrip ty se kom p ilu jí au tom aticky, p rog ram átor se kom p ilací n em u sí zab ývat
 ASP.NET web aplikace (Phalanger 2.0)
 ap likace je stru ktu rovan á, tvořen á z ko m p on en t, d esig n ery
 část P H P kód u g en erován a n a základ ě X M L sou b o rů
 exp licitn í kom p ilace a d ep loym en t
• K on zo lo vé a W in d o w s ap likace v P H P
• výsled ek kom p ilace je .exe sou b o r (assem b ly)
• ko n fig u race pom ocí .exe.con fig sou b o rů
www.php-compiler.net
Web aplikace – p lo ch ý m o d el
•
skrip ty v d an ém virtu áln ím ad resáři n astaven ém jako w eb ap likace
•
ko n fig u race virtu áln íh o ad resáře v IIS
• stejn á jako p ro jin é A S P .N E T ap likace
• p říp on a .p h p m ap ován a n a IS A P I m od u l A S P .N E T v1 .1
 c:\windows\microsoft.net\framework\v1.1.4322\aspnet_isapi.dll
• d otaz od klien ta je z IIS p řep oslán A S P .N E T w orker p rocessu
•
konfigurace ASP.NET
• n astaven a p ři in stalaci P h alan g eru v M ach in e.con fig
• p řid án a p o ložka d o sezn am u H T T P h an d lerů
• zajišťu je p řed án í d otazu tříd ě im p lem en tovan é v P h alan g er C ore
<system.web>
<httpHandlers>
<add verb="*" path="*.php" type="PHP.Core.PageFactory, PhpNetCore, Version=1.0.0.0,..."/>
<add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory" />
...
<add verb="*" path="*" type="System.Web.HttpMethodNotAllowedHandler" />
</httpHandlers>
</system.web>
www.php-compiler.net
R o zh ran í p ro sp o lu p ráci s A S P .N E T
•
ro zh ran í IHttpHandler
•
tříd a im p lem en tu jící toto ro zh ran í zp racovává d o tazy a g en eru je strán ky
•
vyvo lán a p ři p řijetí d otazu p oslan éh o d o w o rker p ro cessu z IS A P I m o d u lu
•
vyko n áván a jed n ím vlákn em , které d ostalo n a starosti zp raco ván í d o tazu
•
p racu je v kon textu p řip raven ém v A S P .N E T
•
zjistí, zda d otazovan ý skrip t již b yl zko m p ilo ván
• tj. zd a assem b ly je u ložen a v cach e n a d isku
• není  zavolá kom p ilátor, který tu to assem b ly vytvoří
•
n ačte assem bly d o p am ěti
•
sp u stí g lob áln í kód skrip tu
www.php-compiler.net
K o n fig u race P H P w eb ap likací
•
P H P d efin u je kon fig u raci n a n ěko lika ú ro vn ích
• soubor php.ini
• sou b ory .h taccess v ad resářích (jen A p ach e server)
• zm ěn a n astaven í b ěh em b ěh u skrip tu (fu n kcem i in i_ g et, in i_ set, ...)
 n ěkteré volb y takto n elze m od ifiko vat
•
Phalanger
•
•
•
•
•
vyu žívá h ierarch ickou kon fig u raci A S P .N E T (W eb .con fig , M ach in e.con fig )
kon fig u race u ložen á p o n ačten í z X M L v kon fig u račn ích ob jektech
m ap u je h od n oty v kon fig u račn ích ob jektech n a orig in áln í n astaven í P H P
m ožn ost zakázat zm ěn u h od n oty v sou b orech n a n ižší ú rovn i
kon fig u račn í ob jekty
• ap likačn í
 kon fig u race p latn á p ro všech n y d o tazy d o ap likace
 n elze m od ifiko vat v p od ad resářích ap likace
• g lob áln í
 ob sah u je kon fig u raci p latn ou p ro všech n y d o tazy d o d an éh o ad resáře
• lokáln í
 kon fig u race m ěn iteln á za b ěh u
 aso ciovan á s d o tazem
www.php-compiler.net
K o n fig u račn í sekce
• d efin ice sp ecifické kon fig u račn í sekce
• p ři in stalaci je p řid án zázn am d o M ach in e.co n fig
• sp ecifikován a tříd a m ající n a starost p arsován í sekce
 implementuje IConfigurationSectionHandler
<configuration>
<configSections>
<section name="phpNet" type="PHP.Core.ConfigurationSectionHandler,…"/>
</configSections>
</configuration>
www.php-compiler.net
P říklad ko n fig u račn íh o so u b o ru
<configuration>
<phpNet>
<!-- Seznam knihoven (assemblies), které jsou použity v aplikaci -->
<classLibrary>
<add assembly="PhpNetClassLibrary,…" section="bcl"/>
<add assembly="PhpNetMsSql,…" section="mssql" />
<add assembly="php_sockets.mng,…" section="sockets" />
</classLibrary>
<!–- Nastavení Session Handleru -->
<session-control>
<set name="AutoStart" value="false" phpName="session.auto_start" />
<set name="Handler" value="aspnet" />
</session-control>
A trib u t p h p N a m e slo u ží je n
p ro le p ší o rie n ta ci u živa te lů
zn a lých ko n fig u ra ce P H P
(p ři p a rso vá n í je ig n o ro vá n )
H o d n o tu to h o to n a sta ve n í již
n e p ů jd e zm ě n it v so u b o re ch
n ižší ú ro vn ě .
<!–- Nastavení Phalanger Base Class Library -->
<bcl>
<mailer>
<set name="SmtpServer" value="localhost" phpName="SMTP" allowOverride="false" />
<set name="SmtpPort" value="25" phpName="smtp_port" />
<set name="DefaultFromHeader" value="[email protected]" phpName="sendmail_from" />
</mailer>
<highlighting>
<set name="Background" value="white" phpName="highlight.bg" />
<set name="String" value="navy" phpName="highlight.string" />
</highlighting>
</bcl>
<!–- Nastavení PHP extension "sockets" -->
<sockets>
<set name="sockets.use_system_read" value="On" />
</sockets>
</phpNet>
</configuration>
www.php-compiler.net
Z p raco ván í h ierarch ické ko n fig u race
•
•
•
•
A S P .N E T zp racovává sou b ory W eb .con fig
n ach ázející se p od él cesty d otazu
kon fig u račn í h an d ler je vo lán p ro každ ý
zp racovávan ý sou b or
h an d ler vrací kon fig u račn í ob jekt
zp racovávan éh o sou b oru
výsled ek je u lo žen d o cach e
d o h an d leru je p řed án kon fig u račn í ob jekt
asociovan ý s n ad řazen ým sou b orem
<phpNet>
<set a=1>
</phpNet>
a=1
b=0
c=0
/App/Web.config
<phpNet>
<set b=2>
</phpNet>
a=1
b=2
c=0
/App/A/Web.config
<phpNet>
<set c=3>
</phpNet>
a=1
b=2
c=3
ko n fig u ra čn í o b je kty v ca ch e A S P .N E T
•
/Web.config
/App/B/Web.config
<phpNet>
<set c=4>
</phpNet>
ko n fig u ra čn í o b je kty p o d o ta ze ch
GET /App/A/file.php
www.php-compiler.net
Z p raco ván í h ierarch ické ko n fig u race
•
•
•
•
<phpNet>
<set a=1>
</phpNet>
a=1
b=0
c=0
/App/Web.config
<phpNet>
<set b=2>
</phpNet>
a=1
b=2
c=0
/App/A/Web.config
<phpNet>
<set c=3>
</phpNet>
a=1
b=2
c=3
clone
•
A S P .N E T zp racovává sou b ory W eb .con fig
n ach ázející se p od él cesty d otazu
kon fig u račn í h an d ler je vo lán p ro každ ý
zp racovávan ý sou b or
h an d ler vrací kon fig u račn í ob jekt
zp racovávan éh o sou b oru
výsled ek je u lo žen d o cach e
d o h an d leru je p řed án kon fig u račn í ob jekt
asociovan ý s n ad řazen ým sou b orem
/Web.config
/App/B/Web.config
<phpNet>
<set c=4>
</phpNet>
a=1
b=2
c=4
ko n fig u ra čn í o b je kty p o d o ta ze ch
GET /App/A/file.php
GET /App/B/file.php
www.php-compiler.net
Phalanger Class Library
• im p lem en tace fu n kcí a tříd p ou žiteln ých v P H P
acosh
addcslashes
array_chunk
array_combine
array_count_values
array_diff
array_fill
array_filter
array_flip
array_key_exists
array_keys
array_map
array_merge
array_multisort
array_pad
array_pop
array_push
array_rand
array_reduce
array_reverse
array_search
array_shift
array_slice
array_splice
array_sum
array_unique
array_unshift
array_values
arsort
asin
base64_decode
base64_encode
base_convert
basename
bin2hex
bin2hex_unicode
• v lib o voln ém jazyce p od p oru jícím typ o vý systém .N E T u a cu stom
attributes
• sada knihoven (assemblies)
• Base Class Library
 základ n í kn ih ovn a
 fu n kce p ro p ráci s p oli, řetězci, …
• native extension
 obalena tzv. managed wrapperem g en erovan ým au tom aticky (viz d ále)
 ob sah u je m an ag ed stu b y volající n ativn í kód
 n aven ek se ch ová stejn ě jako ostatn í kn ih ovn y
• managed extension
 reimplementace PHP extension v managed jazyku
 tran sp aren tn ě n ah razu je n ativn í exten sion
 rych lejší n ež p ou žití n ativn í im p lem en tace
• u živatelské kn ih ovn y
 p ři d o d ržen í jistých p ravid el lze jed n od u še p řid at vlastn í fu n kcion alitu
www.php-compiler.net
Deskriptor knihovny
•
popisuje vlastnosti knihovny
• jm én o kn ih ovn y
• sezn am P H P exten sion s im p lem en tovan ých kn ih ovn ou
•
d efin u je ch ován í kn ih ovn y
• p ři jejím n ačtěn í
 m o žn ost reg istro vat n ové session h an d lery, serializery ap od .
• p ři n ačítán í její kon fig u račn í sekce
 p arso ván í sekce
 vytvářen í vlastn ích kon fig u račn ích ob jektů
•
tříd a d eskrip toru
• jed n a tříd a m ů že b ýt d eskrip torem i p ro více kn ih oven
 n ap ř. n ative exten sion s m ají jed n u tříd u d eskrip toru
•
instance deskriptoru
• p ro každ ou n ačten ou kn ih ovn u je vytvořen a p rávě jed n a in stan ce d eskrip toru
www.php-compiler.net
Obsah knihoven
• implementace
• PHP konstant
 literáln í field y o zn ačen é atrib u tem [Im p lem en tsC on stan t]
• P H P fu n kcí
 statické m etod y ozn ačen é atrib u tem [Im p lem en tsFu n ction ]
• P H P tříd a rozh ran í
 tříd y zd ěd ěn é (n ěp řím o) od tříd y P h p O b ject
 rozh ran í ob sah u jící IP h p In terface
 označen í atrib u tem [ImplementsType]
• om ezen í klad en é n a im p lem en tace
• sig n atu ry fu n kcí m u sí obsah ovat jen typy d ostu p n é PH P
• P H P tříd y m u sí m ít n ěkteré sp ecifické vlastn osti
• a d alší …
www.php-compiler.net
A d ap tace vo lacích ko n ven cí
• jazyk P H P m á jin é kon ven ce volán í n ež .N E T
•
•
•
•
p řed áván í p aram etrů ko p ií
ko n verze typ ů
variab iln í p očet aktu áln ích p aram etrů
...
• cíl n ávrh u kn ih o ven
• odstín it co n ejvíce vlastn í fu n kcion alitu od specifických vlastn ostí
jazyka PHP
• m o žn ost p ou žívat „p o h o d ln ě“ kn ih o vn í fu n kce i z jin ých jazyků
• u m o žn it co n ejobecn ější im p lem en tace
• ko m p iláto r o b alu je volán í kn ih ovn í fu n kce v P H P kód u
• řízen o atrib u ty d efin o van ým i v C o re
 n ap ř. [P h p D eep C op y], [C astT oFalse], …
www.php-compiler.net
Extensions
• PHP
• m n o h o fu n kcí a tříd im p lem en to ván o v tzv. P H P exten sio n s
 php_gtk.dll
 php_imap.dll
 php_oci8.dll
 php_pdf.dll
 php_sockets.dll
…
• Phalanger
• m o žn ost vyu žít fu n kcio n alitu v exten sio n s z lib o vo ln é .N E T ap likace
 managed wrappers
 m ají stejn é ro zh ran í jako C lass Lib raries
 managed reimplementace knihovny php4ts.dll
 n astaviteln á ú roveň izolace
 m o žn ost h o sto vat n ativn í exten sio n s v od d ělen ém p rocesu
www.php-compiler.net
Managed wrappers
assem b lies gen erovan é au to m aticky z n ativn ích exten sio n s a typ ových
in fo rm ací ve form átu X M L
•
php_sockets.dll
...
PHP_FUNCTION(socket_write)
{
zend_parse_parameters(...);
ZEND_FETCH_RESOURCE(...);
// ...
RETURN_LONG(...);
}
...
php_sockets.xml
...
<function returnType="int" name="socket_write" >
<param type="resource" name="socket" />
<param type="string" name="buf" />
<param optional="true" type="int" name="length" />
</function>
...
php_sockets.mng.dll
.method public hidebysig static int32 socket_write(
class [PhpNetCore]PHP.Core.PhpResource socket,
string buf,
int32 length) cil managed
{
.custom instance void
PhpNetCore]PHP.Core.ImplementsFunctionAttribute ...
// ...
call object
[PhpNetCore]PHP.Core.Externals::InvokeFunction(...)
// ...
ret
}
.method public hidebysig static int32 socket_write(
class [PhpNetCore]PHP.Core.PhpResource socket,
string buf) cil managed
{
.custom instance void
PhpNetCore]PHP.Core.ImplementsFunctionAttribute ...
// ...
call object
[PhpNetCore]PHP.Core.Externals::InvokeFunction(...)
// ...
ret
}
www.php-compiler.net
php4ts.dll
základ n í sou část P H P in terp retu
• exp o rtu je ~ 800 sym bolů
•
• b ěh ová p od p ora p ro exten sion s – Zend API
•
reim p lem en tován a jako m ixed -m ode assem b ly s p ou žitím C + + /C LI
• C + + /C LI g en eru je IL i n ativn í kód
 p om o ci # p rag m a m an ag ed , # p rag m a u n m an ag ed lze p řep ín at n a ú rovn i fu n kcí
 i fu n kce p řeložen é d o IL m oh ou p raco vat s u n m an ag ed d aty
 o b d o b a klíčo véh o slo va u n safe v C #
 jen m alá režie p ři volán í u n m an ag ed z m an ag ed a n aop ak
• ad ap tačn í vrstva m ezi m an ag ed světem P h alan g eru a u n m an ag ed světem
PHP extensions
PHP extension 1
Phalanger
Core
managed API
php4ts.dll
Zend API
PHP extension 2
…
www.php-compiler.net
P o d p o ro van á fu n kcio n alita
• vo lán í fu n kcí im p lem en tovan ých v exten sion s
• ve w rap p erech rep rezen to ván y statickým i m eto d am i
• p ou žíván í tříd im p lem en tovan ých v exten sion s
• do wrapperů n agen erován y m an ag ed verze tříd
• p o d p ora „m ag ických “ m eto d (__ g et, _ _set, _ _ call, … )
• b in d in g p aram etrů
• d lo u h odobé svázán í p ro m ěn n é ve skrip tu s její n ativn í rep rezen tací
u vn itř exten sion
• n ap ř. oci_bind_by_name & oci_execute
• zp ětn á vo lán í z exten sion s d o skrip tu
www.php-compiler.net
Izolace extensions
• exten sio n s je m o žn é izolovat v od d ělen ém p rocesu
• vh o d n é zejm én a p ro w eb ap likace, kd e b y n ed ů věryh o d n ý n ativn í kó d
o h ro žoval b ezp ečn ost a stab ilitu w eb serveru
• n astavu je se p ro každ o u exten sio n zvlášť
 atribut isolated v kon fig u račn ím sou b oru
• izolo van é exten sion s h ostován y v p ro cesu E xtM an ag er
 au tom aticky sp ou štěn , p oku d n eb ěží
• komunikace mezi Phalanger Core a procesem ExtManager
vyu žívá in frastru ktu ru .N E T R em otin g
• každ é volán í fu n kce n eb o m eto d y im p lem en to van é v exten sio n
zn am en á m ezip rocesovou kom u n ikaci
• výrazn é sn ížen í výko n u
 n u tn á serizalizace p aram etrů
 režie sp ojen á s kom u n ikací, syn ch ron izací, …
www.php-compiler.net
Kompilace jazyka PHP
• podpora verze 6 se zp ětn ou kom p atib ilitou s verzemi 4 a 5
• volba v konfiguraci
• h lavn í p rob lém jazyka P H P – ch yb ějící sp ecifikace
• n ěkteré kon stru kce jazyka n ejsou zcela jed n o zn ačn ě d efin o ván y
 b ylo třeb a p rozkou m at, jak se ch ová P H P in terp ret
• kó d sp oléh ající se n a ch yb y v P H P in terp retu n en í p od p o ro ván
• n ěkteré kon stru kce jsou p oklád án y za ch yb n é a n ejsou p o vo len y
 n ap ř. vícen ásob n é p ou žití form áln íh o arg u m en tu fu n kce
function f($a, $a) { … }
• n ep o d porován y kon stru kce d o ku m en tovan é P H P jako d ep recated
 n ap ř. p ou žití m od ifikátoru & n a aktu áln í arg u m en ty
f(&$a); se chová stejn ě jako f($ a);
 kom p ilátor h lásí varován í, p oku d je tak n astaven o v kon fig u raci
www.php-compiler.net
K o m p ilace skrip tů
• standard mode
• ko m p ilace p rob íh á postu p n ě p o skrip tech
• inkluze
 statické – op tim alizace, p oku d je kom p ilátor sch op en n ajít cíl
 d yn am ické – cíl je n alezen (a zp říp ad n ě zkom p ilován ) až za b ěh u ap likace
• výsled ek kom p ilace skrip tu
 web aplikace
 jed en skrip t od p o víd á jed n é assem b ly
 m o žn ost zko m p ilo vat všech n y skrip ty d o jed n é assem b ly a d istrib u o vat
ap likaci b ez zd rojo véh o kód u
 ostatn í ap likace
 všech n y skrip ty ap likace jsou kom p ilo ván y d o jed n é assem b ly
 p řid án en try-point aplikace
• pure mode (verze 2.0)
• zakázán y in klu ze a g lo b áln í kó d , p o vo len y jen g lob áln í d eklarace
• všech n y d eklarace jsou vid ět g lo b áln ě ve všech skrip tech (jako v C #)
www.php-compiler.net
K o m p ilace kó d u skrip tu
• obsah skriptu
• deklarace funkcí, tříd n eb o ro zh ran í
• g lo b áln íkód
kód vn ě deklarací
text vn ě skrip tovacích závo rek < ? ?> , < ?p h p ?> , < % % > , …
 zkon verto ván n a volán í echo()
• výsled ek ko m p ilace
• g lo b áln í kód + d eklarace fu n kcí  statická tříd a Default (non-pure)
 PHP funkce  statické m etod y stejn éh o jm én a
 g lob áln í kód  h lavn í statická m etod a M ain ()
• P H P tříd a  .N E T tříd a
 d ěd ičn ost zach ován a, základ n í tříd a je P h p O b ject
• p o m o cn é m etod y
 Run apod.
www.php-compiler.net
Kontext skriptu
•
m n o žin a ob jektů asociovan ých s b ěžícím skrip tem
• in stan ce tříd y P H P .C ore.S crip tC on text
•
vznik kontextu
• PHP web aplikace – n a začátku zp racován í d otazu
• kon zolové a W in d ow s P H P ap likace – p ři sp u štěn í
• ostatn í ap likace (n ap san é v jin ém jazyce) – m an u áln ě
•
p řed áván í kon textu
• p aram etr každ é u živatelské P H P fu n kce
• p aram etr kon stru ktoru každ é u živatelské P H P tříd y
• ostatn í kód (n ep san ý v P H P )
 kon text skrip tu je u m ístěn v call-con textu aktu áln íh o log ickéh o vlákn a
•
obsah kontextu
• lokáln í kon fig u račn í ob jekt
• tab u lka g lo b áln ích p rom ěn n ých
• tab u lka d eklaro van ých u živatelských P H P fu n kcí, tříd a rozh ran í
• a d alší …
www.php-compiler.net
D eklarace fu n kcí, tříd , ro zh ran í
• PHP
• n eu m ožň u je zru šit an i p řep sat již d eklaro van o u en titu
• u m o žň u je p od m ín ěn o u d eklaraci
if (podmínka) { function f(…) { … } } else { function f(…) { … } }
if (podmínka) { class C { … } } else { class C { … } }
• Phalanger
• každ á z deklarací je zko m p ilo ván a zvlášť
 jm én a statických m etod jsou p ozm ěn ěn a (n ap ř. f#0, f#1)
• lo káln í tab u lka d eklaro van ých typ ů a fu n kcí (n a ko n texto vém ob jektu )
 v okam žiku d eklarace
 je p řid án d eleg át d o tab u lky d eklarovan ých fu n kcí resp .
type-ob ject d o tab u lky d eklaro van ých tříd a rozh ran í
 v okam žiku p ou žití je v tab u lce n alezen a p říslu šn á en tita
• globáln í tab u lka typ ů a fu n kcí
 n ačítan á p om ocí reflexe p ou žitých kn ih oven
 n ěkolik fází n ačítán í
 n en ačítají se n ajed n ou všech n y typ y, m etod y a fu n kce
 m n oh é n eb u d ou p o třeb a
www.php-compiler.net
P ro m ěn n é
• PHP
• d yn am icky typ ovan é
 v kód u n en í sp ecifikován typ p rom ěn n é
 p rom ěn n á m á typ p od le p osled n í op erace n a n í p roved en é
• typ y p rom ěn n ých
 bool, int, double, string, array, resource, null
 u živatelské typ y – tříd y, rozh ran í
• p ro m ěn n é m oh ou m ít alias
 m od ifikátor & (n ap ř. $ a = & $ b , fu n ction f(& $ a) {}, … )
• Phalanger
• statické typ y
 S ystem .O b ject (p rom ěn n á b ez aliasu )
 C ore.P h p R eferen ce (p rom ěn n á s aliasem )
• d yn am ické typ y
 Boolean, Int32, Double, String, Core.PhpArray, Core.PhpResource
 Core.PhpObject
 sp olečn á n ad tříd a p ro u živatelské P H P tříd y, které n ed ěd í z .N E T tříd y
www.php-compiler.net
U lo žen í p ro m ěn n ých
•
g lo b áln í p rom ěn n é
• tabulka na kontextu skriptu
•
lokáln í p rom ěn n é
• op tim alizovan á fu n kce
 p rom ěn n é zn ám é za p řeklad u
 stan d ard n í lo káln í p ro m ěn n é n a záso b n íku
 p rom ěn n é vzn ikající za b ěh u
 lo káln í tab u lka ru n -tim e p ro m ěn n ých
• n eop tim alizovan á fu n kce
 lo káln í tab u lka všech p rom ěn n ých
•
lokáln í tab u lky p rom ěn n ých
• m ap u jí jm én a n a h od n oty
• vzn ikající až kd yž je to op ravd u n ezb ytn é
•
funkci lze optimalizovat, neobsahuje-li
• d yn am ický kód (n evím e, jak se ch ová k p rom ěn n ým )
• kód p oten ciáln ě vyžad u jící tab u lku všech p rom ěn n ých
www.php-compiler.net
O b jekto vý m o d el
• PHP 5
• vícen áso b n á d ěd ičn ost rozh ran í
• jed n on áso b n á d ěd ičn ost tříd
• public, protected, private, static, abstract, final
• m o žn o st p řid ávat field y d o in stan cí za b ěh u
• „m ag ické“ m etod y
__construct
__destruct
__get
__set
__call
__sleep
__wakeup
__clone
–
–
–
–
–
–
–
–
ko n stru kto r, ale d ěd í se
destruktor
vyvo lán a p ři čten í n eexistu jícíh o field u
vyvo lán a p ři záp isu d o n eexistu jícíh o field u
vyvo lán a p ři vo lán í n eexistu jící m eto d y
vyvo lán a p řed serializací o b jektu
vyvo lán a p o d eserializaci o b jektu
ko p íro ván í o b jektu
www.php-compiler.net
O b jekto vý m o d el
• Phalanger
• p o d p oru je tém ěř celý o b jekto vý m o d el P H P 5
 _ _ d estru ct fu n g u je s jin ou sém an tikou
 n a .N E T u n en í d eterm in istická fin alizace
 ob jekty u klizen y p ři skon čen í zp raco ván í d otazu
• ko m p ilu je P H P tříd y a ro zh ran í d o .N E T tříd a ro zh ran í
 zach ovává h ierarch ii d ěd ěn í
 je m ožn é d ěd it i od .N E T tříd
 d rob n á o m ezen í
• in stan cím .N E T tříd lze v P H P také p řid ávat field y za b ěh u
 cíl: co n ejm en ší rozd íl m ezi .N E T tříd am i a P H P tříd am i
www.php-compiler.net
P ro b lém y
• n ěkteré kom b in ace atrib u tů n ejso u v .N E T p ovolen y
• abstract static, final static
• řešen í p om ocí cu stom atrib u tů [PhpAbstract], [PhpFinal]
• bázová tříd a n eb o rozh ran í n em u sí b ýt za kom p ilace zn ám á
• o d lo žen í kom p ilace n a d o b u b ěh u
class A extends B
{ /* … */ }
eval(‘class A extends B
{ /* … */ }’);
• každ ý w eb o vý d otaz m u sí m ít svoji kop ii statických field ů
• statické field y op atřen y atrib u tem [ThreadStatic]
• lín á inicializace p řed p rvn ím p řístu p em
• tříd a m ů že zvýšit vid iteln ost zd ěd ěn éh o field u z p rotected n a
public
• tříd a op atřen a cu stom atrib u tem [PhpPublicField("jm én o_ field u ")]
www.php-compiler.net
N evirtu áln í p řístu p
• p řeklad kon stru kcí A ::c, A ::$x, A ::f()
• tříd a A je zn ám á v d o b ě kom p ilace
 p řím ý p řístu p
• tříd a A n en í zn ám á v d o b ě ko m p ilace
 m ělo b y stávat sp íš jen ojed in ěle
 kom p ilátor vyem itu je volán í o p erátoru , který
 n ajd e typ A v tab u lkách (lo káln í a g lob áln í)
 najde field/metodu v tabulce pro typ A
 p om alejší
• ob jekto vé o p eráto ry d ostávají jako p aram etr typ ový kon text
• u rču je typ , v jeh ož kon textu se m á o p erace p ro vést
• u m o žň u je operátoru p ro vést ko n tro lu p řístu p u (vid iteln osti)
 vyn u cen í p ravid el p ro p rotected a p rivate člen y
www.php-compiler.net
V irtu áln í p řístu p
•
p řeklad kon stru kcí $a->x, $a->f()
• ob ecn ě n en í m ožn é u rčit typ $ a v d ob ě kom p ilace
 m o žn ost statické an alýzy, ale n e vžd y d ává výsled ek
• em itu je se volán í op erátoru , který
 z in stan ce získá referen ci n a typ
 n a typ u n ajd e field /m etod u v tab u lce za kom p ilace zn ám ých field ů /m etod
 p o ku d field n en alezen , p ak h led á v tab u lce ru n -tim e field ů
 tab u lka aso cio van á s in stan cí
• op tim alizace ko n stru kcí $ th is->x, $this->f()
 typ $ th is b ývá v d ob ě kom p ilace zn ám ý
class A
{
public $x = "foo";
public function dump()
{ echo $this->x; }
};
class B extends A
{
public function __get($a)
{ return "bar"; }
}
$a = new B;
unset($a->x);
$a->dump();
www.php-compiler.net
Namespaces
•
n u tn é kvů li p řístu p u n a .N E T kn ih ovn y
•
zatím n ejsou im p lem en to ván y v P H P
 je k d isp o zici jen n ávrh a p o ku sn á im p lem en tace (p atch )
•
Phalanger
 p o d p oru je tém ěř ú p ln ě n ávrh au to rů P H P
•
syn tax jm én a
•
•
•
deklarace
•
•
od d ělovač - šesti-tečka :::
p ř. S ystem :::W in d ow s:::Form s:::Form
namespace My:::Namespace { class T rid a { … } fu n ction Fu n kce { … } }
im p ortován í sym b olů
•
•
svázán o se sou b orem (jako v jazycích C #, Java, … )
syntax:
 import namespace System;
 import class System:::Windows:::Forms:::Form as F;
 import function My:::Namespace:::Funkce as f;
www.php-compiler.net
PHP/CLR
•
rozšířen í P H P o syn taxi p o třeb n o u
• p ro p ráci s .N E T tříd am i
• p ro u m ožn ěn í p ln é in teg race s kom p on en tovým p řístu p em A S P .N E T
•
zm ěn y
• v duchu jazyka
• jed n od u ch á syn tax, co n ejm én ě om ezen í
• co n ejvíce d yn am ičn osti (n ech cem e yet an oth er V B )
•
ro zšířen í
• g en erické typ y a m etod y
• custom attributes
• getters, setters
• p arciáln í tříd y
• vyn u cen é volán í kon stru ktoru n ad tříd y
• lib ovoln é id en tifikátory (b ez om ezen í klíčových slov)
• LINQ
www.php-compiler.net
PHP/CLR: Generika
•
d ů vod
•
•
sp ecifikace g en erických arg u m en tů p ři p ou žíván í .N E T tříd
gramatika
p řid án y n o vé token y <:, :>
• nutnost pro zachován í zp ětn é ko m p atib ility
•
 p ř. f(m < A, B > (C));
•
deklarace generických typ ů a funkcí
•
p ř:
import namespace System:::Collections:::Generic;
class MyDict<:K, V:> extends Dictionary<:K, V:> { … }
function f<:K:> { … }
•
defaultní h od n oty typ ových p aram etrů
class MyDict<:K = object, V = object:> extends Dictionary<:K, V:> {…}
•
p ou žití g en erických typ ů
•
p ř.
$t = "MyDict"; $k = "int"; $v = "List";
new MyDict();
// instanciace MyDict<:object,object:>
new MyDict<:int:>();
// instanciace MyDict<:int, object:>
new $t<:$k,$v<:int:>:>;
// instanciace MyDict<:int, List<:int:>:>
function f<:K:> { return new MyDict<:K,K:>(); }
www.php-compiler.net
PHP/CLR: Custom Attributes
• d ů vo d
• n ěkteré .N E T ap likace vyžad u jí atrib u ty
p ř.: W eb services – [W eb M eth o d ] o zn aču je m eto d u slu žb y
• výh od n é i p ro jin é ú čely
statické P H P field y m u sí m ít sém an tiku th read -static
jak v P H P /C LR ap likaci n ad eklaro vat sku tečn ý statický field ?
 atribut [AppStatic]
• syntaxe
• stejná jako v C #
class C extends System:::Web:::Services:::WebService
{
[AppStatic]
private static $x;
[WebMethod(Description = "Foo", EnableSession = false)]
public function GetFoo() { … }
}
www.php-compiler.net
PHP/CLR: Getters, Setters
• d ů vo d
• p řep sán í zd ěd ěn ých .N E T p rop erties
.N E T p roperty a field jso u z h led iska P H P to též
• syntax
import namespace System:::Windows:::Forms;
class MyForm extends Form
{
protected $DefaultSize
{
function __get() { return new Size(10, 10); }
}
}
www.php-compiler.net
PHP/CLR: Language INtegrated Query
•
zob ecn ěn í foreach cyklu
• g en erátory d at, filtry, p ro jekce, tříd iče, …
C# 3.0:
var result =
from c in customers
where c.City == "London"
from o in c.Orders
where o.OrderDate.Year == 2005
select new {c.Name, o.OrderID, o.Total}
•
d ů vo d
• b ýt „in “ 
• mů že zp řeh led n it p rog ram , zo b ecn it p řístu p k d atů m
•
syntax
PHP/CLR:
$result =
from $customers as $c
where $c->City == "London"
from $c->Orders as $o
where $o->OrderDate->Year == 2005
select array($c->Name, $o->OrderID, $o->Total)
www.php-compiler.net

Podobné dokumenty

Implementace LMS MOODLE na Windows 2003 Server a IIS 6.0

Implementace LMS MOODLE na Windows 2003 Server a IIS 6.0 stránkách http://dev.mysql.com/downloads/ zvolíme MySQL Community Server a stiskneme tlačítko Download. Z části Windows Downloads vybereme a stáhneme balíče zip archiv

Více

Předmět CASE: Enterprise Architecture

Předmět CASE: Enterprise Architecture  Strategické „směřování“, zahrnující vizi, principy, cíle a úkoly vedoucí k vývoji a charakteru cílové architektury systému  Současná a cílová architektura, reprezentující současné (a cílové) sch...

Více

CETIS 32

CETIS 32 D o to h o to n o vě vy tvo ře n é h o ad re s á ře b u d e m e u k lá d at s vé z á z n am y . P ro s n az š í o rie n tac i s e z á z n am y v ad re s á ři u k lá d ají d o tz v. o b je k tů , o ...

Více

GD1- GD10 - TECHNOPARK.CZ

GD1- GD10 - TECHNOPARK.CZ Zařízení GD1 a GD10 se může skládat z příslušenství, které je znázorněno na Obrázku 2, ihned zkontrolujte, jestli obsah Vašeho balení odpovídá tomuto obrázku a dále zkontrolujte, jestli jsou jednot...

Více

001 titulka.indd - Regionální hospodářská komora Plzeňského kraje

001 titulka.indd - Regionální hospodářská komora Plzeňského kraje jejímž vývozem se zabýváme, zatím trvá. Jen za rok 2007 jsme získali dvacítku dalších destinací pro export,“ říká finanční ředitelka firmy Andrew

Více

polyfunkční a sportovní stavby

polyfunkční a sportovní stavby globální politiku Glopolis, bylo oceněno osm tuzemských firem za technologická řešení v environmentální oblasti, jež by se dala využít v zemích třetího světa. Č e s t n é o c e n ě ní b y l o u d ě...

Více