Cosa impedisce C di essere compilato / interpretato / JIT?

9

Java è spesso elogiato per la sua straordinaria portabilità, che presumo sia a causa della JVM. La mia domanda è cosa impedisce a C di essere compilato / interpretato / JIT. Se è così, C può anche essere scritto una sola volta e farlo funzionare su qualunque dispositivo tu abbia. ma questo non è un meccanismo popolare per l'elaborazione di un programma C.

Quali sono gli svantaggi dell'elaborazione di C in questo modo, inoltre quali sono i vantaggi dell'elaborazione di Java in questo modo e non la compilazione del codice macchina, oltre alla portabilità, naturalmente?

    
posta SphericalCow 02.06.2015 - 19:37
fonte

8 risposte

18

C è quello che chiamerei un linguaggio di medio livello. Il suo scopo è quello di servire come "assembler di alto livello", motivo per cui funziona così bene come obiettivo del compilatore e perché abbraccia la portabilità così bene.

Storicamente, gli interpreti sono stati generalmente utilizzati con linguaggi di alto livello nel contesto delle chiamate ai metodi. Nella sua forma più semplice, un interprete analizza semplicemente ogni parola chiave nella lingua di origine insieme ai suoi token associati e la converte in chiamate e parametri di metodo. In pratica, ciò che fa la maggior parte degli interpreti è convertire la lingua sorgente in una rappresentazione intermedia, ed è quella rappresentazione che viene interpretata.

Cosa impedisce a C di essere interpretato o Jitted? Nulla. Ma questa non è la ragione d'essere di C.

    
risposta data 02.06.2015 - 19:49
fonte
6

Prima di tutto, vale la pena notare che la JVM di Sun è stata scritta in C. C è un linguaggio molto popolare quando è necessaria la portabilità.

La lingua C è portatile anche se molti programmi non lo sono. Questo perché C non pone tante restrizioni sul programmatore o fa tante ipotesi. Se un programmatore C vuole che i suoi programmi siano portatili, deve mettere queste restrizioni su se stesso.

In pratica, questo non è molto più difficile di vivere con le restrizioni che le forze Java hanno su di te. È principalmente una questione di essere consapevoli della tua endianità e delle dimensioni primitive e utilizzare librerie portatili come GTK + invece di librerie specifiche per piattaforma.

Potresti realizzare un target GTK + e un compilatore C che supportava una macchina virtuale, anche probabilmente la JVM, e ottenere il codice esistente per lavorare con pochissime modifiche. In effetti, senza la garbage collection, una macchina virtuale C sarebbe probabilmente molto più semplice. Perché vorresti, però?

Il contrario, compilando Java al codice nativo, è altrettanto fattibile. Questo è fondamentalmente ciò che fa il JIT. Perché vorresti, però? Sono sicuro che ci sono progetti pet per farlo "solo perché", ma non sono in uso serio.

    
risposta data 02.06.2015 - 20:55
fonte
5

Hai detto:

Java is often praised for its amazing portability, which I presume is because of the JVM.

E lì, nella prima frase, ti sbagli. Java non è portabile a causa della JVM. Java è portabile, perché il linguaggio Java è definito in modo tale da non lasciare all'implementator alcun margine di manovra nel modo in cui un programma può comportarsi.

Ad esempio, Java ha due tipi "int" (intero con segno a 32 bit) e "long" (intero con segno a 64 bit). C e C ++ hanno "int" (firmato almeno a 16 bit), "long" (firmato almeno a 32 bit) e "long long" (firmato almeno a 64 bit). Questo perché C dovrebbe funzionare su molti processori diversi e permettere loro di comportarsi diversamente.

C avrebbe potuto definire dimensioni fisse per questi tipi. In tal caso, i processori a 36 bit non avrebbero potuto implementare il linguaggio C. E non possono davvero implementare Java! Quindi C ha permesso al linguaggio di funzionare con una varietà di computer diversi. È inevitabile che ciò consenta la creazione di codice non portatile. È una questione di linguaggio.

    
risposta data 03.06.2015 - 01:16
fonte
4

Java è altamente portatile in particolare perché la lingua è indirizzata alla Java Virtual Machine, che, come suggerisce il nome, è non una macchina reale . Poiché è possibile implementare una macchina virtuale sull'architettura di molti diversi tipi di macchine reali, un programma basato su JVM è altamente portatile.

C, d'altra parte, è specificamente progettato per essere eseguito su hardware reale, perché è stato creato per lo scopo specifico di implementare un sistema operativo, che necessita di un accesso hardware completo. Ciò significa che il codice C non è particolarmente portabile di design e quando si porta un programma C da una piattaforma all'altra, le varie parti specifiche dell'architettura di destinazione devono essere riscritte in un modo o nell'altro .

    
risposta data 02.06.2015 - 19:49
fonte
3

In realtà ci sono versioni interpretate di C , ma sono principalmente pensate per essere utilizzate per una sperimentazione rapida anziché sistema di produzione.

Non sono comuni, perché dopo tutto, perché dovresti sopportare tutte le idiosincrasie C se non per ottenere un eseguibile piccolo, veloce e statico?

    
risposta data 02.06.2015 - 19:58
fonte
3

Teoricamente, sia C che Java possono essere entrambi compilati in codice nativo, interpretati o compilati su una macchina virtuale.

Il motivo tecnico per cui C non è compilato su una macchina virtuale, è che non esiste semplicemente una macchina virtuale standard C

.

E nessuno sembra voler definire una macchina virtuale C, o anche compilare la macchina virtuale Java (che è perfettamente possibile). Probabilmente perché nessuno che usa C vuole perdere la sua velocità senza rivali. Probabilmente anche perché C è il più strong nella comunità open source che può facilmente fare la portabilità mediante la compilazione (distribuire e ricompilare l'origine e l'esecuzione), in modo che non sentano tale necessità di portabilità dell'esecuzione (distribuire ed eseguire un binario) come chiusa lo sviluppatore di sorgenti fa.

    
risposta data 02.06.2015 - 22:37
fonte
1

In realtà, questo è fatto. Ci sono importanti compilatori che supportano la compilazione su LLVM (lo so che clang fa, e credo che anche gcc lo faccia). Quel LLVM può essere JIT proprio come il codice Java è compilato in bytecode che è JIT.

Tuttavia, ciò che rende java "cross platform" rispetto a C è che Java ha una grande libreria di runtime che è stata portata su molte piattaforme. C esplicitamente non segue questo paradigma.

    
risposta data 03.06.2015 - 04:50
fonte
0

Ci sono alcune importanti differenze tra Java e C. Java è isolato dal sistema operativo tramite la java virtual machine (JVM). La JVM astrae il sistema operativo dal programma. Un'applicazione java potrebbe chiedere alla JVM una porzione di memoria e la JVM chiede quindi al sistema operativo quella memoria. Esistono molte JVM per diverse piattaforme / sistemi operativi. La JVM è ciò che consente allo stesso programma java di funzionare su piattaforme diverse.

Con C, non esiste l'isolamento del SO. I programmi C (di solito) vengono eseguiti direttamente sul sistema operativo, effettuando chiamate al SO diretto. Questo rende i legami che il programma C porta a uno specifico sistema operativo / piattaforma. Qualsiasi programma non banale effettuerà chiamate nel sistema operativo. Inoltre, i programmi C sono compilati in codice macchina, che è specifico dell'hardware. Un programma C compilato per x86 non può essere eseguito direttamente su un processore ARM.

    
risposta data 02.06.2015 - 20:01
fonte

Leggi altre domande sui tag