рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд╣ рднрд╛рдЧ рдЬреЛ "PHP рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ" рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдм рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ:
- рдпрд╣ рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдФрд░ рдХреМрди рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реИ;
- рдЕрдиреБрднрд╡реА phpshniks рд╕реЗ рдкреВрдЫреЗрдВ рдХрд┐ рдореЗрд░реЗ PHP рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рд╕реБрдзрд╛рд░реЗрдВ рдФрд░ рдХреИрд╕реЗ рдорд╛рдкреЗрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдзреАрдорд╛ рд╣реЛред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдФрд░ рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг рд╣реИрдмрд░рдХреЛрдЯ рдХреЗ рддрд╣рддред
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЙрджрд╛рд╣рд░рдг:
( display "Hello, world!\n")
рдпрд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓:
( define (- -)
( lambda () ( display -)))
( define - ( - "!\n"))
( - )
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИред PHP рдореЗрдВ, рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛ (рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ):
function _($_) {
return function () {
print $_;
}
}
$_ = _ ("!\n");
$ _ ();
рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЬреАрдердм рдкрд░ рдпрд╛ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЯреЗрд╕реНрдЯ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
* рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ (рдЙрджрд╛рд╣рд░рдг "рд╣реИрд▓реЛ, рджреБрдирд┐рдпрд╛")
* рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ (рддрдереНрдпрд╛рддреНрдордХ, рджрдВрддрдХрдерд╛рдПрдВ, рдПрдХрд░рдореИрди)
* рд╕рд░реНрдХрд┐рдЯ
* рдирд┐рд░рдВрддрд░рддрд╛
рд╕рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬреЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред R5RS рдорд╛рдирдХ рдХреЗ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддрдХ, рдпрд╣ рдХреЗрд╡рд▓ рдЖрджрд┐рдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдЕрд░реЗ рд╣рд╛рдБ, рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ рдореЗрд░рд╛ рдЫрджреНрдо рдХреЛрдб рдпреЛрдЬрдирд╛ R5RS рднрд╛рд╖рд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП, рдореИрдВ Gambit рд╕реНрдХреАрдорд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░-рд╕реНрдЯреИрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди GVM ( рдХреБрд╢рд▓ рдпреЛрдЬрдирд╛ рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдЖрднрд╛рд╕реА рдорд╢реАрди ) рд╣реИред рдЬрдм GVM рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ рддреЛ рдпрд╣ рд╣рдорд╛рд░рд╛ рдЙрджрд╛рд╣рд░рдг рдмрди рдЬрд╛рддрд╛ рд╣реИ:
; +N: N
; -N: N
; : +1, +2 ..
; +1
; continuation-passing style, - +0
; , escape sequences
;
; #1
#1 0 entry-point 0 ()
; "-"
|~#-| = '#<procedure |~#-|>
-1 = +0
+1 = '"!\n"
+0 = #3
; #2
jump* 4 #2
#2 4
; . +0 #3, , +1 ()
jump$ 4 |~#-| 1
#3 4 return-point
|~#-| = +1
+0 = -1
jump* 4 #4
#4 4
jump$ 0 |~#-| 0
**** #<procedure |~#-|> =
#1 0 entry-point 1 ()
; --
close -1 = (#2 +1)
+1 = -1
jump 0 +0
;
#2 0 closure-entry-point 0 ()
; +4 , +4(1) --
+1 = +4(1)
jump* 0 #3
#3 0
jump$ 0 display 1
GVM рдХреЛ PHP рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо:
function glo_x20hellowr () {
global $reg0, $reg1, $reg2, $reg3, $reg4, $pc, $fp, $stack, $nargs;
$ GLOBALS['glo_-'] = 'glo__';
$ stack[$fp+1] = $reg0;
$ reg1 = "!\n";
$ reg0 = 'lbl_x20hellowr_3';
$ pc = 'lbl_x20hellowr_2';
$ fp = $fp+4;
}
function lbl_x20hellowr_2 () {
global $reg0, $reg1, $reg2, $reg3, $reg4, $pc, $fp, $stack, $nargs;
$nargs = 1;
$ pc = $GLOBALS['glo_-'];
}
function lbl_x20hellowr_3 () {
global $reg0, $reg1, $reg2, $reg3, $reg4, $pc, $fp, $stack, $nargs;
$ GLOBALS['glo_-'] = $reg1;
$ reg0 = $stack[$fp-3];
$ pc = 'lbl_x20hellowr_4';
}
function lbl_x20hellowr_4 () {
global $reg0, $reg1, $reg2, $reg3, $reg4, $pc, $fp, $stack, $nargs;
$nargs = 0;
$ pc = $GLOBALS['glo_-'];
$ fp = $fp-4;
}
// procedure - =
function glo__ () {
global $reg0, $reg1, $reg2, $reg3, $reg4, $pc, $fp, $stack, $nargs;
$ stack[$fp+1] = array('lbl___2', $reg1);
$ reg1 = $stack[$fp+1];
$ pc = $reg0;
}
function lbl___2 () {
global $reg0, $reg1, $reg2, $reg3, $reg4, $pc, $fp, $stack, $nargs;
$ reg1 = $reg4[1];
$ pc = 'lbl___3';
}
function lbl___3 () {
global $reg0, $reg1, $reg2, $reg3, $reg4, $pc, $fp, $stack, $nargs;
$nargs = 1;
$ pc = $GLOBALS['glo_display'];
}
exec_scheme_code(' glo_x20hellowr ');
1) рдЧреЛрдЯреЛ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП?
рдкреНрд░рддреНрдпреЗрдХ GVM рдмреНрд▓реЙрдХ (рд▓реЗрдмрд▓ рд╕реЗ рд╕рдВрдХреНрд░рдордг рддрдХ) рдПрдХ PHP рдлрд╝рдВрдХреНрд╢рди рдмрди рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдЧреЛрдЯреЛ рдХреЛ рд╡рд╛рдкрд╕ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрдХ "exec_scheme_code ($ pc)" рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
$ reg0 = 'glo_exit';
рдЬрдмрдХрд┐ (1) {
$ рдкреАрд╕реА = $ рдкреАрд╕реА ()
}
рд╕рдВрдХрд▓рдХ рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рдпрд╣рд╛рдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкреНрд░рджрд░реНрд╢рди рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИрдВред
рд╡реИрдХрд▓реНрдкрд┐рдХ?
2) рд╕реБрдкрд░рдЧреНрд▓реЛрдмрд▓реНрд╕
рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдорд╛рди рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рд╢рд╛рдпрдж PHP рдХреЛ рдмрддрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реИрдВ?
3) рдвреЗрд░
рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕реНрдЯреИрдХ рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдореИрдВрдиреЗ рдПрдХ рд╕рд░рдгреА рд▓реАред рдФрд░ рдореБрдЭреЗ рдХреБрдЫ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рдерд╛ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╣рдореЗрд╢рд╛ рд╕рд╣рдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВ, рджрд┐рд▓рдЪрд╕реНрдк рджреБрд╖реНрдкреНрд░рднрд╛рд╡реЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХрд╛рдо рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИред
рдХреИрд╕реЗ рдХрд░реЗрдВ рддреЗрдЬ рд╕реНрдЯреИрдХ?
4) рдкреНрд░рджрд░реНрд╢рди
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдРрд╕реЗ PHP рдХреЛрдб рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХрд░рдореИрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореИрдиреБрдЕрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдпрд╣ 30 рдЧреБрдирд╛ рдзреАрдорд╛ рд╣реИред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ (рдЕрдВрдбрд░-рдЧреЛрдЯреЛ рдФрд░ рд╕реНрдЯреИрдХ) рдХреНрдпреЛрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рдЙрдкрдХрд░рдг рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреЛ рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ?