Kompilierbare moderne Alternativen zu C / C ++ [geschlossen]

38

Ich denke darüber nach, ein neues Softwareprodukt zu schreiben. Die Leistung ist von entscheidender Bedeutung, daher bin ich vorsichtig, wenn ich eine interpretierte oder eine Sprache oder eine Emulationsebene (Java lesen) verwende.

Was mich dazu bringt, über C (oder C ++) nachzudenken, obwohl beide ziemlich lang sind. Ich habe auch lange nicht mehr benutzt. Ich dachte, in den letzten 20 Jahren hat wahrscheinlich jemand etwas erstellt, das ziemlich populär ist, das sich gut einprogrammieren und kompilieren lässt.

Welche moderneren Alternativen zu C gibt es, um hochperformanten kompilierten Code zu schreiben?

Wenn C ++ ein anderes Biest ist als vor 15 Jahren, würde ich es in Betracht ziehen, ich glaube, ich hatte die Annahme, dass es einige inhärente Probleme hatte.

Parallelisierung wäre wichtig, aber wahrscheinlich nicht maschinenübergreifend.

Jeremy French
quelle
21
Modernes C ++ unterscheidet sich grundlegend von C. Es ist viel besser mit Java oder C # zu vergleichen als mit C, außer dass es eine deterministische Zerstörung anstelle einer Garbage Collection bietet und außerdem ein undefiniertes Verhalten aufweist, da es nicht in einer VM ausgeführt oder verwaltet wird Umgebung. Ihre andere Alternative ist D, eine anständige Sprache, die aber in Bezug auf Bibliotheken und Unterstützung noch sehr unausgereift ist.
Charles Salvia
11
Können Sie den Teil "Leistung wird kritisch" erläutern? Warum wird es kritisch sein? Hast du schon etwas gemessen?
JesperE
3
15 Jahre sind in Bezug auf Computer ein Zeitalter, und seitdem verwenden Leute wie Ericsson funktionale Sprachen wie Erlang , um verteilte, fehlertolerante, Echtzeit-weiche Nonstop-Anwendungen in ihren eingebetteten Systemen zu unterstützen! Gehen Sie nicht davon aus, dass nur C ++ die von Ihnen gewünschte Leistung erbringt, sondern werfen Sie möglicherweise mehr Hardware auf das Problem und sparen Sie sich viel Implementierungszeit mit einer anderen Sprache.
Mark Booth
5
@JeremyFrench: aber Sie stellen Fragen, die auf der falschen Annahme beruhen, dass Leistung => statische Kompilierung.
Vartec
4
Für das, was es wert ist, dient Haskell derzeit in den meisten Fällen als mein Ersatz für C ++.
Jon Purdy

Antworten:

54

In der Entwicklung befindet sich eine Sprache namens The Rust Programming Language, die ähnliche Ziele wie C ++ verfolgt, insbesondere kostengünstige Abstraktionen und eine genaue Kontrolle über die Speicherverwaltung. Das heißt, es ist vielleicht der bemerkenswerteste aufstrebende Kandidat, obwohl er noch sehr jung ist.

Abgesehen von Rust gibt es wirklich keine anderen beliebten Alternativen, die sich zu nativem Code kompilieren lassen. Es gibt natürlich auch Delphi und D, aber sie sind nicht so schnell, populär oder gebraucht. Googles Sprache Go könnte ein Kandidat sein, aber sie ist noch sehr jung und zielt auf eine etwas andere Domain ab.

Beachten Sie jedoch, dass C # (Microsoft-Plattform vorausgesetzt) ​​und Java möglicherweise nicht so langsam sind, obwohl sie auf einer virtuellen Maschine ausgeführt werden. Die Just-in-Time-Kompilierung von Code kann einige Optimierungen bewirken, die herkömmliche Frühkompilierer aufgrund fehlender Informationen zu Programmstatus und -umgebung nicht anwenden können.

