Gibt es eine Sprache zwischen C und C ++?

18

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.

Robert Martin
quelle
10
Sie sagen, dass Ihre Frage "rein sachlich" ist, aber Sie kürzen c ++ ab, weil es "scheint", zu viele Schluckaufe zu haben. Was sind diese Schluckaufe, und sind sie gültige Gründe, um C ++ zu rabattieren?
Whatsisname
2
Was ist die "Skala von Widgets und Doodads"? Wenn Sie echte Antworten auf eine "rein sachliche" Frage wünschen, sollten Sie bedeutungslose Metriken vermeiden.
Caleb
2
Und die wenigen Dinge, die Sie über C ++ aussagen, verraten einige Fehlinformationen. newEs handelt sich meistens um eine Verbesserung, mallocdie sich auch darum kümmern kann , den Speicher für Sie zu initialisieren. Mit "Placement New" und operator newkö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!
25
Verwenden Sie C+ Diclaimer: Sorry, ich konnte nicht t resist. It1. April;)
knut
2
Das klingt sehr nach der Kontinuumshypothese und wahrscheinlich mit der gleichen Antwort. ( en.wikipedia.org/wiki/Continuum_hypothesis )
John Smith

Antworten:

29

Dies könnten die Droiden sein, nach denen Sie suchen ...

Go - http://golang.org/

D - http://dlang.org/

Rust - http://rust-lang.org/

Jacks_Gulch
quelle
5
@dtech: D hat diesen sinnlosen GC / "Alles, was von Object erbt" / Werte müssen beschissen sein. Ich habe bereits C # dafür und es hat tatsächlich anständige Werkzeuge. Los, ich gebe zu, dass meine Erinnerung daran, warum ich es verworfen habe, etwas verschwommen ist, aber, wie ich mich erinnere, hat es einige sehr nützliche Funktionen gekürzt.
DeadMG
4
-1 für "was C ++ hätte sein sollen". C ++ ist was es ist und wenn Sie nicht damit umgehen können, ist das größtenteils Ihr Problem. Sie können damit umgehen, indem Sie eine Sprache verwenden, die besser zu Ihnen passt, aber das bedeutet nicht, dass C ++ so hätte sein sollen wie diese Sprache.
back2dos
7
@DeadMG Auf D hast du 2 aussagekräftige Aussagen gemacht: GC ist obligatorisch und alles muss ein Objekt sein. Beides ist falsch. Ich bin der Meinung, dass Ihre Schlussfolgerung eher auf Unwissenheit als auf tatsächlichem Wissen beruht. Ich muss CodexArcanum zustimmen.
Deadalnix
5
@deadalnix: Technisch können Sie sich dafür entscheiden, den GC nicht zu verwenden. Da Sie jedoch nicht wissen oder steuern können, welche Bibliotheksfunktionen oder Sprachfunktionen den GC verwenden, gibt es realistisch gesehen keine Möglichkeit, ein Programm zu erstellen, das ihn nicht verwendet. Und Sie können keine Klasse erstellen, die nicht von Object erbt. Und ihre structs 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.
DeadMG
5
@DeadMG: Das Erstellen von Strukturen ohne Vererbung ist ein Feature , kein "Gimping". Es ist etwas, das sie richtig gemacht haben, etwas, das so ziemlich jede OO-Sprache in der Geschichte, die nicht "C ++" heißt, richtig gemacht hat (einschließlich Simula, der ursprünglichen OO-Sprache) und das C ++ unglaublich falsch gemacht hat. Vererbungs- und Werttypen mischen sich nicht. Es bricht die Objektidentität, es bricht die Liskov-Substitution, es bricht das gesamte OO-Paradigma.
Mason Wheeler
19

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.

Jerry Sarg
quelle
13
+1 für "benutze C ++ und vermeide die Teile, die du nicht magst". Und ich würde dem OP vorschlagen, mehr über C ++ zu lernen. Oft lehnen Leute Dinge ab, nur weil sie sie nicht gut genug kennen.
Doc Brown
1
@DocBrown Vielleicht liegt es daran, dass es nicht so einfach ist, C ++ gut genug zu kennen.
Malcolm
3
@ Malcolm: Es ist natürlich schwierig, modernes C ++ gründlich zu lernen. Auf der anderen Seite gibt es absolut keinen Grund, sich vor dem neuen Bediener zu scheuen, was für mich nur abergläubisch klingt.
Doc Brown
3
@ Malcolm: Wahrscheinlich, weil das Konzept sehr einfach ist . Benötige ich ein UTF-32-String-Literal oder ein UTF-16-String-Literal? Nun, das ist eine ziemlich einfach zu beantwortende Frage, vorausgesetzt, Sie kennen die Grundlagen der wtf-Zeichenfolgencodierung. Und diese Vielzahl von harten Funktionen? Sie existieren aus einem Grund . Zum Beispiel Javas Generika. Sie sind im Vergleich zu Vorlagen erbärmlich . Sicher, es gibt weniger zu lernen, aber das liegt einfach daran, dass sie nicht sehr nützlich sind. Es ist, als würde man etwas Komplexeres als Brainfuck als schwierig bezeichnen.
DeadMG
3
@ Malcolm: Das stimmt überhaupt nicht. Die Popularität wird von 99999 Dingen beeinflusst, abgesehen davon, ob die Sprache gut / nützlich ist oder nicht.
DeadMG
16

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.

