wie durft...
Ik kan me nog herinneren dat in mijn Commodore 64 tijd je kon programmeren in de taal 'Basic'. En dat zag er dan zoiets uit:
jeugdsentiment
Ik kan me ook nog herinneren dat ik als klein manneke een keer een boek had gekocht waarmee je een programma kon maken voor de Commodore 64, en met dat programma kon je "makkelijk" sprites maken.
Wat een sprite is?
Niet dit:
Maar bijvoorbeeld deze luchtballon... een simpel plaatje bestaande uit "blokjes". Dat kon je dan over je beeldscherm laten vliegen... WOEEHOOEE... VET!!! ...ja, ehmm oké... ehhh, computers waren in die tijd nog niet zo high-tech als nu hè ;-)
Ik kan me nog goed herinneren dat ik toch wel zo'n 20 bladzijdes met machinetaal heb overgetypt (hoe gek kun je zijn) en uiteindelijk werkte het programma worden boven wonder nog prima ook! (Wat zou er gebeurd zijn als ik 1 tekentje verkeerd had getypt...) Die machinetaal sprak rechtstreeks de processor aan en zag er ongeveer zo uit:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
sjhDSWJHJ54e srerkjherERLKG 4546edrfeFJG sdfjh455rrr LKJFGRTEF4556
sdfsdfFHDFDG ZNVFrej34djfdf WEtrrtij45DF 984JJEREkgH 89dfFDVDFkjkg
dffkjERKJ57R FEDKJEr456KJD1 GDFDcvmnoimJ Qxceer44DFg dfljk343GKJKv
.....
.....
enz.
sdfsdfFHDFDG ZNVFrej34djfdf WEtrrtij45DF 984JJEREkgH 89dfFDVDFkjkg
dffkjERKJ57R FEDKJEr456KJD1 GDFDcvmnoimJ Qxceer44DFg dfljk343GKJKv
.....
.....
enz.
(misschien zag het er in de praktijk iets anders uit, maar zo herinner ik het me)
Nu vraag ik me af... HOE WERKT PHP onder de motorkap? Wie kan (en durft) dat uit te leggen?
Stel we hebben deze code:
Code (php)
Wat gebeurt er nu onderwater? Hoe wordt deze code omgezet naar een tekst op het beeldscherm? Wat komt er allemaal bij kijken?
Lijkt me leuk als iemand hier iets over kan vertellen :-)
Met pookes en peeks heb ik uiteindelijk vroeger in combinatie met de Atari Home XL en de tape-recoder een programma geschreven (lees: 80% aan code uit een boekje overgetypt) om cassettebandjes af te kunnen spelen via je TV.
Vond ik best wel tof toen :-P
Volgens mij is PHP gebouwd op C# of C++. Ben zelf niet zo bekend met deze programmeertalen, maar je kan de source van PHP eens downloaden.
Lang leve open-source :-)
Gewijzigd op 11/04/2013 17:42:03 door - Ariën -
@Aar: ja, dat waren wel toffe dingen he! En kijk ook hoe mooi die computers eruit zien! Je wil er gelijk mee spelen :)
Wat dacht je van deze (Atari 1040ST):
en natuurlijk de Commodore 64
met z'n gave spelletjes :-)
Maar goed... hoe werkt PHP onder de motorkap... dat was dus de vraag :)
- Aar - op 11/04/2013 17:39:19:
Volgens mij is PHP gebouwd op C# of C++. Ben zelf niet zo bekend met deze programmeertalen, maar je kan de source van PHP eens downloaden.
Lang leve open-source :-)
Lang leve open-source :-)
PHP is gemaakt met C (dus niet C++ of C++++ (C#)). Een goed navigeerbare source code van PHP kan je hier vinden: http://lxr.php.net/
Voor een hele goede tut reeks hoe PHP werkt verwijs ik je naar: http://blog.ircmaxell.com/2012/03/phps-source-code-for-php-developers.html
Even een simpel en leuk voorbeeldje:
PHP heeft als basis de Zend Engine. Dit is de grote parser (die staat in de map zend). Daarboven op heb je heel veel PHP extensies (die staan in ext). Dit zijn de meeste PHP functies. Deze functies zijn geregistreerd door PHP_FUNCTION <functienaam>.
Laten we explode opzoeken. We typen daarvoor in de zoekbar "PHP_FUNCTION strlen" in (met quotes). We krijgen dan 2 bestanden: php_string.h en string.c. In een .h (header) file staat beschreven welke functies die in .c staan gebruikt mogen worden door de buitenwereld. Niet erg interessant, we willen de functie weten dus klikken we op de line in string.c. We krijgen dan een hele lange code te zien.
Eerst zien we een hele reeks variabele definities. Leuk om te weten, maar meer niet. Vervolgens komt er dit:
Code (php)
1
2
3
2
3
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|l", &delim, &delim_len, &str, &str_len, &limit) == FAILURE) {
return;
}
return;
}
Hier worden de parameters die jij aan de functie geeft geparsed. Dat begin slaan we over, en dan zien we "ss|l". Dit betekend dat explode 2 parameters verwacht die beide string zijn. Vervolgens komen er de optionele parameters (aangegeven met de |) en dat is er 1 van het type long (getal). Daarachter zien we welke variabele in onze functie de waarde van de parameter krijgen. In ons geval delim + de lengte van delim, str + de lengte van str en limit.
Vervolgens zien we == FAILURE. FAILURE is een marco. C is een taal die eerst wordt gecompiled en vervolgens uitgevoerd kan worden. Met marco's kun je aan de compiler aangeven dat bepaalde keywords een andere waarde krijgen. Deze keywords herken je aan hun hoofdletters. Als we erop klikken zien we de waarde van deze marco:
Er komt dus na het compilen == -1 te staan.
Goed, we gaan weer verder met onze functie. Als er iets fout is zal de functie stoppen met uitvoeren en zal de Zend Engine een fatal error geven.
Code (php)
1
2
3
4
2
3
4
if (delim_len == 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty delimiter");
RETURN_FALSE;
}
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty delimiter");
RETURN_FALSE;
}
Hier kijken we of de delimeter een lengte heeft, zoniet dan zal PHP een E_WARNING error geven met de message 'Empty delimiter' (waarbij E_WARNING weer een marco is voor 1<<1L).
Daarna zal er false geretourneerd worden. (RETURN_FALSE is ook weer een macro)
Vervolgens wordt er nog zo'n check gedaan en daarna wordt php_explode of php_explode_negative_limit aangeroepen. Dit is een pattern dat vaak in PHP wordt gebruikt; de logica van een functie wordt gescheiden van de error handling. Dit zorgt ervoor dat de logica functie's zeer herbruikbaar zijn.
Dit was even een hele snelle introductie (hoe het precies werkt kun je uitvinden door php_explode uit te pluizen). Voor meer informatie verwijs ik graag naar de tutorialreeks die ik aan het begin van deze post plaatste.
Rasmus Lerdorf:
I hate programming with a passion.
Maar we hebben dus een onderliggende taal C die als het ware PHP "interpreteert". Dus PHP wordt omgezet in C. En wat gebeurt er dan? Wordt C omgezet in machinetaal en gaat het dan rechtstreeks naar de processor van de server?
P.S. Hoe weet jij dit allemaal? Heb je je jezelf er helemaal in verdiept?
thanks :)
Quote:
Je hebt het telkens over marco, maar ik neem aan dat je macro bedoelt?
Jep, typo
Quote:
Dus PHP wordt omgezet in C.
Fout. We hebben de Zend Engine. Deze werkt via het Lexer/Parser principe. Hij zal al jouw code omzetten in tokens. Bijv:
Wordt omgezet in:
Code (php)
1
2
3
4
2
3
4
T_OPEN_TAG
T_VARIABELE T_EQUAL T_ENCAPSED_AND_WHITESPACE;
T_ECHO T_ENCAPSED_AND_WHITESPACE T_CONCAT T_VARIABLE;
T_CLOSE_TAG
T_VARIABELE T_EQUAL T_ENCAPSED_AND_WHITESPACE;
T_ECHO T_ENCAPSED_AND_WHITESPACE T_CONCAT T_VARIABLE;
T_CLOSE_TAG
Vervolgens wordt dit in een parser gezet. Die zal uit deze tokens opmaken wat hij er mee moet. Als hij een functie tegenkomt zal hij gaan kijken of die functie gedefinieerd is in 1 van de extensies (waaronder al de PHP extensies) en anders kijkt hij of het gedefinieerd is in jouw code. Dan zal hij deze functies aanroepen (in C uiteraard).
Wat er voor stap er voor C zit weet ik niet. Dat gaat me iets te ver om te weten.
Quote:
P.S. Hoe weet jij dit allemaal? Heb je je jezelf er helemaal in verdiept?
Je weet toch dat ik er van hou om te weten wat er nou gebeurd achter de schermen? Zodra ik ergens in programmeer wil ik weten wat er eigenlijk gebeurd en daarvoor moet je in de source code kijken. Toen Pim eens die link naar de tut stuurde ben ik verkocht en heb me eens hierin verdiept. Het is erg handig om naar te kijken en om dingen van te leren.
Gewijzigd op 11/04/2013 20:15:24 door Ozzie PHP