Ehrlich gesagt würde ich C persönlich nicht als Kandidaten betrachten, wenn C ++ eine Option ist, hauptsächlich aufgrund der Tatsache, dass modernes C ++ sicherer ist, auf einer höheren Abstraktionsebene arbeitet, aussagekräftiger ist und praktisch keinen Leistungsverlust gegenüber C aufweist (in einigen Fällen) C ++ ist deutlich schneller. Einfach ausgedrückt bietet C ++ alles, was C bietet, und mehr. Die meisten C-Funktionen gelten als "veraltet", und die C ++ - Standardbibliothek bietet bessere, sicherere, schnellere und intuitivere Alternativen.

zxcdw
quelle
5
Ich würde nicht sagen, dass die C-Funktionalität offiziell "veraltet" ist - nur, dass es fast keinen Grund gibt, jemals C-Bibliotheksfunktionen, rohe Zeiger oder C-Arrays in C ++ zu verwenden.
Charles Salvia
20
+1 für das Sprechen gegen die "Kompilierung ist für die Leistung erforderlich" falsche Annahme.
Telastyn
3
@gbjbaanb versuchen mit Visual Studio und mit MinGW unter Windows zu kompilieren und viel Glück damit: | Versuchen Sie auch, eine Person zu überzeugen, die Ihnen eine kompilierte Bibliothek mit einem dieser Tools zur Verfügung stellt, die nichts über ABIs weiß. Er sollte Ihnen die Quelle dieser Bibliothek nennen oder lernen, wie Sie die richtigen Spezifikationen neu kompilieren und bereitstellen . das Grauen manchmal.
User827992
5
@paxRoman: Sie können kleine Programme in C ++ schreiben und diese sicherer schreiben als in C.
Kevin Cline
3
@JBRWilkinson Soweit mir bekannt ist, ist die Popularität von Objective-C außerhalb der Apple-Plattform nicht vorhanden.
ZXCDW
19

Es gibt auch Ada , das sich zu nativem Code kompilieren lässt und innerhalb der Grenzen seiner Standardbibliothek über verschiedene Plattformen portierbar ist. Die Sprache ist am Leben und gut, mit dem aktuellsten Sprachstandard-Update (bekannt als Ada 2012).

Kurze Zusammenfassung für diejenigen, die mit Ada nicht vertraut sind:

  • Stark getippt
  • Eingebaute Unterstützung für Parallelität
  • Objektorientiert oder prozedural, je nach Ihren Anforderungen
  • Unterstützt von GNU Toolchain (GCC enthält Ada Frontend)
  • Hervorragend auch für die Softwareentwicklung geeignet, wenn Sie eine direkte Schnittstelle zur Hardware benötigen
  • Unterstützt generische Programmierung (generische Pakete, Prozeduren, Funktionen)
  • Features unterstützen die umfangreiche Softwareentwicklung (Pakete, untergeordnete Pakete, separate Kompilierung, strikte Unterscheidung zwischen Spezifikation und Implementierung)
Schedler
quelle
1
Ganz zu schweigen von Ada Tasks (Parallelisierung!)
NWS
6
+1: Ich habe versucht, etwas Ada zu lernen und ich denke, dass es eine sehr robuste und saubere Sprache ist. Schade, dass es nicht so viele Jobs gibt wie für andere Programmiersprachen.
Giorgio
3
Gut zu erwähnen, ich war auf der Suche nach etwas "modernerem", aber ich hatte Ada
Jeremy French
4
@ Jeremy French: Welche Funktionen suchen Sie in einer 'modernen' Sprache, die Ada nicht bietet?
Giorgio
17

Wenn C ++ ein anderes Biest ist als vor 15 Jahren, würde ich es in Betracht ziehen, ich glaube, ich hatte die Annahme, dass es einige inhärente Probleme hatte.

Vor 15 Jahren gab es keinen C ++ - Standard. Der zweite wurde letztes Jahr veröffentlicht. C ++ - Best Practices haben sich in den fünf Jahren nach der Veröffentlichung des 98-Standards stark verändert, und sie ändern sich mit der Veröffentlichung des 11-Standards erneut.

Ein Programmierer
quelle
12

Warum besteht man immer darauf, nach neuen Sprachen zu suchen?

