Domanda

Sembra che la maggior parte dei nuovi linguaggi di programmazione che sono apparse negli ultimi 20 anni sono stati scritti in C. Questo rende completo senso, come C può essere visto come una sorta di linguaggio assembly portatile. Ma quello che mi incuriosisce è se questo ha limitato la progettazione delle lingue in alcun modo. Che cosa ha spinto la mia domanda stava pensando a come lo stack C viene utilizzato direttamente in Python per le funzioni di chiamata. Ovviamente il progettista linguaggio di programmazione può fare ciò che vogliono in qualsiasi lingua che vogliono, ma mi sembra che la lingua si sceglie di scrivere la nuova lingua in ti mette in una certa mentalità e ti dà certe scorciatoie che sono difficili da ignorare. Ci sono altre caratteristiche di queste lingue che provengono da essere scritto in quella lingua (buono o cattivo)?

È stato utile?

Soluzione

Anche con un'implementazione C, sei sorprendentemente libero in termini di attuazione. Ad esempio, regime pollo utilizza C come intermedio, ma riesce ancora a utilizzare la pila come generazione vivaio sua garbage collector.

Detto questo, ci sono alcuni casi in cui ci sono vincoli. Caso in questione: Haskell compilatore GHC ha uno script perl chiamato Male Mangler per modificare il codice assembly GCC-in uscita per implementare alcune ottimizzazioni importanti. Sono stati muovendo per internamente generate assemblaggio e LLVM parzialmente per questo motivo. Detto questo, non è vincolata alla progettazione del linguaggio -. Unica scelta del compilatore di ottimizzazioni disponibili

Altri suggerimenti

Io tendo a non essere d'accordo.

Non credo che sia così tanto che il compilatore o interprete di una lingua è implementato in C - dopo tutto, è possibile implementare una macchina virtuale con C che è completamente a differenza del suo ambiente host, il che significa che possono uscire da una mentalità linguaggio C / vicino-assemblaggio.

