
Stapelmaschinen werden in einer Vielzahl moderner Programmiersprachen eingesetzt. Sie sind leicht zu verstehen und gleichzeitig sehr effektiv. Möchten Sie eine solche in Aktion ausprobieren?
Sie alle haben wahrscheinlich gehört, dass sich 1C-Spitznamen über ihr System beschweren, da die 1C-Sprache nicht niedrig genug, langweilig usw. ist. Alle schauen sehnsüchtig auf die "echten" Programmiersprachen. Also, meine Herren, sie liegen falsch. Im 1C-System gibt es Orte, an denen Sie das Gehirn des Programmierers dehnen und die Low-Level-Technologie genießen können. Ich schlage vor, Sie tauchen in die Eingeweide der virtuellen 1C-Maschine ein und verstehen, wie sie funktioniert. Es hat einen eigenen "Assembler" und heute werden wir Arbeitscode für 1C darauf schreiben. Komm unter den Schnitt, es wird Spaß machen!
Gestapelte virtuelle Maschinen
Dynamische Programmiersprachen erobern zunehmend die Welt. Vielleicht war nur noch C von den "ehrlichen" Muttersprachen in den Reihen übrig (mit und ohne Pluspunkte). Dies ist, wenn wir den industriellen Mainstream nehmen. Alle gängigen Sprachen haben auf die eine oder andere Weise eine Schicht in Form einer "Laufzeitumgebung" oder einer "virtuellen Maschine", die die Codeausführung auf einer bestimmten Eisenarchitektur ermöglicht. Und die überwiegende Mehrheit dieser "virtuellen Maschinen" ist gestapelt, d.h. Implementieren von Verarbeitungsoperationen unter Verwendung einer solchen Struktur, die in der Computerwelt als "Stapel" bekannt ist.
(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 ist ein komplexes und mehrschichtiges System und es ist äußerst interessant, es zu untersuchen. Und je besser Sie wissen, wie Ihr System funktioniert, desto effizienter können Sie es nutzen. Heute haben wir untersucht, wie die virtuelle 1C-Maschine funktioniert, und hoffentlich unseren technischen Horizont erweitert. Nun, und außerdem haben wir ein Konstruktionsspielzeug in die Hände bekommen, weil das Spielen mit dem Assembler ziemlich lustig ist!
Ich wünsche Ihnen kreativen Erfolg!