Implementazione di una VM per la simulazione [chiusa]

1

Sono a conoscenza di questa domanda , e io penso di sapere perché è stato chiuso. Spero che la mia domanda riesca a essere più specifica.

Il mio livello di abilità: ho una laurea in "Informatica". Ho programmato in molte lingue. Nel giorno in cui ho programmato in C su un microcontrollore integrato (TI MSP430) e in Python e Prolog. Non ho assolutamente esperienza nella programmazione in linguaggio assembly, anche se penso capisco il concetto. Ho dovuto incorporare l'assembly per il mio lavoro con il microcontrollore, ma questo era al livello di inizializzare parte dell'hardware collegato; niente che implicasse anche l'implementazione di un algoritmo.

Sono consapevole del fatto che "The Art of Computer Programming" di Knuth mostra tutti gli algoritmi in assembly. Passare attraverso questo libro è un investimento enorme e lo farei se qualcuno lo consiglia.

Mi rendo conto che questa domanda è molto generica, ma dal momento che non ho assolutamente alcuna esperienza precedente, trovo davvero difficile metterla in un contesto qualsiasi.

Il mio "problema":

Devo implementare un simulatore per un progetto che fa parte del mio lavoro di tesi. Ho provato a farlo in due diversi linguaggi di alto livello: Python e Prolog. Non sono in grado di modellare le "cose" che sto simulando (unità autonome, molto semplici senza una logica complessa, ma troppe di esse) senza incorrere troppo in overhead. Ho anche preso in considerazione l'utilizzo dei processi di Erlang ed Erlang, ma la messaggistica tra di loro è sicuramente un pessimo modo di modellizzare il modo in cui le cose interagiscono tra loro.

Ho preso in considerazione l'utilizzo di C o C ++. La simulazione comporta il cambiamento del comportamento delle cose che sto modellando, e farlo in C o C ++ significherebbe in realtà implementare una macchina "virtuale" (il simulatore) che mi permette di farlo. Sembra che l'assemblatore lo renderà leggermente più facile. Devo ammettere che l'architettura su cui ho scritto (molto limitato) il montaggio aveva uno spazio di indirizzamento piatto, motivo per cui ho pensato che sarebbe stata un'opzione.

Sembra che il linguaggio dell'Assemblea potrebbe essere la via da seguire. Tuttavia, sono in perdita a:

  • quale linguaggio assembly scegliere
  • come scegliere un'architettura

Cose che ho considerato:

  • GNU Assembler
  • MMIX di Knuth

Le domande:

  • Posso effettivamente utilizzare uno dei due per un'implementazione (più o meno) efficiente su un'architettura già esistente?
  • Questo suona come un tentativo completamente fuorviato?
posta XXX 20.01.2015 - 10:04
fonte

1 risposta

2

MMIX non è la soluzione che stai cercando. Il suo scopo principale è di abilitare implementazioni standardizzate di algoritmi e strutture dati in modo che possano essere confrontati tra loro in termini di efficienza. Non è progettato per funzionare su hardware reale e l'efficienza in fase di esecuzione non è mai stata l'obiettivo.

Inoltre, sconsiglio di utilizzare l'assemblatore GNU, almeno non se si sta prendendo di mira un processore 80x86. Usa una sintassi che è in qualche modo diversa dalla sintassi usata da Intel per descrivere i loro processori, ed è la seconda sintassi a cui è rivolta la maggior parte delle risorse educative per la programmazione degli assembly. La NASM è l'assembler più comunemente usato per l'assembly intel codificato a mano, e lo raccomanderei a causa di questo (anche se non ero stato coinvolto nella sua scrittura!).

Detto questo, tuttavia, non sono sicuro che il linguaggio assembly sia l'approccio migliore al tuo problema.

(aggiornamento dopo domanda modificato: inizialmente avevo suggerito C / C ++)

Può darsi che Java sia in realtà la soluzione migliore: ha una manciata di librerie disponibili (asm.jar, BCEL, javassist) che hanno lo scopo di rendere facile la generazione dinamica del codice java in fase di esecuzione. Programmerai le parti dinamiche del tuo sistema in bytecode Java, che è concettualmente simile al linguaggio assembly, ma molto più semplice, e questo verrà quindi convertito in codice macchina nativo dalla JVM. Penso che questo sia probabilmente il miglior equilibrio tra semplicità ed efficienza disponibili. Se non è abbastanza efficiente, LLVM può essere usato per ottenere risultati simili in C ++, ma è più difficile da usare.

    
risposta data 20.01.2015 - 10:18
fonte

Leggi altre domande sui tag