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?
programming-languages
c
FaizanRabbani
quelle
quelle
Antworten:
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.
quelle
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
for
Ausdrucks aus der ISO Ruby Language Specification:Hier ist ein anderes Beispiel als die Typkonformitätsregeln von Scala:
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.
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.
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.
quelle
x := x + y
Syntax anstelle des bekannteren C-ähnlichen verwendetx = x + y
. Diese Kritik geschieht trotz der Tatsache , dass C ist noch nicht erfunden worden ...Der Großteil des Kerns vieler wichtiger Sprachen ist in C geschrieben, aber die Dinge ändern sich:
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) ...
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:
quelle
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
quelle
javac
aus 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 GCJIch 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.
quelle
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
quelle
Hier ist eine Liste von einigen Programmiersprachen , die nicht in C geschrieben sind, neben den Sprachen , die sie sind in implementiert:
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
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)!
quelle