it-swarm.com.de

Warum ist keine schnellere, "bessere" Sprache als C herausgekommen?

Wie kommt es, dass C bei all den neuen "modernen" Sprachen, die es heute gibt, immer noch als die schnellste und "der Maschine am nächsten" bezeichnet wird? 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 übergeordnete Ebenen haben und sich um bestimmte Aufgaben wie die Speicherbereinigung und Speicherzuweisung kümmern und Bibliotheken und dergleichen verwenden. Ich frage nur, warum es für C. noch nie eine echte zweite Option 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 Entwickler)?

EDIT Schau, ich versuche nicht, C oder was auch immer deine Lieblingssprache ist zu klopfen. Ich frage mich, warum C zum Standard geworden ist und warum andere Alternativen nie aufgetaucht sind und C einfach "akzeptiert" wurde.

149
Jason

C ist eine sehr einfache Sprache, und aus diesem Grund ist sie zusammen mit ihrer Langlebigkeit schnell und optimiert. Es wird auch außerordentlich häufig unterstützt, wenn es um eingebettete Umgebungen, Mikroprozessoren usw. geht.

Es ist schwer, eine wirklich einfache und schnelle Sprache zu schlagen. Das einzige, was Sie an einer solchen Sprache verbessern können, ist die Benutzerfreundlichkeit: Verringern Sie die Zeit, die erforderlich ist, um ähnlichen, generischen Code zu erstellen, und erleichtern 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 erhöht; solange die Leute wissen, wie man es benutzt. C++ und C sind nicht fast dieselbe Sprache mehr.

Jetzt war D ein weiterer Schritt nach oben. Gleiche Fähigkeit für schnellen Code, optionale Speicherbereinigung usw., aber sie hat sich nie durchgesetzt. Hoffentlich ändert sich das, denn es lässt das fallen, was C++ plagt: Abwärtskompatibilität mit C.

Um Ihre Frage zu beantworten, ist "besser" schwer zu beurteilen. In Bezug auf Einfachheit und Geschwindigkeit ist C wahrscheinlich nahe am Besten, was wir tun können. In Bezug auf Produktivität und 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 ausgefeilte und aufgeräumte Sprache mit der Geschwindigkeit und Einfachheit von C diesen Kontext.

164
GManNickG

Es gibt schnellere als C-Sprachen.

Es gibt schnellere Sprachen als C. Zum Beispiel ist Fortran, wie bereits erwähnt, sehr gut, weil es viel eingeschränktere Aliasing-Sprachregeln gibt.

Es gibt auch experimentelle Assembly-ähnliche Sprachen, die C auf der Vorderseite angreifen, wo es als Assember-Sprache auf hoher Ebene verwendet wird, zum Beispiel zum Erstellen von Compilern. Schon mal was von C-- oder Janus gehört? Aber diese beiden wurden durch das LLVM-Projekt getötet.

Ich würde wetten, 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 alle Dinge entfernt, die Compiler-Autoren in anderen Sprachen helfen - denken Sie an die markierten arithmetischen Assembler-Codes, mit denen die LISP-Implementierung auf SPARC schnell? Vom Winde verweht) durchgeführt werden kann.

Und wenn Sie von Mikro-Benchmarks zur Anwendungsentwicklung übergehen, gibt es schnellere Sprachen für die Anwendungsentwicklung. Mein persönliches Beispiel hier ist immer SmartEiffel. Es zielt auf C ab, verwendet jedoch die globale Systemoptimierung, wodurch es in der realen Anwendungsentwicklung schneller als C ist.

In diesem Bereich kann sogar eine einfache falsche oder niedrige Abstraktion die gesamte Sprachleistung beeinträchtigen. Da C keine hohen Abstraktionen bietet, sagen die meisten Leute, dass es sich um ein Programmierproblem handelt, dies jedoch nicht. Schauen Sie sich zum Beispiel den Mangel an Generika an. In C werden Sie langsame Implementierungen wie die Bibliotheksfunktion "qsort" erhalten, die mit Generika eine Größenordnung 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 integrierten Operator '<' verwendet.

64
Lothar

