2016-09-04 26 views
6

Tôi đã đọc rằng thông dịch viên chạy dòng mã bằng dòng và báo cáo lỗi nếu có bất kỳ lúc nào và ngừng thực hiện thêm. Vì vậy, trong python, hãy xem xét các tập tin ex1.py,Trình thông dịch python chạy dòng mã theo dòng trong mã sau đây như thế nào?

print "Hello world" 
12variable = 'bye' 
print 12variable 

Bây giờ theo sự vận hành của phiên dịch, người phiên dịch sẽ chạy dòng đầu tiên tức là nó in hello world đầu tiên và sau đó hiển thị các lỗi cú pháp trong các dòng tiếp theo (dòng -by-line làm việc). Do đó sản lượng dự kiến ​​là:

Hello world 
12variable = 'bye' 
     ^
SyntaxError: invalid syntax 

Nhưng sản lượng thực tế là -

12variable = 'bye' 
     ^
SyntaxError: invalid syntax 

Tại sao nó không phải là in Hello World tại là người đầu tiên?

+0

Bạn đã đọc nội dung đó ở đâu? –

+0

Tôi đã đọc về nó ban đầu trong cuốn sách cơ bản về máy tính của tôi. – dlp96

Trả lời

5

Tùy thuộc vào cách bạn chạy trình thông dịch Python. Nếu bạn cung cấp cho nó một tệp nguồn đầy đủ, nó sẽ phân tích cú pháp toàn bộ tệp và chuyển đổi nó thành bytecode trước khi thực hiện bất kỳ lệnh nào. Nhưng nếu bạn ăn nó từng dòng, nó sẽ phân tích và thực thi mã khối của khối:

  • python script.py: phân tích đầy đủ tập tin
  • python < script.py: phân tích và thực hiện bởi khối

Các sau này thường là cách bạn sử dụng nó tương tác hoặc thông qua một vỏ GUI như idle.

2

Vì hiểu biết của bạn về trình thông dịch bị lỗi. Mặc dù hành vi bạn đang mô tả xảy ra cho một tập hợp con lỗi nhưng nó không phải là trường hợp phổ biến đối với nhiều lỗi (nhiều nhất?).

Nếu thông dịch viên có thể xây dựng những gì nó nghĩ là một chương trình hợp lệ nhưng có một lỗi tại thời gian chạy sau đó những gì bạn đang mô tả sẽ xảy ra.

Vì trường hợp bạn đang trỏ đến là lỗi cú pháp ngăn chương trình hợp lệ được tạo nên hành vi như bạn thấy.

+0

Điều đó có nghĩa là thông dịch viên thực hiện dòng mã bằng dòng? Nó có nghĩa là nó phân tích một dòng tại một thời điểm và thực thi dòng hoặc nó chỉ phân tích một dòng tại một thời điểm và nếu không có bất kỳ lỗi cú pháp nào, nó sẽ chuyển sang dòng tiếp theo để phân tích cú pháp và sau đó phân tích toàn bộ tệp. bytecode cung cấp rằng không có bất kỳ lỗi nào trong bất kỳ dòng nào? – dlp96

+1

Nó phân tích toàn bộ chương trình. Nếu nó gặp một lỗi ngăn chặn bytecode hợp lệ được tạo ra thì nó ném một lỗi ở giai đoạn đó và không có dòng nào của chương trình được chạy. Nếu nó quản lý để xây dựng những gì nó tin là một phiên bản bytecode hợp lệ của chương trình thì nó chạy chương trình. Nếu một lỗi thời gian chạy gặp phải sau đó nó ném một lỗi và ngừng thực hiện chương trình tại dòng lỗi gặp phải. – jwpfox

5

Đó là một huyền thoại rằng Python là một ngôn ngữ được diễn giải đầy đủ. Khi CPython chạy một kịch bản mã nguồn được phân tích cú pháp (đây là nơi nó sẽ bắt lỗi cú pháp) và được biên dịch thành bytecode (đôi khi chúng được lưu trữ trong thư mục của bạn dưới dạng tệp .pyc) trước khi bất kỳ điều gì được thực thi. Về vấn đề này Python không phải là tất cả về cơ bản khác với Java hoặc C# khác hơn là nó không dành nhiều thời gian thực hiện bất kỳ tối ưu nào, và tôi tin bytecode được diễn giải một lệnh tại một thời điểm, thay vì được JIT thành mã máy (trừ khi bạn đang sử dụng một cái gì đó giống như PyPy).

0

Tôi hiểu nó theo cách đó:

Python chạy các dòng mã của dòng sau nó trong trạng thái mã byte.

Sự khác biệt giữa điều này và biên dịch (bằng các ngôn ngữ khác như C++) là bạn phải thực hiện quá trình diễn giải này mỗi khi bạn chạy tập lệnh.

Trình thông dịch Python diễn giải mã mỗi khi bạn chạy tập lệnh.

Trong C++ bạn biên dịch chương trình và bạn có thể thực thi chương trình mà không phải biên dịch lại trừ khi bạn muốn thay đổi hệ thống.

Các vấn đề liên quan