2011-01-06 24 views
7

Hiện tại tôi đang làm một recherche cho trường đại học về F #. Tôi có một câu hỏi về F # tương tác Console và trình biên dịch F #.F # Interpreter (fsi.exe) có tạo ra Ngôn ngữ trung gian-Mã như F # Compiler (fsc.exe) không?

Trình biên dịch F # tạo mã Microsoft Intermediate Language (MSIL) khi biên dịch F # -source. Điều này sau đó được dịch bởi trình biên dịch JIT sang mã máy, khi thực hiện chương trình được viết.

Nhưng F # Interpreter Console hoạt động như thế nào? Liệu nó cũng line-per-line dịch mã F # vào MSIL, và sau đó JIT mà vào mã máy? Hay nó dịch F # -Code trực tiếp vào mã máy?

Nếu nó chuyển đổi nó thành IL trước, thì tôi nghĩ có thể sẽ có một thông dịch viên IL vì trình biên dịch JIT chỉ biên dịch các chương trình hoàn chỉnh. Phải không?

Bạn nghĩ sao, F # -interpreter xử lý mã F # và dịch nó như thế nào?

Greetings, Martin

Trả lời

13

Chiếc F # biên dịch phát ra IL sử dụng thư viện riêng của mình AbsIL. Absil là một dự án MSR khác được F # hấp thụ.

Khi biên dịch cho chế độ tương tác, AbsIL uses không gian tên System.Reflection.Emit để phát ra IL trong bộ nhớ, lúc chạy, lần lượt được biên dịch thành mã gốc bởi JIT khi nó thực thi mã.

+0

Grep nhanh chóng của nguồn dường như cho thấy rằng AbsIL không sử dụng System.Reflection.Emit nhưng tạo một tệp nhị phân trực tiếp đến luồng .NET BinaryWriter. Ở những nơi nó cũng có vẻ sử dụng một ByterBuffer tùy chỉnh được định nghĩa trong bytes.fs. Tôi tin rằng điều này là bởi vì ban đầu Absil đã phải vượt qua biên dịch với OCaml nhưng đã di chuyển ra khỏi đó như trình biên dịch đã được khởi động strapped. – Robert

+1

@Robert, hãy xem liên kết thứ hai của bài đăng của tôi, bạn sẽ thấy rằng nó có phần phụ SRE, như được chỉ rõ trong tiêu đề: «Viết cấu trúc IL trừu tượng khi chạy bằng Reflection.Emit» –

+0

Ngoài ra, hãy xem xét số các vấn đề mà fsi kích hoạt, và vẫn kích hoạt trong việc thực hiện SRE của Mono, tôi có thể nói bằng kinh nghiệm :) –