Warum gibt es keine schnellere, "bessere" Sprache als C? [geschlossen]

147

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.

Jason
quelle
44
C ++ ist genauso schnell und viel produktiver zu schreiben. <3
GManNickG
6
ähm, vergisst du nicht c ++?
23
Ich würde sagen, die Montage ist am schnellsten und "am nächsten" an der Maschine.
27
warum alle bewegungen zum schliessen? Ich bin wirklich neugierig ... ich versuche nicht, Flammenkriege oder so etwas zu beginnen
Jason
15
wieder geschlossen? Nachdem er von Jeff Atwood selbst wiedereröffnet wurde? warum solltest du das vielleicht schließen wollen?
Jason

Antworten:

164

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.

GManNickG
quelle
31
Mit "Einfach" meinen Sie "Einfach vom POV eines Compilers, nicht vom POV eines Programmierers". C ist einfach, weil es sich im Grunde genommen um Assemblierung mit Anweisungen und Ausdrücken handelt. Es ist nicht so einfach wie Python.
Marius
15
Einfach zu verstehen bedeutet für den Compiler aber auch einfach zu erlernen. Vielleicht nicht einfach, komplizierte Ideen umzusetzen.
GManNickG
16
OCaml erzeugt hochoptimierten nativen Code in etwa so schnell wie C und C ++, und der Code selbst ist so knapp wie Python. Ich denke, mit ein wenig Glanz könnte OCaml C als die Sprache der Wahl abgleichen oder schlagen, wenn Sie Code für maximale Geschwindigkeit und minimalen Speicherbedarf schreiben müssen. Objective-C macht auch einen ziemlich guten Job, obwohl es nicht immer so schnell ist wie C, bekommt es das ganze "C mit Objekten" in einer Weise richtig, wie C ++ es niemals konnte und niemals wird.
Julia
2
In Übereinstimmung mit @ Thorbjørn ist die Abwärtskompatibilität mit C der Grund, warum C ++ aufgefangen hat und D nicht. Wenn wir bereit sind, diesen aufzugeben, gibt es keinen Grund, uns mit der schrittweisen Verbesserung von D zufrieden zu geben. Wir könnten uns für weitaus bessere Sprachen entscheiden, die vollständig aus der C-Familie stammen. Wie @Juliet sagt, könnte OCaml in Bezug auf die Leistung ein brauchbarer Konkurrent sein. Aber auch eine Reihe anderer Sprachen, wenn Compiler-Autoren so viel Zeit mit ihnen verbracht hätten wie mit C oder C ++. Wie auch immer, gute Antwort und +1 von mir.
Jalf
5
@Ferruccio: Ja, aber jede Sprache kann mit C-Bibliotheken verknüpft werden. Wenn wir uns also damit zufrieden geben wollen, anstatt mit der tatsächlichen Quellcode-Kompatibilität, wie sie C ++ (mehr oder weniger) bietet, können wir auch eine ganz andere Sprache auswählen, z. B. Haskell oder Python. Der Grund, warum sich C ++ durchsetzte, war nicht, dass es sich mit C-Bibliotheken verknüpfen ließ . Es war, dass es C-Code kompilieren konnte .
Jalf
64

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.

Lothar
quelle
9
Sehr guter Kommentar. Es ist wichtig zu wissen, dass einige Aspekte der C-Sprachspezifikation (z. B. Aliasing-Regeln für Zeiger) es unmöglich machen, wirklich optimalen Maschinencode zu generieren. Als hochrangiger Assembler ist C nicht "der Schnellste", sondern nur "ziemlich schnell".
1
Vielen Dank, ich habe vergessen zu erwähnen, dass es nicht möglich ist, mehrere Ergebniswerte zurückzugeben. Ein weiterer Aspekt auf niedriger Ebene, den ich sehr vermisse, wenn ich ihn als Assembler auf hoher Ebene verwende.
5
Ordnungsgemäß geschriebenes modernes C kann dieselben Aliasing-Annahmen wie jede andere Sprache codieren, sodass der Compiler dieselben Optimierungen vornehmen kann. Es ist ein wichtiges Merkmal der Sprache, dass der Programmierer diese Anforderungen nicht übernehmen kann, wenn sie nicht zutreffen. Ihre anderen Punkte stimmen, also +1.
Stephen Canon
1
@Rascher: Das stimmt und da sieht man den Einfluss von C auf die CPU-Designer, die immer einen CPU-ABI spezifizieren. Und mehrere Rückgabewerte fallen einem einfach nicht ein, auch wenn die Anzahl der Register kein Problem darstellen würde (SPARC, PowerPC, Itanium)
13
Zeiger-Aliasing in C wurde restrictin C99 (vor 10 Jahren!) Behandelt.
35

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.

