2012-02-21 53 views
5

Nếu tôi thực hiện một JVM trong Java, ví dụ, là nó có thể làm cho việc thực hiện tôi đã thực sự nhanh hơn việc thực hiện ban đầu tôi đã sử dụng để xây dựng thực hiện này, mặc dù thực hiện của tôi được xây dựng trên đỉnh việc triển khai ban đầu và thậm chí có thể phụ thuộc vào việc triển khai đó không?Làm cách nào để triển khai ngôn ngữ có cùng ngôn ngữ nhanh hơn ngôn ngữ?

(Khó hiểu ...)

Nhìn vào PyPy. Nó là một trình biên dịch JIT cho Python được tạo bằng Python. Không sao, nhưng làm cách nào để tuyên bố là nhanh hơn so với triển khai ban đầu của Python mà nó đang sử dụng và phụ thuộc vào?

+0

Tôi không biết pyton, nhưng để thực hiện JVM trong java, bạn sẽ cần phải viết nhiều phương thức gốc bằng ngôn ngữ khác (ví dụ: C++). – vulkanino

+0

Tại sao không được chấp nhận? – Marcin

+0

Xin lỗi. Tôi chỉ làm nó để xem xét câu trả lời mới nhất cho một chấp nhận có thể. Nhìn qua câu trả lời mới ngay bây giờ, nếu tốt hơn tôi sẽ chấp nhận, nếu không tôi sẽ phản ứng trước đó. – ApprenticeHacker

Trả lời

10

Bạn đang nhầm lẫn giữa một ngôn ngữ bộ máy thực hiện cho ngôn ngữ đó.

Một trong những lý do tại sao PyPy có thể nhanh hơn CPython là vì PyPy được biên dịch thành một tệp thực thi riêng hoàn toàn riêng biệt và không phụ thuộc vào cũng như không thực thi trong CPython. Tuy nhiên, một thông dịch viên được viết bằng cùng một ngôn ngữ đó sẽ được thực hiện một cách không hiệu quả, và được lưu trữ trong trình thông dịch không hiệu quả, nếu thông dịch viên cấp cao hơn sử dụng các chiến lược thực hiện hiệu quả hơn.

7

Tuyệt đối, có thể. Việc triển khai JVM của bạn có thể biên dịch bytecode Java thành mã máy tối ưu. Nếu trình tối ưu hóa của bạn tinh vi hơn khi thực hiện JVM mà bạn chạy trình biên dịch Java của mình, thì kết quả cuối cùng có thể nhanh hơn.

Trong trường hợp đó, bạn có thể chạy trình biên dịch Java trên mã nguồn riêng của mình và hưởng lợi từ tốc độ biên dịch nhanh hơn từ đó trở đi.

Bạn nói rằng PyPy là một trình biên dịch JIT cho Python (tôi không quen với bản thân mình). Nếu đúng như vậy, nó sẽ chuyển đổi một chương trình Python thành mã máy, và sau đó chạy mã máy. Một poster khác nói rằng trình biên dịch PyPy chạy như một thực thi độc lập, tách biệt với CPython. Nhưng ngay cả khi nó đã được chạy trên CPython, một khi chương trình của bạn là JIT'd để máy mã, và mã máy biên dịch đang chạy, hiệu suất của trình biên dịch không còn quan trọng. Tốc độ của trình biên dịch chỉ có tác dụng vào thời gian khởi động.

1

Tôi không nghĩ rằng có thể triển khai thông dịch viên cho ngôn ngữ đó (gọi A), sau đó chạy nó trên một trình thông dịch hiện có khác (gọi B) cho ngôn ngữ đó và thực hiện chương trình P này, và có P chạy trên (A chạy trên B) nhanh hơn P chạy trên B.

Mọi hoạt động của A sẽ phải được thực hiện với ít nhất một phép toán B. Vì vậy, ngay cả khi B là xấu xa và A, là tối ưu tốt, thực tế là A đang được chạy trên B có nghĩa là xấu B sẽ làm chậm A. Một số điện thoại của J , nơi JIT trình biên dịch tạo ra một số mã nhanh hơn trong thời gian chạy, và có P chạy trên (A chạy trên B) nhanh hơn P chạy trên B. Phần thời gian chạy của P không phải là JIT được biên dịch sẽ chậm hơn (nhiều hơn chậm hơn, thông thường) nhưng nếu trình biên dịch JIT xác định thành công các phần "nóng" của P và thực hiện chúng nhanh hơn B thì toàn bộ hệ thống có thể chạy nhanh hơn tổng thể.

