Portabilità del linguaggio C.


10

Come viene determinata esattamente la portabilità di un linguaggio come C? Ho imparato che i compilatori sono specifici dell'ISA. Se questo è vero, come è C portatile? O è che solo il codice sorgente scritto in C è portatile ma non gli eseguibili? Gli eseguibili ISA specifici per esempi di applicazioni per x86 sono separati dalle applicazioni per Apple (supponendo che Apple usi il microprocessore Motorola / PowerPC)?

Risposte:


27

è che solo il codice sorgente scritto in C è portatile e non gli eseguibili?

Corretta. Alcune persone lo chiamano scrivere una volta, compilare ovunque.

http://it.wikipedia.org/wiki/Write_once,_compile_anywhere .

L'altra alternativa è scrivere una volta, eseguire ovunque. Java ne è un buon esempio.

http://en.wikipedia.org/wiki/Write_once,_run_anywhere

E anche se puoi raggiungere la portabilità parziale multipiattaforma, non dovresti mai aspettarti che il tuo codice venga eseguito ovunque senza modifiche.


Codice sorgente C non trasferibile a diversi compilatori o ISA o sistemi operativi senza un po 'di shennanigan extra-linguali. Cose semplici come le dimensioni e l'allineamento dei tipi standard non sono standard in C, quindi il porting del software che scambia dati con altre istanze di se stesso può essere piuttosto impegnativo. Fare riferimento a GNU Autoconf / Automake per un esempio (possibilmente offuscato) dei cerchi che i programmatori C passeranno attraverso per ottenere la portabilità.
Tim Williscroft,

3
@TimWilliscroft: i problemi di portabilità sono in genere causati da librerie non standard e cattive pratiche di programmazione; e non sono causati da C o dalle sue librerie standard. Un semplice esempio potrebbe essere l'utilizzo di un'estensione GCC non standard o la mancata serializzazione / deserializzazione corretta dei dati per IO.
Brendan,

6

Non è solo specifico ISA. Ad esempio chiedi:

le applicazioni per x86 sono separate dalle applicazioni per apple?

Sì, lo sono, anche se Apple utilizza hardware x86. I binari C sono specifici dell'architettura e del sistema operativo.


1
@ Steven314: il tuo commento è tangente. Non ha nulla a che fare con l'hardware standard o meno, e tutto ha a che fare con il fatto che OS X ha un formato binario diverso (Mach-O) rispetto a quello, per esempio, di Linux (tipicamente ELF).
mipadi,

@Steve: EFI vs BIOS è importante solo per l'avvio e gli interni del sistema operativo; l'architettura hardware, che è il set di istruzioni della CPU, è la stessa, perché è la stessa CPU.
vartec,

Commenti eliminati, principalmente perché non avrei mai dovuto includere la cosa mac in primo luogo. La mia menzione di ABI (Application Binary Interface) e convenzioni di chiamata potrebbe essere ancora rilevante (un terzo elemento da aggiungere a "architettura e sistema operativo"). Non sono rilevanti per l'hardware, tranne per il fatto che gli ABI tendono a essere progettati per architetture particolari (ad es. Registri disponibili), ma sono rilevanti per la portabilità binaria. Questo non è un problema di formato di file: ELF è usato su Windows e Linux (da gcc), ma probabilmente non puoi prendere un file oggetto dall'uno all'altro.
Steve314,

@vartec hai detto che anche i binari C sono specifici del sistema operativo, perché O / S stesso è specifico ISA, quindi i binari C diventano indirettamente specifici O / S?
KawaiKx,

@Saurabh: tutti gli eseguibili nativi sono specifici del sistema operativo, poiché il sistema operativo specifica il formato del file. Inoltre, una libreria standard C deve implementare molte funzioni chiamando il sistema operativo, quindi anche se il formato del file fosse standardizzato, il codice stesso non potrebbe essere eseguito su un altro sistema operativo. Questo è standard per i linguaggi che vengono compilati in codice nativo, al contrario di alcuni codici di macchine virtuali come JVM (Java Virtual Machine). È possibile compilare C per una macchina virtuale, ma non lo ho mai fatto. LLVM si avvicina di più, ma è inteso come un back-end del compilatore, non un ambiente di compilazione una volta eseguito ovunque.
Steve314,

5

è che solo il codice sorgente scritto in C è portatile e non gli eseguibili?

Esattamente. Devi ricompilare il tuo programma C su ogni piattaforma. I compilatori C generano un codice macchina che è portatile solo in misura molto limitata, tra macchine dello stesso processore / architettura di memoria e sistema operativo. Ecco perché vedi diverse distribuzioni binarie di app multipiattaforma (ad es. Browser), come "Linux 64-bit Intel" o "Mac OS X 32-bit PowerPC" (OK, l'ultima è solo un'illustrazione, so che Apple ha cambiato a Intel alcuni anni fa :-).