Tuttavia, è più difficile sostenere che il linguaggio C si non ha avuto alcuna influenza sul design delle lingue più tardi. Prendiamo ad esempio l'utilizzo di parentesi graffe { } alle dichiarazioni di gruppo in blocchi, l'idea che gli spazi e il rientro è per lo più importante, i nomi di tipo nativo (int, char, ecc) e di altre parole chiave, o il modo in cui vengono definite le variabili (es. dichiarazione del tipo primo, seguito dal nome della variabile, inizializzazione opzionale). Molti dei linguaggi popolari e diffuse di oggi (C ++, Java, C #, e sono sicuro che ci sono anche di più) condividere questi concetti con C. (Questi probabilmente non sono stati del tutto nuovo con C, ma per quanto ne so C si avvicinò con quel particolare miscela di sintassi del linguaggio.)

No, insomma. La realtà è, guardarsi intorno alle lingue che sono scritte in C. Lua, per esempio, è quanto di più lontano da C come si può ottenere senza diventare Perl. Ha funzioni di prima classe, la gestione della memoria completamente automatizzato, ecc.

E 'insolito per nuovi linguaggi per essere influenzati dal loro linguaggio di implementazione, a meno che detto di lingua contiene gravi limitazioni. Mentre io sicuramente disapprovo C, non è un linguaggio limitato, solo molto soggetto ad errori e lento a programma rispetto a linguaggi più moderni. Oh, se non in CRT. Ad esempio, Lua non contiene la funzionalità di directory, perché non è parte del tubo catodico in modo che non possano portabile implementarlo in serie C. Questo è un modo in cui C è limitata. Ma in termini di caratteristiche del linguaggio, non è limitato.

Se si voleva costruire un argomento dicendo che le lingue implementate in C hanno dei limiti XYZ o caratteristiche, si dovrebbe dimostrare che fare le cose in un altro modo è impossibile in C.

Lo stack C è solo lo stack del sistema, e questo concetto precede C da un bel po '. Se si studia la teoria del calcolo si vedrà che utilizza uno stack è molto potente.

Utilizzo di C per implementare lingue ha probabilmente avuto molto poco effetto su quelle lingue, anche se la familiarità con C (e altre C come le lingue) di persone che progettare e implementare lingue ha probabilmente influenzato il loro design molto. E 'molto difficile non essere influenzati da cose già viste, anche quando non si sta copiando attivamente i pezzi migliori di un'altra lingua.

Molte lingue fanno uso C da collante tra loro e le altre cose, però. Parte di questo è che molti sistemi operativi forniscono un'API C, per così l'accesso che è facile da usare C. Inoltre, C è proprio così comune e semplice che molte altre lingue hanno una sorta di modo di interfacciarsi con esso. Se si desidera incollare due moduli insieme che sono scritte in diverse lingue quindi utilizzando C come l'uomo medio è probabilmente la soluzione più semplice.

Quando l'implementazione di una lingua in C ha probabilmente influenzato altri linguaggi di più è probabilmente cose come fughe sono fatte in stringhe, che probabilmente non è così limitante.

L'unica cosa che ha costretto il design il linguaggio è la fantasia e l'abilità tecnica dei progettisti di linguaggi. Come lei ha detto, C può essere pensato come un "linguaggio assembly portatile". Se questo è vero, allora chiede se C ha costretto un design è simile a chiedere se ha assemblaggio progettazione del linguaggio vincolata. Dal momento che tutto il codice scritto in qualsiasi lingua è finalmente eseguito come assemblaggio, ogni lingua subirebbe gli stessi vincoli. Pertanto, il linguaggio C si impone vincoli che potrebbero essere superati utilizzando una lingua diversa.

Detto questo, ci sono alcune cose che sono più facile per fare in una lingua contro l'altro. Molti progettisti di linguaggi tenerne conto. Se la lingua è stato progettato per essere, diciamo, potente a elaborazione delle stringhe, ma le prestazioni non è una preoccupazione, quindi utilizzando un linguaggio con una migliore built-in strutture di elaborazione delle stringhe (come C ++) potrebbe essere più ottimale.

Molti sviluppatori scelgono C per diversi motivi. In primo luogo, C è un linguaggio molto comune. progetti open source, in particolare del genere è relativamente più facile trovare un esperto sviluppatore in linguaggio C di quanto non lo è quello di trovare uno sviluppatore equivalentemente qualificati in alcune altre lingue. In secondo luogo, C tipicamente si presta a micro-ottimizzazione. Durante la scrittura di un parser per un linguaggio script, l'efficienza del parser ha un grande impatto sulle prestazioni globali di script scritti in quella lingua. Per linguaggi compilati, un compilatore più efficiente in grado di ridurre i tempi di compilazione. Molti compilatori C sono molto buoni a generare codice estremamente ottimizzato (che è anche parte del motivo molti sistemi embedded sono programmati in C), e il codice di performance critica possono essere scritti in linea di montaggio. Inoltre, C è standardizzata ed è generalmente un bersaglio statico. Il codice può essere scritto allo standard ANSI / C89 e non devono preoccuparsi di esso che è incompatibile con una versione futura di C. Le modifiche apportate nella funzionalità add standard di C99, ma non rompere il codice esistente. Infine, C è estremamente portatile. Se esiste almeno un compilatore per una determinata piattaforma, è più probabile un compilatore C. Usando un linguaggio altamente portatile come C rende più facile per massimizzare il numero di piattaforme in grado di utilizzare la nuova lingua.

L'unica limitazione che viene in mente è l'estensibilità e compilatore di hosting. Consideriamo il caso di C #. Il compilatore è scritto in C / C ++ ed è interamente codice nativo. In questo modo è molto difficile da usare nel processo con un'applicazione C #.

Questo ha vaste implicazioni per la catena di lavorazione delle C #. Qualsiasi codice che vuole approfittare del reale C # parser o motore di associazione deve avere almeno un componente che è scritto in codice nativo. Questo alla fine si traduce in maggior parte della catena di utensili per il linguaggio C # essere scritte in C ++, che è un po 'indietro per una lingua.

Questo non significa limitare la lingua per dire, ma ha sicuramente un effetto sull'esperienza attorno al linguaggio.

garbage collection. implementazioni di lingua in cima Java o .NET utilizzano GC della VM. Quelli in cima a C tendono a usa il riferimento.

Una cosa che posso pensare è che le funzioni sono membri non necessariamente di prima classe in lingua, e questo non può essere imputato a C da sola (non sto parlando di passare un puntatore a funzione, anche se si può sostenere che C fornisce questa caratteristica).

Se si dovesse scrivere un DSL in Groovy (/ Scheme / Lisp / Haskell / lua / javascript / e ancora un po 'che non sono sicuro di), le funzioni possono diventare membri di prima classe. Fare funzioni i membri di prima classe e consentendo funzioni anonime consente di scrivere conciso e codice leggibile più umano (come dimostrato da LINQ).

Sì, alla fine tutti questi sono in esecuzione in C (o di montaggio se si vuole arrivare a quel livello), ma in termini di fornire all'utente del linguaggio la possibilità di esprimersi al meglio, queste astrazioni fare un ottimo lavoro.

L'implementazione di un compilatore / interprete in C non ha alcuna limitazione importanti. D'altra parte, l'implementazione di un linguaggio di X per il compilatore C fa. Ad esempio, secondo il voci di Wikipedia C--, durante la compilazione di un livello più alto il linguaggio C non si può fare precisa raccolta dei rifiuti, la gestione delle eccezioni efficiente, o l'ottimizzazione ricorsione in coda. Questo è il tipo di problema che C-- era destinato a risolvere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top