Ist jede Sprache in C geschrieben?

180

Beim Programmieren in verschiedenen Sprachen (C / C ++, C #) fällt mir manchmal folgender Gedanke ein:

  • Ist jede Sprache in der Programmiersprache C geschrieben?
  • Ist die C-Sprache die Mutter / der Vater aller Sprachen?
  • Ist jedes Konzept ( OOP usw.) vollständig in C implementiert?

Bin ich in die richtige Richtung?

FaizanRabbani
quelle
58
@XLAnt: Viele (vielleicht sogar die meisten) C-Compiler sind in C geschrieben.
Jörg W Mittag
32
@Neil: C ++ kompiliert zu nichts. C ++ ist eine Sprache. Sprachen kompilieren nicht, Compiler tun es.
Jörg W Mittag
12
@XLAnt: Das glaube ich nicht. Aber der erste Oberon-Compiler zum Beispiel wurde in Oberon geschrieben und dann von Hand übersetzt (was, glaube ich, eine Form der Kompilierung ist) nach Fortran. Dieser Compiler wurde dann mit einem Fortran-Compiler kompiliert, der resultierende Oberon-Compiler wurde zum Kompilieren des Oberon-Compilers verwendet und von diesem Zeitpunkt an wurde die vorherige Version des Compilers zum Kompilieren des nächsten verwendet.
Jörg W Mittag
18
@Neil Es ist nicht wirklich so umständlich. Es ist richtig: Eine Sprache ist eine Spezifikation. Es kann als Compiler, als Interpreter, als Hybrid usw. implementiert werden. Sie können einen Compiler für eine Sprache schreiben , aber der Compiler ist nicht die Sprache. Ich vermute, das Problem wird verwirrend, da es Sprachen gibt, für die nirgendwo eine Spezifikation geschrieben wurde, außer für die Referenzimplementierung. Aber auch in diesen Fällen würde ich behaupten, dass die Sprache (dh das Ideal, das der Autor im Kopf hatte) sich von der Implementierung / dem Compiler / dem Interpreter / etc. Unterscheidet.
Andres F.
21
Downvoters: Dies ist eine ziemlich vernünftige Frage mit einer klaren Antwort. Daß die Antwort "nein" ist, ist kein Grund, abzulehnen. Erwägen Sie stattdessen, zu antworten und zu erklären.
Andres F.

Antworten:

207

Nein.

OCaml-, Haskell-, Lisp-Dialekte wie Scheme und mehrere andere Sprachen werden häufig bei der Entwicklung von Hobby-Sprachen verwendet.

Viele Sprachen sind in C implementiert, weil es eine allgegenwärtige Sprache ist, und Compiler-Schreibwerkzeuge wie Lexer-Parser-Generatoren (wie Yacc und Bison) sind gut verstanden und fast genauso allgegenwärtig.

Aber C selbst konnte ursprünglich nicht in C entwickelt werden, als es zum ersten Mal erstellt wurde. Es wurde ursprünglich in der B- Sprache entwickelt. Frühere Sprachen (wie Fortran) wurden in der Regel Bootstrap lang mit einer nativen Assemblersprache oder auch Maschinencode , bevor C je existierte.

Unabhängig davon sind Sprachparadigmen wie OOP im Allgemeinen sprachunabhängig. Das funktionale Paradigma zum Beispiel wurde (von Alonzo Church) als Grundlage der Mathematik entwickelt, lange bevor es überhaupt eine Programmiersprache gab. Das prozedurale und strukturierte Programmierparadigma stammt aus der mathematischen Arbeit von Theoretikern wie John von Neumann. Die Objektorientierung wurde durch verschiedene und nicht verwandte Versuche entwickelt, einige aus der Lambda-Rechnung (dem Funktionsparadigma) und einige aus dynamischen Programmiersystemen wie SmallTalk bei Xerox PARC von Alan Kay.

C ist nur ein winziger Teil der Geschichte, Jahrzehnte nachdem diese Ideen entstanden sind.

greyfade
quelle
40
Während es stimmt, dass die ersten C-Compiler offensichtlich nicht in C geschrieben werden konnten, ist dies jetzt sicherlich möglich.
Reirab
17
@ Reirab möglich und wahr. GCC ist in C geschrieben und wird üblicherweise mit GCC kompiliert .
Darkhogg
9
Natürlich wird GCC jetzt in C ++ umgeschrieben, aber das ist nicht so wichtig wie die Tatsache, dass der erste C-Compiler nicht in C geschrieben werden konnte
greyfade
10
@greyfade gcc ist seit einiger Zeit kein C mehr. Es wird nicht "jetzt umgeschrieben", sondern es wurde "seit über zwei Jahren in C ++ geschrieben" (obwohl es noch älter ist, als die Zusammenführung passierte, die es nach C ++ verschob).
13
@greyfade ist nicht "C, aber mit C ++ - Funktionen" eine Art Definition von C ++?
KutuluMike
91

Ist jede Sprache in C geschrieben?

Eine Sprache ist ein Satz von abstrakten mathematischen Regeln und Einschränkungen ( „wenn ich schreibe dies , dass passiert“). Es ist wirklich in nichts geschrieben.

Es wird in der Regel in einer Mischung aus einer formalisierten Teilmenge von Englisch, mathematischer Notation und möglicherweise einer speziellen Spezifikationssprache angegeben. Die Syntax wird häufig in einer Variante von EBNF oder ABNF angegeben .

Hier ist zum Beispiel die Spezifikation des forAusdrucks aus der ISO Ruby Language Specification:

§11.5.2.3.4 Der forAusdruck

Syntax

  • for-expression for for-variable [hier kein Zeilenendezeichen] in expression do-clause end
  • für-Variable linke Seite | mehrere-linke Seite

Semantik

Ein for-Ausdruck wird wie folgt ausgewertet:

  1. Werten Sie den Ausdruck aus . Wenn die Auswertung des Ausdrucks durch einen break-Ausdruck , next-Ausdruck oder redo-Ausdruck beendet wird , ist das Verhalten nicht spezifiziert. Ansonsten sei Oder resultierende Wert.
  2. Lassen Sie Ekann die primär Verfahren-Aufruf des Formulars Primär-expression [keine Linie-Terminator hier] .each do | Block-Parameter-Liste | Blockkörper end , in dem der Wert des Primärausdruck ist O, der Block-Parameter-Liste ist die for- Variable , der Block-Body ist die zusammengesetzte Anweisung der do-Klausel .

    Bewerten E; Wenn jedoch ein Block , dessen Blockkörper das ist Verbindung-Anweisung des do-Klausel der for-Expression während dieser Bewertung genannt wird, werden die Schritte in §11.3.3 außer dem Schritt c) und dem Schritt e) 4) erhält für die Auswertung dieser Ausschreibung herangezogen werden.

  3. Der Wert des for-Ausdrucks ist der resultierende Wert des Aufrufs.

