Python là một ngôn ngữ thông dịch. Phiên dịch có nghĩa là mã nguồn được dịch sang mã máy khi chương trình chạy. Nhưng đó là một sự đơn giản hóa tổng thể Show Python về cơ bản có bốn bước để chạy mã nguồn của bạn. lexer, trình phân tích cú pháp, trình biên dịch và trình thông dịch. Lexer và trình phân tích cú pháp là hiển nhiên. Nó được sử dụng để tạo cây cú pháp trừu tượng. Trình biên dịch có thể gây sốc cho hầu hết mọi người Giống như hầu hết các ngôn ngữ thông dịch khác, Python ban đầu biên dịch mã nguồn do chúng tôi viết sang định dạng trung gian $ time python3 a.py8 Mã byte là một tập lệnh cấp thấp được gọi là chứa tập lệnh có thể được giải thích bởi $ time python3 a.py9. Như bạn có thể thấy có cả trình biên dịch và trình thông dịch Nhưng lý do Python được gọi là ngôn ngữ thông dịch là vì hầu hết công việc được thực hiện bởi trình thông dịch. Có thể đọc và hiểu bytecode sẽ giúp bạn tối ưu code cũng như hiểu Python hơn Chúng tôi có một kịch bản đơn giản $ ls __pycache__/ 0def hello(): Hãy thử chạy tập lệnh $ time python3 a.py Khi bạn chạy tệp, thỉnh thoảng bạn sẽ thấy thư mục con $ ls __pycache__/ 1. Nếu bạn nhìn vào bên trong nó, bạn sẽ thấy tên tệp mã nguồn của mình với phần mở rộng $ ls __pycache__/ 2$ ls __pycache__/ Trong trường hợp bạn không nhìn thấy thư mục. Bạn có thể tự biên dịch tệp bằng CLI ________số 8_______Nếu bạn chạy lại nó, bạn sẽ thấy thời gian thực thi sẽ được cải thiện một chút vì Python không phải phân tích lại mã nguồn của chúng tôi mỗi khi nó chạy $ time python3 a.py Bạn thậm chí có thể chạy trực tiếp tệp $ ls __pycache__/ 3$ time __pycache__/hello.cpython-38.pyc Tháo rời mã byteSử dụng $ ls __pycache__/ 4 để xem nội dung của $ ls __pycache__/ 5 sẽ cung cấp cho bạn các giá trị rác. Chúng tôi có thể thấy mã byte theo nghĩa đen của mã của chúng tôi bằng cách sử dụng $ ls __pycache__/ 6 để ban đầu chuyển mã nguồn thành AST, sau đó là $ ls __pycache__/ 7. Do đó, mã được biên dịch sau này có thể được chạy bởi $ ls __pycache__/ 8 hoặc $ ls __pycache__/ 9>>> c = compile('def hello():\n\tprint("Hello World!")\nhello()', '', "exec") Ở đây, $ python3 -m compileall hello.py 0 ngụ ý rằng mã nguồn chứa nhiều câu lệnh PythonBạn có thể xem mã byte cho các giá trị đã được biên dịch bằng cách sử dụng $ ls __pycache__/ 7>>> hello.__code__.co_code Để xem $ python3 -m compileall hello.py 2 theo nghĩa đen, chúng ta có thể sử dụng $ ls __pycache__/ 7>>> c.co_code Hãy cố gắng hiểu điều này. Chúng tôi biết rằng mỗi lệnh trong Python bao gồm hai byte ở định dạng sau opcode oparg $ python3 -m compileall hello.py 4 là lệnh một byte. Trong khi $ python3 -m compileall hello.py 5 là đối số dành riêng cho hướng dẫn$ time python3 a.py0 Một điều sẽ ngay lập tức đến với bạn khi bạn thấy điều này là nó chẳng có ý nghĩa gì đối với con người chúng ta. Vì vậy, chúng tôi có một thứ gọi là $ python3 -m compileall hello.py 6, tên thân thiện với con người của $ python3 -m compileall hello.py 7. Để tìm tên, chúng ta có thể kiểm tra danh sách $ python3 -m compileall hello.py 8 trong mô-đun $ python3 -m compileall hello.py 9$ time python3 a.py1 Thay vì tổ chức opcode và oparg để xem hướng dẫn mã byte Chúng ta có thể phân tích trực tiếp đối tượng python thành dạng mã byte có thể đọc được bằng cách sử dụng mô-đun $ time python3 a.py0 $ time python3 a.py2 Ở đây, số 2 ở bên trái biểu thị số dòng đồng thuộc tínhCó rất nhiều thuộc tính quan trọng được mang bởi $ time python3 a.py1. Ví dụ $ time python3 a.py3
Có co_attributes khác mà bạn có thể kiểm tra chúng bằng cách sử dụng $ time python3 a.py4 Để biết thông tin về co_attributes, bạn có thể xem chuỗi tài liệu này $ time python3 a.py5 Bây giờ hãy quay lại opcode. Đây là hướng dẫn mà máy ảo python sẽ thực thi chức năng xin chào của chúng tôi
Như bạn có thể nhận thấy, các hướng dẫn mã byte của Python bao gồm thao tác đánh giá ngăn xếp của khung ngăn xếp cuộc gọi hiện tại. Chúng tôi sẽ nhanh chóng lướt qua máy ảo python để hiểu lý do Cần phải hiểu rằng mã byte có thể không phổ biến giữa nhiều phiên bản Python. Tôi đang sử dụng Python3. 8 cho bài viết của tôi. Bạn có thể tìm hiểu về mã byte cụ thể của phiên bản tại đây Máy ảo PythonCpython sử dụng máy ảo dựa trên ngăn xếp. Nó đơn giản và mạnh mẽ. Không có đăng ký. Thay vào đó, chúng ta có thể thêm $ time __pycache__/hello.cpython-38.pyc7 một mục vào $ time __pycache__/hello.cpython-38.pyc8 của ngăn xếp hoặc $ time __pycache__/hello.cpython-38.pyc9 mục đó từ $ time __pycache__/hello.cpython-38.pyc8. Chúng tôi có >>> c = compile('def hello():\n\tprint("Hello World!")\nhello()', '', "exec") 1 là ngăn xếp chính cho chương trình Python. Nó có một mục tên là >>> c = compile('def hello():\n\tprint("Hello World!")\nhello()', '', "exec") 2 cho mỗi lệnh gọi hàm đang hoạt động. Đáy ngăn xếp là điểm vào của chương trìnhMỗi lần gọi hàm sẽ thêm một khung mới vào ngăn xếp và mỗi khi hàm gọi trả về, nó sẽ bật lên khung. Trong Python, chúng ta có thể dễ dàng truy cập các khung này bằng mô-đun >>> c = compile('def hello():\n\tprint("Hello World!")\nhello()', '', "exec") 3$ time python3 a.py6 Thanh tra trả lại một >>> c = compile('def hello():\n\tprint("Hello World!")\nhello()', '', "exec") 4 được gọi là >>> c = compile('def hello():\n\tprint("Hello World!")\nhello()', '', "exec") 5. Nó bao gồm >>> c = compile('def hello():\n\tprint("Hello World!")\nhello()', '', "exec") 6ghi chú. Chúng tôi đang thấy >>> c = compile('def hello():\n\tprint("Hello World!")\nhello()', '', "exec") 7 vì chúng tôi đang sử dụng thiết bị đầu cuốiKhung hiện tại sẽ luôn ở trên cùng để bạn có thể truy cập khung hiện tại bằng cách sử dụng >>> c = compile('def hello():\n\tprint("Hello World!")\nhello()', '', "exec") 8$ time python3 a.py7 Bạn có thể nhận thêm thông tin về khung bằng các thuộc tính đối tượng khung. để biết thêm thông tin tham khảo tại đây Phần kết luậnĐể bài viết ngắn gọn, chúng tôi xin kết thúc tại đây. Còn rất nhiều thứ còn lại nhưng với chừng này bạn có thể bắt đầu khám phá mã byte python Học cách đọc và viết mã byte Python sẽ giúp bạn hiểu Python hơn và giúp bạn tối ưu hóa mã của mình Ngoài ra, đây là bước khởi đầu để hiểu cách thức hoạt động của máy ảo. Điều này là dành cho hôm nay. Tôi đã thêm các liên kết hữu ích để học thêm Bạn sẽ thấy mã byte của chương trình Python như thế nào?Bạn có thể sử dụng danh sách này. opname để tra cứu tên của các lệnh mã byte từ các giá trị byte thập phân của chúng nếu bạn muốn thử phân tách một hàm theo cách thủ công.
Mã byte Python là gì?Bytecode là ngôn ngữ trung gian cho máy ảo Python được sử dụng để tối ưu hóa hiệu suất . Thay vì thực thi trực tiếp mã nguồn mà con người có thể đọc được, các mã số nhỏ gọn, hằng số và tham chiếu được sử dụng để biểu thị kết quả phân tích cú pháp trình biên dịch và phân tích ngữ nghĩa.
Mã byte là gì?Trong hầu hết các hệ thống máy tính, byte là đơn vị dữ liệu dài tám chữ số nhị phân . Một byte là đơn vị mà hầu hết các máy tính sử dụng để biểu thị một ký tự như chữ cái, số hoặc ký hiệu chính tả. Mỗi byte có thể chứa một chuỗi bit cần được sử dụng trong một đơn vị lớn hơn cho mục đích ứng dụng.
Ví dụ mã byte là gì?Các loại mã byte khác nhau sử dụng cú pháp khác nhau, có thể được đọc và thực thi bởi máy ảo tương ứng. Một ví dụ phổ biến là Java bytecode, được biên dịch từ mã nguồn Java và có thể chạy trên Máy ảo Java (JVM) |