Lingue gestite e differenza nella lingua compilata?

18

Mi confondo quando le persone cercano di fare una distinzione tra lingue compilate e lingue gestite. Per esperienza, capisco che molti considerano i linguaggi compilati come C, C ++ mentre i linguaggi gestiti sono Java, C # (Ci sono ovviamente di più, ma questi sono solo alcuni esempi). Ma qual è esattamente la differenza principale tra i due tipi di lingue?

La mia comprensione è che qualsiasi programma, indipendentemente dalla lingua che si usa, viene essenzialmente "compilato" in un codice macchina di basso livello che viene poi interpretato, quindi questo rende i linguaggi gestiti un sottoinsieme di linguaggi compilati (vale a dire, tutto le lingue gestite sono lingue compilate ma non viceversa)?

    
posta l46kok 10.09.2012 - 10:50
fonte

4 risposte

46

La differenza non è in "compilato" rispetto a "gestito", si tratta di due assi ortogonali. Con "gestito" si intende normalmente la presenza di una gestione della memoria raccolta e / o della presenza di un'infrastruttura di macchine virtuali. Entrambi non hanno assolutamente nulla a che fare con la compilazione e qualunque cosa la gente ritenga essere opposta ad essa.

Tutte queste "differenze" sono piuttosto confuse, artificiali e irrilevanti, poiché è sempre possibile combinare la memoria gestita e non gestita in un singolo runtime, e una differenza tra la compilazione e l'interpretazione è molto vaga.

    
risposta data 10.09.2012 - 11:07
fonte
7

Per citare Wikipedia:

Managed code is a term coined by Microsoft to identify computer program source code that requires and will only execute under the management of a Common Language Runtime virtual machine (resulting in bytecode).

Il codice gestito necessita di un runtime (come .NET CLT) da eseguire.

    
risposta data 10.09.2012 - 10:56
fonte
4

Penso che ci sia una distinzione da fare, tuttavia non è necessariamente tra "Compiled" e "Managed". Questi non sono opposti; una lingua può essere compilata e non gestita, o interpretata (non compilata) e gestita, o entrambe o nessuna delle due.

Un linguaggio "compilato" è semplicemente uno in cui esiste un passaggio che trasforma il codice sorgente scritto dallo sviluppatore in un "bytecode" più regolare, che è ciò che viene eseguito dalla macchina. La "macchina" può essere il processore reale o una "macchina virtuale" che esegue operazioni aggiuntive sui bytecode per tradurli in istruzioni macchina "native". L'antonym per un linguaggio "compilato" è un linguaggio "interpretato", in cui il codice sorgente viene trasformato in istruzioni bytecode in fase di esecuzione, riga per riga mentre vengono eseguiti, senza un passo di compilazione. Un ibrido tra di loro è "jitting", da "JIT" (Just In Time), che di solito è interpretato come un passo una tantum dalla macchina in esecuzione; una riga di codice (o funzione o file sorgente) viene interpretata al primo avvio, ma le istruzioni native prodotte vengono mantenute in memoria in modo che il runtime non debba rieseguire l'interpretazione di nuovo sulle esecuzioni successive di quel codice.

Un linguaggio "gestito" è un linguaggio progettato per produrre programmi che vengono consumati all'interno di un ambiente runtime specifico, che include quasi sempre un interprete bytecode; una "macchina virtuale" che prende il codice del programma ed esegue una trasformazione aggiuntiva specifica per macchina o ambiente. L'ambiente può anche includere la gestione della memoria, come un "garbage collector" e altre funzionalità di "sicurezza" che servono a mantenere il programma operativo all'interno della sua "sandbox" di spazio e strumenti, tuttavia tali funzionalità non sono l'unico dominio dei runtime "gestiti" . Praticamente tutti i linguaggi interpretati potrebbero essere considerati gestiti, poiché richiedono che l'interprete sia in esecuzione sotto le righe del codice "utente" in esecuzione. Inoltre, i linguaggi JVM e .NET (Java, Scala, C #, VB, F #, IronWhatever) sono compilati in un linguaggio intermedio o IL, che è superficialmente simile nella forma e nella funzione a un linguaggio assembly binario, ma non aderisce a 100 % a qualsiasi set di istruzioni "nativo". Queste istruzioni vengono eseguite dalla JVM o dal CLR di .NET, che le traduce in modo efficace in istruzioni binarie native specifiche dell'architettura della CPU e / o del sistema operativo della macchina.

