Wir haben die Verwendung von C "aus performance Gründen"
In diesem Alter von vielen Sprachen, es scheint eine tolle Sprache für fast jede Aufgabe, und ich finde mich beruflich kämpft gegen ein mantra der "nichts, aber C ist schnell", wo schnell ist wirklich gemeint "schnell genug". Ich arbeite mit sehr rationalen aufgeschlossene Menschen, die gerne vergleichen, zahlen und alles, was ich habe, sind Gedanken und Meinungen. Könnten Sie mir helfen, meinen Weg vorbei subjektive Meinungen und in der "realen Welt"?
Würden Sie mir helfen, Forschung, was, wenn andere Sprachen verwendet werden könnte, für embedded-und (Linux -) Systeme Programmierung? Ich könnte sehr gut sein das drücken einer falschen Hypothese und würde es sehr zu schätzen Forschung zeigen mir diese. Könntest du bitte einen link oder sind gute zahlen, so wie zu helfen, die "das ist eben seine/Ihre Meinung" Kommentare auf ein minimum.
So, das sind meine besonderen Anforderungen
- Speicher ist nicht eine ernsthafte Einschränkung
- Portabilität ist nicht ein ernstes Problem
- dies ist kein Echtzeit-system
- Es wird schwer werden zu finden, die zahlen, die beweisen, dass etwas ist eigentlich falsch.
- Vorzeitige Optimierung ist die Wurzel allen übels: ich habe erfolgreich geschrieben von embedded software in Python. Am Ende haben Sie, um die balance der Kosten des Schreibens in eine untere-level-Sprache wie C vs der Vorteil von RAD in einer Sprache auf höherer Ebene (und die Kosten in Bezug auf Leistung).
- würde vorsichtig sein, über die vorzeitige Optimierung argument. Wenn die Rechenleistung begrenzt ist, und eine bestimmte Menge an Arbeit, die in real-time oder near-real-time, und wählen Sie eine Sprache, die benötigt mehr Rechenleistung für die Arbeit, als Sie haben, sind Sie königlich geschraubt, da Sie jetzt über starten mit einer fähigen Sprache. Mehr Infos unter weblogs.mozillazine.org/roc/archives/2005/11/...
- Wenn der Speicher, der Portabilität und Pausen (durch GC) sind nicht ein Problem, welches sind dann die Gründe, die Ihre Kollegen geben zu wollen, um mit C?
- Ihre Frage ist zu vage und unspezifisch. Was sind Ihre embedded-Systemen zu tun?
- Im Allgemeinen eine rechenintensive Anwendung wird MINDESTENS 2X langsamer, wenn Sie etwas anderes als C (es sei denn du bist verrückt genug, es zu schreiben in assembler).
- Die Frage ist ein wenig ausschweifend in seiner Grammatik und Inhalt.
- Ein gut geschriebenes VB-Programm an Leistung übertreffen können ein schlecht geschriebenes C-Programm. Es ist nicht die Sprache, ist schnell (ich könnte schreiben Sie einen C-compiler, generiert horriblly langsamen code), es ist, wie Sie die Sprache nutzen.
- "Vorzeitige Optimierung ist die Wurzel allen übels", aber es gibt eine feine Linie zwischen der vorzeitigen Optimierung und vorzeitige pessimization. Letzteres sollte vermieden werden, zusammen mit dem früheren. Beim schreiben einer raytracer auf einem embedded-system und die Wahl von Python, zum Beispiel, ist schon ziemlich pessimistisch. Es ist unrealistisch, dass man jemals erreichen solcher Ziele, die mit einem Dolmetscher.
- "Im Allgemeinen eine rechenintensive Anwendung wird MINDESTENS 2X langsamer, wenn Sie etwas anderes als C" ... es sei denn, es ist C++, dann kann es sein, zehn mal schneller (ex: qsort vs std::sort, string-Verarbeitung, etc.) nur weil es einfacher zu schreiben, effizienten code. Das heißt, in Wirklichkeit viel weniger erfahrene C++ - Programmierer nicht bezahlen, die Aufmerksamkeit auf die Effizienz und schreiben Dinge, die 10 mal langsamer als C, weil Sie achtlos pessimize Ihre Ergebnisse (ex: tiefes kopieren von Daten unnötig) und nicht Profil Ihren code.
- Schauen Sie in MirageOS, wenn Sie möchten ein Beispiel
Du musst angemeldet sein, um einen Kommentar abzugeben.
"Nichts, aber C ist schnell [genug]" ist eine frühzeitige Optimierung und falsch, für alle die Gründe, die die vorzeitige Optimierungen sind falsch. Wenn dein system hat genug Komplexität, dass etwas anderes als C ist erwünscht, dann gibt es Teile des Systems, müssen "schnell genug" und Teile mit leichteren Einschränkungen. Wenn das schreiben von deinem code, zum Beispiel in Python wird das Projekt beendet, schneller, mit weniger Fehlern, dann können Sie follow-up mit einigen C-oder Assembler-code zu beschleunigen, die Zeit-kritischen teilen.
Selbst wenn es sich herausstellt, dass der gesamte code muss in C geschrieben werden oder eine Baugruppe zur Erfüllung der performance-Anforderungen, Erstellung von Prototypen in einer Sprache wie Python kann echte Vorteile haben. Sie können Ihre Arbeit Python Prototyp und nach und nach Teile ersetzen mit C-code, bis Sie die erforderliche Leistung.
So, die tools verwenden, mit denen die Entwicklungsarbeit am meisten richtig und am schnellsten, dann verwenden Sie echte Daten, um zu bestimmen, wo Sie brauchen, um zu optimieren. Es könnte sein, dass C ist die am besten geeignete tool, um mit zu beginnen manchmal, aber durchaus nicht immer, auch in embedded-Systemen.
Meiner Erfahrung mit C für embedded und systems-Programmierung ist nicht unbedingt ein performance-Problem - es ist oft eine Portabilität Problem. C neigt dazu, die meisten tragbaren, gut unterstützte Sprache auf so ziemlich jeder Plattform, die vor allem auf embedded-Systemen und-Plattformen.
Wenn Sie möchten, verwenden Sie etwas anderes in einem eingebetteten system, es ist oft eine Frage der, herauszufinden, welche Optionen verfügbar sind, dann bestimmen, ob die performance, Speicherverbrauch, Bibliothek, etc, sind "gut genug" für Ihre situation.
Verwendung von C für embedded-Systeme hat einige sehr gute Gründe, der die "Leistung" ist nur einer der kleineren. Embedded ist sehr nahe an der hardware, die Sie müssen manuelle Speicher Adressierung für die Kommunikation mit der hardware. Alle APIs und SDKs sind erhältlich für C meistens.
Gibt es nur wenige Plattformen, die eine VM für Java oder Mono, das ist teilweise aufgrund der Auswirkungen auf die Leistung, sondern auch aufgrund der teuren Kosten für die Implementierung.
Abgesehen von der Leistung, gibt es eine weitere überlegung: Sie werden wahrscheinlich Umgang mit low-level-APIs, die entworfen wurden, verwendet werden, die in C oder C++.
Wenn Sie nicht verwenden können, einige SDK, werden Sie nur bekommen, selbst in Schwierigkeiten anstatt zu sparen, Zeit mit der Entwicklung mit einer Sprache auf höherer Ebene. Zumindest werden Sie am Ende nochmal eine Reihe von Funktionsdeklarationen und Konstanten-Definitionen.
C:
C ist das gehen zu sein, um für viele Jahre zu kommen. In der embedded-Entwicklung Ihr ein Monopol, das erstickt jeden Versuch einer Veränderung. Eine Sprache, die Notwendigkeit einer VM wie Java oder Lua ist nie, zu gehen mainstream im embedded-Umfeld. Eine kompilierte Sprache, die vielleicht eine chance haben, wenn es bietet überzeugende neue features über C.
Gibt es mehrere benchmarks auf das web zwischen verschiedenen Sprachen. Die meisten von Ihnen finden Sie eine C-oder C++ - Implementierung an der Spitze, wie Sie Ihnen mehr Kontrolle, um wirklich etwas optimiert werden.
Beispiel: Die Computer Language Benchmarks Game.
Es ist schwer zu argumentieren gegen C (oder einem anderen Verfahren Sprachen wie Pascal, Modula-2, Ada) und Montage für embedded. Es ist eine große Geschichte von Erfolg mit diesen Sprachen. In der Regel, die Sie entfernen wollen, das Risiko des unbekannten. Versuchen, etwas anderes als C oder Montage, meiner Meinung nach, ist unbekannt. Having said that, es ist nichts falsch mit einem gemischten Modell, wo verwenden Sie eines der Systeme, gehen Sie zu C oder Python oder Lua oder JavaScript als Skriptsprache.
Was Sie wollen, ist die Fähigkeit zu schnell und leicht gehen Sie zu C, wenn Sie müssen.
Wenn Sie überzeugen, dass das team mit etwas gehen, das ist unbewiesen Ihnen, das Projekt ist Ihre cookie. Wenn es bröckelt, es werden wahrscheinlich gesehen werden als deine Schuld.
Dieser Artikel (von Michael Barr) spricht über die Verwendung von C, C++, assembler und andere Sprachen in embedded-Systemen und umfasst ein Diagramm mit der relativen Nutzung der einzelnen.
Und hier ist noch ein Artikel, passend zum Titel, Schlechte Gründe für die Ablehnung von C++.
Gibt es Situationen, wo Sie brauchen, Echtzeit-performance, vor allem in embedded-Systemen. Sie haben auch schweren Gedächtnis-Einschränkungen. Eine Sprache wie C gibt Ihnen mehr Kontrolle über Ausführung, Zeit und Ausführung Raum.
So, je nachdem, was du tust, C kann sehr gut sein, "besser" oder geeigneter ist.
Schauen Sie sich die folgenden Artikel
http://theunixgeek.blogspot.com/2008/09/c-vs-python-speed.html
http://wiki.python.org/moin/PythonSpeed/PerformanceTips (vor allem siehe Python ist nicht C-Abschnitt)
http://scienceblogs.com/goodmath/2006/11/the_c_is_efficient_language_fa.php
Ada ist ein high-level-Programmiersprache, die entworfen wurde für embedded-Systeme und unternehmenskritische Systeme.
Es ist eine schnelle, sichere Sprache, Daten überprüfen erbaut überall. Es ist das, was die auto-Piloten in Flugzeugen sind vorprogrammiert.
In dieser link Sie haben einen Vergleich zwischen Ada und C.
Möchten Sie vielleicht Blick auf die D Programmiersprache. Es könnte etwas performance-tuning, da gibt es einige Bereiche, in Python kann übertreffen es. Ich kann nicht wirklich Punkt, den Sie, um benchmarking-Vergleiche, da wurde noch nicht das führen einer Liste, aber wie schon von Peter Olsson, Benchmarks & Sprache-Implementierungen hat D Digital Mars.
Werden Sie wahrscheinlich auch wollen, schauen Sie sich diese schönen Fragen:
C ist allgegenwärtig, für nahezu jede Architektur verfügbar, in der Regel von Tag eins eines Prozessors Verfügbarkeit. C++ ist eine enge zweite. Wenn Ihr system unterstützt C++, und Sie haben das nötige know-how, verwenden Sie es anstelle von C - es ist alles, was C ist, und mehr, so gibt es einige Gründe für die nicht-Verwendung es.
C++ ist eine größere Sprache, und es gibt Konstrukte und Techniken unterstützt, die verbrauchen Ressourcen, oder Verhalten sich in unakzeptabler Weise in einem eingebetteten system, aber das ist kein Grund, nicht die Sprache, sondern eher, wie man es richtig nutzen.
Java und C# (auf Micro.Net oder WinCE) alternativen sein können für nicht-Echtzeit -.
Ich bin nicht wirklich ein Systeme/embedded Programmierer, aber es scheint mir, dass die eingebetteten Programme müssen in der Regel deterministische Leistung, die unmittelbar Regeln, die aus viel Müll gesammelt Sprachen, weil Sie nicht deterministisch im Allgemeinen. Es wurde jedoch die Arbeit auf deterministische garbage collection (z.B. Metronom-Java: http://www.ibm.com/developerworks/java/library/j-rtj4/index.html)
Ist die Frage einer Einschränkungen zu tun, die Sprachen/Laufzeitumgebungen treffen die deterministische, Speicherauslastung, etc Anforderungen.
C ist wirklich die beste Wahl.
Es ist ein Unterschied für das schreiben von portablen C-code und immer zu tief in das ghee whiz features von einem bestimmten compiler-oder Ausnahmefällen, die Sprache (die alle sollten vermieden werden). Aber Portabilität zwischen Compilern und compiler-Versionen. Die Anzahl der Mitarbeiter, wird in der Lage sein, die Entwicklung oder die Aufrechterhaltung der code. Die Compiler haben eine einfachere Zeit mit es und zu produzieren, besser, sauberer und zuverlässiger code.
C ist nicht überall, mit all den neuen Sprachen, die entwickelt, um zu beheben die Fehler in allen Sprachen vor. C, mit allen Schwächen, die diese neuen Sprachen sind versuchen zu beheben, steht immer noch stark.
Hier sind ein paar Artikel, vergleichen Sie in C# zu C++ :
http://systematicgaming.wordpress.com/2009/01/03/performance-c-vs-c/
http://journal.stuffwithstuff.com/2009/01/03/debunking-c-vs-c-performance/
Nicht genau, was Sie gefragt, für wie es nicht mit einem Fokus auf embedded-C-Programmierung. Aber es ist trotzdem interessant. Die erste zeigt die performance von C++ und die Vorteile der Verwendung von "unsafe" - code für Prozessor-intensive Aufgaben. Die zweite etwas lüftet den Schleier der erste und zeigt, dass, wenn Sie schreiben, der C# - code ein wenig anders dann die Leistung ist fast die gleiche.
So, ich werde sagen, dass C oder C++ kann der klare Gewinner in Bezug auf die Leistung in vielen Fällen. Aber oft die Marge ist gering. Ob C oder nicht ist ein anderes Thema insgesamt. Meiner Meinung nach sollte es wirklich hängt von der Aufgabe zur hand. Aber in eingebetteten Systemen Sie haben oft nicht viel von einer Wahl.
Ein paar Leute haben erwähnt, Lua. Leute, die ich kenne, die gearbeitet haben, mit embedded-Systemen haben, sagte Lua ist nützlich, aber es ist nicht wirklich Ihre eigene Sprache per se, sondern mehr eine Bibliothek eingebettet werden können, in C. Es ist gezielt in Richtung auf den Einsatz in embedded-Systemen und in der Regel werden Sie wollen, nennen Lua-code von C. Aber das Reine C macht für einfacher (wenn auch nicht unbedingt einfacher) Wartung, da jeder weiß es.
Je auf der embedded-Plattform, wenn der Speicher Einschränkungen sind ein Problem, werden Sie wahrscheinlich benötigen, um eine nicht-veralteter Programmiersprache.
C in dieser Hinsicht ist wahrscheinlich den meisten bekannt durch die Mannschaft und die am meisten unterstützt mit den verfügbaren Bibliotheken und tools.
Die Wahrheit ist - nicht immer.
Scheint es .NET-runtime (aber auch jede andere Laufzeit als ein Beispiel), drängt einige MBs von Laufzeit-overhead. Wenn dies alles, was Sie haben (im RAM), dann sind Sie kein Glück. JavaME zu sein scheint, kompakter, aber immer noch hängt alles von Ressourcen, die Sie zur Verfügung haben.
C-Compiler sind sehr viel schneller, auch auf desktop-Systemen, weil, wie einige langage Funktionen gibt es im Vergleich zu C++, also würde ich mir vorstellen, der Unterschied ist nicht trivial auf embedded-Systemen. Dies führt zu einer schnelleren iteration Zeit, obwohl OTOH Sie müssen nicht auf den Komfort von C++ (z.B. Sammlungen), die Sie verlangsamen auf lange Sicht.