2009-09-23 10 views
9

Ecco la domanda, come è stato il C (K & R C)? La domanda riguarda i primi dieci o venti anni della vita di C?Com'è nata la C prima che io nascessi?

Lo so, bene li ho sentiti da un prof nella mia uni, che C non aveva le librerie standard che otteniamo con ANSI C oggi. Erano soliti scrivere le routine IO nell'assemblaggio avvolto! La seconda cosa è che il libro K & R è uno dei migliori libri di sempre per un programmatore da leggere, Questo è ciò che il mio prof ci ha detto :)

Vorrei saperne di più sul buon vecchio C. Per esempio, quale grande differenza tu sai rispetto ad ANSI C, o in che modo il C ha cambiato idea sui programmatori riguardo alla programmazione?


Solo per cronaca, io chiedo a questa domanda dopo aver letto principalmente questi due documenti:

Sono circa C++, ho conoscere! ecco perché voglio saperne di più su C, perché questi due articoli riguardano il modo in cui C++ è nato da C. Ora sto chiedendo come fosse prima del. Grazie Lazarus per aver ricordato al 1 ° edizione del K & R, ma sono ancora interessati a conoscere di più su C da SO guru;)

+9

Odori come i compiti per ragazzi – Lazarus

+2

Può essere ingiusto, perché non cercare una copia della prima edizione del libro K & R. Questo dovrebbe darti una buona idea di com'era nei bei tempi andati. – Lazarus

+0

qual è la tua data di nascita? – TigerTiger

risposta

2

Guarda il codice per il kernel Unix Versione 6 - era quello che sembrava C!

Vedere Lion's Commentary on Unix 6th Edition (Amazon).

Inoltre, sarebbe più facile se ci hai detto la tua età - il tuo profilo dice che sei 22, in modo che stai chiedendo di codice prima del 1987.

Considera anche: The Unix Programming Environment dal 1984.

+0

Grazie, sembra una grande risorsa da seguire :) – AraK

3

Parlando per esperienza personale, i miei primi due compilatori C/ambienti dev erano DeSmet C (16 -bit riga di comando MS-DOS) e Lattice C (anche la riga di comando MS-DOS a 16 bit). DeSmet C è venuto con un proprio editor di testo (see.exe) e librerie - le funzioni non standard come scr_rowcol() posizionavano il cursore. Anche allora, tuttavia, c'erano alcune funzioni standard, come printf(), fopen() fread(), fwrite() and fclose().

Una delle peculiarità interessanti dell'epoca era la possibilità di scegliere tra quattro modelli di memoria di base: S, P, D e L. Altre variazioni andavano e venivano nel corso degli anni, ma queste erano le più significative. S era il modello "piccolo", indirizzamento a 16 bit per codice e dati, limitandoti a 64K per ciascuno. L ha usato l'indirizzamento a 24 bit, che era un registro di segmento a 16 bit e un registro di offset a 16 bit per calcolare gli indirizzi, limitandoti a 1024K di spazio di indirizzamento. Ovviamente, in un mondo DOS a 16 bit, si è stati confinati a una limitazione fisica di 640K. P e D erano compromessi tra le due modalità, dove P ammetteva codice a 24 bit (640K) e dati a 64K e D consentito per il codice 64K e l'indirizzamento dei dati a 640K.

+0

Fortunatamente, Lattice ha deciso di rendere l'esperienza il più possibile simile a Unix, aiutata dal fatto che MS-DOS 2.0 ha fatto lo stesso. E quando Microsoft ha concesso in licenza il compilatore Lattice, hanno fatto lo stesso. – kdgregory

+1

Si noti che i modelli di memoria erano un'invenzione di Microsoft. Unix C non ha mai avuto tali mostruosità. – Jay

+2

In realtà, erano un'invenzione Intel. Unix mainstream ha avuto il lusso di girare su architetture di processore con spazi di indirizzamento contigui (e generalmente di grandi dimensioni): PDP-11, VAX, 68000, 80386 e così via. A meno che non volessi limitarti a un segmento di dati a 64k, avevi bisogno di un meccanismo per indirizzare il resto dell'1M in un 8086. Non ho usato il primo compilatore Intel C (che non credo provenga da entrambi Lattice o Microsoft), ma si sospetta che abbia una sorta di controllo di segmentazione esplicito. – kdgregory

3

Wikipedia ha some information su questo argomento.

+0

Grazie Nathan. La pagina di Wikipedia è davvero breve se voglio saperne di più sull'argomento. – AraK

+0

Certo, l'ho notato anche io ... subito dopo l'invio. :( –

7

Dai un'occhiata allo home page per il libro K & R presso i Bell Labs, in particolare il titolo "La storia della lingua è tracciata in" Lo sviluppo del linguaggio C ", da HOPL II, 1993"

12

Beh, tanto per cominciare, non c'era niente di tutto questo prototipo di funzione spazzatura. main() è stato dichiarato così:

/* int */ main(c,v) 
int c; 
char *v[]; 
{ 
    /* Do something here. */ 
} 

e non c'era niente di tutto questo commenti doppio-slash fantasia sia. Né elenchi. I veri uomini hanno usato #define.

Aah, porta una lacrima agli occhi, ricordando i bei vecchi tempi :-)

+19

i bei giorni ole, dove tutto era peggio, e quindi meglio –

+6

In realtà anche i tipi di ritorno erano omessi.I primi C restituivano sempre una parola e un argomento int era predefinito, quindi un semplice "main (c, v) char * v []; {/*...*/} "era tipico –

+0

Avevo dimenticato quel bit, @Andy. – paxdiablo

3

Ecco un esempio del codice che ha cambiato con ANSI C per il meglio:

double GetSomeInfo(x) 
int x; 
{ 
    return (double)x/2.0; 
} 

int PerformFabulousTrick(x, y, z) 
int x, int y; 
double z; 
{ 
    /* here we go */ 
    z = GetSomeInfo(x, y); /* argument matching? what's that? */ 
    return (int)z; 
} 
+0

Hai dimenticato il paren attorno all'argomento di ritorno. Alcuni compilatori pre-ANSI in realtà li richiedevano. ;) –

+0

Sì, la vita ha succhiato in quel modo. Non ho mai preso l'abitudine paren poiché il compilatore C che ho usato è stato scritto da K & R (ho lavorato ai Bell Labs quando ho imparato C). – plinth

+0

Non mi è mai piaciuto particolarmente il paren, me stesso.Mi ha sempre infastidito il modo in cui sembravano essere lo stile accettato all'epoca, nonostante il fatto che così tante fonti affermassero "evitare parven non necessari". Alcuni compilatori hanno implementato return() come una chiamata di funzione, che ha semplicemente aggiunto alla confusione. –

3

ho iniziato a lavorare con C su VAX/VMS nel 1986. Qui ci sono le differenze che ricordo:

  • Nessun prototipi - definizioni di funzioni e delcarations sono stati scritti da
 
    int main() /* no void to specify empty parameter list */ 
    { 
     void foo(); /* no parameter list in declaration */ 
     ... 
    } 
    ... 
    void foo(x,y) 
     int x; 
     double y; 
    { 
     ... 
    } 
  • generici (void) tipo di puntatore; tutte le funzioni *alloc() restituiscono invece char * (che è parte del motivo per cui alcune persone eseguono ancora il cast del valore di ritorno di malloc(); con i compilatori ANSI precedenti, è stato a);

  • Le funzioni variabili sono state gestite in modo diverso; non era richiesto alcun argomento fisso e il file di intestazione era chiamato diversamente (varargs.h invece di stdarg.h);

  • Un sacco di cose è stato aggiunto a math.h nel corso degli anni, in particolare nello standard C99; La C anni '80 non era il più grande strumento per il lavoro numerico;

  • Le librerie non erano standardizzate; quasi tutte le implementazioni avevano una versione di stdio, matematica, stringa, ctype, ecc., ma i contenuti non erano necessariamente gli stessi attraverso le implementazioni.

+0

Anche io ero un ragazzo VAX/VMS. In Unix e PC-lands, restituendo 0 da main() significa che tutto è buono e normale. Ma VMS ha interpretato il valore restituito come un codice di errore standard, in cui i valori dispari erano buoni e anche quelli erano cattivi. I programmi portati terminavano invariabilmente con i messaggi "Violazione di accesso", perché è quello che 0 mappava nelle tabelle dei messaggi di sistema. Anche con ANSI, non potevi 'ritornare a EXIT_SUCCESS', dovevi usare' exit (EXIT_SUCCESS); 'e poi aggiungere un commento'/* NOTREACHED */'per lint e infine' return 0; 'per soddisfare l'avviso del compilatore . –

+0

era uno sviluppo piuttosto recente; c'erano una varietà di altre tecniche molto più discutibili utilizzate prima. –

+0

exit (SS $ _SUCCESS); funzionerebbe benissimo su vms. – EvilTeach

0

Ho iniziato a usare C all'inizio degli anni '80. La differenza fondamentale che ho visto tra ora e allora era che i primi C non avevano prototipi di funzioni, come qualcuno ha notato. Il primo C mai usato aveva praticamente la stessa libreria standard di oggi. Se c'era un tempo in cui C non aveva printf o fwrite, era prima ancora del mio tempo! Ho imparato C dal libro originale K & R. È davvero un classico, e la prova che le persone tecnicamente sofisticate possono anche essere scrittori eccellenti. Sono sicuro che lo puoi trovare su Amazon.

0

Si potrebbe dare un'occhiata alle voci del concorso C offuscate dal periodo di tempo che stai cercando.

2

Mentre per ovvie ragioni il nucleo del linguaggio è venuto prima che la libreria, se entrare in possesso di una copia della prima edizione del K & R pubblicata nel 1978 si trova la libreria molto familiare. Anche C è stato originariamente utilizzato per lo sviluppo di Unix e la libreria è collegata ai servizi di I/O del sistema operativo. Quindi penso che l'affermazione del tuo prof sia probabilmente apocrifa.

La differenza più evidente è il modo funzioni sono state definite:

VOID* copy(dest, src, len) 
    VOID* dest ; 
    VOID* src ; 
    int len ; 
{ 
    ... 
} 

anziché:

void* copy(void* dest, void* src, int len) 
{ 
    ... 
} 

per esempio. Nota l'uso di VOID; K & R C non aveva un tipo di vuoto e in genere VOID era una macro definita come int *. Inutile dire che, per consentire a questo di funzionare, il tipo di controllo nei primi compilatori era permissivo. Da un punto di vista pratico, la capacità di C di convalidare il codice era scadente (in gran parte attraverso la mancanza di prototipi di funzioni e il controllo dei tipi deboli), e quindi la popolarità di strumenti come il lint.

Nel 1978 la definizione della lingua era il libro K & R. Nel 1989 è stato standardizzato da ANSI e successivamente da ISO, la 2a edizione non è più considerata come la definizione della lingua, ed era basata su ANSI C. È ancora il miglior libro su C IMO e un buon libro di programmazione in generale.

C'è una breve descrizione su Wikipedia che può essere d'aiuto. La cosa migliore è ottenere una copia della prima edizione di K & R, tuttavia, non la userei per imparare C, ottenere un 2 ° ed. per quello.

0

Gli interi a 16 bit erano piuttosto comuni nei vecchi tempi.

Problemi correlati