Sorry, Kumpel, Widerspruchsalarm. Nicht-Cstring-Behandlung erfordert new . Es ist eine grundlegende Notwendigkeit. Sie können nicht std::stringohne haben new. Und außerdem ist new/ deletegenau gleichbedeutend mit malloc/ freeaber sicherer , weil es die korrekte Konstruktion und Zerstörung von Heap-Objekten garantiert (absolut notwendig!) Und anstelle einer NULLRückgabe die Ausnahmebehandlung verwendet und daher in jeder erdenklichen Weise überlegen ist. In C ++ 11 ist es sehr gut möglich, eine eigene newStyle-Funktion zu schreiben , da Sie mit perfekter Weiterleitung jeden Konstruktor eines beliebigen Typs bearbeiten können. Wenn Sie waffenscheu sind new, 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.

DeadMG
quelle
1
Genau. Es ist viel besser, C ++ so zu verwenden, wie Sie es möchten, als nach einer (wahrscheinlich minderwertigen) Alternative zu suchen
dtech
1
Ich denke nicht, dass Lambdas ausreichen, um funktionell zu programmieren. Ich würde auch erwarten, einen Funktionszusammensetzungsoperator, ein Currying und so weiter zu haben. Siehe auch stackoverflow.com/questions/1981400/functional-programming-in-c . Für mich fühlt es sich fast so an, als würde man OOP in C ...
Giorgio
@ Giorgio: Die Antworten auf diese Frage sagen einfach "Es ist schwer!". Sie zeigen keine Beweise dafür, dass es tatsächlich schwierig ist . Warum möchten Sie einen separaten Operator für die Funktionszusammensetzung? 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.
DeadMG
1
@DeadMG: Ein Funktionszusammensetzungsoperator ist ein ziemlich gut etabliertes Grundkonzept in der funktionalen Programmierung. Ich würde erwarten, es in einer Sprache zu finden, die FP unterstützt. Ich finde es sehr praktisch (prägnant), eine komplexe Funktion als Zusammensetzung anderer Funktionen zu definieren (z. B. wie bei Pipes in Unix), ohne Variablen zu verwenden: k = h. g. f
Giorgio
1
@ Giorgio: std::bindunterstützt solche Dinge.
DeadMG
4

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.

tdammers
quelle
In der Tat haben wir in Branchen wie der Entwicklung von Konsolenspielen gearbeitet, in denen wir wirklich "eine Sprache zwischen C und C ++" wollten. Genau das haben wir getan. Wir haben eine Teilmenge der C ++ - Funktionalität verwendet, mit bestimmten Einschränkungen oder eher Einschränkungen in leistungskritischen Schleifen.
Carson63000
3

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 ++".

CodexArcanum
quelle
2

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 ++.

Null
quelle
2
imho Objective-C ist ein dürftiger Versuch, Klassen in C einzuführen, die C ++ in vielerlei Hinsicht unterlegen sind. Außerhalb von Mac OS X / iOS wird es nur sehr wenig verwendet.
Dtech
1
@dtech: Interessant, ein ehemaliger Kollege von mir, der kein Mac-Fan ist (eher ein Debian / Linux-Typ), war überzeugt, dass Objective-C eine viel sauberere OO-Erweiterung von C als C ++ ist. Ich habe Objective-C jedoch noch nie ausprobiert, daher habe ich keine Meinung dazu.
Giorgio
1
@dtech: Dann schlage ich demütig vor, dass Sie Ihre Meinung überdenken;) Objective-C befasst sich mit der Objektorientierung und leistet dabei weitaus bessere Arbeit als C ++, da es die Weitergabe von Nachrichten einführt. Ich stimme zu, dass die Sprache C ++ in vielerlei Hinsicht unterlegen ist, in anderer Hinsicht ist sie jedoch genauso überlegen.
back2dos
@Giorgio Ich stimme Ihrem Kollegen zu, obwohl Obj-C auch einige Grenzen hat (vielleicht sind einige davon mit Obj-C 2.0 verschwunden), z Funktion Überladung a la Fortran in C ...
ShinTakezou
2

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.

mattnz
quelle
0

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.

dodgy_coder
quelle