L'esecuzione corretta di un programma richiede che tre elementi corrispondano:
- Set di istruzioni CPU (ad es. X86 nel PC, ARM nel telefono cellulare, PowerPC in alcuni Mac Apple, bytecode Java per applet Java, CLI per applicazioni ".Net" / Mono)
- Formato file binario (es. PE / COFF ".exe" per Microsoft Windows, .jar per applet Java, PE32 ".exe", ELF su Unix / Linux)
- Interfaccia di programmazione dell'applicazione ; (Ad esempio POSIX su Linux / Unix, Cocoa per Mac OSX, Win32 su Microsoft Windows, Libreria di classi base per applicazioni ".Net" / Mono).
Puoi aumentare la possibilità di trovare una corrispondenza tra tutti e tre disponendo di emulatori / interpreti (per altri set di istruzioni della CPU), caricatori di file aggiuntivi (per formati di file esterni) e librerie di programmazione aggiuntive che forniscono più API.
Si noti inoltre che alcuni processori possono eseguire nativamente più di un set di istruzioni; un PC abbastanza spesso ha set di istruzioni x86 e amd64 ; un processore ARM può eseguirne quattro: ARM32 / Thumb / Java bytecode / ThumbEE . Alcuni sistemi operativi possono fornire anche più di un'API in modo nativo (Microsoft Windows fornisce Win32 e POSIX ).
Per tutto il resto è necessario un software aggiuntivo. Per eseguire i programmi Java sono necessarie le tre parti sopra elencate per farlo funzionare: un programma Java Virtual Machine da eseguire il bytecode; un modo per avviare programmi Java e un Classlibrary Java per i programmi da chiamare. "Java" è un marchio qui per diverse tecnologie separate originariamente sviluppate da Sun, ma per un utente vengono spesso scaricate come una sola.
Lo stesso vale per ".Net", che è un marchio commerciale per diverse tecnologie originariamente sviluppate da Microsoft: l'API Common Language Run-time / Base Class Library (CLR); VES è il caricatore e Common Language Interface (CLI) è il set di istruzioni.
Non è necessario scaricare tali tecnologie da Microsoft, da Sun o da Intel solo perché hanno originariamente inventato qualcosa. AMD rende i processori compatibili con gli standard Intel; sia Apache ("Harmony") che Google ("Android Dalvik") creano entrambi una suite simile a Java; e Mono fornisce una suite CLR / CLI / VES. L'importante è che tutti utilizzino gli stessi standard, rendendoli compatibili. Un disco DVD verrà riprodotto su qualsiasi lettore DVD che soddisfa lo standard e una pagina Web HTML verrà visualizzata in qualsiasi browser Web conforme agli standard HTML.
- Mono è una suite CLR / CLI / VES che può essere eseguita su Mac OSX, MS Windows e Linux.
- Vino è un'implementazione dell'API Win32 che può essere eseguita su Mac OSX, MS Windows e Linux.
- Puoi eseguire Mono su Wine , su qualsiasi sistema operativo.
- Puoi eseguire Wine su Qemu , su qualsiasi architettura CPU.
Quindi Mono fa funzionare le applicazioni CLR .exe e Wine fa funzionare le applicazioni Win32 .exe. L'unica cosa in comune è che i nomi dei file terminano in ".exe"; i contenuti sono completamente diversi e incompatibili, quindi hai bisogno di quello giusto .
Proprio come un interprete Python si guasta quando viene presentato con Perl (e viceversa), un interprete CLR si guasta quando viene presentato con x86 + Win32 o JVM + Java bytecode. Se puoi pubblicare un link al particolare programma che desideri eseguire, io stesso o qualcun altro dovresti essere in grado di dirti il set esatto di istruzioni, il formato del file e l'API per cui è stato progettato e cosa devi installare su Linux per eseguirlo. Spero che sia d'aiuto!
(A volte potresti persino aver bisogno di entrambi. Ad esempio, il simulatore di treni Openbve è C # e compilato in PE / COFF + CLI + CLR, ma può facoltativamente utilizzare plugin binari C compilati per PE / COFF + Win32 + x86. In questo caso, tu serve una versione Win32 di Mono in Wine. Se anche l'architettura della CPU è diversa, dovrebbe essere emulata, quindi Mono in Wine in Qemu).