Câu trả lời của Keno được phát hiện, nhưng có lẽ tôi có thể cung cấp thêm một chút chi tiết về những gì đang diễn ra và những gì chúng tôi đang dự định làm.
Hiện nay chỉ có một chế độ LLVM JIT:
- Có một thông dịch viên rất tầm thường đối với một số báo cáo cấp cao nhất đơn giản.
- Tất cả các mã khác được đưa vào mã máy trước khi thực thi. Mã này được chuyên biệt hóa mạnh mẽ bằng cách sử dụng các kiểu thời gian chạy của các giá trị mà mã đang được áp dụng cho, được truyền qua chương trình bằng cách sử dụng suy luận kiểu động.
Đây là cách Julia được hiệu suất tốt ngay cả khi mã được viết không có loại chú thích: nếu bạn gọi f(1)
bạn nhận được mã chuyên cho Int64
- loại 1
trên hệ thống 64-bit; nếu bạn gọi f(1.0)
, bạn sẽ nhận được phiên bản mới được công bố dành riêng cho Float64
- loại 1.0
trên tất cả các hệ thống. Vì mỗi phiên bản được biên dịch của hàm đều biết loại nào sẽ nhận được, nó có thể chạy ở tốc độ giống như C. Bạn có thể phá hoại điều này bằng cách viết và sử dụng các hàm "type-unstable" có kiểu trả về phụ thuộc vào dữ liệu thời gian chạy, chứ không chỉ là các kiểu, nhưng chúng tôi rất cẩn thận không làm điều đó trong thiết kế ngôn ngữ chính và thư viện chuẩn.
Hầu hết Julia được viết trong chính nó, sau đó phân tích cú pháp, gõ-inferred và jitted, do đó, bootstrapping toàn bộ hệ thống từ đầu mất khoảng 15-20 giây. Để làm cho nó nhanh hơn, chúng tôi có một hệ thống dàn dựng, nơi chúng tôi phân tích cú pháp, gõ-infer, và sau đó cache một phiên bản được tuần tự hóa của AST kiểu được suy ra trong tệp sys.ji
. Tệp này sau đó được tải và sử dụng để chạy hệ thống khi bạn chạy julia
. Tuy nhiên, không có mã LLVM hoặc mã máy nào được lưu trong bộ nhớ trong sys.ji
, do đó, tất cả các lệnh bắt LLVM vẫn cần phải được thực hiện mỗi lần julia
khởi động, do đó mất khoảng 2 giây.
Thời gian trễ khởi động 2 giây này khá khó chịu và chúng tôi có kế hoạch sửa lỗi. Kế hoạch cơ bản là có thể biên dịch toàn bộ chương trình Julia thành nhị phân: một trong hai tệp thực thi có thể chạy hoặc .so
/.dylib
thư viện được chia sẻ có thể được gọi từ các chương trình khác như thể chúng được chia sẻ đơn giản là thư viện C. Thời gian khởi động cho một nhị phân sẽ giống như bất kỳ chương trình C nào khác, do đó, thời gian trễ khởi động 2 giây sẽ biến mất.
Phụ lục 1: Kể từ tháng 11 năm 2013, phiên bản phát triển của Julia không còn bị chậm trễ khởi động 2 giây vì nó biên dịch trước thư viện chuẩn dưới dạng mã nhị phân. Thời gian khởi động vẫn chậm hơn gấp 10 lần so với Python và Ruby, do đó có chỗ để cải thiện, nhưng nó khá nhanh. Bước tiếp theo sẽ là cho phép biên dịch trước các gói và các kịch bản để những người có thể khởi động nhanh như chính Julia đã làm.
Phụ lục 2: Kể từ tháng 6 năm 2015, phiên bản phát triển của Julia tự động biên dịch nhiều gói, cho phép chúng tải nhanh. Bước tiếp theo là biên dịch tĩnh của toàn bộ chương trình Julia.
Điều này đã được thực hiện trong các đêm ở Julia và sẽ được đưa vào bản phát hành 0.3. Thời gian khởi động được cải thiện rất nhiều. –