Hier ist ein anderes Beispiel als die Typkonformitätsregeln von Scala:

Der polymorphe Typ [A 1 >: L 1 <: U 1 , ..., a n >: L n <: U n ] T entspricht den polymorphen Typen [A1>: L ' 1 <: U' 1 , ..., a n >: L ' n <: U' n ] T ', wenn unter der Annahme von L' 1 <: a 1 <: U ' 1 , ... L' n <: a n <: U ' n hat man T <: T ' Und L i <: L' i und U ' i<: U i für i ∈ {1,…, n} .


Ist C-Sprache Mutter / Vater aller Sprachen?

Nein ist es nicht. C ist ziemlich jung. Es gibt viele alte Sprachen. Da Zeitreisen physisch unmöglich sind, ist es für C einfach unmöglich, irgendeinen Einfluss auf diese alten Sprachen zu haben.

  • Plankalkül (1943)
  • Geschwindigkeitskodierung (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)
  • Rollenspiel (1964)
  • BCPL (1966)
  • ISWIM (1966)
  • MUMPS (1967)
  • Forth (1968)
  • LOGO (1968)
  • REFAL (1968)
  • B (1969)
  • Glückseligkeit (1970)
  • Pascal (1971)
  • KRL (1971)
  • Smalltalk (1972)

