Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
compiler_-_php010.pdf
Search
Joshua Thijssen
September 08, 2016
Technology
180
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
compiler_-_php010.pdf
Joshua Thijssen
September 08, 2016
More Decks by Joshua Thijssen
See All by Joshua Thijssen
RAFT: A story on how clusters of computers keep your data in sync
jaytaph
0
87
The first few milliseconds of HTTPS
jaytaph
0
330
Paradoxes and theorems every developer should know
jaytaph
0
380
Paradoxes and theorems every developer should know
jaytaph
0
820
The first few milliseconds of HTTPS - PHPNW16
jaytaph
1
310
Paradoxes and theorems every developer should know
jaytaph
0
320
Introduction into interpreters, compilers and JIT
jaytaph
1
400
Paradoxes and theorems every developer should know
jaytaph
1
1k
Are you out of memory, or have plenty to spare?
jaytaph
0
300
Other Decks in Technology
See All in Technology
推論基盤と Scale-Up Interconnect の現状と制約から俯瞰する技術動向
markunet
2
600
AIエージェント時代、Kaggleにどう取り組むか
takanao
2
380
外国人エンジニアがVueプロトタイプで仕様を合わせている話 / Vue Fes Japan 2026 LT
eluwing
0
290
ひとりで始めた AI駆動開発、チームに広げて何が変わったのか
kenichiodo
0
150
Agent × Maestro で始める モバイル E2E 端末準備からテスト実行・結果確認まで
sansantech
PRO
0
230
"計画的無茶振り"を通してAIネイティブ世代の新人を育てる
subroh0508
1
130
正解のない研修に放り出されて / Being thrown into a training program with no right answers
ohnoeight
1
160
生き様としてのSRE
hokkai7go
0
130
Claude for Google Workspaces ポン出し/claude-for-google-workspace-slide-conversion
emiki
0
13k
「社外イベント=意識高い」の壁を壊せ!元々無関心だった僕らが部内で社外イベントを民主化して15人を連れ出すまで
say_no_w
0
160
OneLakeをデータソースにした AI Search(Foundry IQ)の ライフサイクル管理
ryuseiiida
0
180
AI秘書と毎日働くのはもう当たり前。開発以外の業務に足りない機能をどう埋める?
minorun365
PRO
4
1.9k
Featured
See All Featured
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Side Projects
sachag
456
43k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
490
New Earth Scene 8
popppiees
4
2.7k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Six Lessons from altMBA
skipperchong
29
4.5k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The Cult of Friendly URLs
andyhume
79
7k
Everyday Curiosity
cassininazir
0
370
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.4k
Transcript
1 Joshua Thijssen jaytaph an introduction into compilers, interpreters and
JIT From source to code
Computers don't understand: 2 http://blog.ruslans.com/2012_11_01_archive.html
56e9 5200 4641 4c46 5245 0020 0102 0001 e002 4000
f00b 0009 0012 0002 0000 0000 0000 0000 0000 ef29 adbe 52de 4641 4c46 5245 2020 2020 4146 3154 2032 2020 6152 6666 656c 4f72 3a53 0020 414e 454d 2053 2020 4144 0054 4900 fa37 c031 d88e c08e d08e 00bc fb7c 3ebe e87c 0117 00bb b880 0001 12bf e800 00a3 00bb b8a4 0013 0ebf e800 0097 bffc a400 4abe b97c 000b f357 5fa6 0d74 c781 0020 ff81 c000 ea76 fde9 8bff 1c45 55a3 bb7c c000 458b 501a abe8 5800 c381 0200 8953 d1c3 01eb 8bc3 0097 5b80 01a9 7500 8107 ffe2 e90f 0003 eac1 8104 f0fa 890f 72d0 31d4 cdc0 001a 5716 e87c 0088 ff25 8900 bec3 c000 f789 3e03 7c55 0ab4 2588 cbfe 0f74 39ac 7cfe be03 c000 0a3c f074 f1e9 56ff b046 3a0a 7504 c6f9 0004 e85e 006b fde9 50ff 0ae8 5800 c381 0200 4f40 f375 89c3 81e5 08ec be00 0012 d231 f6f7 c2fe 5688 beff 0002 d231 f6f7 5688 89fe fc46 01b0 6e8a 8afc fe76 4e8a b2ff b400 cd02 8913 c3ec 022d 3100 b1c9 f701 05e1 0021 bee8 c3ff 57a1 ba7c 8405 e2f7 063b 7c57 0375 d488 a340 7c57 d089 acc3 003c 0a74 0eb4 07bb cd00 e910 fff1 90c3 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 aa55 3
56e9 5200 4641 4c46 5245 0020 0102 0001 e002 4000
f00b 0009 0012 0002 0000 0000 0000 0000 0000 ef29 adbe 52de 4641 4c46 5245 2020 2020 4146 3154 2032 2020 6152 6666 656c 4f72 3a53 0020 414e 454d 2053 2020 4144 0054 4900 fa37 c031 d88e c08e d08e 00bc fb7c 3ebe e87c 0117 00bb b880 0001 12bf e800 00a3 00bb b8a4 0013 0ebf e800 0097 bffc a400 4abe b97c 000b f357 5fa6 0d74 c781 0020 ff81 c000 ea76 fde9 8bff 1c45 55a3 bb7c c000 458b 501a abe8 5800 c381 0200 8953 d1c3 01eb 8bc3 0097 5b80 01a9 7500 8107 ffe2 e90f 0003 eac1 8104 f0fa 890f 72d0 31d4 cdc0 001a 5716 e87c 0088 ff25 8900 bec3 c000 f789 3e03 7c55 0ab4 2588 cbfe 0f74 39ac 7cfe be03 c000 0a3c f074 f1e9 56ff b046 3a0a 7504 c6f9 0004 e85e 006b fde9 50ff 0ae8 5800 c381 0200 4f40 f375 89c3 81e5 08ec be00 0012 d231 f6f7 c2fe 5688 beff 0002 d231 f6f7 5688 89fe fc46 01b0 6e8a 8afc fe76 4e8a b2ff b400 cd02 8913 c3ec 022d 3100 b1c9 f701 05e1 0021 bee8 c3ff 57a1 ba7c 8405 e2f7 063b 7c57 0375 d488 a340 7c57 d089 acc3 003c 0a74 0eb4 07bb cd00 e910 fff1 90c3 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 9090 aa55 3
4 mov ax, [di + 0x1A] ; Here starts FAT
clusters loadClusters: push ax call ReadCluster pop ax add bx, 512 ; Next sector push bx mov bx, ax shr bx, 1 add bx, ax mov dx, [0x8000 + bx] pop bx test ax, 0x01 jnz oddCluster evenCluster: and dx, 0x0FFF jmp testCluster oddCluster: shr dx, 4 testCluster: cmp dx, 0xFF0 mov ax, dx jb loadClusters https://github.com/domcode/rafflers/blob/master/jaytaph-bootsector-asm/raffler.S
1 static void out_string(conn *c, const char *str) { 2
size_t len; 3 4 assert(c != NULL); 5 6 if (c->noreply) { 7 if (settings.verbose > 1) 8 fprintf(stderr, ">%d NOREPLY %s\n", c->sfd, str); 9 c->noreply = false; 10 conn_set_state(c, conn_new_cmd); 11 return; 12 } 13 14 if (settings.verbose > 1) 15 fprintf(stderr, ">%d %s\n", c->sfd, str); 16 17 /* Nuke a partial output... */ 18 c->msgcurr = 0; 19 c->msgused = 0; 20 c->iovused = 0; 21 add_msghdr(c); 22 23 len = strlen(str); 24 if ((len + 2) > c->wsize) { 25 /* ought to be always enough. just fail for simplicity */ 26 str = "SERVER_ERROR output line too long"; 27 len = strlen(str); 28 } 29 30 memcpy(c->wbuf, str, len); 31 memcpy(c->wbuf + len, "\r\n", 2); 5 https://github.com/memcached/memcached/blob/master/memcached.c
1 <?php 2 3 if (! isset($_POST['email'])) { 4 die("Need
mail"); 5 } 6 7 $email_to = "
[email protected]
"; 8 $email_subject = "subject line"; 9 10 // What could possibly go wrong here... 11 $email_message = $_POST['email']; 12 13 @mail($email_to, $email_subject, $email_message); 6
Let's write a language (in 5 minutes or less) 7
8 set a 1 set b 2 add a b
c print c
8 set a 1 set b 2 add a b
c print c operator
8 set a 1 set b 2 add a b
c print c operator operands
8 set a 1 set b 2 add a b
c print c 1 <?php 2 3 $vars = array(); 4 5 $lines = file("example.010"); 6 7 foreach ($lines as $line) { 8 $line = explode(" ", trim($line)); 9 switch ($line[0]) { 10 case "set" : 11 $vars[$line[1]] = $line[2]; 12 break; 13 case "add" : 14 $vars[$line[3]] = $vars[$line[1]] + $vars[$line[2]]; 15 break; 16 case "print" : 17 echo $vars[$line[1]]; 18 break; 19 } 20 } operator operands
9 Interpreter
10
10 ➡ Runs directly from the source.
10 ➡ Runs directly from the source. ➡ Platform agnostic.
10 ➡ Runs directly from the source. ➡ Platform agnostic.
➡ Runtime checks.
10 ➡ Runs directly from the source. ➡ Platform agnostic.
➡ Runtime checks. ➡ Slow.
10 ➡ Runs directly from the source. ➡ Platform agnostic.
➡ Runtime checks. ➡ Slow. ➡ Every instruction interpreted over and over again.
11 PHP is an interpreted language (for now)
What if: we could convert our source code into machine
code? 12
Compiler 13
Pro 14
Pro 14 ➡ Compiles source into machine code.
Pro 14 ➡ Compiles source into machine code. ➡ Runs
very fast (no "layers" in between).
Pro 14 ➡ Compiles source into machine code. ➡ Runs
very fast (no "layers" in between). ➡ No need for the source code.
Pro 14 ➡ Compiles source into machine code. ➡ Runs
very fast (no "layers" in between). ➡ No need for the source code. ➡ Optimized for the running platform.
Cons 15
Cons ➡ Can ONLY run on the compiled architecture (x64,
arm, sparc etc). 15
Cons ➡ Can ONLY run on the compiled architecture (x64,
arm, sparc etc). ➡ A change in the source code means a recompilation is needed. 15
Cons ➡ Can ONLY run on the compiled architecture (x64,
arm, sparc etc). ➡ A change in the source code means a recompilation is needed. ➡ 15
16
17 http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf
This is why sane people do not write compilers* 18
* I'm currently writing a compiler.
19
Hybrid system 20
21
21 ➡ We compile source code to an intermediate code.
21 ➡ We compile source code to an intermediate code.
➡ Run this intermediate code in a specialized interpreter.
21 ➡ We compile source code to an intermediate code.
➡ Run this intermediate code in a specialized interpreter. ➡ Faster interpretation.
22
22 <?php function foo() { $i = 1; $i =
$i + 1; return $i; } line #* E I O op ext return operands --------------------------------------------------- 4 0 E > ASSIGN !0, 1 5 1 ADD ~2 !0, 1 2 ASSIGN !0, ~2 6 3 > RETURN !0 7 4* > RETURN null PHP
22 <?php function foo() { $i = 1; $i =
$i + 1; return $i; } line #* E I O op ext return operands --------------------------------------------------- 4 0 E > ASSIGN !0, 1 5 1 ADD ~2 !0, 1 2 ASSIGN !0, ~2 6 3 > RETURN !0 7 4* > RETURN null PHP def foo(): i = 1 i = i + 1 return i 4 0 LOAD_CONST 1 (1) 3 STORE_FAST 0 (i) 5 6 LOAD_FAST 0 (i) 9 LOAD_CONST 1 (1) 12 BINARY_ADD 13 STORE_FAST 0 (i) 6 16 LOAD_FAST 0 (i) 19 RETURN_VALUE PYTHON
23 compile PHP to bytecode Run PHP bytecode read PHP
file into memory
24 compile PHP to bytecode Run PHP bytecode read PHP
file into memory
24 compile PHP to bytecode Run PHP bytecode read PHP
file into memory OPCache
25 compile PHP to bytecode read PHP file into memory
OPCache Run PHP bytecode
JIT ( just in time ) 26
27
➡ Compiles to native machine code at runtime. 27
➡ Compiles to native machine code at runtime. ➡ Compiles
per function /method 27
➡ Compiles to native machine code at runtime. ➡ Compiles
per function /method ➡ Or, compiles code block. 27
➡ Compiles to native machine code at runtime. ➡ Compiles
per function /method ➡ Or, compiles code block. ➡ Or, only compiles on multiple calls. 27
➡ Compiles to native machine code at runtime. ➡ Compiles
per function /method ➡ Or, compiles code block. ➡ Or, only compiles on multiple calls. ➡ Or, interprets, compiles in the background, and switches to compiled code when compilation is finished. 27
init(); $a = 1; for ($i=0; $i!=1000; $i++) { //
very CPU consuming functions $a = $i / 100 * sqrt($i / 163.21) + foobar($i)); echo $a; } 28
29
29 ➡ We don't have to "wait" for compilation.
29 ➡ We don't have to "wait" for compilation. ➡
Still runs fast (as in binary code).
29 ➡ We don't have to "wait" for compilation. ➡
Still runs fast (as in binary code). ➡ Can optimize even better than pre- compilation (it has more context).
PHP7 30
31 Lexing & Parsing Bytecode Compilation Execution
32 AST Generation Bytecode Compiliation Execution Lexing & Parsing
33 AST Generation Bytecode Compiliation Execution Lexing & parsing Whatever
you want to do
34 Abstract Syntax Tree https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Abstract_syntax_tree_for_Euclidean_algorithm.svg/400px-Abstract_syntax_tree_for_Euclidean_algorithm.svg.png while ($b != 0) {
if ($a > $b) { $a = $a - $b; } else { $b = $b - $a; } } return $a;
35 ➡ Make changes to the tree (eg: remove all
else-statements) ➡ Convert code back to older versions or other language (transpiling) ➡ Analyze code ➡ Optimize code
36 ➡ JIT system (other than HHVM) ➡ LLVM ?
➡ Bytecode interchange ? ➡ PhpPhp (php interpreter written in php?) The future
http://farm1.static.flickr.com/73/163450213_18478d3aa6_d.jpg 37
38 Find me on twitter: @jaytaph Find me for development
and training: www.noxlogic.nl / www.techademy.nl Find me on email:
[email protected]
Find me for blogs: www.adayinthelifeof.nl