Ogni lingua è scritta in C?


180

A volte durante la programmazione in diversi linguaggi (C / C ++, C #), mi viene in mente questo pensiero:

  • Ogni lingua è scritta nel linguaggio di programmazione C?
  • La lingua C è la madre / il padre di tutte le lingue?
  • Ogni concetto ( OOP , ecc.) È tutto implementato in C?

Sono nella giusta direzione?


58
@XLAnt: molti compilatori C (forse anche la maggior parte) sono scritti in C.
Jörg W Mittag il

32
@Neil: C ++ non si compila in nulla. C ++ è un linguaggio. Le lingue non si compilano, i compilatori lo fanno.
Jörg W Mittag,

12
@XLAnt: Non la penso così. Ma il primo compilatore Oberon, per esempio, è stato scritto in Oberon e poi tradotto a mano (che è una forma di compilazione, immagino) in Fortran. Questo compilatore è stato quindi compilato con un compilatore Fortran, il compilatore Oberon risultante è stato utilizzato per compilare il compilatore Oberon e da quel momento in poi, è stata utilizzata la versione precedente del compilatore per compilare il successivo.
Jörg W Mittag,

18
@Neil Non è poi così pedante. È preciso: una lingua è una specifica. Può essere implementato come compilatore, come interprete, un ibrido, ecc. È possibile scrivere un compilatore per una lingua, ma il compilatore non è la lingua. Immagino che il problema diventi confuso perché ci sono lingue per le quali non ci sono specifiche scritte da nessuna parte tranne che per l'implementazione di riferimento. Ma anche in quei casi, direi che il linguaggio (cioè l'ideale che l'autore aveva in mente) è diverso dall'implementazione / compilatore / interprete / ecc.
Andres F.

21
Downvoter: questa è una domanda abbastanza ragionevole con una risposta chiara. Che la risposta sia "no" non è un motivo per votare. Invece, considera di rispondere e spiegare.
Andres F.

Risposte:


207

No.

I dialetti OCaml, Haskell, Lisp come Scheme e molte altre lingue sono spesso usati nello sviluppo di linguaggi amatoriali.

Molti linguaggi sono implementati in C perché è un linguaggio onnipresente e strumenti di scrittura di compilatori come generatori di lexer-parser (come yacc e bison) sono ben compresi e quasi onnipresenti.

Ma C non poteva originariamente essere sviluppato in C quando fu creato per la prima volta. In effetti, è stato originariamente sviluppato utilizzando il linguaggio B. I linguaggi precedenti (come Fortran) erano di solito avviati tramite bootstrap usando un linguaggio assembly nativo o addirittura un codice macchina molto prima che esistesse C.

Non correlato, paradigmi linguistici come OOP sono generalmente indipendenti dalla lingua. Il paradigma funzionale, ad esempio, è stato sviluppato (da Alonzo Church) come base della matematica molto prima che esistesse un linguaggio di programmazione. I paradigmi di programmazione procedurale e strutturata sono emersi dal lavoro matematico di teorici come John von Neumann. L'orientamento agli oggetti è stato sviluppato da diversi sforzi diversi e non correlati , alcuni fuori dal calcolo lambda (il paradigma funzionale) e altri da sistemi di programmazione dinamica come SmallTalk presso Xerox PARC di Alan Kay.

C è solo una piccola parte della storia, decenni dopo che queste idee sono nate.


40
Mentre è vero che i primi compilatori C ovviamente non potevano essere scritti in C, è certamente possibile ora.
reirab

17
@reirab Posible AND true. GCC è scritto in C e compilato di solito usando GCC .
Darkhogg,

9
Naturalmente, GCC ora viene riscritto in C ++, ma non è così importante come il fatto che il primo compilatore C non potesse essere scritto in C.
greyfade,

10
@greyfade gcc non è stato C per un po 'di tempo. Non è "ora in fase di riscrittura", ma "è stato scritto in C ++ per oltre due anni" (è ancora più vecchio di così, è quando è avvenuta la fusione che lo ha spostato in C ++).

13
@greyfade non è "C ma con funzionalità C ++" una sorta di definizione di C ++?
KutuluMike,

91

Ogni lingua è scritta in linguaggio C?

Una lingua è un insieme di regole matematiche astratte e restrizioni ( "se scrivo questo , che succede"). Non è scritto in niente, davvero.

È specificato, di solito in una miscela di un sottoinsieme formalizzato di inglese, notazione matematica e forse un linguaggio di specifica specializzato. La sintassi è spesso specificata in una variante di EBNF o ABNF .

Ad esempio, ecco la specifica fordell'espressione dalla specifica ISO Ruby Language:

§11.5.2.3.4 L' forespressione

Sintassi

  • for-expression for for-variabile [nessuna terminazione di riga qui] in espressione do-clausola end
  • per variabile lato sinistro | multiplo lato sinistro

Semantica

Una di espressione è valutata come segue:

  1. Valuta l' espressione . Se la valutazione dell'espressione viene terminato da una pausa-espressione , di nuova espressione , o rifare-espressione , il comportamento è specificato. Altrimenti, lascia che Osia il valore risultante.
  2. Sia El' invocazione del metodo primario del form espressione-primaria [qui non c'è un terminatore di riga] .each do | blocco-elenco-parametri- | blocco-corpo end , dove il valore dell'espressione primaria è O, l' elenco di parametri-blocco è il for- variabile , il blocco-corpo è l' istruzione composta della clausola do .

    Valutare E; tuttavia, se durante questa valutazione viene chiamato un blocco il cui corpo del blocco è l' istruzione composta della clausola do dell'espressione for , le fasi in §11.3.3 eccetto la Fase c) e la Fase e) 4) devono essere preso per la valutazione di questo invito.

  3. Il valore dell'espressione for è il valore risultante dell'invocazione.

