2016-01-31 31 views
5

Perché il linguaggio C originale non supportava le dichiarazioni iniziali nelle inizializzazioni del ciclo?Razionale per pre-C99 C che non ha dichiarazioni iniziali in cicli for?

Ovviamente i creatori originali, e quindi le standardizzazioni pre-C99, non lo hanno specificato in questo modo. Ma non riesco a trovare alcuna motivazione per perché che la scelta di progettazione è stata fatta.

La cosa più vicina ad una risposta mi sembra di trovare è this answer spiegando come le dichiarazioni e il codice di miscelazione è stata vietata al fine di consentire per i compilatori di essere single-passano indietro quando questo era importante. A prima vista ha senso che le dichiarazioni in una dichiarazione di ciclo avessero problemi identici o simili a quelli delle dichiarazioni mescolate con il codice.

Ma, pre-C99 C fatto dichiarazioni di sostegno alla partenza dei blocchi:

{ 
    unsigned int i; 
    for(i = 0; i < WHATEVER; i += 1) 
    { 
     /* ... */ 
    } 
} 

Io personalmente non vedo come la logica compilatore per che è sostanzialmente diverso da quello per questo:

for(unsigned int i = 0; i < WHATEVER; i += 1) 
{ 
    /* ... */ 
} 

Mi sembra che se un compilatore può eseguire l'ex passaggio singolo, potrebbe fare anche quest'ultimo. Potrebbe richiedere che una dichiarazione forsempre crei un blocco di ambito (anche se seguito da una sola istruzione e non da un blocco di istruzioni { ... }), ma non riesco a pensare a un modo per tale semantica di rompere qualsiasi altro pre-C99 Codice C (l'istruzione for è seguita da un blocco nel qual caso è già "ambito", oppure è seguito da una singola istruzione, nel qual caso una nuova dichiarazione non sarebbe stata comunque consentita in quella singola istruzione).

Quindi, perché questa "funzione" di sintassi è stata inizialmente omessa? Ho sbagliato a pensare che sarebbe stato banale sostenerlo senza violare gli obiettivi di prestazione del tempo? Le tecniche del parser/compilatore conosciute al momento hanno fatto sembrare più difficile? È stato omesso solo a causa del design minimalista/mentalità, dal momento che funzionalmente era possibile fare la stessa cosa (bloccarsi per loop)? Oppure c'era un motivo esplicito di design del linguaggio contro di esso (ad esempio, come inizialmente Go escludeva le eccezioni perché i progettisti pensavano che fosse fatto per una lingua migliore)?

Dove Ho guardato

  • Ho cercato di trovare una risposta a questo qui e attraverso general web-search-fu, senza fortuna: tutti i termini di ricerca ho pensato di sembrano essere saturo di confuso domande sulle dichiarazioni iniziali di C for loop, sul messaggio di errore "usato al di fuori della modalità C99", ecc. (eccetto il termine di ricerca "razionale", che mi ha guidato a informazioni utili, ma nulla che abbia risposto in modo specifico).
  • Ho cercato su this article da Dennis Ritchie stesso sullo sviluppo della lingua, e non ho notato nulla.
  • Ho cercato attraverso la mia copia di The C Programming Language (2a edizione), prima leggendo la sezione di spiegazione del loop effettivo, quindi controllando l'indice per altre menzioni di "for"/"for loop". Ho letto un paio di altri posti che pensavo potessero dirlo, ma non ho trovato nulla.
+1

Prima di C99, C non consentiva di definire le variabili tranne all'inizio di un blocco. Le variabili definite nella parte di controllo di un ciclo 'for' non erano all'inizio di un blocco, quindi non c'era alcuna aspettativa che fossero supportate. Il C++ ha introdotto entrambi i concetti (definendo le variabili ovunque in un blocco e le variabili definite nella parte di controllo di un 'for' loo) - e C99 ha aggiunto anche loro. –

+0

Le uniche persone che possono rispondere a questo sono gli autori, chiunque altro sta solo speculando. Questi tipi di domande sono considerati fuori tema. – cimmanon

+0

@JonathanLeffler Ho upvoted il tuo commento. Pensi che sarebbe meglio incorporato nella risposta attualmente data? È simile al concetto "non aggiungere funzionalità a meno che i programmatori non si fermino dall'ottenere qualcosa" nella risposta, ma coglie un modo leggermente diverso di considerare il problema. – mtraceur

risposta

10

Non credo che ci sia alcuna decisione specifica per escludere tali caratteristiche, né la logica montata fare così.

Per quanto romantico possa sembrare credere che i progettisti (Kernighan, Ritchie, ecc.) Abbiano pensato a tutte le possibilità e le caratteristiche escluse solo dopo una considerazione profonda e significativa, la realtà è che i primi anni di progettazione di C (come piuttosto alcuni altri linguaggi di programmazione hanno seguito una filosofia molto più umile come "Inizia in piccolo, non preoccuparti di aggiungere funzionalità a meno che i programmatori non siano PREVENUTI dal fare qualcosa".

Le caratteristiche come l'inizializzazione delle variabili nei loop for sono la convenienza del programmatore: la loro assenza non ha impedito il completamento delle operazioni. Quindi, anche se ci fosse qualcuno che mendica o fa una campagna per tale caratteristica (che probabilmente non c'era), probabilmente è andato giù nell'ordine di priorità.

come le cose si sono evolute .....

Prima del 1999, dichiarazioni di variabili erano all'inizio del file di C (codice iniziata con { e termina alla chiusura }), non all'interno di altre istruzioni. Questo è il modo in cui le cose originariamente funzionavano in pre-standard (K & R), e nelle lingue precedenti come B (che in realtà era una derivata ridotta delle lingue precedenti).

La dichiarazione/inizializzazione variabile all'interno di un ciclo for è stata introdotta prima in C++. È apparso abbastanza presto (ad esempio la Sezione 19 nel BRACCIO), ed è stato infine introdotto nel primo standard C++ che è stato ratificato alla fine del 1998.

C'è stata qualche discussione nel comitato standard C, durante il processo di redazione del Standard C++ (che impiegò un decennio) sull'adozione di alcune caratteristiche del C++ in C. Quella discussione era spesso per lo più sulla falsariga di "farebbe qualcos'altro in C break se aggiungessimo questo?". Un certo numero di produttori di compilatori aveva già implementato molte di queste funzionalità nei loro compilatori C come estensioni opzionali (oi compilatori C erano in realtà compilatori C++, con le impostazioni per disabilitare le funzionalità C++ incompatibili con C), quindi la discussione sull'aggiunta di tali funzionalità era piuttosto breve. Pertanto, quelle caratteristiche facilmente aggiunte a C da C++ apparivano nello standard C del 1999. La dichiarazione/inizializzazione variabile all'interno di un ciclo for era una di quelle funzionalità.

Da quella storia, non vi è alcuna prova di alcuna decisione particolare o logica per escludere tali caratteristiche dal primo C - in breve, probabilmente semplicemente non è stato pensato.

+3

K & R era semplicemente un appassionato assemblatore di testi e voleva un linguaggio che fosse semplice e che potesse tradurre quasi direttamente nell'assembler in modo che potessero continuare a lavorare su UNIX. Ai miei esordi (1983), un buon programmatore C era qualcuno che sapeva cosa generava il compilatore. –

+0

Penso che questa risposta sarebbe ancora migliore con le fonti effettive collegate per alcune affermazioni di verità difficili da verificare con un google (ad esempio, le discussioni del comitato di design C: "farebbe qualsiasi cosa in C break", e che " non aggiungere funzionalità a meno che alle persone non venga impedito di fare qualcosa "era una filosofia di progettazione comunemente adottata in quel momento). Trovo totalmente credibili in base a ciò che so, ma rafforzerebbe le parti che sono più suscettibili di sentire il più "non-obiettivo" per alcuni. Ad ogni modo, a meno che non arrivi qualcosa di meglio, accetterò questa risposta in un altro giorno o giù di lì. – mtraceur

+2

Trova la motivazione C99. Vicino all'inizio (prima pagina dell'introduzione) si dice: _L'obiettivo generale era quello di sviluppare uno standard chiaro, coerente e non ambiguo per [C] che codifichi la comune definizione esistente di C e che promuova la portabilità dei programmi utente ... La carta originale X3J11 aveva chiaramente il mandato di codificare le prassi comuni esistenti e il Comitato della C89 si teneva rapidamente al precedente ovunque fosse chiaro e inequivocabile. La stragrande maggioranza della lingua ... era esattamente la stessa definita nell'Appendice A di ... The C Programming Language di Brian Kernighan e Dennis Ritchie ... _ –