Portabilità della lingua C

10

In che modo viene determinata la portabilità di un linguaggio come C? Ho imparato che i compilatori sono specifici ISA. Se questo è vero, come è C portatile? O è solo che il codice sorgente scritto in C è portatile ma non gli eseguibili? I file eseguibili ISA specifici per le applicazioni di esempio per x86 non sono distinti dalle applicazioni per Apple (supponendo che Apple utilizzi il microprocessore Motorola / PowerPC)?

    
posta KawaiKx 16.05.2011 - 19:03
fonte

7 risposte

25

is it that just the source code written in C is portable not the executables?

Una corretta. Alcuni lo chiamano scrivere una volta, compilare ovunque.

link .

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

link

E anche se puoi ottenere una portabilità parziale su più piattaforme, non dovresti mai aspettarti che il tuo codice funzioni ovunque senza modifiche.

    
risposta data 16.05.2011 - 19:13
fonte
6

Non è solo specifico ISA. Ad esempio chiedi:

applications for x86 are separate from the applications for apple?

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

    
risposta data 16.05.2011 - 19:16
fonte
5

is it that just the source code written in C is portable not the executables?

Esattamente. Hai bisogno di ricompilare il tuo programma C su ogni piattaforma. I compilatori C generano codice macchina che è portatile solo in misura molto limitata, tra macchine dello stesso processore / architettura di memoria e sistema operativo. Questo è il motivo per cui si vedono 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 qualche anno fa: -).

    
risposta data 16.05.2011 - 19:09
fonte
3

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

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

Ottieni anche i miglioramenti della macchina virtuale stessa.

Quindi, direi che in generale, passando dal meno portatile ai più portatili linguaggi che avresti: Assembler, linguaggio compilato a basso livello come C, quindi C ++, quindi linguaggi interpretati o quelli che girano all'interno di una macchina virtuale .

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

    
risposta data 16.05.2011 - 21:47
fonte
3

Buone risposte sulla scrittura una volta compilate ovunque.

Alla gente piace pensare a C come a un linguaggio portatile a causa della sua popolarità e dell'alto probabilità di un compilatore C disponibile per piattaforme di destinazione future. 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, anche se quasi tutte le applicazioni C complesse richiedono del lavoro per passare a una nuova piattaforma a causa delle dipendenze hardware o del sistema operativo. Questo processo è noto come porting.

    
risposta data 16.05.2011 - 22:09
fonte
3

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

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

  • Esiste uno standard universalmente condiviso per il linguaggio stesso, a differenza di ogni implementazione del compilatore che riconosce una variante leggermente diversa del linguaggio (ancora una volta, un Big Deal quando C fu progettato per la prima volta, poiché c'erano più varianti di linguaggi come Pascal e BASIC che non sono stati riconosciuti universalmente);

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

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

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

Si noti, tuttavia, che C lascia molto all'implementazione. Le dimensioni esatte dei vari tipi di dati, il comportamento sull'overflow, ecc., Dipendono interamente dall'implementazione; lo standard fornisce i requisiti minimi a cui un'implementazione deve conformarsi, ma l'implementazione è libera di andare oltre questi limiti.

    
risposta data 16.05.2011 - 22:18
fonte
0

Qualunque sia l'ISA, C non è ISA specifico. Presumo che tu non ti stia riferendo allo slot ormai obsoleto per le schede di estensione del PC.

Esistono compilatori C conformi agli standard per molte piattaforme e, purché si utilizzino funzioni linguistiche completamente definite dagli standard nel codice sorgente, dovresti 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 funzionalità come definito dall'implementazione o come comportamento non definito. Questo viene fatto per rendere il linguaggio C più generalmente utile per la programmazione di basso livello, evitando i casi in cui alcuni comportamenti definiti con precisione sono inadeguati per 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 fornito da Java o C #. Puoi ottenere librerie molto portabili per fare qualsiasi cosa, ma devi lavorare per costruirle e farle lavorare insieme.

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

    
risposta data 16.05.2011 - 19:14
fonte

Leggi altre domande sui tag