3

Alla maggior parte della domanda è stata data una risposta, ma vorrei aggiungere che la durabilità è un'altra cosa che potresti dover prendere in considerazione.

Ad esempio, JAVA può essere scritto una volta ed eseguito su qualsiasi piattaforma in cui la VM (oggi si chiama "Runtime Environment"). Ma un altro vantaggio è che puoi eseguire il codice Java 1.1 dal 1995 nella tua macchina del 2011. Ciò non è possibile se il codice è stato compilato su i386 e si tenta di eseguirlo sull'architettura AMD64.

Ottieni anche i miglioramenti della macchina virtuale stessa.

Quindi, direi che in generale, passando dalle lingue meno portatili a quelle più portatili che avresti: Assembler, linguaggio compilato di basso livello come C, quindi C ++, quindi interpretato le lingue o quelle che girano all'interno di una macchina virtuale.

Non sono davvero un difensore di Java, almeno non per la lingua né la comunità, ad esempio, ma è la strada da percorrere se stai cercando portabilità e la minima perdita di prestazioni rispetto a C.


3

Buone risposte su scrivere una volta compilate ovunque.

Alla gente piace pensare a C come un linguaggio portatile a causa della sua popolarità e dell'alta probabilità che un compilatore C sia disponibile per future piattaforme target. Un altro fattore è la libreria standard che aiuta con le attività di programmazione comuni in modo indipendente dalla piattaforma.

Quindi direi che la portabilità di una lingua è determinata da:

  1. Livello di standardizzazione.
  2. Disponibilità di compilatori per diverse piattaforme / architetture.
  3. Profondità e ampiezza delle librerie portatili.

Realisticamente, sebbene quasi tutte le complesse applicazioni C richiederanno un po 'di lavoro per passare a una nuova piattaforma a causa delle dipendenze dell'hardware o del sistema operativo. Tale processo è noto come porting.


3

"Portabilità" ha molteplici significati. Rispetto a C, significa quanto segue:

  • I compilatori sono stati implementati per C per un'ampia varietà di piattaforme hardware e di sistemi operativi, che era un grosso problema nei primi anni '70;

  • Esiste uno standard universalmente concordato per il linguaggio stesso, al contrario di ogni implementazione del compilatore che riconosce una variante leggermente diversa del linguaggio (di nuovo, un grande affare quando C è stato progettato per la prima volta, poiché c'erano più varianti di linguaggi come Pascal e BASIC che non sono stati universalmente riconosciuti);

  • A causa di questo standard, il codice conforme produrrà lo stesso comportamento quando compilato su piattaforme diverse.

Il codice sorgente è portatile, ma per ogni target deve essere generato un nuovo binario.

Si noti, tuttavia, che la sorgente C raramente è "banalmente" portatile; la maggior parte delle applicazioni richiede di andare oltre ciò che è definito dallo standard linguistico, utilizzando estensioni uniche per una particolare piattaforma, quindi in pratica il codice sorgente non è portatile al 100%.

Si noti, tuttavia, che C lascia molto al passo con l'implementazione. Le dimensioni esatte di vari tipi di dati, il comportamento in caso di overflow, ecc., Dipendono tutti dall'implementazione; lo standard fornisce i requisiti minimi a cui un'implementazione deve conformarsi, ma l'implementazione è libera di andare oltre tali limiti.


0

Qualunque sia ISA, C non è specifica ISA. Suppongo che non ti riferisci allo slot ormai obsoleto per le schede di estensione PC.

Esistono compilatori C conformi agli standard per moltissime piattaforme e fino a quando si utilizzano funzionalità di linguaggio completamente standard nel codice sorgente, si dovrebbe essere in grado di compilarlo su qualsiasi compilatore C per qualsiasi piattaforma.

Tuttavia, uno dei problemi è che lo standard C lascia un sacco di comportamento delle caratteristiche come implementazione definita o come comportamento indefinito. Questo viene fatto per rendere il linguaggio C generalmente più utile per la programmazione di basso livello, evitando casi in cui un comportamento definito con precisione non corrisponde a ciò che l'hardware supporta su alcune piattaforme. Tuttavia, rende un po 'più difficile scrivere programmi portatili.

Inoltre, a differenza di alcune lingue, C non viene fornito con un'enorme libreria del tipo fornita da Java o C #. Puoi ottenere librerie molto portatili per fare qualsiasi cosa, ma devi fare un po 'di lavoro per costruirle e farle lavorare insieme.

C ha una libreria standard, ovviamente, ma il suo ambito è relativamente limitato rispetto a Java, C #, Python, ecc. Ecc.


4
ISA = istruzione set architecture aka architettura hardware
vartec
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.