C ++:

  • Ist die Sprache Nummer 4 von TIOBE, aber in Kombination mit C schlägt sie alle Konkurrenten
  • Hat viele Frameworks
  • Ist sehr einfach zu codieren
  • Ist sehr einfach zu stimmen
  • Ist sehr performant
  • Ist sehr sicher
  • Hat eine sehr gute Industrieunterstützung
  • Ist plattformübergreifend
  • Benötigt keine zusätzlichen VMs / Frameworks / Deployment-Probleme, wenn dies korrekt durchgeführt wird
  • Wird Ihnen leicht einen Job verschaffen
  • Verfügt über alle erforderlichen Komponenten, um .so / .dll zu erstellen und auf sehr alten Systemen zu starten
  • Leicht zu beheben
  • Sehr ausdrucksvoll
  • Sehr dynamisch
  • und ein paar andere interessante Sachen

Der einzige Nachteil von C ++ ist, dass Sie ein bisschen lernen müssen. Das ist es.

Vergleichen Sie dies mit anderen Sprachen, bei denen es sich um eine oder mehrere der folgenden Sprachen handelt:

  • Eng unterstützt (OCML, Fortran, ...)
  • Langsam (Java, Javascript)
  • Experimentell (Silverlight)
  • Ein bewegliches Ziel (.NET 1/2/3/4/5? Welches ist jetzt das letzte?)
  • Plattform gesperrt (.NET)
  • Schlechte Framework-Unterstützung haben (Fortran)
  • Hat kleine Gemeinschaften (alles außerhalb der Top 10)
  • Sind Albtraum zu beheben (Alles mit hochrangigen, narrensicheren Konzepten und Sachen)
  • Benötigt 500 MB Vorinstallation auf dem Kundencomputer (JVM / .NETVM)

IMHO, je weniger Sprachen wir verwenden und unterstützen, desto besser wird die Situation sein.

Dies führt zu automatischen Verbesserungen der Frameworks für Sprache, Support, Dokumentation, Arbeit der Standardisierungskomitees, besseren Büchern, mehr Wissen, einfacher zu unterstützender Software, besseren Mustern, längeren Sprachunterstützungszyklen und besser in der Sprache geschriebenem Code.

Ich weiß, dass die Leute dies ablehnen werden, aber denken Sie wirklich darüber nach.

Coder
quelle
71
C ++ "ist sehr einfach zu programmieren" ist einfach lächerlich falsch, sorry. Es ist eine unglaublich schwer zu erlernende Sprache, und selbst wenn Sie moderne C ++ - Redewendungen verwenden und Zeiger meiden, werden Sie mit tonnenweise rätselhaften Compiler- und Laufzeitfehlern konfrontiert sein, bevor Sie den Dreh rausfinden. Und selbst nachdem Sie es gemeistert haben, steht die Syntax ziemlich oft im Weg. In Safe C ++ werden häufig verschachtelte Vorlagen verwendet, die eine große Menge an Code erzeugen.
Konrad Rudolph
20
Sehr ausdrucksstark und sehr dynamisch klingen nicht wie typische C ++ - Merkmale im Vergleich zu dynamischen Sprachen.
Vartec
29
@gbjbaanb "etwas schwieriger zu lernen" ist wieder einmal lächerlich falsch. Es tut uns leid. Ich programmiere all diese Sprachen seit Jahren, ich bevorzuge eindeutig C ++ (und programmiere am ernsthaftesten darin), aber zu sagen, dass es einfach ist, ist einfach total irreführend. Und ich spreche nicht von ausgefallenen Metaprogrammier-Dingen, sondern von Compilerfehlern, die durch gewöhnlichen Code, durch das Verbergen von Namen, ADL, constKorrektheitsprobleme und ähnliches verursacht werden. Jeder, der Effective C ++ gelesen hat (wie Coder behauptet) und behauptet, dass C ++ einfach ist, hat eine mentale Trennung.
Konrad Rudolph
13
@ gbjbaanb Ich bin ein C ++ - Programmierer. Ich glaube nicht, dass C ++ einfach ist. Und dieser Kommentarthread hat auch im C ++ - Chat ein paar Stirnrunzeln bekommen. Das ist es also nicht. Und der Unterschied zwischen C ++ - Fallstricken und Fallstricken anderer Sprachen besteht darin, dass Sie wahrscheinlich in Ordnung sind, wenn Sie sie nicht in anderen Sprachen kennen. In C ++ sind Sie Toast. Und selbst wenn Sie davon wissen, können Sie immer noch mehrere Bildschirmseiten mit Kompilierungsfehlern für einen einzelnen Fehler erhalten (ist mir heute wieder passiert). Und obwohl der Fehler einfach zu beheben war (ein Tippfehler), braucht es Zeit, um all das zu analysieren.
Konrad Rudolph
6
Wann war eine beliebte Sprache jemals gut? PHP ist sehr beliebt und kein ernsthafter Mensch denkt, es sei eine "gute" Sprache, auch für seine Nische. Das einzig "Gute" an populären Sprachen ist, dass es viele Bibliotheken gibt, die das Programmieren bestimmter Domänen erleichtern. C ++ selbst ist voller Frustrationen.
weberc2
11

