[JAVA] Bibliothèque de compilateur Kinx Library-JIT (édition supplémentaire)

Bibliothèque Kinx-JIT Library (édition supplémentaire)

introduction

** "Ressemble à JavaScript, le cerveau (contenu) est Ruby, (la stabilité est AC / DC)" ** Langage de script Kinx ). Cette fois, c'est l'édition supplémentaire de la bibliothèque JIT.

Il s'agit d'une fonction nouvellement ajoutée à la bibliothèque JIT introduite dans Ici.

J'ai ajouté une fonction pour exécuter du code binaire arbitraire dans JIT Library. Pour ceux qui veulent vraiment un contrôle précis. Cela dépend fortement de l'architecture. Et il est facile de planter.

échantillon

Le premier est un échantillon.

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

À propos, c'est une fonction qui renvoie simplement la valeur numérique donnée par l'argument, et comme il n'y a pas de registre à détruire, il n'y a pas de prologue ou d'épilogue, et la valeur qui est arrivée au premier argument est définie sur la valeur de retour (rax) et ret est exécuté. C'est juste pour toi.

System.PLATFORM

Le System.PLATFORM est utilisé pour isoler x64 et Windows ou non Windows. Il est gênant de devoir séparer cela avec un assembleur brut. Cependant, vous pouvez pleinement profiter du parfum dangereux et sucré de ** vous pouvez tout faire **.

Sous Windows, le premier argument vient dans le registre rcx car il est basé sur la convention d'appel de Microsoft. En revanche, la convention d'appel System V, qui est principalement adoptée par des non-Microsoft, place le premier argument dans le registre rdi.

Ce qui est spécifiquement renvoyé par System.PLATFORM est ...

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"

est.

Ce que tu ne devrais pas faire

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 ... C'est dangereux.

en conclusion

En un mot, c'est comme ** «Prenez vos risques». **. Cependant, je ne pense pas qu'il y ait beaucoup de langages de script qui entrent dans ce genre d'endroit, donc cela peut en valoir la peine. Par exemple, si vous avez cette bibliothèque, Xbyak semble être portable! Kinx a également des remplacements d'opérateurs (non appelés surcharges).

JIT devient de plus en plus familier.

à plus.

Recommended Posts

Bibliothèque de compilateur Kinx Library-JIT (édition supplémentaire)
Bibliothèque de compilateur Kinx Library-JIT
Combinateur bibliothèque-analyseur Kinx (édition supplémentaire)
Bibliothèque Kinx - REPL
Bibliothèque Kinx --Obtenir
Bibliothèque Kinx --DateTime
Bibliothèque Kinx - Processus
Essayons Zoomdata (édition supplémentaire)