Ecco un esempio diverso dalle regole di conformità del tipo di Scala:

Il tipo polimorfico [a 1 >: L 1 <: U 1 ,…, a n >: L n <: U n ] T è conforme al tipo polimorfico [a1>: L ′ 1 <: U ′ 1 ,…, a n >: L ′ n <: U ′ n ] T ′ se, assumendo L ′ 1 <: a 1 <: U ′ 1 ,…, L ′ n <: a n <: U'n uno ha T <: T ′ E L i <: L ′ i e U ′ i<: U i for i ∈ {1, ..., n} .


La lingua C è madre / padre di tutte le lingue?

No non lo è. C è piuttosto giovane. Ci sono molte vecchie lingue. Poiché il viaggio nel tempo è fisicamente impossibile, è semplicemente impossibile che C abbia avuto alcuna influenza su quelle vecchie lingue.

  • Plankalkül (1943)
  • Speedcoding (1953)
  • Fortran (1954)
  • IPL (1956)
  • Lisp (1958)
  • Algol (1958)
  • COBOL (1959)
  • JOVIAL (1960)
  • APL (1962)
  • SIMULA (1962)
  • SNOBOL (1962)
  • CPL (1963)
  • BASIC (1964)
  • PL / I (1964)
  • GDR (1964)
  • BCPL (1966)
  • ISWIM (1966)
  • MUMPS (1967)
  • Forth (1968)
  • LOGO (1968)
  • REFAL (1968)
  • B (1969)
  • BLISS (1970)
  • Pascal (1971)
  • KRL (1971)
  • Smalltalk (1972)

