Come il linguaggio C è portabile a qualsiasi set di istruzioni (intendo per la nuova architettura). Dobbiamo scrivere di nuovo il compilatore C per la nuova architettura?
in generale, ogni nuova architettura ha bisogno di una nuova porta del compilatore C (insieme al resto della catena di strumenti C)
Di solito questo inizia con lo sviluppo di un "cross-compilatore" su un'architettura conosciuta per compilare C per la nuova architettura.
(il compilatore, di per sé, può essere ciò che viene compilato, dall'origine, per la nuova architettura.)
anche una nuova architettura correlata necessita di molti aggiornamenti per il compilatore per sfruttare la nuova architettura. Ad esempio prendere un compilatore 8086
C e modificarlo per un'architettura 80486
le modifiche tra l'hardware sottostante (8 bit, 16 bit, 32 bit, 64 bit, 128 bit, ecc. richiedono modifiche al compilatore per sfruttare la nuova architettura. Modifiche al compilatore, a causa di un bus diverso ( ISA, s80, ecc. Ecc. Possono essere sfruttati per sfruttare le diverse capacità del bus, ma di solito non sono una prima considerazione. Una considerazione molto più importante è: quali istruzioni può supportare la nuova CPU e come viene gestita la pipeline? Le unità / etc (e quante di ciascuna unità) sono disponibili nella nuova CPU.
How C language is portable to any instruction set (I mean for new architecture).
Non lo è, ma C è portabile alla maggior parte delle serie di istruzioni ragionevoli vicine a quelle esistenti .
Come ipotetico contro-esempio, potresti definire un'architettura di computer usando ternario (non binario) o decimale. Entrambi sono accaduti in passato (1960: IBM / 1620 era decimale, russo Setun era ternario). Per queste macchine un compilatore C [cross-] non è semplicemente possibile. Nelle precedenti macchine Lisp (o Smalltalk ) o su Rekursiv o iAPX432 macchine, C sarebbe molto difficile (quasi impossibile) per port. L'attuale SAFE progetto Darpa definisce un'architettura che non è C friendly.
In pratica, disponibilità di byte (di 8 bit), indirizzamento dei byte, Harvard o Von Neumann l'architettura è quasi necessaria per un compilatore C ragionevole.
C e molti dei programmi pratici codificati in C- potrebbero essere portati sulla maggior parte delle macchine a 64 o 64 bit (o ipotetici 128 bit) (ma sarebbe molto più difficile portarlo su macchine a 24 bit o 48 bit o su macchine con 9 -prezzi char
e 36 bit parole, anche se ciò sarebbe fattibile in linea di principio).
Naturalmente, quando definisci una nuova architettura oggi (es. RISCV o MILL ), praticamente lo definisci più o meno C compatibile (e vicino ad alcuni processori esistenti, spesso in grado di eseguire alcuni SO POSIX-like) e progetti (e codice, spesso effettuando il porting di alcuni compilatori esistenti come GCC o Clang ), un C cross-compiler per esso. Altrimenti, se la tua architettura è radicalmente diversa, devi pensare (e budgetare) allo sviluppo di compilatori e sistemi operativi per questo.
Inoltre, non sei sicuro che un dato programma (ad esempio il kernel di Linux o il browser Firefox) possa essere facilmente essere ported alla tua nuova architettura.
Sì. Il set di istruzioni è definito, codice macchina, una sintassi del linguaggio assembly è definita insieme a un assemblatore. Molto probabilmente un linker, e quindi sei pronto per una porta del compilatore C. E poi puoi iniziare con bootloader, sistemi operativi ecc (naturalmente dopo la verifica del progetto o come parte di esso).
In rare occasioni qualcuno cambia da questo percorso, e come raramente ci riesce. Puoi sempre portare anche innumerevoli lingue, ma non andrai molto lontano senza un assemblatore e un compilatore C per un processore generico.
Se non si tratta di un processore generico, un assemblatore potrebbe essere tutto ciò che è richiesto.
Non dobbiamo scrivere un compilatore C per ogni nuova architettura. Ad esempio la Lisp Machine e Java VM può fare molto bene senza un compilatore C.
Tuttavia, se lo vuoi davvero, C è portatile anche per queste architetture poiché sono Turing complete .
Per le comuni architetture C-friendly un approccio spesso utilizzato è iniziare a scrivere e utilizzare un C cross-compiler . Se poi vuoi essere indipendente dalla compilazione incrociata, puoi compilare a croce un compilatore C e voilà, hai un compilatore C nativo sulla tua nuova architettura.