Đố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 BinaryExpression
nút có operator
giá trị là =
, Left
giá trị ReferenceExpression(x)
và Right
giá 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".