Jason Orendorff
quelle
9
C wird immer noch häufig für Server-Code verwendet. Es gibt nicht nur das Web, die meisten DNS-, E-Mail- usw. Server sind in C geschrieben. Auch für das Web befindet sich Apache in C
@bortzmeyer: Apache ist allerdings ziemlich alt. Ich sage nicht, dass es nicht nützlich ist oder abgelöst wurde, es wurde gerade erstellt, als C es war und es gab nicht viele gute Alternativen.
Macke
1
Ich bin gespannt, warum Sie C für "nicht gut geeignet" für das wissenschaftliche Rechnen halten. Zugegebenermaßen ist es angenehmer, mit Python zu arbeiten, aber ich fand, dass C eine solide Alternative ist, wenn schnellerer Code benötigt wird und viele der möglichen Alternativen (C ++) im Gegensatz zu anderen Aspekten der Programmierung nicht viel mehr auf den Tisch bringen .
Fomite
1
Darüber hinaus usw. die Menge an Material in SciPy / NumPy das ist geschrieben bereits in C ist es nützlich zu wissen.
Fomite
1
@EpiGrad Vielleicht ist C eine solide Alternative für dich. Aber C hat eine super steile Lernkurve, besonders für Leute, die keinen Hintergrund im Codieren haben. Insbesondere stürzt es manchmal ab, und wenn Sie kein Programmierer sind, haben Sie wenig Hoffnung, es herauszufinden. Mathematica erleichtert das Schreiben einer Vielzahl von Dingen, und Sie erhalten um den Faktor Hundert weniger Code. Und es stürzt nicht ab.
Jason Orendorff
25

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.

Michael Borgwardt
quelle
@michael - aber es gibt immer noch einen Markt für superschlankes, superschnelles Programmieren, besonders mit dem Ansturm all dieser Mobilgeräte ... warum ist C für einige dieser Geräte immer noch die beste Option, dh warum gibt es kein anderes? auf dieser Ebene Sprache, wie .NET-vs-Python-esque?
Jason
5
Lispeln. Schlummer aber nicht vergessen! :)
2
@ Jason: Frage ist, wie viele tragbare Assembler brauchst du? C ist bekannt und es ist sehr schwierig, eine Sprache mit einer schnelleren Implementierung zu schreiben. Warum also? Im Anzug gibt es keine Anforderung, keinen Markt, keine Motivation.
4
@ Michael, entschuldige mich für deine Antwort. Der Grund, warum es mehr im Terrain von Python / Ruby / Java usw. gibt, ist, dass Sie, sobald Sie aufhören, nach der effizientesten Sprache zu suchen, viel mehr Optionen für die Priorisierung der Funktionen erhalten und jeder Ansatz eine neue Sprache hervorbringen kann. Es gibt viel weniger Möglichkeiten, die schnellstmögliche Sprache zu schreiben.
1
-1 für "und es gibt kaum Raum, um das zu verbessern" - es gibt viel Raum, um C / C ++ zu verbessern, ohne die Leistung zu beeinträchtigen.
BlueRaja - Danny Pflughoeft
21

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.

zaharpopov
quelle
1
Und C ++ wird noch aktualisiert.
GManNickG
5
@GMan: so ist C.
3
Korrigieren Sie mich, wenn ich falsch liege, aber hätte ein C99- restrictZeiger nicht die gleiche Alias-Semantik wie Fortran? Und was macht da noch einen Unterschied?
9
Ich denke, die Idee, dass Fortran schneller ist als C, ist ein Mythos, je nachdem, was codiert wird und wer es tut. Der Grund, warum sich numerische Bibliotheken im Schwergewicht in Fortran befinden, ist nicht, dass Fortran schneller ist, sondern dass die Routinen ursprünglich in Fortran codiert wurden und nur wenige Menschen den Nerv haben oder sie neu schreiben müssen. Die kleine Anzahl von Mathe-Gurus, die diese Algorithmen schreiben und testen, ist in Fortran glücklich und sieht keinen Grund, sich zu ändern, zumal sie glauben, dass Fortran schneller ist.
Mike Dunlavey
16

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.

Alesplin
quelle