[JAVA] Kinx Library-JIT-Compiler-Bibliothek (Extra Edition)

Kinx Library-JIT Library (Extra Edition)

Einführung

** "Sieht aus wie JavaScript, Gehirn (Inhalt) ist Ruby, (Stabilität ist AC / DC)" ** Skriptsprache Kinx ). Diesmal handelt es sich um die zusätzliche Ausgabe der JIT-Bibliothek.

Dies ist eine neu hinzugefügte Funktion zur JIT-Bibliothek, die in Here eingeführt wurde.

Ich habe [JIT Library] eine Funktion zum Ausführen von beliebigem Binärcode hinzugefügt (https://qiita.com/Kray-G/items/a237f195630f3f0a91df). Für diejenigen, die wirklich Feinsteuerung wollen. Dies ist stark architekturabhängig. Und es ist leicht zu stürzen.

Stichprobe

Erstens ist eine Probe.

okay.kx


using Jit;

var code
    = System.PLATFORM == "X86_64-WIN" ? <0x48, 0x89, 0xc8, 0xc3>    // mov rax, rcx | ret
    : System.PLATFORM == "X86_64"     ? <0x48, 0x89, 0xf8, 0xc3>    // mov rax, rdi | ret
    : null;
if (code.isBinary) {
    Jit.dump(code);
    var runner = new Jit.Runner(code);
    System.println(runner.run(100));
}
$ ./kinx okay.kx
       0:   48 89 f8                                    mov rax, rdi
       3:   c3                                          ret
100

Übrigens ist es eine Funktion, die einfach den durch das Argument angegebenen numerischen Wert zurückgibt, es gibt kein zu zerstörendes Register, also keinen Prolog oder Epilog, und der Wert, der zum ersten Argument kam, wird auf den Rückgabewert (rax) gesetzt und ret wird ausgeführt. Es ist nur für dich.

System.PLATFORM

Die System.PLATFORM wird verwendet, um x64 und Windows oder Nicht-Windows zu isolieren. Es ist mühsam, dies mit einem Raw-Assembler trennen zu müssen. Sie können jedoch den gefährlichen und süßen Duft von ** Sie können alles ** genießen.

Unter Windows befindet sich das erste Argument im Register "rcx", da es auf der Microsoft-Aufrufkonvention basiert. Im Gegensatz dazu stellt die System V-Aufrufkonvention, die hauptsächlich von Nicht-Microsoft übernommen wird, das erste Argument in das Register "rdi".

Was speziell von "System.PLATFORM" zurückgegeben wird, ist ...

Value Window?
"X86_32-WIN" O
"X86_64-WIN" O
"ARM_THUMB2-WIN" O
"ARM_V7-WIN" O
"ARM_V5-WIN" O
"ARM_64-WIN" O
"X86_32"
"X86_64"
"ARM_THUMB2"
"ARM_V7"
"ARM_V5"
"ARM_64"
"PPC_64"
"PPC_32"
"MIPS_32"
"MIPS_64"
"SPARC_32"
"TILEGX"
"UNSUPPORTED"

ist.

Was du nicht tun solltest

crash.kx


using Jit;
var code = <0x48, 0x31, 0xc0,   // xor rax, rax
            0x48, 0x8b, 0x00>   // mov rax, [rax]
            ;
Jit.dump(code);
var runner = new Jit.Runner(code);
System.println(runner.run());
$ ./kinx crash.kx
       0:   48 31 c0                                    xor rax, rax
       3:   48 8b 00                                    mov rax, [rax]
Segmentation fault (core dumped)

Fufufu ... Es ist gefährlich.

abschließend

Kurz gesagt, es ist wie ** "Gehen Sie Ihr eigenes Risiko ein." **. Ich glaube jedoch nicht, dass es viele Skriptsprachen gibt, die in diese Art von Ort gehen, also kann es sich lohnen. Wenn Sie beispielsweise über diese Bibliothek verfügen, scheint Xbyak portabel zu sein! Kinx verfügt auch über Operator-Overrides (nicht als Überladungen bezeichnet).

JIT wird immer vertrauter.

wir sehen uns.

Recommended Posts

Kinx Library-JIT-Compiler-Bibliothek (Extra Edition)
Kinx Library-JIT-Compiler-Bibliothek
Kinx Library-Parser Combiner (Extra Edition)
Kinx-Bibliothek --REPL
Kinx-Bibliothek - Getopt
Kinx Library --DateTime
Kinx Library - Prozess
Versuchen wir Zoomdata (Extra Edition)