Dịch ngược mã máy Python: import

Tiếp loạt bài về CPython compiler

img

 rand.py 
     1  import random
     2  do = random.choice(['an', 'ngu'])
     3  print(do)
     4
     5  from datetime import timedelta
     6  print("Mot ngay co: {}s".format(timedelta(days=1).total_seconds()))
     7
     8  from math import *
     9  print(factorial(5))

3 kiểu import trong Python. Chạy dis:

#  python3 -m dis rand.py
  1           0 LOAD_CONST               0 (0)
              2 LOAD_CONST               1 (None)
              4 IMPORT_NAME              0 (random)
              6 STORE_NAME               0 (random)

  2           8 LOAD_NAME                0 (random)
             10 LOAD_METHOD              1 (choice)
             12 LOAD_CONST               2 ('an')
             14 LOAD_CONST               3 ('ngu')
             16 BUILD_LIST               2
             18 CALL_METHOD              1
             20 STORE_NAME               2 (do)

  3          22 LOAD_NAME                3 (print)
             24 LOAD_NAME                2 (do)
             26 CALL_FUNCTION            1
             28 POP_TOP

  5          30 LOAD_CONST               0 (0)
             32 LOAD_CONST               4 (('timedelta',))
             34 IMPORT_NAME              4 (datetime)
             36 IMPORT_FROM              5 (timedelta)
             38 STORE_NAME               5 (timedelta)
             40 POP_TOP

  6          42 LOAD_NAME                3 (print)
             44 LOAD_CONST               5 ('Mot ngay co: {}s')
             46 LOAD_METHOD              6 (format)
             48 LOAD_NAME                5 (timedelta)
             50 LOAD_CONST               6 (1)
             52 LOAD_CONST               7 (('days',))
             54 CALL_FUNCTION_KW         1
             56 LOAD_METHOD              7 (total_seconds)
             58 CALL_METHOD              0
             60 CALL_METHOD              1
             62 CALL_FUNCTION            1
             64 POP_TOP

  8          66 LOAD_CONST               0 (0)
             68 LOAD_CONST               8 (('*',))
             70 IMPORT_NAME              8 (math)
             72 IMPORT_STAR

  9          74 LOAD_NAME                3 (print)
             76 LOAD_NAME                9 (factorial)
             78 LOAD_CONST               9 (5)
             80 CALL_FUNCTION            1
             82 CALL_FUNCTION            1
             84 POP_TOP
             86 LOAD_CONST               1 (None)
             88 RETURN_VALUE

import random sẽ dùng BYTECODE IMPORT_NAME, random sẽ trở thành 1 name trong module này, được chứa STORE_NAME tương tự khi đặt x = 5. Để gọi random.choice, đầu tiên phải LOAD_NAME random rồi LOAD_METHOD choice.

Code from datetime import timedelta, chạy IMPORT_NAME datetime, nhưng không STORE_NAME này mà IMPORT_FROM timedelta rồi STORE_NAME timedelta.

Code from math import * sử dụng BYTECODE IMPORT_STAR.

Chú ý khi gọi random.choice thì BYTECODECALL_METHOD do choice gắn liền vào random - xem như 1 method của 1 module object, nhưng khi gọi factorial đã from math import * thì BYTECODECALL_FUNCTION.

Đăng ký ngay tại PyMI.vn để học Python tại Hà Nội TP HCM (Sài Gòn), trở thành lập trình viên #python chuyên nghiệp ngay sau khóa học.