Tutti quelli esistevano prima ancora che C fosse inventata. E molti altri non hanno influenza di C in essi, anche dopo che esisteva. La famiglia di lingue PASCAL (ALGOL-58, ALGOL-60, ALGOL-X, ALGOL-W, PASCAL, Modula-2, Oberon, Oberon-2, Active Oberon, Component Pascal) è una discendenza completamente separata. Tutta la famiglia Lisp (LISP, Franz Lisp, InterLisp, MacLisp, Scheme, Flavors, LOOPS, CommonLoops, Dylan, CommonLisp, Arc, Clojure, Racket, ecc.) Non ha alcuna relazione. I linguaggi funzionali (ISWIM, KRL, Miranda, ML, SML, CAML, OCaml, F #, Haskell, Gofer, Clean) e l'intera famiglia tipicamente dipendente (Agda, Coq, GURU, Idris) sono il più lontano possibile da C. Lo stesso vale per la famiglia Smalltalk (Smalltalk, Self, Newspeak, Us, Korz), la famiglia di programmatori logici (PLANNER, Prolog, Mercury), SQL e molti altri.

Ogni concetto (OOP ecc.) È tutto implementato in linguaggio C?

Le prime lingue con concetti OO furono Simula (1960) e Smalltalk (1972), ma i sistemi orientati agli oggetti erano stati costruiti già nel 1953 (senza chiamarli così). Ancora una volta, molto prima che esistesse C, quindi OO non può avere alcuna relazione con C.



2
@leftaroundabout: è un ottimo post sul blog, uno dei miei preferiti da anni.
Jörg W Mittag,

1
@FrancisDavey: grazie. Ho iniziato a compilare l'elenco dalla memoria, quindi ho aggiunto date che non ricordavo cercandole su Wikipedia. Successivamente, ho trovato una sequenza temporale di lingue su Wikipedia e da lì ho scelto alcune altre lingue. Poiché l'articolo su BCPL cita il 1966, ma la cronologia cita il 1967, non ho notato che avevo già aggiunto BCPL. Rimuoverò il duplicato.
Jörg W Mittag,

1
Nella tua lista, "htroF" non è scritto al contrario?
chux,

2
"Il viaggio nel tempo è fisicamente impossibile" - È un'affermazione altamente controversa. Ovviamente non toglie nulla al valore di questa risposta.
Konrad Rudolph,

50

La maggior parte del nucleo di molte lingue importanti è scritta in C, ma le cose stanno cambiando:

  • l'implementazione di riferimento di Python ( CPython ) è scritta in C (ma ci sono altre implementazioni scritte in altre lingue, ad esempio Jython / Java, PyPy / Python, IronPython / C # ...)
  • PHP Zend Engine è scritto in C
  • il primo compilatore Java sviluppato da Sun Microsystems è stato scritto in C, ma ora le librerie di classi sono sempre scritte in Java (poiché sono pensate per essere eseguite usando la stessa VM Java). Alcune librerie che utilizzano JNI (Java Native Interface) possono essere parzialmente scritte in una varietà di altre lingue, poiché sono destinate a essere utilizzate FUORI dalla JVM.

    La VM Sun / Oracle è scritta in C ++. BEA / Weblogic / Oracle VM è scritto in C. Ma ci sono JVM scritti in Java, Lisp, SmallTalk (IBM) ...

  • Perl è implementato come un interprete principale, scritto in C, insieme a una vasta raccolta di moduli, scritti in Perl e C (ma Pugs , un compilatore e interprete per il linguaggio di programmazione Perl 6, è scritto in Haskell)
  • l'interprete ufficiale di Ruby, spesso indicato come l'interprete o la risonanza magnetica di Matz, è scritto in C e utilizza la propria macchina virtuale specifica per Ruby (ma c'è JRuby, un'implementazione Java che gira sulla macchina virtuale Java; Rubinius, un C ++ macchina virtuale bytecode che utilizza LLVM per compilare il codice macchina in fase di esecuzione ...)
  • circa il 50% di R è scritto in C
  • e, naturalmente, C è (era) scritto in C ! (ma il primo compilatore C, destinato al PDP-11, era un mix di B e assemblatore).

Ci sono molte ragioni per cui C è stato spesso scelto: prestazioni, portabilità, esperienza.

L'ultimo probabilmente è il più importante: Python è stato avviato nel 1991, PHP nel 1994/1995, Perl nel 1988, Ruby nel 1995. In quegli anni Java era appena uscito e C ++ non ancora ben standardizzato.


In qualche modo correlato:


5
Dal punto di vista dell'implementazione di compilatori / interpreti, C è stato / è un punto di riferimento. Inoltre ha influenzato direttamente o indirettamente molte lingue successive (almeno sintatticamente).
manlio,

2
abbastanza presto, sarai in grado di dire che C # è stato scritto in C #! (tipo di)
DLeh

1
La maggior parte di Mono (che include un compilatore C # e molte / la maggior parte della libreria di classi base .NET) è scritta in C #.
Charlie Kilian,

3
La risposta alla domanda "C è la madre / il padre di tutte le lingue?" è "no", quindi non credo sia utile fornire molti esempi scritti in C. I contro-esempi sarebbero di aiuto, ma le tue scelte sono ancora discendenti da C. Ad esempio, anche se Java, Python, ecc. sono ora self-hosting, erano ancora avviati da C, quindi sono come "nipoti" di C. Lingue come LISP, FORTRAN, ML e (ovviamente) codice macchina sono veri contro-esempi, dato che C non è mai stata coinvolta in la loro creazione.
Warbo,

2
L'aspirazione per molte lingue deve, naturalmente, essere attuata il più possibile in sé. Tuttavia, sembra che la maggior parte delle lingue dipenda da C perché la maggior parte delle lingue deve essere in grado di chiamare C per essere utile; la maggior parte delle moderne API del sistema operativo e delle utili librerie tendono ad avere collegamenti C. Devi anche stare attento a cosa intendi per "scritto in". Un'implementazione del linguaggio in genere ha più parti: almeno un compilatore e un sistema di runtime. I sistemi di runtime sono spesso scritti in C per una migliore interfaccia con il sistema operativo.
Pseudonimo,

10

No, alcune lingue sono precedenti a C. E molte sono implementate indipendentemente da C, ad es. Vedi http://en.wikipedia.org/wiki/Lisp_%28programming_language%29


2
Esistono molte implementazioni di Java, la maggior parte sono scritte in Java. L'implementazione GNU di Objective-C è scritta in C (o C ++, sono cambiati di recente, credo), l'implementazione di LLVM è scritta in C ++ e c'era un interprete scritto in C #. Esistono molte implementazioni di Python, una è scritta in RPython, una in Java, una in C # e una in C. PHP ha sei implementazioni principali, due in Java, due in C #, una in C e una in C ++.
Jörg W Mittag,

1
No. I designer linguistici sono sicuramente influenzati da altre lingue, ma possono scegliere di ignorare tali influenze se lo desiderano.
Jörg W Mittag,

2
Le lingue @FaizanRabbani, in sostanza, sono concetti e scelte di paradigmi, modelli e compromessi - molto spesso un "linguaggio viene creato / adattato da altre lingue" ma che è completamente estraneo al linguaggio di implementazione del suo compilatore; il linguaggio X può essere derivato dal linguaggio Y ma implementato in C o in qualcosa di completamente diverso - e questo è spesso il caso. E in questo caso, l '"antenato concettuale" è importante, ma il linguaggio del compilatore è solo una sfumatura tecnica appena rilevante che può cambiare nel tempo.
Peteris,

3
L'ultimo link è di dubbia importanza: troppi errori per prenderlo sul serio.
Unknown Coder

4
@SebastianGodelet: HotSpot non è un'implementazione del linguaggio Java. È un'implementazione del linguaggio bytecode JVM. Quelle sono due lingue completamente diverse. Le implementazioni più utilizzate del linguaggio Java provengono javacda Oracle JDK / OpenJDK scritto da Martin Odersky (di fama Scala) in Java al 100%, il compilatore Eclipse, scritto in Java al 100% (derivato dal compilatore Jikes di IBM ), il compilatore di IBM J9, anch'esso derivato da Jikes e Java al 100%. AFAIK, l'unico compilatore Java in uso piuttosto diffuso che non è scritto in Java è GCJ
Jörg W Mittag,

4

Vorrei fare questo un commento se potessi, ma non posso, ecco qui:

Uno dei motivi per cui C sembra così onnipresente è perché è uno dei primi linguaggi sviluppati e un'enorme quantità di linguaggi moderni si basa sulla sua struttura (Java, Go, PHP, Perl, ecc.) - facendolo sembrare più posti di quello che è.

Un'altra ragione spesso dimenticata è che nel 1973 Unix è stato riscritto in C e molte delle chiamate di sistema di Unix sono disponibili anche come programmi / funzioni C, rendendo i due altamente interconnessi. Poiché Unix era una parte potente dello sviluppo della programmazione moderna nel suo insieme, C è stato trascinato in infamia con esso.

Detto questo, la risposta alla tua domanda è "No". C è basato su un linguaggio chiamato ALGOL, e c'erano molti concorrenti sia con ALGOL (FORTRAN, Lisp, COBOL) che C (nessuno viene in mente). La programmazione orientata agli oggetti, probabilmente il più grande cambiamento di paradigma nella progettazione della programmazione, non ha avuto origine con C - nonostante C ++ sia un linguaggio OOP molto popolare (è apparso prima in Lisp o Simula 67, a seconda di chi si chiede). Quando nacque OOP, C era un linguaggio così popolare che non aveva bisogno di essere il primo - era così popolare che l'espansione C ++, per così dire, divenne anche uno dei principali linguaggi OOP. Rimane in uso moderno principalmente a causa delle sue potenti funzionalità di controllo della memoria (è possibile allocare e deallocare direttamente la memoria creata dalle strutture), permettendogli di creare programmi con budget di memoria ristretti (pensate ai videogiochi) e al suo compilatore altamente ottimizzato (ovviamente a seconda del compilatore). Certo, anche queste funzionalità stanno perdendo terreno man mano che la compilazione JIT Java e i gestori di memoria in-lingua diventano più avanzati.


1
ciò non sembra offrire nulla di sostanziale rispetto ai punti formulati e spiegati nelle risposte precedenti, in particolare nella prima , tranne che per un'affermazione discutibile secondo cui "C è basato su un linguaggio chiamato ALGOL"
moscerino del

4
La base di C in ALGOL è difficilmente discutibile ... Vedi cm.bell-labs.com/who/dmr/chist.html , en.wikipedia.org/wiki/C_%28programming_language%29 )
WannabeCoder

la storia attuale è molto più complicata e interessante di così; Direi che il modo in cui sono disposte le cose qui non è di grande aiuto per i lettori
moscerino del

3

Ovviamente no. Come potrebbe il primo compilatore C essere scritto in C se C non esistesse prima? Questo non è il problema del pollo e delle uova.

Esistono molti modi per scrivere il primo compilatore di una lingua che si chiama bootstrap

Inoltre la maggior parte dei compilatori tenta di raggiungere l'hosting autonomo o di compilare se stesso nella sua lingua, principalmente per promuovere la lingua e il compilatore stesso


12
Il primo compilatore Oberon è stato scritto in Oberon. Va benissimo, a condizione che tu sia un professore e che ci siano molti studenti che tradurranno a mano il compilatore per te (che il Prof. Wirth aveva).
Jörg W Mittag,

@Jorg che è stato menzionato nell'articolo di bootstrap collegato sopra, quindi non mi preoccupo di scriverlo perché questa domanda riguarda C e nessun compilatore C è stato scritto in questo modo
phuclv,

14
@ JörgWMittag - il primo compilatore automatizzato Oberon è stato scritto in Oberon. Il primo vero compilatore Oberon era un gruppo di studenti.
nnnnnn,

4
@nnnnnn: considererei questo "gruppo di studenti" un interprete, non un compilatore.
Paŭlo Ebermann,

4
@ Paŭlo Ebermann Per aggiungere un altro elemento umano: "computer" era originariamente un titolo professionale .
chux,

2

Ecco un elenco di alcuni linguaggi di programmazione che non sono scritti in C, accanto ai linguaggi in cui sono implementati:

  • Haskell - Haskell
  • Idris - Haskell
  • Adga - Haskell
  • Clash - Haskell
  • PureScript - Haskell
  • Olmo - Haskell
  • Mercurio - Mercurio
  • Ruggine - Ruggine (inizialmente OCaml)
  • Vai vai
  • Crystal - Crystal
  • OCaml - OCaml
  • Frege - Frege + Java
  • Haxe - OCaml + Haxe
  • Scala - Scala
  • Futhark - Haskell
  • ATS - ATS

I migliori linguaggi per l'implementazione di un compilatore saranno probabilmente molto lontani da C. I linguaggi funzionali ti danno cose come schemi di ricorsione e combinatori di parser monadici (a condizione che tu abbia delle macchine da scrivere), che li rendono particolarmente adatti per il lavoro del compilatore.

In secondo luogo, rispondere alla tua domanda se C sia la "madre / padre di tutti i linguaggi di programmazione" - non proprio. C era un linguaggio ben progettato all'epoca in cui appariva, e senza dubbio ha influenzato i progettisti del linguaggio che poi hanno continuato a fare cose molto diverse. Ma alla fine della giornata, Haskell parte essenzialmente da C in tutti i modi possibili. C ha 45 anni e non sorprende che nel frattempo abbiamo imparato a fare di meglio.

Infine, per rispondere alla tua terza domanda, semplicemente non è il caso che C implementa "tutti i concetti". In particolare, tentare di attuare alcuni dei concetti avanzati della programmazione funzionale (come metamorfismi o, dio non voglia, sincronismi) in C sarebbe mostruosamente difficile. Non conosco particolarmente la programmazione orientata agli oggetti, ma so per certo che alcuni linguaggi orientati agli oggetti hanno tipi di somma.


C non è mai stato "un linguaggio incredibilmente ben progettato". Le verruche che vediamo oggi sono state conosciute fin dall'inizio. Ma era abbastanza buono per essere la lingua madre del sistema operativo Unix adatto agli sviluppatori, e dopo che Bell Labs spinse Unix nelle università, C / Unix divenne la lingua / sistema operativo preferito per una generazione di professionisti del computer.
Solomon Slow,

PS. In C. non c'erano molte idee originali. Se stai cercando la madre / il padre di tutti i linguaggi di programmazione procedurale strutturati in blocchi, potresti dare un'occhiata ad ALGOL .
Solomon Slow,

Le macro Lisp erano molto meglio di C e ALGOL e Smalltalk avevano blocchi, chiusure e funzioni nidificate per aiutare a organizzare il codice. In effetti Lisp avrebbe potuto essere usato come macro-processore per assemblatore e creato un codice che era più breve e più veloce (elaborazione personalizzata delle espressioni S) rispetto ai primi C. Simula che uscì prima che C avesse il polimorfismo. Lisp, APL e Smalltalk avevano "shell" che erano completamente funzionali (lo stesso codice tra shell e programmi) a differenza di "sh" vs "C" di Unix che permetteva di intercalare il codice interpretato e compilato. I puntatori erano più facili in Lisp (rplaca / rplacd).
aoeu256,

Il più grande vantaggio di C era che era più facile costruire "compilatori" per C, e quindi poteva diffondersi più facilmente ... come un virus, e grazie a C i programmatori moderni non hanno idea di come costruire programmi sono modulari (la mutabilità fa male alla modularità), non hanno idea di avverbi / combinatori / funzioni di ordine superiore [scrivi manualmente i tuoi loop ogni volta], e le nostre CPU sono limitate dal collo di bottiglia "von neumann" perché il nostro sistema operativo è scritto in C, quindi abbiamo bisogno del nostro CPU per eseguire codice C per compatibilità con le versioni precedenti.
aoeu256,

1

I linguaggi di programmazione sono specifiche (non software!) Solitamente scritte in alcuni documenti inglesi (con alcune formalizzazione, ad esempio EBNF per la maggior parte della sintassi; a volte anche la loro semantica è anche parzialmente formalizzata).

Ad esempio, C11 è definito da n1570 (che dovresti leggere). Alcuni dialetti di Scheme sono definiti da R5RS (che dovresti anche leggere, è scritto molto bene).

I linguaggi di programmazione possono essere implementati da alcuni software. A volte quel software è un compilatore scritto nel linguaggio di programmazione stesso. Leggi i compilatori di bootstrap .

Si può scrivere un compilatore nel linguaggio di programmazione compilato stesso. Se quella lingua XX è nuova di zecca, devi passare attraverso un passaggio temporaneo che prevede la scrittura di un interprete o compilatore minimo di un sottoinsieme di quella lingua in un altro linguaggio di implementazione (forse C), e in seguito puoi buttare via quel compilatore temporaneo o interprete (che non deve essere "buono", solo per essere abbastanza per compilare l'altro compilatore). Una volta compilato il compilatore XX scritto in XX, puoi eliminare il compilatore temporaneo.

Spesso (ma non sempre) il sistema di runtime è in parte scritto in C (in particolare il Garbage Collector ).

Notare che bones è un compilatore di Scheme e un runtime interamente scritti in sé (e puoi trovare molti altri esempi di implementazioni completamente avviate).

A proposito, è conveniente usare C come lingua di destinazione dei compilatori .

Oggi, molte implementazioni di linguaggi di programmazione sono software libero o open source . Sentiti libero di studiare (e forse contribuire a) il loro codice sorgente!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.