Ogni lingua è scritta in C?

176

A volte durante la programmazione in diverse lingue (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.) è implementato in C?

Sono nella giusta direzione?

    
posta FaizanRabbani 22.12.2014 - 09:08
fonte

8 risposte

206

No.

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

Molte lingue sono implementate in C perché è un linguaggio onnipresente e gli strumenti di scrittura del compilatore come i generatori di parser lexer (come yacc e bison) sono ben compresi e quasi ubiquitari.

Ma C non poteva originariamente essere sviluppato in C quando fu creato per la prima volta. In effetti, è stato originariamente sviluppato utilizzando la lingua B . I linguaggi precedenti (come Fortran) erano in genere bootstrap utilizzando un linguaggio assembly nativo o addirittura un codice macchina molto prima che C fosse mai esistito.

Paradossalmente, i paradigmi linguistici come OOP sono generalmente agnostici linguistici. Il paradigma funzionale, ad esempio, è stato sviluppato matematicamente (di Alonzo Church ) come una branca della teoria degli insiemi molto prima che qualsiasi linguaggio di programmazione sia mai esistito. I paradigmi procedurali e strutturati della programmazione provenivano dal lavoro matematico di teorici come John von Neumann. L'orientamento all'oggetto è stato sviluppato da diversi sforzi diversi e non correlati , alcuni dal lambda calcolo (il paradigma funzionale) e alcuni fuori dai sistemi di programmazione dinamica come SmallTalk presso Xerox PARC di Alan Kay.

C è solo una piccola parte della storia, decenni dopo la nascita di queste idee.

    
risposta data 22.12.2014 - 09:59
fonte
91

Is each and every language written in C language?

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

Viene specificato, di solito in una miscela di un sottoinsieme formalizzato di inglese, notazione matematica e forse qualche linguaggio specifico specializzato. La sintassi viene spesso specificata in una variante di EBNF o ABNF .

Ad esempio, ecco la specifica dell'espressione for dalla Specifica del linguaggio Ruby ISO:

§11.5.2.3.4 The for expression

Syntax

  • for-expression for for-variable [no line-terminator here] in expression do-clause end
  • for-variable left-hand-side | multiple-left-hand-side

Semantics

A for-expression is evaluated as follows:

  1. Evaluate the expression. If the evaluation of the expression is terminated by a break-expression, next-expression, or redo-expression, the behavior is unspecified. Otherwise, let O be the resulting value.
  2. Let E be the primary-method-invocation of the form primary-expression [no line-terminator here].each do | block-parameter-list | block-body end, where the value of the primary-expression is O, the block-parameter-list is the for-variable, the block-body is the compound-statement of the do-clause.

    Evaluate E; however, if a block whose block-body is the compound-statement of the do-clause of the for-expression is called during this evaluation, the steps in §11.3.3 except the Step c) and the Step e) 4) shall be taken for the evaluation of this call.

  3. The value of the for-expression is the resulting value of the invocation.

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

The polymorphic type [a1 >: L1 <: U1 , … , an >: Ln <: Un]T conforms to the polymorphic type [a1 >: L′1 <: U′1 , … , an >: L′n <: U′n]T′ if, assuming L′1 <: a1 <: U′1 , … , L′n <: an <: U′n one has T <: T′ and Li <: L′i and U′i <: Ui for i ∈ { 1 , … , n }.

Is C language mother/father of all languages?