Nhưng điều đó không thực sự thú vị. Cũng có thể triển khai trình biên dịch cho một ngôn ngữ trong ngôn ngữ đó (C), biên dịch nó bằng một trình biên dịch hiện có (D), và có ngôn ngữ trình biên dịch mới tạo mã nhanh hơn trình biên dịch gốc đã tạo ra. Tôi hy vọng điều đó không làm bạn giật mình; cần phải rõ ràng rằng tốc độ của mã được phát ra bởi D sẽ chỉ có ảnh hưởng đến thời gian thực hiện của C, không phải trên thời gian thực hiện của các chương trình khác được biên soạn với C.

Viết trình biên dịch bằng ngôn ngữ mà chúng biên dịch đã được được thực hiện trong nhiều thập kỷ (GCC được viết bằng C), và không thực sự liên quan đến câu hỏi thực sự mà tôi nghĩ bạn đang hỏi; JIT cũng không biên dịch một ngôn ngữ bằng chính nó. Trong cả hai trường hợp, việc thực hiện bên dưới là một thứ khác với ngôn ngữ bạn đang xem xét; thường là mã máy.

Tuy nhiên, nguồn câu hỏi của bạn là một quan niệm sai lầm. Trình thông dịch Python của PyPy không thực sự được triển khai bằng Python. Dự án PyPy có một thông dịch viên cho Python được viết bằng RPython. RPython là một tập hợp con của Python, được chọn để nó có thể được biên dịch một cách hiệu quả thành mã máy; như một ngôn ngữ RPython là nhiều hơn như Java với suy luận kiểu và khối thụt lề thay vì niềng răng. Dự án PyPy cũng có một trình biên dịch cho RPython được viết bằng Python, và có khả năng (chủ yếu) tự động thêm trình biên dịch JIT vào bất kỳ trình biên dịch nào mà nó biên dịch.

Khi bạn đang sử dụng trình thông dịch PyPy trong sản xuất, bạn đang sử dụng trình thông dịch mã máy được biên dịch từ các nguồn RPython, giống như khi bạn đang sử dụng trình thông dịch CPython, bạn sử dụng trình thông dịch mã máy được biên dịch từ Mã nguồn C. Nếu bạn thực thi trình thông dịch PyPy trên một trình thông dịch Python khác (bạn có thể làm vì mã RPython hợp lệ cũng là mã Python hợp lệ; nhưng không phải là theo cách khác), thì nó chạy chậm hơn rất nhiều so với trình thông dịch CPython.

+0

Nếu người xuống bình chọn câu trả lời này muốn cho biết các vấn đề họ đã tìm thấy trong đó, tôi sẽ cố gắng giải quyết chúng. – Ben

+1

Đoạn đầu tiên của bạn không chính xác.Trong thực tế, sẽ rất khó để tạo ra một ví dụ phản đối mà không có sự giả tạo, nhưng tuy nhiên. – Marcin

+0

@Marcin Nếu nó sai, tôi muốn hiểu tại sao nó sai và sửa đổi câu trả lời. Ngay cả một ví dụ counter-contrived sẽ hữu ích. Tôi mạnh mẽ nghi ngờ tuyên bố đầu tiên của tôi là đúng cho tất cả các trường hợp thực tế ngay cả khi nó không phải là lý thuyết luôn đúng sự thật. – Ben

-1

Quá trình dịch pypy chạy trên CPython, nhưng đầu ra là danh sách tệp .c (19 tệp lần cuối tôi kiểm tra), sau đó được biên dịch thành nhị phân: pypy-c. Tại thời gian chạy pypy-c không có bất kỳ mối quan hệ với CPython, đó là lý do tại sao nó có thể được nhanh hơn.

2

PyPy không phải là thông dịch Python thực hiện bằng Python, đó là Python thông dịch viên và biên dịch thực hiện trong RPython, mà là một hạn chế tập hợp con có kiểu tĩnh của Python:

RPython là một tập hợp con hạn chế của Python có nghĩa là tuân theo tĩnh phân tích . Mặc dù có bổ sung cho ngôn ngữ và một số điều có thể làm việc đáng ngạc nhiên, đây là danh sách sơ bộ các hạn chế mà cần được xem xét. Lưu ý rằng có rất nhiều hạn chế đặc biệt của các giới hạn mà bạn sẽ gặp phải khi thực hiện.

Sự khác biệt tốc độ thực xuất phát từ thực tế, rằng không giống như CPython được giải thích toàn bộ chương trình như bytecode, PyPy sử dụng just-in-time (JIT) compilation (vào mã máy) cho các bộ phận RPython.