C / C ++ ist ziemlich lang im Gange ... das ist eine gute Sache . Dies impliziert, dass sie gut genug entworfen wurden (ähm), dass sie immer noch sehr brauchbar sind, dass viele Leute sie für alltägliche Aufgaben verwenden und dass Sie eine große Anzahl von Entwicklern finden, die Experten in ihnen sind. Reife ist etwas, das man schätzen sollte.

Wenn Sie Ihre ganze Zeit auf der Suche nach etwas Neuem verbringen, nur weil es neu ist und denken, dass es irgendwie besser sein muss, werden Sie sehr enttäuscht sein. Dies gilt für Software-Sprachen, GUI-Systeme (zur Kenntnis nehmen, Microsoft und Gnome) und Liebhaber (zur Kenntnis nehmen, junge Damen :))

Nun, wenn Ihre Erfahrung mit C ++ 20 Jahre alt ist, und wenn C ++ - Code im Allgemeinen wie C codiert wurde, dann ist es vielleicht an der Zeit, die Sprache neu zu bewerten, werden alle Funktionen verwendet, die es an diesem Tag gab und die nie wirklich verwendet wurden Heutzutage noch viel mehr, und einige Standardisierungsbemühungen haben die Sprache ein wenig erweitert, damit sie sich deutlich von den alten Entwicklungen im C-Stil unterscheidet. Nicht, dass C auch schlecht ist - es ist eine perfekte Sprache für viele Arten von Codierungsaufgaben!

gbjbaanb
quelle
16
Ich denke, C und C ++ sind Beispiele für Hoares Kommentar zum Softwaredesign: Entweder machen Sie es so einfach, dass es offensichtlich keine Mängel gibt, oder machen Sie es so kompliziert, dass es keine offensichtlichen Mängel gibt.
TMN
1
Wie können wiederholte Sicherheitslücken aufgrund einer Art Puffer eine "gute Sache" ausnutzen, unabhängig davon, wie alt oder verwurzelt eine Sprache ist? Und ist das wirklich anders, als die Fortsetzung einer bestehenden Ehe nach wiederholtem Missbrauch zu argumentieren?
user2864740
@ user2864740 was du vorschlägst ist eine Scheidung zu bekommen, weil die Frau alt ist und du ein neues, aufregendes Modell willst ... Ich sage du bleibst bei dem, was du hast, weil du die Schwächen und Macken kennst. Wie viele der neuen, coolen Sprachen lösen Probleme wie Pufferüberlauf und haben dann subtile Möglichkeiten, Puffer überzulaufen? Also, was ist besser - der Überlauf, den Sie vermeiden können, indem Sie nicht faul sind oder das richtige Konstrukt verwenden, oder der, in den Sie fallen, weil Sie nicht wissen, dass er da ist?
gbjbaanb
@ gbjbaanb Nein, das habe ich nie gesagt. Ich habe ein Gleichnis speziell für Schäden gezeichnet, die dadurch entstanden sind, dass der Kontext von Situationen nicht verbessert wurde. Ich bin im Allgemeinen sehr vernünftig und neige nicht dazu, trendige Themen oder Tools "fanboi" auszuwählen (das ist nur meine Natur). Außerdem sind C und C ++ verschiedene Sprachen. dennoch sind beide aus dem gleichen Grund gerechtfertigt. Und das ist das Problem bei solchen.
user2864740
8

