Jika Anda memiliki format perantara, maka Anda dapat menerapkan sesuatu yang menerjemahkan program dalam Bahasa X ke format itu, dan juga dari format itu ke Bahasa Y. Terapkan konversi tersebut untuk semua bahasa yang Anda minati dan selesai, bukan?
Anda tahu? Format seperti itu sudah ada: perakitan. Kompiler sudah melakukan konversi "Bahasa X ke perakitan", dan pembongkaran ke konversi "perakitan ke Bahasa Y".
Sekarang, assembly bukanlah bahasa yang hebat untuk melakukan konversi terbalik, tetapi MSIL sebenarnya tidak terlalu buruk. Unduh Reflector dan Anda akan melihat ada opsi untuk membongkar perakitan .NET ke banyak bahasa yang berbeda (dan plugin bahkan menyediakan lebih banyak lagi). Jadi sangat mungkin untuk mengambil program dalam C #, kompilasi ke DLL (yaitu, MSIL), kemudian gunakan reflektor untuk membongkar itu menjadi VB, C ++ / CLI, F #, dan banyak lainnya. Tentu saja, semua pekerjaan konversi lainnya juga. Ambil file F #, kompilasi ke DLL, gunakan Reflector untuk mengubahnya menjadi C #.
Tentu saja, dua masalah besar yang akan Anda temukan adalah:
- Kode ini pada dasarnya tidak dapat dibaca. MSIL (bahkan dengan informasi debug) menghapus banyak informasi dari sumber asli, sehingga versi yang diterjemahkan tidak memiliki kesetiaan 100% (secara teoritis melakukan konversi C # -> MSIL-> C # akan mengembalikan kode asli, tetapi biasa).
- Banyak bahasa .NET memiliki pustaka kustom mereka sendiri (misalnya pustaka runtime VB, pustaka F # dan sebagainya). Ini perlu dimasukkan (atau dikonversi) ketika Anda melakukan konversi juga.
Benar-benar tidak ada yang bisa dikalahkan # 2, tetapi Anda mungkin bisa mendapatkan # 1 dengan beberapa anotasi tambahan di MSIL (melalui atribut, mungkin). Itu akan menjadi pekerjaan tambahan, tentu saja.