Wie kommt es, dass C nach all den neuen "modernen" Sprachen immer noch als die schnellste und "der Maschine am nächsten" gilt? Ich glaube nicht wirklich daran, dass es jemals nur einen richtigen Weg gibt, Dinge zu tun, und C gibt es schon sehr lange (seit den 60ern!). Haben wir uns wirklich nichts Besseres ausgedacht als etwas, das vor fast 50 Jahren geschrieben wurde?
Mir ist bewusst, dass moderne Sprachen übergeordnet sind und bestimmte Aufgaben wie Speicherbereinigung und Speicherzuweisung übernehmen und Bibliotheken und dergleichen nutzen. Ich frage nur, warum es nie eine echte zweite Option zu C gegeben hat.
Kann es sein, dass C so perfekt ist, dass keine andere Art der Bedienung eines Computers möglich ist (abgesehen von der Übernahme durch den Entwickler)?
BEARBEITEN Schau, ich versuche nicht, C oder was auch immer deine Lieblingssprache ist, anzuklopfen. Ich frage mich, warum C zum Standard geworden ist und warum andere Alternativen nie aufgetaucht sind und C einfach "akzeptiert" wurde.
Antworten:
C ist eine sehr einfache Sprache, und deshalb ist sie zusammen mit ihrer Langlebigkeit schnell und optimiert. Es wird auch außerordentlich häufig in Bezug auf eingebettete Umgebungen, Mikroprozessoren usw. unterstützt.
Es ist schwer, eine wirklich einfache und schnelle Sprache zu schlagen. Das einzige, was man an einer solchen Sprache verbessern kann, ist die Benutzerfreundlichkeit: Verringern Sie den Zeitaufwand für das Erstellen von ähnlichem, generischem Code und vereinfachen Sie das Modellieren mit Abstraktionen.
Hier kommt C ++ ins Spiel. C ++ kann genauso schnell sein wie C. Die Sache ist, dass C ++ eine viel komplexere Sprache ist, was bedeutet, dass es definitiv die Produktivität steigert. solange die Leute wissen, wie man es benutzt. C ++ und C sind nicht mehr fast dieselbe Sprache.
Nun war D ein weiterer Schritt nach oben. Dieselbe Fähigkeit für schnellen Code, optionale Speicherbereinigung usw., aber sie hat sich nie durchgesetzt. Hoffentlich ändert sich das, denn C ++ leidet darunter: Abwärtskompatibilität mit C.
Um Ihre Frage zu beantworten: "Besser" ist schwer zu beurteilen. In Bezug auf Einfachheit und Geschwindigkeit ist C wahrscheinlich das Beste, was wir tun können. In Bezug auf Produktivität versus Einfachheit ist C ++ wahrscheinlich das Beste, was wir tun können, obwohl diese Meinung viel mehr variiert. Schließlich gewinnt D in Bezug auf eine konkretisierte und aufgeräumte Sprache mit der Geschwindigkeit und Einfachheit von C diesen Kontext.
quelle
Es gibt schneller als C-Sprachen.
Es gibt schnellere Sprachen als C. Zum Beispiel macht sich Fortran, wie bereits erwähnt, sehr gut, weil es viel eingeschränktere Aliasing-Sprachregeln gibt.
Es gibt auch experimentelle Assembler wie Sprachen, die C an der Front angreifen, wo es als Assember-Sprache auf hoher Ebene verwendet wird, zum Beispiel zur Erstellung von Compilern. Schon mal was von C-- oder Janus gehört? Aber diese beiden wurden durch das LLVM-Projekt getötet.
Ich wette, dass APL oder andere mathematische Sprachen in ihren speziellen Anwendungsbereichen C aus dem Wasser sprengen werden, da sie die Unterstützung für Vektorverarbeitungseinheiten eingebaut haben. Dies ist etwas, was für C nicht möglich ist (und Leute: NEIN! Speziell optimierte Bibliotheken mit C-Verknüpfung haben nichts mit C als Sprache zu tun).
Auch CPU-Produzenten haben alles entfernt, was Compiler-Autoren in anderen Sprachen hilft. Erinnern Sie sich an die mit Tags versehenen Assembler-Codes, um die LISP-Implementierung auf SPARC zu beschleunigen? Vom Winde verweht.
Wenn Sie von Mikrobenchmarks zur Anwendungsentwicklung übergehen, gibt es schnellere Sprachen für die Anwendungsentwicklung. Mein persönliches Beispiel ist hier immer SmartEiffel. Es zielt auf C ab, verwendet jedoch eine globale Systemoptimierung, die es in der realen Anwendungsentwicklung schneller als C macht.
In diesem Bereich kann sogar eine einfache falsche oder einfache Abstraktion die gesamte Sprachleistung beeinträchtigen. Weil C keine hohen Abstraktionen bietet, sagen die meisten, es sei ein Programmierproblem, aber das ist es nicht. Schauen Sie sich zum Beispiel den Mangel an Generika an. In C werden Sie langsame Implementierungen wie die Bibliotheksfunktion "qsort" haben, die mit generischen Methoden um ein Vielfaches schneller geschrieben werden kann (wobei der Funktionsaufruf für Schlüsselvergleiche entfällt).
Vergleichen Sie einfach einen qsort-Aufruf für ein Megabyte-Array von ints mit einer gut handgeschriebenen Implementierung, die den Array-Zugriff und den eingebauten Operator '<' verwendet.
quelle
restrict
in C99 (vor 10 Jahren!) Behandelt.Gute Frage. Ich denke, Sprachen schaffen es, eine Nische zu finden. Es ist wichtig zu wissen, dass es in ihren Nischen viele neuere Sprachen gibt, die besser sind als C.
C wurde früher häufig als Anwendungssprache verwendet und hat in diesem Bereich gegenüber C ++, Java und in letzter Zeit allen möglichen anderen Sprachen (insbesondere den dynamischen Sprachen) stetig an Boden verloren.
C war früher eine Sprache zum Schreiben von Servercode. Das Web hat eine erstaunliche Vielfalt von Sprachen in diesen Bereich gebracht - Perl, Java, Python, VBScript, VB.NET, Ruby, C # - und Fälle, in denen C für Servercode Sinn macht, gibt es nur noch wenige.
C wurde für das wissenschaftliche Rechnen verwendet, ist jedoch der Konkurrenz durch domänenspezifische Sprachen wie Matlab und Mathematica sowie durch Bibliotheken wie SciPy ausgesetzt . Viele Leute, die Code in dieser Nische schreiben, sind von Haus aus keine Programmierer, und C passt nicht zu ihnen.
Aber die Nische von C ist der Systemcode. Betriebssystem-Kernel. Fahrer. Laufzeitbibliotheken. Es ist in diesem Bereich so etabliert, dass sogar C ++ es ziemlich langsam verdrängt.
C gewann in den 1970er Jahren aufgrund von UNIX, weil die konkurrierenden Sprachen entweder zu restriktiv oder zu langsam waren und weil C-Code als einigermaßen portabel galt (Lügen sogar damals). Aber seine größten Vorteile sind heute nicht verwandt und stammen hauptsächlich aus Jahrzehnten der Dominierung seiner Nische. Es gibt gute Tools für C: Optimieren von Compilern, Kernel-Debuggern, effektive statische Analyse zum Auffinden von Fehlern im Treibercode usw. Fast jede wichtige Plattform definiert ein C-ABI, und oft ist es die Verkehrssprache für Bibliotheken. Es gibt einen Pool von Programmierern, die wissen, wie man C codiert - und die die Probleme und Fallstricke von C kennen.
Langfristig wird diese Nische nicht verschwinden. und C hat einige Probleme. Aber es wäre immer noch äußerst schwierig für jeden Neuling, sich zu behaupten.
quelle
Um es mit einem sehr guten Kommentar zu sagen: Es gibt nicht viele verschiedene Möglichkeiten, eine Sprache schnell und "nah an der Maschine" zu machen - C hat es gut gemacht, und es gibt kaum Raum, dies zu verbessern.
Ursprüngliche Antwort:
Schnell auszuführen oder schnell zu schreiben?
Die Ausführung von Sprachen ist nicht schnell oder langsam , was bei bestimmten Implementierungen der Fall ist. Eine Sprache kann nur dann als schneller angesehen werden als andere, wenn es irgendwie einfacher ist, sie schnell zu implementieren . Das bedeutet immer "nah an der Maschine". Aber mit den Maschinen, die exponentiell schneller werden, wird dies im Laufe der Zeit immer weniger interessant. Stattdessen sind die Benutzerfreundlichkeit, die Entwicklungsgeschwindigkeit und die Portabilität viel wichtiger geworden. "Besser" bedeutet also "von der Maschine weg" . In den letzten fünf Jahrzehnten sind so ziemlich alle Bemühungen im Bereich Sprachdesign in diese Richtung gegangen.
Sie sind also näher an der Maschine und haben schnellere Sprachen als C; Es sind diejenigen, die vor C : Assembler, Fortran, kamen. Wahrscheinlich einige vergessene.
quelle
Fortran ist für numerische Aufgaben schneller als C, da es Speicherreferenzen verarbeitet (C-Zeiger sind schwieriger zu optimieren). Die schwergewichtigen numerischen Bibliotheken wie Matlab und Numpy sind immer noch in Fortran geschrieben.
Auf der anderen Seite kann C ++ genauso schnell sein wie C, verfügt jedoch über viele erweiterte Programmierfunktionen. Es ist eine viel neuere Sprache, ab Mitte der 80er Jahre.
quelle
restrict
Zeiger nicht die gleiche Alias-Semantik wie Fortran? Und was macht da noch einen Unterschied?Was zum Teufel, ich melde mich mit meinen 0,02 Dollar.
In vielen Fällen gibt es einen realen oder wahrgenommenen Unterschied zwischen "System" -Sprachen und höheren Sprachen. Ich werde die meisten "höheren" Sprachen ignorieren, da niemand (zumindest nicht viele) argumentieren wird, dass Sprachen wie Python, Ruby usw. für viele Aufgaben einfacher zu handhaben sind.
C wurde als Systemsprache konzipiert, dh als die Sprache, in der das Unix-Betriebssystem geschrieben wurde. Als solche wurde es einfach, leistungsstark und schnell konzipiert. Eine einfache Sprache gewinnt an Macht, weil Nicht-System-Programmierer sie oft als gefährlich betrachten: Zeiger, manuelle Speicherverwaltung usw. Wie bereits erwähnt, ist C recht einfach. K & R ist mit Abstand das kleinste Buch in meinem Programmier-Regal (ohne O'Reilly-Taschenreferenzen) und nur unwesentlich "größer" als meine Ruby-Taschenreferenz. C ist ziemlich mächtig. Wenn Sie mit der Hardware sprechen müssen, überprüfen Sie den Speicher usw. manuell und ändern Sie ihn. C verfügt über die entsprechenden Funktionen.
Aus Sicht eines Programmierers ist C jedoch nicht so einfach. Geschwindigkeit und Leistung gehen zu Lasten der manuellen Speicherverwaltung und der in die Sprache integrierten OOP-Unterstützung. C ++ (nicht meine Lieblingssprache) ist aus Sicht eines Programmierers viel einfacher, aber aus Sicht eines Compilers viel weniger einfach. Objective-C (möglicherweise meine Lieblingssprache) hat den gleichen Kompromiss mit einer leichten Neigung zur Vereinfachung der Sprache (die Garbage Collection ist beispielsweise ein Neuling in Objective-C). Aber da die Computerwelt, wie viele von uns wissen, dass sie in C geschrieben wurde, ist es für neuere, kompliziertere, aber "einfachere" Sprachen schwierig, eine breite Akzeptanz zu erlangen.
In einigen Fällen, insbesondere wenn der aktuelle "Standard" so "gut genug" ist wie C, gibt es einfach nicht viele Anreize für etwas "Besseres" (C ++, Objective-C, D usw.), um dort an Bodenhaftung zu gewinnen ist sogar Ansporn genug, etwas "Besseres" zu schaffen.
quelle