Der aktuelle Standard von C ++ ist C ++ 11 , der 2011 veröffentlicht wurde. Es handelt sich also nicht um einen 20 Jahre alten Standard. Und dazwischen gab es zahlreiche Standards. Jeder von ihnen führt zahlreiche Leistungsverbesserungen ein.

Auch die Compiler haben sich ständig verbessert. Sie können viel besser optimieren als früher.

Auch die ausführbaren Formate haben sich verbessert. Vor 20 Jahren hatten Sie ein Out , jetzt haben Sie ELF .

Insgesamt kann der Vorschlag, dass sich C ++ in 20 Jahren nicht geändert hat, nicht weiter von der Wahrheit abweichen.

Denken Sie auch daran, dass C und C ++ sehr unterschiedliche Sprachen sind.

vartec
quelle
2
Ich ging davon aus, dass etwas, das vor 20 Jahren zum ersten Mal konzipiert wurde, architektonische Einschränkungen aufweist, die nur mit einer leeren Tafel verbessert werden können. Ich denke, diese Annahme könnte falsch gewesen sein.
Jeremy French
4
@JeremyFrench: Wie die x86-Architektur?
TMN
2
@TMN beweist oder widerlegt das meine Vermutung?
Jeremy French
6
Die ursprüngliche x86-Architektur war ein übler Kompromiss zwischen Abwärtskompatibilität mit dem 8080 und einer Reihe von Funktionen, die mit dem 68000 und dem NS32032 konkurrieren konnten. Segmentierter Speicher (mit "fernen" und "nahen" Zeigern), nur 4 Allzweckregister, Befehlscodierung mit variabler Länge, über 50 verschiedene JMP-Befehle, ein gemultiplexter Systembus mit drei Zuständen ... Und das auch heute noch Das grundlegende Design wird stärker als je zuvor, nachdem es vielen "überlegenen" Clean-Slate-Designs (Alpha, MIPS, PowerPC) nicht gelungen ist, es zu ersetzen.
TMN
1
@JeremyFrench Nein, Ihre Annahme war nicht falsch, zumindest im Fall von C ++. C ++ 11-Funktionen sind auf jeden Fall nützlich. Zu diesem Zeitpunkt sind sie jedoch mehr Mist auf dem Misthaufen. Sie versuchen, Funktionen moderner Sprachen einzubauen, aber um mit dem vorhandenen C ++ - Chaos fertig zu werden, müssen sie Ausnahmen haben, und diese Ausnahmen werden Ausnahmen haben und so weiter und so fort.
weberc2
6

Ich bin kein großer Experte für diese Sprache, aber ich denke, OCaml könnte eine interessante Option sein.

OCaml ist eine kompilierte, funktionale / objektorientierte Sprache. Für einen Leistungsvergleich mit C ++ siehe C ++ vs OCaml: Ray-Tracer-Vergleich . Natürlich ist dies ein sehr spezifisches Beispiel und man sollte ausführlichere Tests durchführen, um ein besseres Gefühl für die Leistung von OCaml zu bekommen.

Giorgio
quelle
Kann der Downvoter bitte einen Hinweis geben, wie diese Antwort verbessert werden kann? Vielen Dank.
Giorgio
3

Hängt davon ab, was Ihr Produkt tun wird. Wenn die Leistung wirklich kritisch ist, ist FORTRAN nach wie vor die bevorzugte Sprache . Ich würde Java auch nicht ausschließen - es wird in vielen umfangreichen Finanzhandelsanwendungen verwendet. Erlang ist einen Blick wert, wenn Ihre Problemdomäne eine hohe Nebenläufigkeit erfordert. Objective-C ist nett, obwohl ich nicht weiß, wie gut es außerhalb des Apple-Ökosystems unterstützt wird (jenseits von Compilern und Basislaufzeiten). Ich habe auch gute Dinge über Haskells Leistung gehört, bin mir aber nicht sicher, ob dies absolute Leistung oder nur Leistung im Vergleich zu anderen funktionalen Sprachen ist.