No, non lo è. C è piuttosto giovane. Ci sono molte vecchie lingue. Dal momento che il viaggio nel tempo è fisicamente impossibile, è semplicemente impossibile per C avere 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)
  • RPG (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 esistiti prima che C fosse persino inventato. E molti altri non hanno alcuna influenza di C in loro, anche dopo che è esistito. La famiglia di lingue PASCAL (ALGOL-58, ALGOL-60, ALGOL-X, ALGOL-W, PASCAL, Modula-2, Oberon, Oberon-2, Oberon attivo, Pascal componente) è un lignaggio completamente separato. L'intera famiglia Lisp (LISP, Franz Lisp, InterLisp, MacLisp, Scheme, Flavors, LOOPS, CommonLoops, Dylan, CommonLisp, Arc, Clojure, Racket, ecc.) Non è correlata. I linguaggi funzionali (ISWIM, KRL, Miranda, ML, SML, CAML, OCaml, F #, Haskell, Gofer, Clean) e l'intera famiglia tipizzata in modo 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 programmazione logica (PLANNER, Prolog, Mercury), SQL e molti altri.

Each concept (OOP etc) is all implemented in C language?

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

    
risposta data 22.12.2014 - 22:37
fonte
50

La maggior parte del nucleo di molte importanti lingue è 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, es. 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 destinate ad essere eseguite utilizzando la stessa VM Java). Alcune librerie che utilizzano JNI (Java Native Interface) possono essere parzialmente scritte in una varietà di altri linguaggi, poiché sono destinate ad essere utilizzate FUORI dalla JVM.

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

  • Perl è implementato come interprete principale, scritto in C, insieme a una vasta collezione di moduli, scritto in Perl e C (ma Pugs , un compilatore e un interprete per il linguaggio di programmazione Perl 6, è scritto in Haskell)
  • l'interprete ufficiale di Ruby, spesso indicato come Matz's Ruby Interpreter o MRI, è scritto in C e utilizza la propria macchina virtuale specifica di Ruby (ma esiste JRuby, un'implementazione Java che viene eseguita sulla macchina virtuale Java, Rubinius, una macchina virtuale bytecode C ++ che utilizza LLVM per compilare codice macchina in fase di runtime ...)
  • su il 50% di R è scritto in C
  • e, naturalmente, C is (was ) scritto in C ! (ma il primo compilatore C, indirizzato 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 è stato appena rilasciato e C ++ non ancora ben standardizzato.

Parzialmente correlato:

risposta data 22.12.2014 - 10:22
fonte
10

No, alcune lingue sono precedenti C. E molte sono implementate indipendentemente da C, ad es. vedi link

    
risposta data 22.12.2014 - 09:12
fonte
4

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

Una delle ragioni per cui C sembra così onnipresente è perché è una delle prime lingue sviluppate, e un'enorme quantità di linguaggi moderni si basano sulla sua struttura (Java, Go, PHP, Perl, ecc.) - rendendola sembra che sia più posto di quello che è.

Un altro motivo spesso dimenticato è che nel 1973 Unix è stato riscritto in C e molti delle chiamate di sistema di Unix sono anche disponibili come programmi / funzioni C, rendendo i due altamente interconnessi. Dato che Unix è stata una parte importante dello sviluppo della programmazione moderna nel suo insieme, C è stata trascinata con sé nell'infamia.

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 cambio di paradigma nel design della programmazione, non ha avuto origine con C - nonostante il C ++ sia un linguaggio OOP molto popolare (è apparso prima in Lisp o in Simula 67, a seconda di chi si chiede). Quando arrivò OOP, C era un linguaggio così popolare che non aveva bisogno di essere il primo: era così popolare che l'espansione del C ++, per così dire, divenne anche uno dei linguaggi OOP principali. Resta nell'uso moderno principalmente per le sue potenti funzioni di controllo della memoria (puoi allocare e deallocare direttamente la memoria creata dalle tue strutture), permettendogli di creare programmi con budget di memoria ristretti (pensa ai videogiochi) e il suo compilatore altamente ottimizzato (ovviamente a seconda di il compilatore). Certo, anche queste caratteristiche stanno perdendo terreno in quanto la compilazione Java JIT e i gestori di memoria in-language diventano più avanzati.

    
risposta data 22.12.2014 - 15:19
fonte
3

Ovviamente no. Come potrebbe il primo compilatore C essere scritto in C se prima non esisteva C? Questo non è il problema del pollo e dell'uovo.

Ci sono molti modi per scrivere il primo compilatore di una lingua che si chiama bootstrapping

Inoltre la maggior parte dei compilatori tenta di ottenere self-hosting , o di compilare esso stesso la sua lingua, principalmente per promuovere la lingua e il compilatore stesso

    
risposta data 22.12.2014 - 20:11
fonte
2

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

  • Haskell - Haskell
  • Idris - Haskell
  • Adga - Haskell
  • Clash - Haskell
  • PureScript - Haskell
  • Elm - 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 implementare un compilatore saranno probabilmente molto lontani da C. I linguaggi funzionali forniscono cose come schemi di ricorsione e combinatori di parser monadici (purché si abbiano tipeclass), il che li rende particolarmente adatti per il lavoro del compilatore. / p>

In secondo luogo, per rispondere alla domanda se C sia "madre / padre di tutti i linguaggi di programmazione" - non proprio. C era un linguaggio ben progettato al momento in cui è apparso, e senza dubbio ha influenzato i progettisti di linguaggi che poi hanno continuato a fare cose molto diverse. Ma alla fine della giornata, Haskell si allontana da C essenzialmente in ogni modo possibile. C ha 45 anni e non sorprende che abbiamo imparato a fare meglio nel frattempo.

Infine, per rispondere alla terza domanda, semplicemente non è vero che C implementa "tutti i concetti". In particolare, provare a implementare alcuni dei concetti avanzati della programmazione funzionale (come i metamorfismi, o, Dio non voglia, i sincromorfismi) in C sarebbe mostruosamente difficile. Non ho molta familiarità con la programmazione orientata agli oggetti, ma so per certo che alcuni linguaggi orientati agli oggetti hanno tipi di somma.

    
risposta data 16.09.2017 - 08:32
fonte
1

I linguaggi di programmazione sono specifiche (non software!) solitamente scritti in un documento inglese (con qualche formalizzazione, ad esempio EBNF per la maggior parte della sintassi, a volte anche la loro semantica è parzialmente formalizzato).

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

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 quel linguaggio XX è nuovo di zecca, devi passare attraverso una fase temporanea che comporta la scrittura di un interprete o compilatore minimo di un sottoinsieme di quella lingua in qualche altro linguaggio di implementazione (forse C), e successivamente puoi buttare via quel compilatore temporaneo o interprete (che non ha bisogno di essere "buono", solo per essere sufficiente per compilare l'altro compilatore). Una volta compilato il tuo XX compilatore scritto in XX puoi buttare via il tuo compilatore temporaneo.

Spesso (ma non sempre) il sistema di runtime è parzialmente scritto in C (in particolare garbage collector ).

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

BTW è comodo usare C come lingua di destinazione dei compilatori .

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

    
risposta data 16.09.2017 - 08:47
fonte

Leggi altre domande sui tag