Alle existierten, bevor C überhaupt erfunden wurde. Und viele andere haben keinen Einfluss auf C, selbst nachdem es existiert hat. Die PASCAL-Sprachfamilie (ALGOL-58, ALGOL-60, ALGOL-X, ALGOL-W, PASCAL, Modula-2, Oberon, Oberon-2, Active Oberon, Component Pascal) ist eine völlig separate Linie. Die gesamte Lisp-Familie (LISP, Franz Lisp, InterLisp, MacLisp, Schema, Flavours, LOOPS, CommonLoops, Dylan, CommonLisp, Arc, Clojure, Racket usw.) hat ebenfalls keine Beziehung. Die funktionalen Sprachen (ISWIM, KRL, Miranda, ML, SML, CAML, OCaml, F #, Haskell, Gofer, Clean) und die gesamte typabhängige Familie (Agda, Coq, GURU, Idris) sind so weit wie möglich von C entfernt. Gleiches gilt für die Smalltalk-Familie (Smalltalk, Self, Newspeak, Us, Korz), die Logik-Programmierfamilie (PLANNER, Prolog, Mercury), SQL und viele andere.

Jedes Konzept (OOP usw.) ist alle in C-Sprache implementiert?

Die ersten Sprachen mit OO-Konzepten waren Simula (1960) und Smalltalk (1972), aber objektorientierte Systeme wurden bereits 1953 gebaut (ohne sie so zu nennen). Wiederum ist das lange bevor C existierte, also kann OO unmöglich irgendeine Beziehung zu C haben.

Jörg W. Mittag
quelle
2
@leftaroundabout: Das ist ein großartiger Blogpost, einer meiner Favoriten seit Jahren.
Jörg W Mittag
1
@FrancisDavey: Danke. Ich fing an, die Liste aus dem Gedächtnis zusammenzustellen, und fügte dann Daten hinzu, an die ich mich nicht erinnerte, indem ich sie in Wikipedia nachschlug. Danach habe ich eine Zeitleiste mit Sprachen auf Wikipedia gefunden und ein paar weitere Sprachen von dort ausgewählt. Da der Artikel über BCPL 1966, aber die Zeitleiste 1967 zitiert, habe ich nicht bemerkt, dass ich BCPL bereits hinzugefügt habe. Ich werde das Duplikat entfernen.
Jörg W Mittag
1
Ist "htroF" in Ihrer Liste nicht rückwärts geschrieben?
Chux
2
"Zeitreisen sind physisch unmöglich" - das ist eine sehr umstrittene Behauptung. Beeinträchtigt den Wert dieser Antwort natürlich nicht.
Konrad Rudolph
50

Der Großteil des Kerns vieler wichtiger Sprachen ist in C geschrieben, aber die Dinge ändern sich:

  • Die Referenzimplementierung von Python ( CPython ) ist in C geschrieben (es gibt jedoch auch andere Implementierungen in anderen Sprachen, z. B. Jython / Java, PyPy / Python, IronPython / C # ...).
  • PHP Zend Engine ist in C geschrieben
  • Der allererste von Sun Microsystems entwickelte Java-Compiler wurde in C geschrieben. Jetzt werden die Klassenbibliotheken immer in Java geschrieben (da sie mit der Java-VM selbst ausgeführt werden sollen). Bestimmte Bibliotheken, die JNI (Java Native Interface) verwenden, können teilweise in einer Vielzahl anderer Sprachen geschrieben sein, da sie außerhalb der JVM verwendet werden sollen.

    Die Sun / Oracle-VM ist in C ++ geschrieben. Die BEA / Weblogic / Oracle-VM ist in C geschrieben. Es gibt jedoch JVM in Java, Lisp, SmallTalk (IBM) ...

  • Perl ist als Core-Interpreter implementiert , geschrieben in C, zusammen mit einer großen Sammlung von Modulen, geschrieben in Perl und C ( Pugs , ein Compiler und Interpreter für die Programmiersprache Perl 6, ist in Haskell geschrieben).
  • Der offizielle Ruby-Interpreter, oft als Matz's Ruby Interpreter oder MRI bezeichnet, ist in C geschrieben und verwendet eine eigene Ruby-spezifische virtuelle Maschine (es gibt jedoch JRuby, eine Java-Implementierung, die auf der Java-virtuellen Maschine ausgeführt wird; Rubinius, eine C ++ Virtuelle Bytecode-Maschine, die LLVM verwendet, um zur Laufzeit zu Maschinencode zu kompilieren ...)
  • etwa 50% von R sind in C geschrieben
  • und natürlich ist (war) C in C geschrieben ! (Aber der erste C-Compiler, der auf den PDP-11 abzielte, war eine Mischung aus B und Assembler).

Es gibt viele Gründe, warum C oft gewählt wurde: Leistung, Portabilität, Erfahrung.

Das letzte ist wahrscheinlich das wichtigste: Python wurde 1991 gestartet, PHP 1994/1995, Perl 1988, Ruby 1995. In diesen Jahren wurde Java gerade veröffentlicht und C ++ noch nicht gut standardisiert.


Etwas verwandt:

Manlio
quelle
5
Aus der Sicht der Compiler / Interpreter-Implementierung war / ist C ein Bezugspunkt. Darüber hinaus hat es viele spätere Sprachen (zumindest syntaktisch) direkt oder indirekt beeinflusst.
Manlio
2
Bald können Sie sagen, dass C # in C # geschrieben wurde! (Art von)
DLeh
1
Der größte Teil von Mono (der einen C # -Compiler und einen Großteil der .NET-Basisklassenbibliothek enthält) ist in C # geschrieben.
Charlie Kilian
3
Die Antwort auf die Frage "Ist C die Mutter / der Vater aller Sprachen?" ist "nein", daher halte ich es nicht für hilfreich, viele in C geschriebene Beispiele bereitzustellen. Gegenbeispiele würden helfen, aber Ihre Auswahl ist immer noch von C abhängig . Zum Beispiel, selbst wenn Java, Python usw. sind jetzt selbsthostend, sie wurden noch von C gebootet, also sind sie wie "Enkelkinder" von C. Sprachen wie LISP, FORTRAN, ML und (natürlich) Maschinencode sind wahre Gegenbeispiele, da C nie beteiligt war ihre Schaffung.
Warbo
2
Das Streben nach vielen Sprachen ist natürlich so weit wie möglich in sich selbst umzusetzen. Es scheint jedoch, dass die meisten Sprachen von C abhängen, da die meisten Sprachen C aufrufen müssen, um nützlich zu sein. Die Mehrheit der modernen Betriebssystem-APIs und nützlichen Bibliotheken weist in der Regel C-Bindungen auf. Sie müssen auch vorsichtig sein, was Sie mit "eingeschrieben" meinen. Eine Sprachimplementierung besteht normalerweise aus mehreren Teilen: mindestens einem Compiler und einem Laufzeitsystem. Laufzeitsysteme werden häufig in C geschrieben, um eine bessere Anbindung an das Betriebssystem zu ermöglichen.
Pseudonym
10

Nein, einige Sprachen gehen auf C zurück. Und viele werden unabhängig von C implementiert, z. B. siehe http://en.wikipedia.org/wiki/Lisp_%28programming_language%29

Ofir
quelle
2
Es gibt viele Implementierungen von Java, die meisten sind in Java geschrieben. Die GNU-Implementierung von Objective-C ist in C geschrieben (oder C ++, sie haben sich kürzlich geändert, glaube ich), die LLVM-Implementierung ist in C ++ geschrieben, und früher gab es einen in C # geschriebenen Interpreter. Es gibt viele Implementierungen von Python, eine in RPython, eine in Java, eine in C # und eine in C. PHP hat sechs Hauptimplementierungen, zwei in Java, zwei in C #, eine in C und eine in C ++.
Jörg W Mittag
1
Nein. Sprachdesigner werden sicherlich von anderen Sprachen beeinflusst, aber sie können diese Einflüsse ignorieren, wenn sie dies wünschen.
Jörg W Mittag
2
@FaizanRabbani-Sprachen sind im Wesentlichen Konzepte und Auswahlmöglichkeiten von Paradigmen, Mustern und Kompromissen - sehr oft wird eine "Sprache aus anderen Sprachen erstellt / adaptiert", die jedoch völlig unabhängig von der Implementierungssprache ihres Compilers ist. sprache x kann von sprache y abgeleitet, aber in c oder etwas ganz anderem implementiert werden - und das ist oft der fall. In diesem Fall ist der "konzeptuelle Vorfahr" wichtig, aber die Compilersprache ist nur eine kaum relevante technische Nuance, die sich im Laufe der Zeit ändern kann.
Peteris
3
Das letzte Glied ist von zweifelhaftem Wert - zu viele Fehler darin, um es wirklich ernst zu nehmen.
Unknown Coder
4
@SebastianGodelet: HotSpot ist keine Implementierung der Java-Sprache. Es ist eine Implementierung der JVM-Bytecodesprache. Das sind zwei völlig verschiedene Sprachen. Die am häufigsten verwendeten Implementierungen der Java-Sprache stammen javacaus dem Oracle JDK / OpenJDK von Martin Odersky (von Scala Fame) in 100% Java, dem Eclipse Compiler, der in 100% Java (abgeleitet vom IBM Jikes Compiler) geschrieben wurde, dem Compiler von IBMs J9, ebenfalls abgeleitet von Jikes und 100% Java. AFAIK, der einzige Java-Compiler, der nicht in Java geschrieben ist, ist GCJ
Jörg W Mittag
4

Ich würde dies zu einem Kommentar machen, wenn ich könnte, aber das kann ich nicht.

Einer der Gründe, warum C so allgegenwärtig zu sein scheint, ist, dass es eine der frühesten entwickelten Sprachen ist und eine enorme Anzahl moderner Sprachen auf seiner Struktur basiert (Java, Go, PHP, Perl usw.) - so dass es so aussieht, als wäre es mehr Orte als es ist.

Ein weiterer oft vergessener Grund ist, dass Unix 1973 in C umgeschrieben wurde und viele der Unix-Systemaufrufe auch als C-Programme / -Funktionen verfügbar sind, wodurch die beiden stark miteinander verknüpft sind. Da Unix ein wichtiger Bestandteil der Entwicklung der modernen Programmierung insgesamt war, wurde C mit in die Schande gezogen.

Nach alledem lautet die Antwort auf Ihre Frage "Nein". C basiert auf einer Sprache namens ALGOL, und es gab viele Konkurrenten sowohl mit ALGOL (FORTRAN, Lisp, COBOL) als auch mit C (keine fallen ein). Objektorientierte Programmierung, der wohl größte Paradigmenwechsel im Programmierdesign, ist nicht auf C zurückzuführen - obwohl C ++ eine sehr beliebte OOP-Sprache ist (je nachdem, wen Sie fragen, wurde es zuerst in Lisp oder Simula 67 angezeigt). Als OOP entstand, war C eine so beliebte Sprache, dass es nicht unbedingt die erste sein musste - es war so beliebt, dass die C ++ - "Erweiterung" sozusagen auch eine der primären OOP-Sprachen wurde. Es wird hauptsächlich aufgrund seiner leistungsstarken Speichersteuerungsfunktionen (Sie können den von Ihren Strukturen erstellten Speicher direkt zuweisen und freigeben) weiterhin verwendet. Dies ermöglicht die Erstellung von Programmen mit geringem Speicherbudget (denken Sie an Videospiele) und dessen hochoptimiertem Compiler (offensichtlich abhängig vom Compiler). Zugegebenermaßen verlieren auch diese Funktionen an Bedeutung, da die Java-JIT-Kompilierung und die sprachspezifischen Speichermanager fortschrittlicher werden.

WannabeCoder
quelle
1
dies scheint nicht alles wesentliche über Punkte gemacht zu bieten und erläutert vor Antworten, vor allem in obere , mit Ausnahme einer fragwürdigen Aussage , dass „C aus einer Sprache basiert Algol genannt“
gnat
4
Cs Basis in ALGOL ist kaum fraglich ... Siehe cm.bell-labs.com/who/dmr/chist.html , en.wikipedia.org/wiki/C_%28programming_language%29 )
WannabeCoder 22.12.14
Die eigentliche Geschichte ist viel komplizierter und interessanter. Ich würde sagen , wie die Dinge sind hier angelegt ist kaum hilfreich für die Leser
gnat
3

Offensichtlich nicht. Wie könnte der erste C-Compiler in C geschrieben werden, wenn C vorher nicht existiert hätte? Das ist nicht das Henne-Ei-Problem.

Es gibt viele Möglichkeiten, den ersten Compiler einer Sprache zu schreiben, die als Bootstrapping bezeichnet werden

Darüber hinaus versuchen die meisten Compiler, sich selbst zu hosten , oder kompilieren sich seine Sprache, hauptsächlich um die Sprache und den Compiler selbst zu fördern

phuclv
quelle
12
Der erste Oberon-Compiler wurde in Oberon geschrieben. Das ist vollkommen in Ordnung, vorausgesetzt, Sie sind Professor und haben viele Studenten, die den Compiler (den Prof. Wirth hatte) für Sie von Hand übersetzen.
Jörg W Mittag
@Jorg, der in dem oben verlinkten Bootstrapping-Artikel erwähnt wurde, damit ich nicht die Mühe habe, das zu schreiben, da es sich um C handelt und kein C-Compiler auf diese Weise geschrieben wurde
phuclv
14
@ JörgWMittag - der erste automatisierte Oberon-Compiler wurde in Oberon geschrieben. Der eigentliche erste Oberon-Compiler war eine Gruppe von Studenten.
NNNNNN
4
@nnnnnn: Ich würde diese "Gruppe von Studenten" als Dolmetscher und nicht als Compiler betrachten.
Paŭlo Ebermann
4
@ Paŭlo Ebermann Um ein weiteres menschliches Element hinzuzufügen: "Computer" war ursprünglich eine Berufsbezeichnung .
Chux
2

Hier ist eine Liste von einigen Programmiersprachen , die nicht in C geschrieben sind, neben den Sprachen , die sie sind in implementiert:

  • Haskell - Haskell
  • Idris - Haskell
  • Adga - Haskell
  • Zusammenstoß - Haskell
  • PureScript - Haskell
  • Elm - Haskell
  • Quecksilber - Quecksilber
  • Rust - Rust (ursprünglich OCaml)
  • Los Los
  • Kristall - Kristall
  • OCaml - OCaml
  • Frege - Frege + Java
  • Haxe - OCaml + Haxe
  • Scala - Scala
  • Futhark - Haskell
  • ATS - ATS

Die besten Sprachen für die Implementierung eines Compilers werden wahrscheinlich ziemlich weit von C entfernt sein. Funktionale Sprachen bieten Ihnen Dinge wie Rekursionsschemata und monadische Parser-Kombinatoren (vorausgesetzt, Sie haben Typenklassen), was sie besonders für die Compiler-Arbeit geeignet macht.

Zweitens, um Ihre Frage zu beantworten, ob C die "Mutter / der Vater aller Programmiersprachen" ist - nicht wirklich. C war zu der Zeit, als es erschien, eine gut gestaltete Sprache, und es hat zweifellos Sprachdesigner beeinflusst, die dann ganz andere Dinge taten. Aber am Ende des Tages verlässt Haskell C auf praktisch jede Art und Weise. C ist 45 Jahre alt und es ist nicht verwunderlich, dass wir inzwischen gelernt haben, es besser zu machen.

Schließlich, um Ihre dritte Frage zu beantworten, ist es einfach nicht der Fall, dass C "alle Konzepte" implementiert. Insbesondere wäre es ungeheuer schwierig, einige der fortgeschrittenen Konzepte der funktionalen Programmierung (wie Metamorphismen oder, Gott bewahre, Synchromorphismen) in C zu implementieren. Ich bin nicht besonders vertraut mit objektorientierter Programmierung, aber ich weiß, dass einige objektorientierte Sprachen Summentypen haben.


quelle
C war nie "eine unglaublich gut gestaltete Sprache". Die Warzen, die wir heute darauf sehen, waren von Anfang an als Warzen bekannt. Aber es war gut genug, um die Muttersprache des entwicklerfreundlichen Unix-Betriebssystems zu sein, und nachdem Bell Labs Unix an die Universitäten vertrieben hatte, wurde C / Unix zu einer bevorzugten Sprache / einem bevorzugten Betriebssystem für eine Generation von Computerfachleuten.
Solomon Slow
PS., Es gab nicht viele originelle Ideen in C. Wenn Sie nach der Mutter / dem Vater aller blockstrukturierten prozeduralen Programmiersprachen suchen, möchten Sie sich vielleicht ALGOL ansehen .
Solomon Slow
Lisp-Makros waren viel besser als C, und ALGOL und Smalltalk verfügten über Blöcke, Abschlüsse und verschachtelte Funktionen, die beim Organisieren von Code hilfreich waren. Tatsächlich hätte Lisp als Makro-Prozessor für Assembler verwendet werden können und Code erstellt, der kürzer und schneller war (benutzerdefinierte Verarbeitung von S-Ausdrücken) als der frühe C. Simula, der herauskam, bevor C einen Polymorphismus aufwies. Lisp, APL und Smalltalk hatten "Shells", die im Gegensatz zu "sh" und "C" von Unix voll funktionsfähig waren (derselbe Code zwischen Shell und Programmen), sodass interpretierter und kompilierter Code verschachtelt werden konnte. Zeiger waren in Lisp (rplaca / rplacd) einfacher.
aoeu256
Der größte Vorteil von C war, dass es einfacher war, "Compiler" für C zu erstellen, und sich so leichter verbreiten konnte ... wie ein Virus, und dank C haben moderne Programmierer keine Ahnung, wie man modulare Programme erstellt (Veränderbarkeit schadet der Modularität), haben keine Ahnung von Adverbien / Kombinatoren / Funktionen höherer Ordnung [schreiben Sie Ihre Schleifen jedes Mal manuell], und unsere CPUs sind durch den "von neumann" -Engpass begrenzt, weil unser Betriebssystem in C geschrieben ist, also brauchen wir unser CPU zum Ausführen von C-Code aus Gründen der Abwärtskompatibilität.
aoeu256
1

Programmiersprachen sind Spezifikationen (keine Software!), Die normalerweise in einem englischen Dokument geschrieben sind (mit einer gewissen Formalisierung, z. B. EBNF für den größten Teil der Syntax; manchmal ist auch deren Semantik teilweise formalisiert).

Zum Beispiel ist C11 durch n1570 definiert (was Sie lesen sollten). Einige Dialekte des Scheme werden von R5RS definiert (was Sie auch lesen sollten, es ist sehr gut geschrieben).

Programmiersprachen können von einiger Software implementiert werden. Manchmal ist diese Software ein Compiler, der in der Programmiersprache selbst geschrieben ist. Lesen Sie mehr über Bootstrapping-Compiler .

Man kann einen Compiler in der kompilierten Programmiersprache selbst schreiben. Wenn diese Sprache brandneu ist, müssen Sie einen vorübergehenden Schritt durchlaufen, bei dem ein minimaler Interpreter oder Compiler einer Teilmenge dieser Sprache in einer anderen Implementierungssprache (möglicherweise C) geschrieben wird. Später können Sie diesen vorübergehenden Compiler oder verwerfen Interpreter (der nicht "gut" sein muss, nur um den anderen Compiler zu kompilieren). Sobald Sie Ihren in XX geschriebenen XX-Compiler kompiliert haben, können Sie Ihren temporären Compiler wegwerfen.

Oft (aber nicht immer) ist das Laufzeitsystem teilweise in C geschrieben (insbesondere der Garbage Collector ).

Beachten Sie, dass Bones ein vollständig in sich selbst geschriebener Scheme-Compiler und eine vollständig in sich selbst geschriebene Laufzeit ist.

Übrigens ist es praktisch, C als Zielsprache für Compiler zu verwenden .

Heutzutage sind viele Implementierungen von Programmiersprachen freie Software oder Open Source . Fühlen Sie sich frei, ihren Quellcode zu studieren (und vielleicht dazu beizutragen)!

Basile Starynkevitch
quelle