Gute Frage. Ich denke, Sprachen schaffen es, eine Nische zu finden. Es ist wichtig zu beachten, dass es viele neuere Sprachen gibt, die in ihren Nischen besser als C sind.

  • 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 gedrängt - Perl, Java, Python, VBScript, VB.NET, Ruby, C # - und Fälle, in denen C für Servercode irgendeinen Sinn ergibt, 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 Bibliotheken wie SciPy ausgesetzt. Viele Leute, die Code in dieser Nische schreiben, sind keine Codierer von Beruf, und C passt nicht gut zu ihnen.

Die Nische von C ist jedoch der Systemcode. Betriebssystemkerne. Treiber. Laufzeitbibliotheken. Es ist in diesem Raum 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 angesehen wurde (Lügen, selbst dann). Aber seine größten Vorteile hängen heute nicht zusammen und beruhen hauptsächlich auf Jahrzehnten der Dominanz seiner Nische. Es gibt gute Tools für C: Optimierung von Compilern, Kernel-Debuggern, effektive statische Analyse, um Fehler im Treibercode zu finden usw. Fast jede wichtige Plattform definiert einen 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. Trotzdem wäre es für jeden Neuling äußerst schwierig, sich zu behaupten.

35
Jason Orendorff

Um einen sehr guten Kommentar zu paraphrasieren: 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?

Sprachen sind nicht schnell oder langsam zur Ausführung sind bestimmte Implementierungen. Eine Sprache kann nur dann als schneller angesehen werden als andere, wenn es irgendwie einfacher ist, ein schnelle Implementierungen zu haben. Das bedeutet immer "nah an der Maschine". Aber mit Maschinen, die exponentiell schneller werden, ist das im Laufe der Zeit immer weniger interessant geworden. Stattdessen sind Leichtigkeit und Geschwindigkeit der Entwicklung und Portabilität viel wichtiger geworden, also "besser" bedeutet "weg von der Maschine". In den letzten fünf Jahrzehnten sind so gut wie alle Bemühungen im Bereich Sprachdesign in diese Richtung gegangen.

Da sind Sie also: näher an der Maschine und es gibt schnellere Sprachen als C. sie sind diejenigen, die vor C kamen: Assembler, Fortran. Wahrscheinlich einige vergessene.

25

Fortran ist für numerische Aufgaben schneller als C, da es Speicherreferenzen verarbeitet (C-Zeiger sind schwieriger zu optimieren). Die schwergewichtigen numerischen Bibliotheken an der Basis von Dingen 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.

21
zaharpopov

Was zum Teufel, ich werde mich mit meinen $ 0,02 einschalten.

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 bearbeiten sind.

C wurde als Systemsprache konzipiert, dh als Sprache, in der das Unix-Betriebssystem geschrieben wurde. Als solche wurde es als einfach, leistungsstark und schnell konzipiert. Eine einfache Sprache gewinnt an Macht, indem Nicht-Systemprogrammierer sie häufig 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 Programmierregal (ohne O'Reilly Pocket Reference) und es ist nur unwesentlich "größer" als mein Ruby Pocket Reference. C ist ziemlich mächtig. Wenn Sie es brauchen mit Hardware zu sprechen, manuell zu überprüfen und mit dem Speicher zu drehen usw. C hat die Fähigkeit.

Aus Sicht eines Programmierers ist C jedoch nicht so einfach. Geschwindigkeit und Leistung gehen zu Lasten der manuellen Speicherverwaltung und nicht viel OOP in die Sprache integrierte Unterstützung. C++ (nicht meine Lieblingssprache) ist aus Sicht eines Programmierers viel einfacher, aber viel weniger einfach Aus der Sicht eines Compilers. Objective-C (möglicherweise meine Lieblingssprache) hat den gleichen Kompromiss, mit einer leichten Neigung in Richtung einer einfachen Sprache (Garbage Collection ist zum Beispiel ein Neuling in Objective-C). Aber seit der Computerwelt Wie viele von uns wissen, wurde es in C geschrieben. Für neuere, kompliziertere, aber "einfachere" Sprachen ist es schwierig, eine breite Akzeptanz zu finden.

In einigen Fällen, insbesondere wenn der aktuelle "Standard" so "gut genug" ist wie C, gibt es einfach keinen großen Anreiz für etwas "Besseres" (C++, Objective-C, D usw.), dort Traktion zu erlangen ist sogar genug Anreiz, um etwas "Besseres" zu schaffen.

16
alesplin