Ich mag die einfache und transparente Art von C sehr: Wenn ich C-Code schreibe, fühle ich mich nicht von "undichten Abstraktionen" belastet und kann fast immer schlau raten, welche Baugruppe ich produziere. Ich mag auch die einfache, vertraute Syntax für C.
Allerdings hat C nicht diese einfachen, hilfreichen Doodads, die C ++ wie Klassen, vereinfachte Nicht-Cstring-Behandlung usw. anbietet. Ich weiß, dass es alles möglich ist, in C mithilfe von Sprungtabellen und dergleichen zu implementieren, aber das ist manchmal etwas wortreich und aus verschiedenen Gründen nicht sehr typsicher.
Ich bin kein Fan der Überbetonung von Objekten in C ++, und ich bin waffenscheu gegenüber dem "neuen" Operator und dergleichen. C ++ scheint nur ein paar zu viele Probleme zu haben, um beispielsweise als Systemprogrammiersprache verwendet zu werden.
Gibt es eine Sprache zwischen C und C ++ auf der Skala von Widgets und Doodads?
Haftungsausschluss: Ich meine dies als rein sachliche Frage. Ich habe nicht die Absicht, Sie zu verärgern, weil ich Ihre Ansicht nicht teile, dass C {, ++} gut genug ist, um alles zu tun, was ich plane.
new
Es handelt sich meistens um eine Verbesserung,malloc
die sich auch darum kümmern kann , den Speicher für Sie zu initialisieren. Mit "Placement New" undoperator new
können Sie entscheiden, wie und wo Speicher zugewiesen wird. Und was die Objekthervorhebung betrifft: In einigen Zeilen über Ihnen heißt es, dass Sie Klassen als "einfachen, hilfreichen Doodad" betrachten. Entscheide dich!C+
Diclaimer: Sorry, ich konnte nichtt resist. It
1. April;)Antworten:
Dies könnten die Droiden sein, nach denen Sie suchen ...
Go - http://golang.org/
D - http://dlang.org/
Rust - http://rust-lang.org/
quelle
struct
s sind im Vergleich zu C ++ - Werten stark beeinträchtigt - keine Vererbung, keine R-Wert-Referenzen, also ist es unmöglich, so etwas Einfaches wie eine Wertzeichenfolgenklasse in D zu erzeugen, das so effizient ist wie das C ++ - Äquivalent. Das sind Fakten über die D-Sprache.Es gibt einige Sprachen (z. B. Java, Go, D, Objective-C), die entweder ungefähr parallel zu C ++ sind oder Versuche, Probleme zu beheben, die die Autoren mit C ++ gesehen haben.
Zumindest IMO, jedoch arbeiten alle von ihnen für die meisten praktischen Zwecke wesentlich schlechter als C ++.
Aufgrund Ihrer offensichtlichen Vorliebe für die Erstellung von Assembler-Code können wir Objective C und Java wahrscheinlich sofort ausschließen.
Theoretisch würde ich Go als das interessanteste davon betrachten - es hat einige wirklich originelle Ideen und interessante Ansätze zur Lösung von Problemen, die einige Arten von Code viel einfacher machen. Leider produzieren aktuelle Compiler keinen sehr guten Code, und diesbezüglich hat sich in den letzten Jahren nicht viel verbessert.
Das lässt D so ziemlich als das Einzige übrig, das eine Chance hat. Es ist wahrscheinlich am ähnlichsten zu C ++ (von diesen), aber auch am unwahrscheinlichsten (IMO), das zu beheben, was Sie anscheinend als Probleme ansehen.
Damit bleibt ein offensichtlicher Ansatz: Verwenden Sie C ++, aber nur die Teile, die Sie möchten, und vermeiden Sie die Teile, die Sie nicht mögen.
quelle
Sorry, Kumpel, Widerspruchsalarm. Nicht-Cstring-Behandlung erfordert
new
. Es ist eine grundlegende Notwendigkeit. Sie können nichtstd::string
ohne habennew
. Und außerdem istnew
/delete
genau gleichbedeutend mitmalloc
/free
aber sicherer , weil es die korrekte Konstruktion und Zerstörung von Heap-Objekten garantiert (absolut notwendig!) Und anstelle einerNULL
Rückgabe die Ausnahmebehandlung verwendet und daher in jeder erdenklichen Weise überlegen ist. In C ++ 11 ist es sehr gut möglich, eine eigenenew
Style-Funktion zu schreiben , da Sie mit perfekter Weiterleitung jeden Konstruktor eines beliebigen Typs bearbeiten können. Wenn Sie waffenscheu sindnew
, dann schlage ich vor, dass Sie einfach nicht wirklich wissen, womit Sie es zu tun haben.Oh ja, und kluge Zeiger sorgen dafür, dass Sie sich nie selbst darum kümmern müssen.
Darüber hinaus gibt es in C ++ keine Überbetonung. Sie müssen kein Objekt verwenden, das Sie nicht möchten. Sie können mit Lambdas programmieren, wann immer Sie möchten. Niemand zwingt Sie, Vererbung und virtuelle Funktionen zu verwenden - tatsächlich weisen viele gute C ++ - Programme selten Vererbung auf. Vorlagen sind die leistungsfähigere und nützlichere Abstraktionstechnik. Das ist nicht Java.
quelle
f(g(x))
scheint gut zu funktionieren für mich. Und ich glaube auch, dass Currying als Bibliothek generisch in C ++ 11 durchgeführt werden kann.std::bind
unterstützt solche Dinge.C ist fast eine Teilmenge von C ++. Sie können also einfach die Teile von C ++ verwenden, die Ihnen gefallen, und den Rest ignorieren. Es ist sogar möglich, gültiges C zu schreiben, das auch gültiges C ++ ist.
Sie werden kein idiomatisches C ++ schreiben, aber das ist ungefähr so "dazwischen", wie es nur geht.
Alternativ können Sie auch andere Sprachen ausprobieren, die versuchen, C auf etwas Stärkeres auszudehnen, insbesondere D und Objective-C.
Und schließlich können Sie sich je nach Art des Projekts für einen mehrsprachigen Ansatz entscheiden: Teilen Sie Ihr Projekt in Module auf und wählen Sie für jeden Teil die am besten geeignete Sprache aus. Der Nachteil dabei ist, dass die Sprachen zusammenarbeiten müssen, was möglicherweise zu viel Arbeit ist, um die Mühe wert zu sein.
quelle
Nur um eine wilde, unkonventionelle Antwort zu geben: Wenn die gewünschte Sprache nicht existiert, warum nicht selbst eine Sprache erstellen? Es gibt eine Vielzahl leistungsfähiger Tools für die Sprachentwicklung, die auf den alten Standby-Systemen von (F) Lex und Yacc / Bison zur Verfügung stehen. Da Sie C bereits kennen, brauchen Sie nur Ihren "Compiler", um C-Code auszugeben, für den Sie dann Ihre vorhandene Toolkette verwenden.
Dies kann sowohl einfacher als auch leistungsfähiger sein, als Sie denken. Beginnen Sie mit einem Parser / Lexer für C und fügen Sie dann die zusätzlichen Funktionen hinzu, die Sie für wichtig halten. Wenn es ärgerlich ist, Sprungtabellen von Hand zu schreiben, finden Sie ein Konstrukt, das die Zusammenfassung ausdrückt, und lassen Sie es von Ihrem Interpreter für Sie schreiben. Im Wesentlichen handelt es sich hierbei nur um eine höhere Stufe der Vorprozessor-Metaprogrammierung, bei der externe Tools für die Metaprogrammierung verwendet werden. Sie wissen immer genau, wie die Endmontage aussehen wird, da Sie das C kennen und wissen, in welches C Ihre Spracherweiterungen expandieren werden.
Offensichtlich gibt es einige Einschränkungen, wie effektiv dies ohne viel zusätzliche Arbeit sein kann. Das Hinzufügen eines vollständigen statischen Typsystems mag etwas komplexer sein, als Sie sich vorstellen möchten, aber es ist eine Option, die Sie ausprobieren können, wenn Sie eine Vorliebe dafür finden. Ihre DSL-Nebenstellen sind so leistungsfähig und komplex, wie Sie Zeit und Energie haben, um sie herzustellen, und wer weiß, vielleicht wird Ihre Nebenstellensprache eines Tages "das nächste C ++".
quelle
Sie haben nicht gesagt, welche C ++ - Funktionen Sie stören. Du könntest es trotzdem mit Objective-C versuchen. Der Schwerpunkt liegt auf objektorientierter statt auf Standardbibliothek in C ++.
quelle
Die Embedded-Welt hat Embedded C ++ spezifiziert , das ist möglicherweise das, wonach Sie suchen. Sie haben Dinge wie Mehrfachvererbung und dergleichen entfernt. Soweit mir bekannt ist, ist es jedoch ziemlich ausgestorben.
quelle
Dieser ausführliche Vergleich von C ++, Objective-C, Java und C # ist möglicherweise hilfreich. Persönlich denke ich, dass es viel sauberer ist, mit C # zu arbeiten als mit C ++. Ich habe zuvor mehrere (numerische / Berechnungs-) C-Funktionen nach C # portiert, ohne dass aufgrund der Ähnlichkeit von Syntax und numerischen Datentypen zu viele Änderungen erforderlich waren.
quelle