рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг libjit рдмрдирд╛рдо llvm
рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯреЗрд╕реНрдЯ llvm / libjit part II, рд╡рд╣реА + рдЧрдиреНрдиреВ рд▓рд╛рдЗрдЯрдирд┐рдВрдЧ ред
рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рджрд╣реА
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ, ervosthenes рдХреА рдЫрд▓рдиреА рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП llvm, libjit рдФрд░ gnu lightning рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХреА рдЧрдИ рдереАред рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рд╡рд┐рдХрд▓реНрдк рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рдЖрдЧ рдХреА рджрд░ рдЕрдЪреНрдЫреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╡рд┐рд╢реЗрд╖ рдЕрд╕реЗрдВрдмрд▓рд░ рд╣реИрдВ, рдФрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрд╡рдпрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЕрдиреНрдп рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЗрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЕрдкрдиреЗ рдбреАрдПрд╕рдПрд▓ рдХреЗ рдмреИрдХрдПрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП - рдЕрдкреНрд░реИрд▓ рдлреВрд▓ рдХрд╛ рдордЬрд╛рдХ - рддреЛрддреЗ рдХрд╛ рдЬрдиреНрдо - рднрд╡рд┐рд╖реНрдп рдХреЗ рдореЛрддреА рдХрд╛ рдЖрдзрд╛рд░ред
рдХрдИ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рддрд╛рд░, рд╣реИрд╢ рдЯреЗрдмрд▓, рдЖрдпрд╛рдо рд░рд╣рд┐рдд рд╕рд░рдгрд┐рдпрд╛рдБ, рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣, рдХрдВрд╕реЛрд▓ рдФрд░ рдлрд╝рд╛рдЗрд▓ I / O, рдФрд░ рдЕрдиреНрдп рдЕрдЪреНрдЫреА рдЪреАрдЬреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдкреНрд░рд╢реНрди - рдЗрди рд╕рднреА рдЕрдЪреНрдЫреЗ рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп (рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдиреБрдХрд╕рд╛рди рдореЗрдВ) рдХреНрдпрд╛ рд╣реИ?
рдЖрдЗрдпреЗ рдЗрд╕реЗ рдЖрдЬрдорд╛рддреЗ рд╣реИрдВред
рдПрд░рд╛рдЯреЛрд╕реНрдердиреАрдЬ рддреЛрддреЗ рдкрд░ рдЫрд▓рдиреА
рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рдпреЗ рджреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ (erato) рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ (рдореБрдЦреНрдп) 1 рд╕реЗ 50_000 рддрдХ рдХреЗ рдЕрдкрд░рд╛рдзреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 100_000 рдмрд╛рд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
.loadlib 'trans_ops'
.loadlib 'math_ops'
.sub 'erato'
.param int n
$P0 = new 'ResizableIntegerArray' # a = P0
$P0 = n
$N0 = sqrt n # q = I0
$I0 = floor $N0 # i = I1
$I1 = 2
for_cond:
if $I1 > $I0 goto for_end
$I2 = $P0[$I1]
if $I2 == 1 goto end_if
$I3 = $I1 * $I1 # j = I3
while_cond:
if $I3 > n goto while_end
$P0[$I3] = 1
$I3 += $I1
goto while_cond
while_end:
end_if:
$I1 += 1
goto for_cond
for_end:
.end
.sub main :main
$I10 = 0
for_test1:
if $I0>100000 goto for_end1
erato(50000)
$I0 += 1
goto for_test1
for_end1:
.end
рдФрд░ - рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдЬреЛ рдпрд╣ рд╕рдм рдЪрд▓рд╛рддрд╛ рд╣реИ:
001 : #include <parrot/embed.h>
002: #include <parrot/extend.h>
003:
004: int main ( int argc, char * argv[])
005: {
006: Parrot_Interp interp;
007: Parrot_PackFile pf;
008:
009: interp = Parrot_new( NULL );
010: if ( ! interp) {
011: return 1 ;
012: }
013:
014: pf = Parrot_pbc_read(interp, "erato.pbc" , 0 );
015: Parrot_pbc_load(interp, pf);
016: Parrot_runcode(interp, argc, argv);
017:
018: Parrot_destroy(interp);
019:
020: return 0 ;
021: }
022:
рдЗрд╕рд▓рд┐рдП, рдирдпрд╛ рд╡рд┐рдХрд▓реНрдк рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ:
parrot -o erato.pbc erato.ptr
gcc -O2 erato.c -I /usr/include/parrot/2.0.0/ -lparrot -o erato
рдФрд░ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ:
/usr/bin/time -f "%U" ./erato
2361.2
рд▓реЗрдЦрдХ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдЖрдВрджреЛрд▓рди рдХреЗ рдЙрддреНрдкрд╛рдж рдФрд░ рдлрд▓
рдХреБрд▓, рд╣рдорд╛рд░реА рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рдкрддреНрд░ рд▓реЗрддреА рд╣реИ:
рд╡реАрдПрдо | рд╕реЗрдХрдВрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдордп, (рдХрдо = рдмреЗрд╣рддрд░) |
---|---|
LLVM | 13.77 |
LIBJIT | 14.17 |
GNU рд▓рд╛рдЗрдЯрд┐рдВрдЧ | 32.59 |
рддреЛрддрд╛ | 2361 |
рдФрд░ рд╕рд┐рд░реНрдл рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП: | |
gcc -O0 | 50.09 |
gcc -O1 | 13.79 |
рдЗрд╕реА рддрд░рд╣ рдХреЗ рдкрд░реНрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо | 4288 |
рдпрд╣реА рд╣реИ, рддреЛрддрд╛ рдЖрднрд╛рд╕реА рдорд╢реАрди рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЬреАрдЯ рдорд╢реАрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 150 рдЧреБрдирд╛ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдЪрд▓рддреА рд╣реИред рд▓реЗрдХрд┐рди рдореЛрддреА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 2 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреЛрддреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдореЛрддреА рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдЖрдЬ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ ... рд╣рд╛рд▓рд╛рдВрдХрд┐, рддреЛрддрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдиреНрдп рдорд╢реАрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдЧрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЕрдВрддрд┐рдо рд░рд╛рдЧ
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рддреЛрддрд╛ рдПрдХ _very_ рд╕реБрдЦрдж рдЫрд╛рдк рдЫреЛрдбрд╝ рдЧрдпрд╛, рд╕рдм рдХреБрдЫ рд╡рд░реНрдгрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреЛрдИ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рдереЗ, рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╕рдореБрджреНрд░ рд╣реИрдВ, рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдЕрдЪреНрдЫрд╛ рд╣реИред Llvm рдХреЗ рдмрд╛рдж рдЙрд╕ рдкрд░ рд▓рд┐рдЦрдирд╛ рдПрдХ рдЦреБрд╢реА рд╣реИред рдЗрд╕рд▓рд┐рдП рдЕрдкрдиреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдпрд╛:
- рдЧрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ - llvm рдпрд╛ libjit, llvm рдмреЗрд╣рддрд░ рд╣реИ (рдмреЗрд╣рддрд░ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдБрдЪрд╛, рдЕрдзрд┐рдХ рдЙрдкрдХрд░рдг)
- рдХрдо рд╕реНрдерд┐рддрд┐, рдЬреИрд╕реЗ рдХрд┐ рдХрдо рдореЗрдореЛрд░реА рдФрд░ рдбрд┐рд╕реНрдХ рд╕реНрдерд╛рди - рдЧреНрдиреВ рд▓рд╛рдЗрдЯрдирд┐рдВрдЧ;
- рдЕрдЧрд░ рдЧрддрд┐ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рддрд╛рд░ рдпрд╛ рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ - рддреЛрддрд╛