
Las máquinas apiladoras se utilizan en una amplia variedad de lenguajes de programación modernos. Son fáciles de entender y al mismo tiempo bastante efectivos. ¿Quieres probar uno de estos en acción?
Probablemente todos ustedes hayan escuchado que los apodos 1C se quejan de su sistema, considerando que el lenguaje 1C no es lo suficientemente bajo, aburrido, etc. Todos ellos miran ansiosamente hacia los lenguajes de programación "reales". Entonces, caballeros, están equivocados. En el sistema 1C hay lugares donde puedes estirar el cerebro del programador y disfrutar de la tecnología de bajo nivel. Le sugiero que se sumerja en las entrañas de la máquina virtual 1C y entienda cómo funciona. Tiene su propio "ensamblador" y hoy escribiremos código de trabajo para 1C en él. Ven debajo del corte, ¡será divertido!
Máquinas virtuales apiladas
Los lenguajes de programación dinámicos están capturando cada vez más el mundo. De los idiomas nativos "honestos" en las filas, tal vez, solo quedó C (con más y sin más). Esto es si tomamos la corriente principal industrial. Todos los lenguajes populares, de una forma u otra, tienen una capa en forma de "entorno de tiempo de ejecución" o "máquina virtual", que proporciona la ejecución de código en una arquitectura particular de hierro. Y la gran mayoría de estas "máquinas virtuales" están apiladas, es decir implementar operaciones de procesamiento utilizando una estructura conocida en el mundo de la informática como la "pila".
(Stack) "". (, ) - , . . .. . "LIFO" — last in/first out. ( ). — .
Java, Python, C# 1 — . , node.js — , , . 95% , . JIT , , ? :)
, , . , — , -, . , . , — , . Java — . , . , , Java JVM — . ( ) Dalvik. , , . — , . , , , ( ) , , .
1 . — 1, — , 1Script. , .
. 2014 , .
, = 1 + 1; ?
PushConst 1
PushConst 1
Add
LoadVar A
- 1 (2 ), Add.
Add
(2 ) . . LoadVar
, ( — ).
. , = 1+1+2 :
PushConst 1 ;
PushConst 1 ;
Add ; 2 (1 1), ,
PushConst 2 ;
Add ; 2 (2 2), ,
LoadVar A ; , (4) .
, , , : - - .
, , "-". "" .
- 1
, 1 - , , , . , , - - — . , 1 - . , , epf . v8unpack.
1. , .
epf. , chocolatey
choco install v8unpack --version 3.0.41 --source https://www.myget.org/F/onescript/api/v2
, chocolatey (, , ?) https://github.com/e8tools/v8unpack/releases/download/v.3.0.40/v8unpack.exe exe PATH, .
, 1, , .
v8unpack -P .epf content
content, 1 ( — : https://infostart.ru/public/250142/)
, "<--GUID>.0", "info" "text". "text" , , . content . "" " ". , .

, ? , content
v8unpack -P .epf content
GUID.0 , image, text — - . , , - , ? 1 - image. :

— 1. , . , ? , ! ? , !
?
, -, , , . .
-, , - 1 , . 1-, , . " 1" , . , , , 1. . , ?
. , , , .. . . , 1 . , , ( ) " ", " 1" — , .
, . , . - -, 1 . , .
: , ( , ), , , .
, ?
- 1, . - .
, v8unpack "" "image", .

, , , 1.
""
(). — . (OpCode), . , . . , , . ( ). , , — : .
? 1 128, , . .
""
. - , — , — . " ", . .. - , , / . , / . , .
. , , "". " = 2" 1 . . " - ".
""
1 ( ) . - ( ). , . . "", ( ) , .

-?
. — , — , . 2 1.
2. 0 .
2 2 :
LdConst 0
LdConst 0
Add 0
! : , - , Ld "Load". , .
LdConst , ( , 0 ). , . — .
, 2 ( — )
— . , , , Add 0. 2 1 ( ).
, "" .
, , .
, !
, "Hello World".
"" "" :

" " "" , .
, " "

, "" :
LdConst 0
ArgNum 1
CallLoc 0
End 0
"". , -

?
"" " " v8unpack . 1- . " " "". .
. .
= 8;
= + 2;
= - ;
: -, 8 2 "" . 0, — 1. , , . .
LdVar. , . , :
LineNum 1 ;
LdVar 0 ; 0 ()
LdConst 0 ; 0 ( 8)
Assign ; - , .
LineNum 2 ;
LdVar 1 ; 1 ()
LdVar 0 ; 0 ()
LdConst 1 ; 1 ( 2)
Add ; 2 , (+2)
Assign ; - , ( = (+2)).
LineNum 3 ;
LdVar 2 ; 2 ()
LdVar 1 ; 1 ()
LdVar 0 ; 0 ()
Sub; . 2 ,
Assign; = (-)
End;
, , , , . , LineNum? , , , . . , , " , " . , LineNum. , , , .
. -, , . ( ) . :
. "" . 0.
, LineNum. "" 1 .
LdConst 0; -
ArgNum 1;
CallLoc 0; 0.
, ArgNum. — . , . , .
, ( ), , — - . Assign, . 2 . . LdRet. , , . , Ret, . LdRet — . , . . 1Script "" .
, , . . , . Jmp. , Jmp . . , , 1. - — , .
, , 1 . , " " , — . = , " " . :
() = ("") . = 2
2 : . 1 . , , . , " " .
, . , . 2 — And Or . , , .
, "" , , , .. , .. . ( ). , , , .. , ).
2 : JmpTrue JmpFalse. ( ), , , . , JmpTrue 1 . .. , JmpTrue, , .. 1 (trollface) , 1Script JmpTrue .
? 0 1, 0 1
0: LdVar 0 ;
1: LdConst 0 ; 1
2: Cmp ; ( )
3: JmpFalse 6 ; 6,
4: IF ;
5: IF ;
6: … ;
— . — .
3 : "", "… " " … ". "" , .
"… " " ", , . , , . Gte (--) JmpFalse . , "".
" "
. — , Next()
Iter, Next , . , … , , 1 , , .
. , , :
()
.();
;
, "" 0, "" 1. , , "0", . , ? , :)
? , :
PutTmp ;
LdTmp ;
( 0)
LdLoc 0 ;
, , .
Iter ; -.
Assign ; Tmp
, :
5. Assign, 2 — . .
:
LdLoc 2 ; 0
LdTmp 0 ;
Assign; 0
LdLoc 2; 0
Next;
JmpFalse 26 ; - .
Next. , (0), , , , , . JmpFalse .
, JmpFalse 0
, . 0
, 0
— .
…
- . 19-23 . 25 — Jmp , 26 — .
27- 32-. 0
, - 2 . ,
, … , +3 , 0
. , , …
, 1Script :
0 :(LineNum 3)
1 :(PushLoc 0)
2 :(PushIterator 0)
3 :(LineNum 3)
4 :(IteratorNext 0)
5 :(JmpFalse 12)
6 :(LoadLoc 1)
7 :(LineNum 4)
8 :(PushLoc 1)
9 :(ArgNum 0)
10 :(ResolveMethodProc 0)
11 :(Jmp 3)
12 :(StopIterator 0)
13 :(PushConst 1)
14 :(Return 0)
15 37. , .. , . , 1Script 1. .
, , , . ? , , . , .
? , , , "" "".
- , 1 . BlckEnd Jmp . , BlckEnd — - . BlckEnd 0.
. "" BlckEnd, .
2;
.. "" — BlckEnd 0, "" — BlckEnd < >. , " " ,
, .. "" " ".
-
BeginTry, . .. . , , BlckEnd <> Jmp ;
:
()
;
;
;
0: BeginTry 4 ; Cmd
1: LineNum 6 ;
2:BlckEnd 1 ; 1
3:Jmp 6 ;
4:LineNum 6 ; :
5:EndTry 0 ; ( )
6:LineNum 7 ; :
7:End 0 ; (, )
8:End 0 ; (, )
9:End 0 ; (, )
. BeginTry , , ( ).
( ), BlckEnd ( 2-3). EndTry.
, , . .
? , ? , "" "". image -, , v8unpack epf.
, .
: . , . , (-) , ? , " " :
= .();
.()
(.);
;
, , " " "-()". 1 , 1 , !
. "" "" . , "" — . :
"". "". ? , "(())" "". - -. ? — !
(dmpas), , :)
Disclaimer
, , . , , 1 . , . "" . , . . , "" , .
1C es un sistema complejo y de múltiples capas y es extremadamente interesante estudiarlo. Y cuanto mejor sepa cómo funciona su sistema, más eficiente podrá usarlo. Hoy examinamos cómo funciona la máquina virtual 1C y, con suerte, ampliamos nuestros horizontes técnicos. Bueno, y además, tenemos en nuestras manos un juguete de construcción, ¡porque jugar con ensamblador es muy divertido!
¡Te deseo éxito creativo!