TMN
quelle
2
Jeder Finanzjob, den ich mir angesehen habe, möchte C / C ++ - Entwickler, nicht Java. Aus Erfahrung mit Java sehe ich keine, die eine hohe Leistung bieten, es sei denn, Sie werfen eine Menge Hardware darauf.
Gbjbaanb
An der Wall Street und bei verschiedenen Investmentbanken in den USA und in Großbritannien sind zahlreiche Java-Handelssysteme in Betrieb. Es wird auch ziemlich häufig an der Chicago Mercantile Exchange eingesetzt.
TMN
3

Wenn Sie sagen, dass Ihr Projekt leistungsabhängig ist, meinen Sie damit jede Codezeile? Oder gibt es, wie üblich, einen kleineren Prozentsatz, der für die Leistung entscheidend ist, während der Rest Ihr gewöhnlicher Geschäftsbetrieb ist?

Was ist das größere Risiko für Ihr Projekt, nachdem Sie darauf geantwortet haben: dass das Endergebnis zu langsam ist oder dass Sie es nie zu Ende bringen?

Angenommen, Sie beantworten die zweite Frage für beide, sollten Sie in einer höheren Sprache entwickeln, die native Interop unterstützt (Python, Ruby, die .Net-Familie haben dies alle). Beenden Sie zuerst das Projekt. Dann profilieren, optimieren, spülen, wiederholen. Erst danach sollten Sie erwägen, das Auswahlsegment Ihrer Anwendung in systemeigenen Code umzuwandeln und diesen systemeigenen Code in Ihr fertiges Produkt zu integrieren.

Chris Pitman
quelle
Sobald es Java ist, können Sie es nicht retten, wenn es zu langsam ist.
Coder
6
@Coder Java verfügt über einen FFI (JNI), mit dem Sie in der Sprache Ihrer Wahl „Chaos anrichten“ können. Wenn Sie also die Schnittstellen gut entworfen haben, können Sie einfach eine Java-Implementierung durch eine native ersetzen. Die Java-Plattform ist gut durchdacht.
K.Steff
1

Vala ähnelt Java und C #, kompiliert in nativen Code (oder C-Quellcode, wenn Sie es vorziehen) und ist sehr schnell . Für die objektorientierten Elemente ist GLib erforderlich, und es wurde von Linux-Hackern für Linux-Hacker geschrieben. Wenn Ihre Domain also Windows ist, ist sie möglicherweise nicht sehr gut.

Setzen Sie Monica wieder ein
quelle
1

Objective-C ist eine moderne, kompilierte Alternative zu C und C ++. Es verfügt sowohl über ein Garbage-Collected- als auch ein deterministisches Speichermanagement, und die Message-Passing-OO-Laufzeit wurde für die Leistung optimiert.

Es ist über GCC und CLang verfügbar und es gibt Anwendungsbibliotheken wie GNUStep und Cocotron, die auf verschiedenen Plattformen funktionieren.

Wenn Sie Hochleistungsarbeiten ausführen, gehe ich davon aus, dass dies eine Art Zahlenverarbeitung oder eine andere Divide-and-Conquer-Arbeit anstelle der Benutzeroberfläche ist. zB HTML über einen Mini-HTTP-Server.

JBRWilkinson
quelle
0

Ich habe es nie benutzt, aber ein Freund von mir schwört auf Cython, mit dem Sie Primitive im C-Stil in leistungskritischen Teilen Ihres Codes verwenden können, während Sie die allgemeine Python-Syntax beibehalten und Python-Konstrukte höherer Ebenen in vollem Umfang nutzen können, um die Entwicklung zu reduzieren Zeit überall sonst.

Dan Neely
quelle