рд╕реА рдореЗрдВ рд▓рд┐рдореНрдмреЛ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╡рд┐рдХрд╛рд╕ (рднрд╛рдЧ 1)

рд╕реА рдореЗрдВ рд▓рд┐рдЦреЗ рд▓рд┐рдореНрдмреЛ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрднреА-рдХрднреА рдУрдПрд╕ рдЗрдиреНрдлрд░реНрдиреЛ рдбреНрд░рд╛рдЗрд╡рд░ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗ рдУрдПрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрдорддреМрд░ рдкрд░ рдЗрдирдлрд░реНрдиреЛ рдореЗрдВ рд▓рд┐рдореНрдмреЛ рдореЗрдВ рдЧрд╛рдпрдм рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддреА рд╣реИ (рдореМрдЬреВрджрд╛ 3-рдкрд╛рд░реНрдЯреА рд╕реА / рд╕реА ++ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрдЬрдмрд╛рди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд┐рд╕рдХрд▓реНрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдпрд╛ рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдирд┐рдЪреЛрдбрд╝рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ (рдореЗрд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЕрдВрддрд░) рдЬреЗрдЖрдИрдЯреА рдФрд░ рд╕реА рдХреЗ рд╕рд╛рде рд▓рд┐рдореНрдмреЛ рдХреЗ рдмреАрдЪ рдХреА рдЧрддрд┐ рд▓рдЧрднрдЧ 1.3-1.5 рдЧреБрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред

рд╕рд╛рдордЧреНрд░реА



рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░реЗрдВ


рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрдиреНрдлрд░реНрдиреЛ рдХреЗ рдкрд╛рд╕ рд╕реА рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реАрдзреЗ рдУрдПрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред (рдпрд╣ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж рдЗрдиреНрдлрд░реНрдиреЛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЖрд╡рд╢реНрдпрдХ рдЖрдВрд╢рд┐рдХ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд▓рдЧрднрдЧ 10 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВред)

рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: libinterp/mkfile , module/runt.m , emu/Linux/emu рдФрд░ emu/Linux/emu-g ред рдФрд░ рдЪреВрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛ рдореЙрдбреНрдпреВрд▓ рд╕рдорд╛рди рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╕рдорд╛рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдирдЬрд╛рди рдХреНрд░рдо рдореЗрдВ рдХрдИ рдРрд╕реЗ рдореЙрдбреНрдпреВрд▓, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣ рд╕рдХрддрд╛ рд╣реИ, рдорд╛рдирдХ patch рдХрдорд╛рдВрдб рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╡рд╣ рдПрдХ рдпрд╛ рджреЛ рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝реЗрдЧреА, рд▓реЗрдХрд┐рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдмрд╛рдж рд╕реЗ рдЙрд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдВрдкрд╛рджрди рдпреЛрдЧреНрдп рд╕реНрдерд╛рди рд╡рд╣ рджреЗрдЦрдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рднрд┐рдиреНрди рд╣реЛрдиреЗ рд▓рдЧреЗрдЧрд╛ред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкрд░реНрд▓ рдкрд░ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕реНрдХреЗрдЪ рдХрд┐рдпрд╛ - рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рд▓рд╛рдЗрди рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ
 my $MODNAME = 'CJSON'; 

рдФрд░ рд╡рд╣ рдУрдПрд╕ рдЗрдиреНрдлрд░реНрдиреЛ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдЖрдкрдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдХреЗ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдЧрд╛ред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЕрддрд┐рд░рд┐рдХреНрдд C / C ++ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЗрдиреНрдлрд░реНрдиреЛ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рддреЛ рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (C ++ рдкреБрд╕реНрддрдХрд╛рд▓рдп re2 рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрд╢реЛрдзрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг Re2 рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ -R рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдЗрд╕рд▓рд┐рдП, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдЗрд╕реЗ $INFERNO_ROOT рдореЗрдВ $INFERNO_ROOT , рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ $INFERNO_ROOT , рдореЙрдбреНрдпреВрд▓ рдирд╛рдо рдХреЛ рдЗрд╕рдореЗрдВ "рдЙрджрд╛рд╣рд░рдг" рдореЗрдВ рдмрджрд▓реЗрдВ, рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛рдПрдВред рдЕрдм (рдЧреИрд░-рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ) рдЙрджрд╛рд╣рд░рдг рдореЙрдбреНрдпреВрд▓ рдХрд░реНрдиреЗрд▓ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдпрд╣ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЗрдиреНрдлрд░реНрдиреЛ рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рджреЛ рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдБ:
  1. module/example.m
     Example: module { PATH: con "$Example"; }; 
  2. libinterp/example.c
     #include <lib9.h> #include <isa.h> #include <interp.h> #include "runt.h" #include "examplemod.h" void examplemodinit(void) { builtinmod("$Example", Examplemodtab, Examplemodlen); } 

рдФрд░ рдУрдПрд╕ рдЗрдиреНрдлрд░реНрдиреЛ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рд╢реБрд░реВ рдХрд░реЗрдВ:
 $ (cd libinterp/; mk nuke) $ rm Linux/386/bin/emu # work around "text file busy" error $ mk install 

рдЕрдм рд╣рдо рд▓рд┐рдореНрдмреЛ рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реЛрдб рдХрд░реЗрдЧрд╛, рдЬреЛ рдЕрдм рддрдХ рдХреБрдЫ рднреА рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ:
рдФрд░ рдЪрд▓рд╛рдПрдВ:
 $ emu ; limbo testexample.b ; testexample Example module loaded ; 

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдЕрд╕реЗрдВрдмрд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, module/example.m рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрд╡рд╢реНрдпрдХ C- рд╕рдВрд░рдЪрдирд╛рдПрдБ рдЙрддреНрдкрдиреНрди рдХреА рдЬрд╛рддреА рд╣реИрдВ рдЬреЛ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИрдВ - рдПрдХ рдЕрд▓рдЧ libinterp/examplemod.h - рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрдкреВрд░реНрдг рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рд╕реНрдерд┐рд░рд╛рдВрдХ, adt-shki, рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ libinterp/runt.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ) libinterp/runt.h рдЬрд┐рд╕рдореЗрдВ рд╕рднреА C- рдореЙрдбреНрдпреВрд▓ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИред рдпреЗ рджреЛ .h рдлрд╛рдЗрд▓реЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ libinterp/example.c рд╕реЗ рдЬреБрдбрд╝реА рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, OS Inferno рдХреА рдмреВрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, рдПрдХ рдмрд╛рд░ examplemodinit() рдЬреЛ рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ (рдпрджрд┐ рдХреЛрдИ рд╣реЛ) рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдбреЗрдЯрд╛ рдХреЛ examplemodinit() рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ (Inferno рдХреЛрд░ рдореЗрдВ builtinmod(тАж) рдХрд╣рдХрд░) рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ load рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рд▓рд┐рдореНрдмреЛ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ PATH builtinmod() рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣рдорд╛рд░реЗ builtinmod() рдФрд░ $ рдЙрджрд╛рд╣рд░рдг рдЫрджреНрдо-рдкрде рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдХрд╛рд░реНрдп: рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░рдирд╛


рд╕рдВрдЦреНрдпрд╛

рдЖрдЗрдП рд╕рд░рд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЬрдЯрд┐рд▓ рди рдХрд░реЗрдВред

рдЗрдиреНрдлрд░реНрдиреЛ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВред


рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ emu рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрд▓ рд░рд╣реЗ emu рдореЗрдВ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рд╕реА-рдореЙрдбреНрдпреВрд▓ рдирд╣реАрдВ рд╣реИред
 $ emu ; limbo testexample.b ; testexample Example module loaded increment(5) = 6 ; 

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рджреМрд░рд╛рди, module/example.m рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ increment() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд┐рд╡рд░рдг, рдЗрд╕рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рд░рд┐рдЯрд░реНрди рдорд╛рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд╝рд╛рдЗрд▓ libinterp/runt.h рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛:
 void Example_increment(void*); typedef struct F_Example_increment F_Example_increment; struct F_Example_increment { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; WORD i; }; 

рдореБрдЭреЗ рдЕрднреА рддрдХ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓рд╛ рд╣реИ рдХрд┐ regs рдХреНрдпрд╛ regs ; рд╕рдВрд░реЗрдЦрдг рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝реЗ рдЧрдП temps ; ret рд░рд┐рдЯрд░реНрди рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд╣реИ; рдФрд░ i рд╣рдорд╛рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ

рдкрдВрдХреНрддрд┐рдпрд╛рдВ

рд╣рдо рдПрдХрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ:
 $ emu ; limbo testexample.b ; testexample Example module loaded increment(5) = 6 Hello! ; 

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдпрд╣рд╛рдБ рд╣рдореЗрдВ libinterp/runt.h рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ:
 void Example_say(void*); typedef struct F_Example_say F_Example_say; struct F_Example_say { WORD regs[NREG-1]; WORD noret; uchar temps[12]; String* s; }; 

noret рд╕рд╛рде noret рдмрдЬрд╛рдп ret рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, say() рдлрд╝рдВрдХреНрд╢рди рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред String* рдкреНрд░рдХрд╛рд░ рд▓рд┐рдореНрдмреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ C рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдЖрдк include/interp.h struct String рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ (рдЬреИрд╕реЗ string2c() рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП string2c() рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп libinterp/string.c ред

рдЕрдиреНрдп рд▓рд┐рдореНрдмреЛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдПрдХ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: Array* , List* , рдЖрджрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рд╕рднреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк libinterp/xec.c рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ)ред

module/example.m рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд╕реНрдЯрдо adt рдХреЛ рдирд┐рдпрдорд┐рдд C- рд╢рд░реНрдореАрд▓реА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ adt рдХреЛ рдпреВрдирд┐рдпрди рдореЗрдВ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЯреБрдкрд▓реНрд╕ рдХреЛ рднреА рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, module/example.m рдмрджрд▓рддреЗ рд╕рдордп рдХреЗ рдмрд╛рдж module/example.m рдЖрдкрдХреЛ libinterp/runt.h рдХреЛ libinterp/runt.h рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реЗрдВрдмрд▓реА (рдЬреЛ рдХрд┐ рдЧрд▓рддреА рд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧреА) рдХреЛ рд╢реБрд░реВ libinterp/runt.h рд╣реЛрдЧрд╛ рдФрд░ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ рдФрд░ рдпрд╣ рд╕рдордЭреЗрдВ рдХрд┐ libinterp/example.c рдореЗрдВ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ ред

рдЕрдкрд╡рд╛рдж

рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ error() рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред рдЖрдк libinterp/raise.c рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдорд╛рдирдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдпрд╛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ libinterp/example.c рдореЗрдВ рдЕрдкрдиреА рдЦреБрдж рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдХреЗ raise.h рдХреЛ raise.h рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдмреЗрд╢рдХ, рдЕрдЧрд░ рдЖрдкрдиреЗ рдЦреБрдж рдХреЛ malloc() рдорд╛рдзреНрдпрдо рд╕реЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рд╣реИ, рддреЛ рдХреЙрд▓рд┐рдВрдЧ error() рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЗрд╕ рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдПрдХ рд░рд┐рд╕рд╛рд╡ рд╣реЛрдЧрд╛ред рдвреЗрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рдирдХ рддрд░реАрдХреЗ рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рд╡рд╕реНрддреБрдУрдВ (рдЬреИрд╕реЗ String* рдФрд░ Array* ) рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╡реИрд╕реЗ рднреА рд╡реЗ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдкрд╛рдП рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рд╣рдЯрд╛рдП рдЬрд╛рдПрдВрдЧреЗред ( рднрд╛рдЧ 2 рдореЗрдВ рдвреЗрд░ рдФрд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдХреЗ рдХрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ)

рд╡рд╛рдкрд╕реА рд▓рд┐рдВрдХ

рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддреЗ рд╕рдордп рдПрдХ рдирд┐рд╣рд┐рдд рдХреНрд╖рдг рдЗрд╕ рддрдереНрдп рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ *f->ret рдореЗрдореЛрд░реА рд╕реЗрд▓ рдореЗрдВ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ *f->ret рдкреЙрдЗрдВрдЯреНрд╕ рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЙрд╕рдХреЗ рд╕рдлрд▓ рд╕рдорд╛рдкрди рдХреЗ рдмрд╛рдж рд╕реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд╕реЗ рджреЛ рдкрд░рд┐рдгрд╛рдо рд╕рд╛рдордиреЗ рдЖрддреЗ рд╣реИрдВ:
  1. рдпрджрд┐ рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ *f->ret рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рд╣реИ рдФрд░ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдВ, рддреЛ рдХреБрдЫ рдЕрд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд▓рд┐рдореНрдмреЛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ: рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛ рдФрд░ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдЧрд╛ред
  2. рдпрджрд┐ рд╡рд╣ рдЪрд░ рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ, рдореЗрдВ рдХреБрдЫ рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдПрдХ рд╕рдВрджрд░реНрдн рднреА рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдЪрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рдорд╛рди рдХреЗ рд╕рдорд╛рди рд╣реИ), рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдореЗрдореЛрд░реА рд╕реЗ рдореБрдХреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЖрдкрдХреЗ рд╕рд╛рде рдЗрд╕ рд▓рд┐рдВрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреИрд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИред
рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ
increment() рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 ; testexample ... catched: some error i = 6 ; 

рд╕реА-рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЛ *f->ret рд╕реЗ рдмрдЪрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ *f->ret рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреЛ рдореБрдХреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 destroy(*f->ret); *f->ret = new_value; 

рдпрд╛ рддреЛ ( H рд▓рд┐рдореНрдмреЛ-рдирд┐рд▓реНрд╕ nil рдХрд╛ рд╕реА-рд╡реЗрдВ рдПрдирд╛рд▓реЙрдЧ рд╣реИ):
 void *tmp; ... tmp = *f->ret; *f->ret = H; destroy(tmp); ... *f->ret = new_value; 

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдлрд┐рд▓рд╣рд╛рд▓ рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдбрд┐рд╕реНрдХ рдХреЛ рдХрдИ рд╕реАрдкреАрдпреВ / рдХреЛрд░ рдкрд░ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдбрд┐рд╕реНрдХ рдмреНрд▓реЙрдХ


рдЗрдиреНрдлрд░реНрдиреЛ рдЧреНрд▓реЛрдмрд▓ рдбрд┐рд╕ рд▓реЙрдХ (рд╢рд╛рдпрдж рдЕрдЬрдЧрд░ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЬреНрдЮрд╛рдд рдЬреАрдЖрдИрдПрд▓ рдХреЗ рд╕рдорд╛рди) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред C-shnyh рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рд╕ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ (рдпрд╛рдиреА, рд▓рд┐рдВрдмреЛ рд╕реЗ рд╕реБрд▓рдн рдХреЛрдИ рднреА рдорд╛рди рдФрд░ рдЪрд░ - рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рд╕реА-рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рд╕рд╣рд┐рдд) рдХреЗрд╡рд▓ рдПрдХ рд╕реЗрдЯ рд▓реЙрдХ рдХреЗ рд╕рд╛рдеред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреБрдЫ рд▓рдВрдмрд╛ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрдврд╝рдирд╛ / рд▓рд┐рдЦрдирд╛ рдпрд╛ рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ "рднрд╛рд░реА" рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдпрд╛ рдХреБрдЫ рд▓рдВрдмреА рдЧрдгрдирд╛ рдХрд░рдирд╛), рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рдСрдкрд░реЗрд╢рди рд╕реЗ рдкрд╣рд▓реЗ release() рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдбрд┐рд╕реНрдХ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ, рдФрд░ рдлрд┐рд░ acquire() рдлрд┐рд░ рд╕реЗ рдбрд╛рд▓реЗрдВ (рдЕрдиреНрдпрдерд╛, рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдФрд░ рд▓рд┐рдВрдмреЛ рдХреЛрдб рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ)ред рдПрдХ рдЙрджрд╛рд╣рд░рдг sys->read() emu/port/inferno.c рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 void Sys_read(void *fp) { ... release(); *f->ret = kread(fdchk(f->fd), f->buf->data, n); acquire(); } 


рднрд╛рдЧ реи

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


All Articles