Nếu bạn có định dạng trung gian, thì bạn có thể triển khai thứ gì đó dịch chương trình trong Ngôn ngữ X sang định dạng đó và từ định dạng đó sang Ngôn ngữ Y. Thực hiện các chuyển đổi đó cho tất cả các ngôn ngữ bạn quan tâm và bạn đã hoàn thành, phải không?
Vâng bạn biết gì không? Một định dạng như vậy đã tồn tại: lắp ráp. Trình biên dịch đã thực hiện chuyển đổi "Ngôn ngữ X để lắp ráp" và phân tách thành chuyển đổi "lắp ráp thành Ngôn ngữ Y".
Bây giờ, lắp ráp không phải là một ngôn ngữ tuyệt vời để thực hiện chuyển đổi ngược lại, nhưng MSIL thực sự không phải là xấu. Tải xuống Reflector và bạn sẽ thấy có các tùy chọn để tháo rời một cụm .NET thành một loạt các ngôn ngữ khác nhau (và các plugin cung cấp nhiều hơn nữa). Vì vậy, hoàn toàn có thể lấy một chương trình trong C #, biên dịch nó thành một DLL (nghĩa là MSIL), sau đó sử dụng bộ phản xạ để phân tách nó thành VB, C ++ / CLI, F # và một nhóm khác. Tất nhiên, tất cả các công việc chuyển đổi khác, quá. Lấy một tệp F #, biên dịch thành DLL, sử dụng Reflector để chuyển đổi nó thành C #.
Tất nhiên, hai vấn đề lớn mà bạn sẽ tìm thấy là:
- Mã về cơ bản là không thể đọc được. MSIL (ngay cả với thông tin gỡ lỗi) sẽ xóa rất nhiều thông tin khỏi nguồn ban đầu, vì vậy phiên bản dịch không có độ trung thực 100% (về mặt lý thuyết thực hiện chuyển đổi C # -> MSIL-> C # sẽ cung cấp cho bạn mã gốc, nhưng nó sẽ không).
- Nhiều ngôn ngữ .NET có thư viện tùy chỉnh riêng (ví dụ thư viện thời gian chạy VB, thư viện F #, v.v.). Chúng cần được đưa vào (hoặc chuyển đổi) khi bạn thực hiện chuyển đổi.
Thực sự không có gì để có được khoảng # 2, nhưng bạn có thể có được khoảng # 1 với một số chú thích bổ sung trong MSIL (có thể thông qua các thuộc tính). Đó sẽ là công việc bổ sung, tất nhiên.