Se hai un formato intermedio, allora potresti implementare qualcosa che traduce un programma in Language X a che formatta, e anche da che formattano in Language Y. Implementare quelle conversioni per tutte le lingue che ti interessano e il gioco è fatto, giusto?
Beh, sai una cosa? Un tale formato esiste già: assemblaggio. Il compilatore esegue già la conversione "Language X to assembly" e i disassemblatori alla conversione "assembly to Language Y".
Ora, l'assemblaggio non è un gran linguaggio per fare la conversione inversa, ma MSIL non è poi così male. Scarica Reflector e vedrai che ha le opzioni per disassemblare un assembly .NET in un mucchio di lingue diverse ( e i plugin forniscono ancora di più). Quindi è abbastanza possibile prendere un programma in C #, compilarlo in una DLL (cioè MSIL), quindi usare reflector per disassemblarlo in VB, C ++ / CLI, F # e un gruppo di altri. Naturalmente, anche tutte le altre conversioni funzionano. Prendi un file F #, compila una DLL, usa Reflector per convertirlo in C #.
Ovviamente, i due grandi problemi che troverai sono:
- Il codice è fondamentalmente illeggibile. MSIL (anche con informazioni di debug) rimuove un sacco di informazioni dalla fonte originale, quindi la versione tradotta non ha fedeltà al 100% (in teoria una conversione di C # - > MSIL- > C # dovrebbe restituire il codice originale, ma non lo farà).
- Molti linguaggi .NET hanno le proprie librerie personalizzate (ad esempio la libreria runtime VB, la libreria F # e così via). Questi dovrebbero essere inclusi (o convertiti) anche quando fai la tua conversione.
Non c'è davvero nulla per aggirare il n. 2, ma probabilmente potresti ottenere il n. 1 con alcune annotazioni aggiuntive nel MSIL (tramite attributi, forse). Questo sarebbe un lavoro aggiuntivo, naturalmente.