рдПрдХ рд╕рд╛рдзрд╛рд░рдг llvm / libjit рдкрд░реАрдХреНрд╖рдг рднрд╛рдЧ III, рдЕрдм рддреЛрддрд╛ рднреА рд╣реИ

рдпрд╣ рд▓реЗрдЦ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ:
рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг 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

рд▓реЗрдЦрдХ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдЖрдВрджреЛрд▓рди рдХреЗ рдЙрддреНрдкрд╛рдж рдФрд░ рдлрд▓


рдХреБрд▓, рд╣рдорд╛рд░реА рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рдкрддреНрд░ рд▓реЗрддреА рд╣реИ:

рд╡реАрдПрдорд╕реЗрдХрдВрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдордп, (рдХрдо = рдмреЗрд╣рддрд░)
LLVM13.77
LIBJIT14.17
GNU рд▓рд╛рдЗрдЯрд┐рдВрдЧ32.59
рддреЛрддрд╛2361
рдФрд░ рд╕рд┐рд░реНрдл рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП:
gcc -O050.09
gcc -O113.79
рдЗрд╕реА рддрд░рд╣ рдХреЗ рдкрд░реНрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо4288


рдпрд╣реА рд╣реИ, рддреЛрддрд╛ рдЖрднрд╛рд╕реА рдорд╢реАрди рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЬреАрдЯ рдорд╢реАрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 150 рдЧреБрдирд╛ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдЪрд▓рддреА рд╣реИред рд▓реЗрдХрд┐рди рдореЛрддреА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 2 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреЛрддреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдореЛрддреА рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдЖрдЬ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ ... рд╣рд╛рд▓рд╛рдВрдХрд┐, рддреЛрддрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдиреНрдп рдорд╢реАрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдЧрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЕрдВрддрд┐рдо рд░рд╛рдЧ



рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рддреЛрддрд╛ рдПрдХ _very_ рд╕реБрдЦрдж рдЫрд╛рдк рдЫреЛрдбрд╝ рдЧрдпрд╛, рд╕рдм рдХреБрдЫ рд╡рд░реНрдгрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреЛрдИ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рдереЗ, рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╕рдореБрджреНрд░ рд╣реИрдВ, рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдЕрдЪреНрдЫрд╛ рд╣реИред Llvm рдХреЗ рдмрд╛рдж рдЙрд╕ рдкрд░ рд▓рд┐рдЦрдирд╛ рдПрдХ рдЦреБрд╢реА рд╣реИред рдЗрд╕рд▓рд┐рдП рдЕрдкрдиреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдпрд╛:

Source: https://habr.com/ru/post/In102533/


All Articles