Was sind die Unterschiede zwischen C, C # und C ++ in Bezug auf die reale Anwendung?
Wie ich weiter oben geschrieben hier habe ich beschlossen, zu versuchen meine hand auf eines dieser aber aufgrund meiner Interessen als web-Entwickler, ich würde gerne wissen, der Unterschied zwischen Ihnen in Ihrer realen Anwendungen.
Bearbeiten Hinweis:
Während ich bin ein web-Entwickler, bitte lass nicht zu, dass beschränken Sie Ihre Antwort. Ich bin 30...ich habe Jahre der Karriere ändern vor mir.
InformationsquelleAutor der Frage jerebear | 2009-03-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
C-und C++ geben Sie eine niedrigere Ebene der Abstraktion, die, mit einer erhöhten Komplexität, bietet eine Breite der Zugriff auf die zugrunde liegende Maschine Funktionen, die nicht unbedingt ausgesetzt, die mit anderen Sprachen. C++ fügt die Bequemlichkeit reduziert (Entwicklung Zeit) einer vollständig objektorientierten Sprache, die potentiell eine zusätzliche Leistung Kosten. In Bezug auf real-world-Anwendungen, sehe ich diese Sprachen angewendet, in den folgenden Bereichen:
C
C,C++
C# bietet ein managed-memory-Modell fügt hinzu, dass eine höhere Ebene der Abstraktion wieder. Diese Ebene der Abstraktion fügt Komfort und verbessert die Entwicklungszeiten, sondern erschwert den Zugang zu niedrigeren level-APIs und macht spezielle performance-Anforderungen problematisch.
Sicherlich ist es möglich zu implementieren, die extrem hohe performance der software in einer verwalteten Umgebung Speicher, aber das Bewußtsein für die Auswirkungen ist unerlässlich.
Die syntax von C# ist sicherlich weniger anspruchsvoll (und fehleranfällig) ist als C/C++ und hat, für die initiierten Programmierer, einen flacheren Lernkurve.
C#
Johannes Rössel macht Gültiger Punkt, dass die Verwendung von C# Zeiger, Unsicherer und Ungeprüfter keywords durchbrechen die Ebene der Abstraktion, auf der C# aufgebaut ist. Ich möchte betonen, dass die Art der Programmierung ist die Ausnahme, die meisten C# - Entwicklung von Szenarien und nicht ein grundlegender Teil der Sprache (wie ist der Fall mit C/C++).
InformationsquelleAutor der Antwort RedBlueThing
Beachten Sie, dass ich spreche ASFAC++B. 🙂 Ich habe die wichtigsten differenzierenden Faktor ersten.
Garbage Collection
Garbage Collection (GC) ist der wichtigste einzelne Faktor in der Differenzierung zwischen diesen Sprachen.
Während C und C++ verwendet werden kann mit GC, es ist eine verschraubt-auf Nachhinein nicht gemacht werden und welche nicht so gut funktionieren (der bekannteste ist hier) - es ist zu "konservativ", was bedeutet, dass Sie nicht sammeln Sie alle nicht verwendeten Speicher.
C# ist von Grund auf konzipiert, um die Arbeit an einem GC-Plattform mit standard-Bibliotheken auch auf diese Weise entworfen. Es macht einen absolut grundlegenden Unterschied zu der Produktivität der Entwickler, die erlebt werden muss, um geglaubt zu werden.
Es ist der glaube weit verbreitet unter C/C++ - Benutzer, die GC ist gleichzusetzen mit "schlecht-Leistung". Aber das ist out-of-date folklore (auch die Böhm ' sche Sammlung auf C/C++ führt viel besser als die meisten Leute erwarten). Die typische Angst vor dem "langen Pausen", wo das Programm Stoppt so die GC kann einige Arbeit. Aber in Wirklichkeit sind diese langen Pausen passiert mit den nicht-GC-Programme, da Sie auf der Oberseite des virtual-memory-system, die gelegentlich unterbricht, um Daten zwischen dem physischen Arbeitsspeicher und der Festplatte.
Dort weit verbreitet ist auch die überzeugung, dass GC ersetzt werden kann, mit shared_ptraber man kann es nicht; die Ironie ist, dass in einem multi-threaded Programm
shared_ptr
ist langsamer als ein GC-basierten system.Es gibt Umgebungen, die sind so genügsam, dass GC nicht praktisch - aber diese werden immer seltener. Handys haben in der Regel GC. Die CLR-GC, C# in der Regel läuft auf scheint state-of-the-art.
Seit Einführung C# vor etwa 18 Monaten habe ich Durchlaufen mehrere Phasen der reinen performance tuning mit einem profiler, und der GC ist so effizient, dass es nahezu unsichtbar ist während der Bedienung des Programms.
GC ist kein Allheilmittel, löst es nicht alle Programmieraufgaben, es nur wirklich bereinigt Speicher-Zuweisung, wenn Sie das zuordnen sehr große Speicherblöcke dann müssen Sie trotzdem einige Pflege, und es ist immer noch möglich, was beläuft sich auf ein Speicher-Leck in eine ausreichend komplexe Programm - und doch ist die Wirkung von GC auf die Produktivität macht es eine ziemlich enge Annäherung an ein Allheilmittel!
Undefiniertes Verhalten
C++ ist gegründet auf den Begriff der undefinierten Verhalten. Das heißt, die Sprache-Spezifikation definiert das Ergebnis bestimmte eng definierte Verwendungen von Sprache, die Funktionen und beschreibt alle anderen Verwendungen als Ursache Undefiniertes Verhaltenbedeutet im Prinzip, dass die operation könnte, haben kein Ergebnis (in der Praxis bedeutet dies, dass Sie schwer zu diagnostizieren bugs mit offensichtlich nicht-deterministische Zerstörung von Daten).
Fast alles über C++ berührt Undefiniertes Verhalten. Auch sehr schön, kommenden features wie lambda-Ausdrücke können problemlos verwendet werden, als praktischen Weg, um korrupte dem stack (erfassen einer lokalen Referenz, lassen sich die lambda-Instanz überleben der lokalen).
C# ist auf dem Prinzip gegründet, dass alle möglichen Operationen sollen definiert haben, Verhalten. Das Schlimmste, was passieren kann, ist eine Ausnahme geworfen wird. Dies ändert vollständig die Erfahrung der software-Konstruktion.
(Es gibt unsafe-Modus, der Zeiger und damit Undefiniertes Verhalten, aber das wird dringend abgeraten, für Allgemeine Verwendung - denken Sie an es als Analog, embedded Assembler.)
Komplexität
In Bezug auf die Komplexität von C++ hat, herausgegriffen werden, vor allem, wenn wir Bedenken, dass der sehr-bald-zu-sein, standardisierte neue version. C++ bietet absolut alles, was es kann, um sich effektiv, kurz, vorausgesetzt, GC, und als Ergebnis hat es eine wunderbare Lernkurve. Die Sprache Designer Entschuldigung viel von diesem mit den Worten: "Diese Funktionen sind nur für Bibliothek-Autoren, nicht die normalen Nutzer" - aber um wirklich effektiv zu sein-in jeder Sprache, die Sie brauchen, um zu bauen Ihre code als wiederverwendbare Bibliotheken. So können Sie nicht entkommen.
Auf der positiven Seite, C++ ist so Komplex, es ist wie ein Spielplatz für nerds! Ich kann Ihnen versichern, dass Sie viel Spaß haben werden lernen, wie es passt alles zusammen. Aber ich kann doch nicht ernsthaft empfehlen, da es eine Grundlage für eine produktive Arbeit (oh, die vergeudete Jahre...) auf den mainstream-Plattformen.
C hält die Sprache einfach (einfach im Sinne von "der compiler ist einfach zu schreiben"), aber das macht die Codierung Techniken, die mehr Arkane.
Beachten Sie, dass nicht alle neuen Funktionen der Sprache gleichzusetzen mit Komplexität Hinzugefügt. Einige Funktionen der Sprache werden beschrieben als "syntaktischen Zucker", denn Sie sind Kürzel, die der compiler baut für Sie. Dies ist ein guter Weg, um zu denken, ein großer Teil der Verbesserungen für C# - in den letzten Jahren. Die standard-Sprache auch gibt einige Funktionen, indem Sie die übersetzung in longhand, z.B.
using
- Anweisung erweitert, intry
/finally
.In einem Punkt, war es möglich, denken von C++ - templates auf die gleiche Weise. Aber Sie haben inzwischen so mächtig, dass Sie sind bilden nun die Grundlage für eine ganze eigene dimension der Sprache, mit seinen eigenen begeisterte user-communities und Redewendungen.
Bibliotheken
Die seltsamste Sache über C und C++ ist, dass Sie nicht über eine standard-austauschbare form von pre-kompilierte Bibliothek. Die Integration von fremden code in Ihr Projekt ist immer ein wenig fummelig, mit obskuren Entscheidungen darüber getroffen werden, wie werden Sie verlinkt.
Auch die standard-Bibliothek ist extrem basic - C++ hat einen vollständigen Satz von Daten-Strukturen und eine Möglichkeit zur Darstellung von strings (
std::string
), aber das ist immer noch minimal. Gibt es ein standard-Weg zu finden, eine Liste von Dateien in einem Verzeichnis? Erstaunlich, Nein! Gibt es standard-Bibliothek Unterstützung für die Analyse oder Generierung von XML? Nein. Was ist mit Zugriff auf Datenbanken? Sein ernst sein! Schreiben Sie eine web-site-back-end? Sind Sie verrückt? etc.So haben Sie auf die Jagd gehen weiter in die Ferne. Für XML -, versuchen Xerces. Aber ist es verwenden
std::string
zu strings? Natürlich nicht!Wollen, und alle diese Drittanbieter-Bibliotheken haben Ihre eigenen bizarren Bräuche für die Benennung von Klassen und Funktionen? Sie betcha!
Die situation in C# könnte unterschiedlicher nicht sein; die Grundlagen waren vorhanden, von Anfang an, damit alles inter-arbeitet schön (und weil die Grundlagen geliefert werden, die von der CLR, es ist cross-language-support).
Es ist nicht alles perfekt; Generika haben sollte, schon von Anfang, aber war nicht, das hinterlässt eine sichtbare Narbe auf einigen älteren Bibliotheken; aber es ist in der Regel leicht zu beheben ist dieser extern. Auch eine Reihe von populären Bibliotheken portiert von Java, die nicht so gut zu Ihnen passt, wie es zunächst scheint.
Closures (Anonyme Methoden mit Lokalen Variablen Erfassen)
Java und C sind praktisch die letzten verbliebenen mainstream-Sprachen von fehlender Verschlüsse und Bibliotheken gestaltet werden kann und viel mehr verwendet, sondern mit Ihnen als ohne (dies ist ein Grund, warum portiert Java-Bibliotheken, die manchmal scheinen klobig zu einem C# Benutzer).
Die lustige Sache über C++ ist, dass Ihre standard-Bibliothek entworfen wurde, als ob die Verschlüsse waren in der Sprache verfügbar (container-Typen
<algorithm>
<functional>
). Dann zehn Jahre vergingen, und jetzt sind Sie endlich ergänzt! Sie wird einen großen Einfluss haben (obwohl, wie oben erwähnt, Sie lecken underfined Verhalten).C# und JavaScript sind die am meisten verwendeten Sprachen, in denen die Verschlüsse sind "idiomatically etabliert". (Der wesentliche Unterschied zwischen diesen Sprachen, C# statisch typisiert, während JavaScript ist dynamisch typisiert).
Plattform-Unterstützung
Ich habe diese Letzte, nur weil es scheint nicht zu unterscheiden diese Sprachen so viel, wie Sie vielleicht denken. Alle diese Sprachen können auf mehreren Betriebssystemen und Rechner-Architekturen. C ist die am breitesten unterstützte, dann C++, und schließlich C# (obwohl C# verwendet werden kann auf den meisten gängigen Plattformen Dank einer open-source-Implementierung namens Mono).
Meine Erfahrung der Portierung von C++ - Programmen zwischen Windows und verschiedene Unix-Geschmacksrichtungen, war unangenehm. Ich habe nie versucht, Portierung sehr Komplex in C# auf Mono, so dass ich kann nicht kommentieren, die.
InformationsquelleAutor der Antwort Daniel Earwicker
C ist die bare-bones, einfache, saubere Sprache, das macht Sie alles selbst machen. Es muss nicht deine hand halten, es nicht zu stoppen Sie von shooting selbst in den Fuß. Aber es hat alles, was Sie brauchen, um zu tun, was Sie wollen.
C++ ist C mit Klassen Hinzugefügt, und dann eine ganze Reihe anderer Dinge, und dann einige weitere Sachen. Es muss nicht deine hand halten, aber lassen Sie halten Sie Ihre eigene hand, mit add-on GC, oder RAII und smart-Pointer. Wenn es etwas gibt, das Sie erreichen wollen, stehen die Chancen es gibt einen Weg, um den Missbrauch des template-system, um Ihnen eine relativ einfache syntax. (außerdem ist mit " C++0x). Diese Komplexität gibt Ihnen auch die Kraft, um versehentlich erstellen ein Dutzend Instanzen von sich selbst und Schießen allen in den Fuß.
C# ist Microsofts Dolchstoß Verbesserung auf C++ und Java. Tonnen von syntaktischen Funktionen, aber keine, wo in der Nähe die Komplexität von C++. Es läuft in einer voll verwalteten Umgebung, also Speicher-Verwaltung wird für Sie erledigt. Es tut, lassen Sie sich "schmutzig" und die Verwendung unsicherer code, wenn Sie müssen, aber es ist nicht der Standard, und Sie haben zu tun, einige arbeiten selbst fotografieren.
InformationsquelleAutor der Antwort Eclipse
Meiner Meinung nach ist C# und ASP.NET wäre das beste der drei für die Entwicklung, web-voreingenommen.
Ich bezweifle, dass jemand schreibt neue web-apps in C oder C++ mehr. Es geschah vor 10 Jahren, und es gibt wahrscheinlich eine Menge von legacy-code noch in Gebrauch, aber Sie sind nicht besonders gut, es scheint nicht so viel (laufende) tool-Unterstützung, und Sie haben wahrscheinlich eine kleine aktive community, die web-Entwicklung (außer vielleicht für web-server-Entwicklung). Ich schrieb viele website-C++ - COM-Objekte zurück in den Tag, aber C# ist weit mehr produktiv, dass es keinen zwingenden Grund, code C oder C++ (in diesem Zusammenhang), es sei denn, Sie müssen.
Tue ich noch schreiben, C++, wenn nötig, aber es ist in der Regel für ein kleines problem-Domäne. z.B. die Kommunikation von C# via P/Invoke zu alten C-Stil-dll - einige Dinge zu tun, die sind geradezu plump in C# waren ein Kinderspiel erstellen Sie eine C++ COM-Objekt als eine Brücke.
Das schöne an C# ist, dass Sie können auch die einfache übertragung in das schreiben von Windows-und Konsolen-apps und bleiben Sie in C#. Mit Mono-Sie sind auch nicht beschränkt auf Windows (obwohl Sie nur die Bibliotheken, die Sie verwenden).
Sowieso ist das alles von einem web-voreingenommenen Perspektive. Wenn Sie gefragt werden, über embedded-Geräte würde ich sagen C oder C++. Man könnte argumentieren, keines dieser eignen sich für web-Entwicklung, C#/ASP.NET ist ziemlich glatt, es funktioniert gut, es gibt jede Menge online-Ressourcen, eine große Gemeinschaft, und kostenlosen dev-tools.
Also von einem real-Welt-Perspektive, die Kommissionierung nur einer von C#, C++ und C, wie gefordert, als Allgemeine Regel, Sie sind besser zu halten mit C#.
InformationsquelleAutor der Antwort Robert Paulson
Aus deinen anderen posts, ich denke Sie wollen eine neue Sprache zu lernen, um neue Fähigkeiten. Mein Rat ist, dass die Sprache nicht wirklich wichtig, wichtig ist die Qualität der Gemeinschaft (Rat, aber auch vorhandenen code können Sie Lesen und daraus lernen) und die verfügbaren Bibliotheken/frameworks. In dieser Hinsicht, denke ich, dass die "C-Familie" ist nicht die beste Wahl für Sie: web-Bibliotheken und frameworks sind nur wenige, nicht übertragbare und nicht groß und Kodierung der code-Stil, den man studieren kann, ist sehr unterschiedlich und kann verwirren Sie eine Menge. (Obwohl C ist meine Lieblings-Sprache)
Ich würde Ihnen raten, einfach nur C lernen, und versuchen, wirklich zu verstehen, das Konzept der Zeiger, dann bewegen, um andere Sprachen mehr an die web (python oder javascript in den Sinn kommt - oder auch java). Auch in der C-Familie, Objective-C hat den besten mix aus Leistung und Einfachheit in meine Meinung, aber ein Nischen-player.
InformationsquelleAutor der Antwort Colas Nahaboo
C - eine ältere Programmiersprache, die beschrieben wird als Hands-on. Als Programmierer müssen Sie dem Programm sagen, alles zu tun. Auch diese Sprache wird lassen Sie fast alles tun. Es unterstützt nicht Objekt orriented code. Also keine Klassen.
C++ - eine Erweiterung der Sprache per se von C. In C ++ code bedeutet, Schrittweite 1. Also C++ ist besser als C. Es ermöglicht eine sehr kontrollierte Objekt orriented code. Wieder einmal eine sehr Hände auf die Sprache, das geht zu weit ins detail.
C# - Voll-Objekt orriented code ähnelt dem Stil von C/C++ - code. Das ist wirklich näher an JAVA. C# ist die neueste version der C-style Sprachen und ist sehr gut für die Entwicklung von web-Anwendungen.
InformationsquelleAutor der Antwort Anand Kuma Arya
Für roh-Geschwindigkeit, benutzen Sie C. Für die Stromversorgung, Verwendung von C++. Für .net-Kompatibilität, Verwendung von C#. Sie sind alle ziemlich Komplex, da Sprachen; C durch jahrzehntelange allmähliche Akkretion, C++, durch die Jahre des raschen Verbesserung, und C# durch die macht von Microsoft.
InformationsquelleAutor der Antwort MarkusQ
C ist die core-Sprache, der am meisten ähnelt und direkt übersetzt in CPU-Maschinensprache. CPUs Folgen Sie den Anweisungen, move, add, logisch kombinieren, vergleichen, springen, push und pop. C tut genau dies mit sehr einfacher syntax. Studieren Sie die Demontage, können Sie lernen, zu schreiben C-code, der ist nur so schnell und kompakt wie die Montage. Es ist meine bevorzugte Sprache für den 8-bit Microcontroller mit begrenztem Speicherplatz. Wenn Sie schreiben, einen großen PC-Programm in C werden Sie in Schwierigkeiten geraten, weil seine begrenzte Organisation. Das ist, wo der Objekt-orientierten Programmierung wird mächtig. Die Fähigkeit von C++ - und C# - Klassen enthalten die Daten und Funktionen zusammen erzwingt Organisation, die wiederum ermöglicht, mehr komplexe Bedienbarkeit über C. C++ ist notwendig für die schnelle Bearbeitung in der Vergangenheit, wenn die CPUs nur ein Kern. Ich bin am Anfang zu lernen jetzt C#. Seine Klasse nur die Struktur angezeigt wird, erzwingt man einen höheren Grad der Organisation als C++, was letztendlich dazu führen zu schneller Entwicklung und Förderung von code-sharing. C# wird nicht interpretiert wie VB. Es ist teilweise zusammengestellt, die bei der Entwicklung und dann weiter übersetzt, die zur Laufzeit werden mehr-Plattform-freundlich.
InformationsquelleAutor der Antwort MikeZ