Οι προγραμματιστές του V8 παρουσίασαν έναν απομεταγλωττιστή για το WebAssembly

Προγραμματιστές της μηχανής JavaScript V8 παρουσιάζονται χρησιμότητα wasm-decompile, το οποίο σας επιτρέπει να απομεταγλωττίσετε την ενδιάμεση δυαδική αναπαράσταση WebAssembly σε μια ευανάγνωστη ψευδογλώσσα που θυμίζει JavaScript και C. Η προτεινόμενη ψευδογλώσσα είναι πολύ πιο κατανοητή και πιο κατάλληλη για χειροκίνητη ανάλυση από την αναπαράσταση κειμένου του WebAssembly στη μορφή ".wat", η οποία είναι πιο κοντά στη γλώσσα assembly παρά σε γλώσσες υψηλού επιπέδου. Σε αυτή την περίπτωση, η αποσυμπίεση αντικατοπτρίζει την αναπαράσταση Wasm όσο το δυνατόν πληρέστερα.

Decompiler περιλαμβάνεται περιλαμβάνονται στην εργαλειοθήκη WABT, το οποίο παρέχει μετάφραση μεταξύ δυαδικών αναπαραστάσεων και αναπαραστάσεων κειμένου του WebAssembly, καθώς και ανάλυση, επεξεργασία, τροποποίηση και επαλήθευση αρχείων wasm. Η WABT αναπτύσσει επίσης ένα βοηθητικό πρόγραμμα wasm2c, το οποίο επιτρέπει στα αρχεία wasm να απομεταγλωττιστούν σε ισοδύναμο κώδικα C που μπορεί να μεταγλωττιστεί από έναν μεταγλωττιστή C, αλλά δεν διαφέρει πολύ ως προς την αναγνωσιμότητα από την αναπαράσταση κειμένου του "wat".

Για παράδειγμα, η αρχική συνάρτηση C μεταγλωττισμένη στο wasm

typedef struct { float x, y, z; } vec3;

float dot(const vec3 *a, const vec3 *b) {
επιστροφή a->x * b->x +
a->y * b->y +
a->z * b->z;
}

θα απομεταγλωττιστεί από το βοηθητικό πρόγραμμα wasm-decompile σε μια ψευδο-γλώσσα

συνάρτηση dot(a:{ a:float, b:float, c:float },
β:{ a:float, b:float, c:float }):float {
επιστροφή aa * ba + ab * bb + ac * bc
}

ενώ η μετατροπή σε μορφή κειμένου ".wat" θα μοιάζει με αυτό

(func $dot (τύπος 0) (param i32 i32) (αποτέλεσμα f32)
(f32.add
(f32.add
(f32.mul
(f32.load
(local.get 0))
(f32.load
(local.get 1)))
(f32.mul
(f32. μετατόπιση φορτίου=4
(local.get 0))
(f32. μετατόπιση φορτίου=4
(local.get 1))))
(f32.mul
(f32. μετατόπιση φορτίου=8
(local.get 0))
(f32. μετατόπιση φορτίου=8
(local.get 1))))))

Πηγή: opennet.ru

Προσθέστε ένα σχόλιο