Quindi, le lingue possono generalmente essere descritte come "compilate" o "interpretate" e come "non gestite" (o "native") e "gestite". Ci sono linguaggi che possono essere descritti come qualsiasi combinazione di questi eccetto il possibile "interpretato nativo" (che sarebbe vero solo per gli opcode esadecimali scritti a mano, dove ciò che è scritto dallo sviluppatore è ciò che viene eseguito); se consideri il livello di interpretazione come un "runtime" (che è facile da argomentare e difficile da argomentare contro), tutte le lingue interpretate sono "gestite".

Se vuoi diventare tecnico, quasi tutti i programmi rivolti a un sistema operativo multitasking sono oggi "gestiti"; il sistema operativo creerà una "macchina virtuale" per ogni programma in esecuzione, in cui il programma pensa (o almeno non deve sapere altrimenti) che è l'unica cosa in esecuzione. Il codice può effettuare chiamate all'interno di se stesso e ad altre librerie di riferimento come se quel programma fosse l'unica cosa caricata in memoria; allo stesso modo, le chiamate per allocare RAM e altra memoria più alta per archiviare e manipolare dati e dispositivi di controllo sono codificate come se l'intera architettura di memoria fosse disponibile. La VM (e il sistema operativo dietro di esso) traduce quindi vari puntatori di memoria nella posizione effettiva del programma, i suoi dati e gli hook sui driver di dispositivo, ecc. Questo è spesso fatto applicando un offset di memoria (ogni VM riceve un blocco di 2 GB o qualsiasi altra cosa della memoria, a partire dall'indirizzo X che il programma può trattare come se X fosse l'indirizzo 0) e come tale è molto economico da fare, ma ci sono altre cose che il kernel del sistema operativo è responsabile, come la pianificazione dei processi e l'inter- processo di comunicazione, che sono più difficili da gestire. Tuttavia, questo schema di base non è generalmente considerato "gestito", in quanto il programma non deve sapere che è gestito da una macchina virtuale e spesso è ancora responsabile di mantenere la sua memoria allocata "pulita". Un programma che è stato progettato per essere eseguito sulla riga di comando MS-DOS può essere eseguito su sistemi operativi Windows più recenti che non hanno più nemmeno l'ambiente MS-DOS al di sotto di essi; al programma viene invece assegnato un ambiente di "console virtuale" e, a condizione che non provi a lasciare questa "sandbox" cercando di accedere direttamente alle aree protette della memoria, funzionerà abbastanza felicemente.

    
risposta data 10.09.2012 - 18:03
fonte
2

Lingua gestita in termini semplici è un linguaggio di alto livello che dipende dai servizi forniti da un ambiente run-time da eseguire, come il servizio di garbage collection, motivo per cui viene chiamato gestito in generale, ma non è l'unico servizio che utilizza, e alcuni di questi servizi sono security services, exception handling, standard types , utilizza Common Language Run-time CLR per l'esecuzione, come in. Netti linguistici o un ambiente virtuale come Java che utilizza 'JVM Java Virtual Machine.

Lingua non gestita è un eseguibile di lingua di basso livello direttamente dal sistema operativo senza la necessità di servizi di run-time virtuali o lingua intermedia, tali linguaggi come C, C++ , codice non gestito prodotto da tali lingue usa le routine di libreria che sono collegate dinamicamente al sistema operativo per ottenere il codice da eseguire chiamato DLL (Dynamic Link Libraries), il codice non gestito accede direttamente alla memoria, ecco perché è più veloce del codice gestito, ma a meno che non si stia costruendo un driver hardware o sofisticato videogioco non si vuole veramente usare linguaggi non gestiti in quanto può diventare pericoloso lavorare con gli sviluppatori inesperti come lo stato del ruolo with great power comes great responsibility , ed è per questo che esistono linguaggi gestiti per aiutare gli sviluppatori a produrre codice estensibile senza immergersi nella parte inferiore del sistema, ma è comunque possibile creare codice misto se necessario, questi articoli spiegano tutto:

Panoramica sull'interoperabilità del codice gestito / non gestito

Esempio: missaggio non gestito C ++, C ++ / CLI e C # code

    
risposta data 10.09.2016 - 00:01
fonte

Leggi altre domande sui tag