Python Runtime thực sự hoạt động như thế nào?


26

Tôi có một số vấn đề trong việc hiểu khái niệm về a runtime library, đặc biệt là Python. Vì vậy, tôi đã viết một số chương trình python hello world và có ý định thực hiện nó, vì vậy tôi viết python ./hello_world.py.

Những bước nào xảy ra giữa tôi nhấn nút Enter và mã máy được tạo từ mã python của tôi đang được thực thi trên CPU của tôi? Và làm thế nào điều này liên quan đến hệ thống thời gian chạy và / hoặc thư viện Python?


Hai luồng này cung cấp một cái nhìn sâu sắc tuyệt vời về thời gian chạy Python - Python được giải thích, hoặc được biên dịch, hoặc cả hai? & Python có được giải thích (như Javascript hay PHP) không? . Thư viện thời gian chạy và thời gian chạy không giống nhau. Ánh xạ nó đến thế giới .NET mà tôi biết - Thời gian chạy ngôn ngữ chung (CLR) và Thư viện khung / lớp cơ sở (FCL / BCL) không giống nhau.
RBT

Câu trả lời:


33

Đối với sự đa dạng như chúng, có một số khái niệm phổ biến mà tất cả các ngôn ngữ lập trình hiện đại, nghiêm túc đều chia sẻ. Hai trong số đó là cốt lõi của câu trả lời cho câu hỏi của bạn ở trên.

Những bước nào xảy ra giữa tôi nhấn nút Enter và mã máy được tạo từ mã python của tôi đang được thực thi trên CPU của tôi?

Mã được phân tích cú pháp, phân tích và đưa vào một trình thông dịch. Đây là tất cả về một lĩnh vực rất quan trọng của khoa học máy tính được gọi là lý thuyết trình biên dịch . Trình biên dịch là một chương trình dịch mã từ một ngôn ngữ (mã nguồn của bạn) sang ngôn ngữ khác (thường là mã máy, mặc dù "bộ chuyển mã" dịch từ ngôn ngữ cấp cao này sang ngôn ngữ khác có tồn tại). Đây là một chủ đề thực sự lớn mà bạn có thể dành nhiều năm nghiên cứu, nhưng đây là phiên bản cơ bản:

Trình biên dịch bắt đầu với một trình phân tích cú pháp , một thói quen đọc mã nguồn của bạn và áp dụng các quy tắc cú pháp của ngôn ngữ cho nó để tìm hiểu xem nó có nghĩa là mã Python hợp lệ (trong trường hợp của bạn) hay không. Nếu không, trình phân tích cú pháp sẽ đưa ra một lỗi và trình biên dịch sẽ giải cứu, nhưng nếu có, trình phân tích cú pháp sẽ đưa ra cái gọi là Cây cú pháp trừu tượng hoặc viết tắt là AST. AST là một cấu trúc dữ liệu cây mà mỗi nút chứa một phần tử của cú pháp. Ví dụ: nếu bạn nói x = 5, bạn có thể kết thúc bằng một BinaryExpressionnút có operatorgiá trị là =, Leftgiá trị ReferenceExpression(x)Rightgiá trị là IntegerLiteralExpression(5). Toàn bộ chương trình của bạn có thể được đại diện bởi một cây lớn như thế này.

Khi trình phân tích cú pháp tạo ra AST, giai đoạn thứ hai là phân tích ngữ nghĩa . Trong tiếng Anh đơn giản, điều này có nghĩa là "tìm hiểu ý nghĩa của AST này." Nó kiểm tra AST để xác định xem bạn đã làm bất cứ điều gì bất hợp pháp mặc dù đó là một phân tích hợp lệ, (ví dụ: cố gắng gọi hàm 1 đối số với 3 đối số) và sẽ phát sinh lỗi nếu bạn làm như vậy. Mặt khác, nó phân tích AST và thực hiện các chỉnh sửa để làm cho máy dễ hiểu hơn.

Giai đoạn thứ ba là tạo mã. Khi bạn đã có một AST hợp lệ, được đơn giản hóa, được phân tích đầy đủ, bạn đưa nó vào trình tạo, nó đi theo AST và tạo mã bằng ngôn ngữ đầu ra. Đây là thành phẩm của bạn.

Với Python, nó sử dụng trình thông dịch chứ không phải trình biên dịch. Trình thông dịch hoạt động chính xác giống như trình biên dịch, với một điểm khác biệt: thay vì tạo mã, nó tải đầu ra trong bộ nhớ và thực thi trực tiếp trên hệ thống của bạn. (Các chi tiết chính xác về cách điều này xảy ra có thể khác nhau giữa các ngôn ngữ khác nhau và các thông dịch viên khác nhau.)

Và làm thế nào điều này liên quan đến hệ thống thời gian chạy và / hoặc thư viện Python?

Tất cả trừ những ngôn ngữ đơn giản nhất đi kèm với một tập hợp các chức năng được xác định trước rất quan trọng đối với một tỷ lệ lớn người dùng và người dùng sẽ khó có thể tự mình thực hiện vì lý do này hay lý do khác. Mã của họ có thể gọi vào các chức năng này mà không cần bất kỳ thư viện của bên thứ ba nào. (Ví dụ, trong Python bạn có print, mà sẽ gửi ra cho stdout. Chúc may mắn thực hiện điều đó trên! Riêng bạn) Tập hợp các chức năng thường được thu thập trong một thư viện chia sẻ rằng mã có thể gọi vào tại thời gian chạy, đó là lý do tại sao nó được biết đến như thư viện thời gian chạy ngôn ngữ, hoặc đơn giản là "thời gian chạy".


Vì vậy, mã của tôi được đưa đến một chương trình khác (hệ thống thời gian chạy Python) thực hiện tất cả những điều đó và kết thúc khi mã của tôi kết thúc (và sau khi dọn dẹp, tất nhiên)?
hg Diesel

@hg Diesel Tôi tin rằng trong trường hợp của Python, trình thông dịch là một phần của thời gian chạy. Đây không phải là trường hợp cho mọi ngôn ngữ. Tất nhiên, nhưng nó khá phổ biến trong số các ngôn ngữ được giải thích.
Mason Wheeler

5

Việc triển khai Python chuẩn là một máy ảo mã byte. Điều này có nghĩa là mã máy (opcodes từ bộ opcode của bộ xử lý của bạn) không được tạo từ chương trình của bạn. Các opcodes chỉ được chọn từ các opcodes đã được biên dịch vào máy ảo trong khi VM diễn giải mã byte.

Làm thế nào chương trình của bạn được chuyển thành mã byte ở vị trí đầu tiên là một câu hỏi hơi khác nhau, nhưng câu trả lời ngắn gọn là "thông qua biên dịch, giống như bất kỳ bản dịch ngôn ngữ đi xuống nào khác".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.