
Mesin tumpukan digunakan dalam berbagai bahasa pemrograman modern. Mereka mudah dimengerti dan pada saat yang sama cukup efektif. Ingin mencoba tindakan seperti itu?
Kalian semua, mungkin, pernah mendengar bahwa nama panggilan 1C mengeluh tentang sistem mereka, mengingat bahasa 1C tidak cukup rendah, membosankan, dll. Semua dari mereka melihat ke arah bahasa pemrograman "nyata". Jadi, tuan-tuan, mereka salah. Dalam sistem 1C ada tempat di mana Anda dapat meregangkan otak programmer dan menikmati teknologi tingkat rendah. Saya sarankan Anda menyelam ke dalam mesin virtual 1C dan memahami cara kerjanya. Ini memiliki "assembler" sendiri dan hari ini kita akan menulis kode kerja untuk 1C di atasnya. Di bawah luka, itu akan menyenangkan!
Mesin Virtual Tertumpuk
Bahasa pemrograman dinamis semakin menangkap dunia. Dari bahasa asli "jujur" di peringkat, mungkin, hanya C yang tersisa (dengan plus dan tanpa). Ini jika kita mengambil arus utama industri. Semua bahasa populer, dengan satu atau lain cara, memiliki lapisan dalam bentuk "lingkungan runtime" atau "mesin virtual", yang menyediakan eksekusi kode pada arsitektur besi tertentu. Dan sebagian besar "mesin virtual" ini ditumpuk, mis. mengimplementasikan operasi pemrosesan menggunakan struktur yang dikenal di dunia komputer sebagai "tumpukan".
(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 adalah sistem yang kompleks dan multi-layer dan sangat menarik untuk mempelajarinya. Dan semakin baik Anda mengetahui cara kerja sistem Anda, semakin efisien Anda dapat menggunakannya. Hari ini kami memeriksa cara kerja mesin virtual 1C dan, semoga, memperluas cakrawala teknis kami. Yah, dan selain itu, kami mendapatkan mainan konstruksi, karena bermain dengan assembler sangat menyenangkan!
Semoga sukses kreatif!