Nous avons vu dans les sections précédentes que python générait des fichiers précompilés. Précompilés, ca veut dire quoi ? Contrairement à un langage compilé qui génère du code directement compréhensible par le processeur de votre ordi, le code précompilé est compréhensible par un processeur virtuel. D'ou le nom “machine virtuelle” que l'on retrouve en Java, .NET, et oui, donc, en python.
Donc, la première fois que python tente d'exécuter un code stocké dans un fichier py, hop, il nous génère une petit “assembly” python dans un fichier .pyc. Il y a aussi sa petite soeur optimisée .pyo.
Dans nos modules jb, et martin, nous pouvons ainsi nous amuser à aller voir le code (puisque vous vous ennuyez) ainsi généré. Pour cela ;
import dis import jb dis.dis(jb.bourrin)
Disassembly of generer_guid:
5 0 LOAD_GLOBAL 0 (input)
3 LOAD_CONST 1 ('Saisir le nombre de guid a generer svp :\n')
6 CALL_FUNCTION 1
9 STORE_FAST 1 (nb)
6 12 LOAD_GLOBAL 1 (type)
15 LOAD_FAST 1 (nb)
18 CALL_FUNCTION 1
21 LOAD_GLOBAL 2 (int)
24 COMPARE_OP 2 (==)
27 JUMP_IF_FALSE 44 (to 74)
30 POP_TOP
7 31 SETUP_LOOP 41 (to 75)
34 LOAD_GLOBAL 3 (range)
37 LOAD_FAST 1 (nb)
40 CALL_FUNCTION 1
43 GET_ITER
44 FOR_ITER 23 (to 70)
47 STORE_FAST 2 (i)
50 LOAD_GLOBAL 4 (str)
53 LOAD_GLOBAL 5 (uuid)
56 LOAD_ATTR 6 (uuid4)
59 CALL_FUNCTION 0
62 CALL_FUNCTION 1
65 PRINT_ITEM
66 PRINT_NEWLINE
67 JUMP_ABSOLUTE 44
70 POP_BLOCK
71 JUMP_FORWARD 1 (to 75)
74 POP_TOP
75 LOAD_CONST 0 (None)
78 RETURN_VALUE
Pour ceux qui se sont déjà frottés à du langage assembleur, on peut reconnaître des instruction très bas niveau ; pas celle de notre processeur, mais celles de la machine virtuelle python : (LOAD_CONST, PRINT_ITEM, RETURN_VALUE…) ainsi que ces opérandes.