Alternatives modernes compilables à C / C ++ [fermé]

38

J'envisage d'écrire un nouveau produit logiciel. Les performances seront critiques, je me méfie donc de l’utilisation d’un langage interprété ou utilisant un calque d’émulation (read java).

Ce qui m'amène à penser à utiliser C (ou C ++), mais ils sont assez longs dans la dent. Je n'ai pas utilisé non plus depuis longtemps. J'ai pensé qu'au cours des 20 dernières années, quelqu'un a probablement créé quelque chose qui est raisonnablement populaire, agréable à coder et compilé.

Quelles alternatives plus modernes existe-t-il à C pour écrire du code compilé hautes performances?

Si C ++ est une bête différente de ce qu’elle était il ya 15 ans, j’envisagerais cela, j’imaginais que j’avais supposé qu’il posait des problèmes inhérents.

La parallélisation serait importante, mais probablement pas sur plusieurs machines.

Jeremy French
la source
21
Le C ++ moderne est radicalement différent du C. Il est beaucoup plus comparable à quelque chose comme Java ou C # qu’il est au C, sauf qu’il présente une destruction déterministe au lieu d’un garbage collection et qu’il a également un comportement indéfini car il ne fonctionne pas dans une VM ou n’est pas géré. environnement. Votre autre alternative est D, qui est un langage décent, mais toujours très immature en termes de bibliothèques et de support.
Charles Salvia
11
Pouvez-vous élaborer sur la partie "performance sera critique"? Pourquoi sera-t-il critique? Avez-vous encore mesuré quelque chose?
JesperE
3
Ericsson utilise depuis longtemps des langages fonctionnels comme Erlang pour prendre en charge des applications distribuées, tolérantes aux pannes, en temps réel et non-stop dans leurs systèmes embarqués! Ne supposez pas que seul le C ++ peut vous donner les performances que vous souhaitez, vous feriez mieux de jeter plus de matériel sur le problème et de gagner beaucoup de temps d'implémentation avec un autre langage.
Mark Booth
5
@JeremyFrench: mais vous posez une question basée sur une fausse hypothèse, cette performance => compilation statique.
vartec
4
Pour ce que cela vaut, Haskell remplace actuellement le C ++ dans la plupart des cas.
Jon Purdy

Réponses:

54

Un langage en développement appelé The Rust Programming Language poursuit des objectifs similaires à ceux du C ++, notamment des abstractions gratuites et un contrôle précis de la gestion de la mémoire. Cela dit, il s’agit peut-être du candidat le plus remarquable à venir, bien qu’il soit encore très jeune.

En dehors de Rust, il n’existe pas vraiment d’autre alternative populaire qui compile en code natif. Il y a Delphi et D aussi, bien sûr, mais ils ne sont pas aussi rapides, populaires ou utilisés. La langue Go de Google pourrait être candidate, mais elle est encore très jeune et vise un domaine légèrement différent.

Cependant, notez que C # (en supposant la plate-forme Microsoft) et Java peuvent ne pas être aussi lents même s’ils s’exécutent sur une machine virtuelle; la compilation de code juste à temps peut permettre certaines optimisations que les compilateurs traditionnels ne sont pas en mesure d'appliquer, en raison du manque d'informations sur l'état et l'environnement du programme.

Franchement, personnellement, je ne considérerais pas le C comme candidat si le C ++ était une option, principalement parce que le C ++ moderne est plus sûr, fonctionne à un niveau d'abstraction plus élevé, est plus expressif et n'a pratiquement aucune perte de performance par rapport au C (dans certains cas C ++ est notamment plus rapide). En termes simples, C ++ fournit tout ce que C fournit et plus encore. La plupart des fonctionnalités C sont considérées comme "obsolètes" et la bibliothèque standard C ++ fournit des alternatives plus sûres, plus rapides et plus intuitives.

zxcdw
la source
5
Je ne dirais pas que la fonctionnalité C est "obsolète", au sens officiel du terme, mais qu'il n'y a pratiquement aucune raison d'utiliser des fonctions de bibliothèque C, des pointeurs bruts ou des tableaux C en C ++.
Charles Salvia
20
+1 pour parler contre la "compilation est nécessaire pour la performance" hypothèse fausse.
Telastyn
3
@gbjbaanb essayez de compiler avec Visual Studio et avec MinGW sous Windows et bonne chance avec ça: | essayez également de convaincre une personne qui vous donne une bibliothèque compilée, compilée avec l’un de ces outils, qui ne sait rien des ABI qu’elle a tort et qui devrait vous en donner la source ou apprendre à recompiler et donner les spécifications appropriées. . l'horreur, parfois.
user827992
5
@paxRoman: vous pouvez écrire de petits programmes en C ++ et les écrire plus en toute sécurité qu'en C.
kevin cline
3
@JBRWilkinson Autant que je sache, la popularité d'Objective-C est inexistante en dehors de la plateforme Apple.
Zxcdw
19

Il existe également Ada , qui compile en code natif et est portable sur diverses plates-formes dans les limites de sa bibliothèque standard. La langue est vivante et se poursuit, avec la mise à jour la plus récente des normes linguistiques (connue sous le nom de Ada 2012).

Résumé rapide pour ceux qui ne connaissent pas Ada:

  • Fortement typé
  • Prise en charge intégrée de la concurrence
  • Orienté objet ou procédural, selon vos besoins
  • Pris en charge par la chaîne d’instruments GNU (GCC contient une interface Ada)
  • Excellent également pour le développement de logiciels, c'est-à-dire lorsque vous devez vous connecter directement au matériel
  • Prend en charge la programmation générique (packages génériques, procédures, fonctions)
  • Les fonctionnalités prennent en charge le développement de logiciels à grande échelle (packages, packages enfants, compilation séparée, distinction stricte entre spécification et implémentation)
Ordonnanceur
la source
1
Sans parler des tâches Ada (Parallélisation!)
NWS
6
+1: J'ai essayé d'apprendre un peu d'Ada et je pense que c'est un langage très robuste et propre. Dommage qu'il n'y ait pas autant d'emplois que pour d'autres langages de programmation.
Giorgio
3
Bonne mention, je cherchais quelque chose de plus "moderne" mais j'avais oublié Ada
Jeremy French
4
@ Jeremy French: Quelles fonctionnalités recherchez-vous dans une langue plus «moderne» qu'Ada ne propose pas?
Giorgio
17

Si C ++ est une bête différente de ce qu’elle était il ya 15 ans, j’envisagerais cela, j’imaginais que j’avais supposé qu’il posait des problèmes inhérents.

Il y a 15 ans, il n'y avait pas de standard C ++. Le second a été publié l'année dernière. Les meilleures pratiques C ++ ont beaucoup changé au cours des 5 années qui ont suivi la publication de la norme 98 et elles le sont encore avec la publication de la norme 11.

Programmateur
la source
12

Pourquoi les gens insistent toujours pour chercher de nouvelles langues?

C ++:

  • Est la langue numéro 4 par TIOBE, mais écrase toute la concurrence si elle est combinée avec C
  • A beaucoup de cadres
  • Est très facile à coder
  • Est très facile à accorder
  • Est très performant
  • Est très sécuritaire
  • A un très bon soutien de l'industrie
  • Est la plateforme croisée
  • N'a pas besoin de désordre supplémentaire de VM / Frameworks / deployment si c'est fait correctement
  • Vous obtiendrez facilement un emploi
  • Possède tout le matériel nécessaire pour construire .so / .dll à lancer sur de très vieux systèmes
  • Facile à dépanner
  • Très expressif
  • Très dynamique
  • et un tas d'autres choses intéressantes

Le seul inconvénient de C ++ est que vous devez apprendre un peu. C'est ça.

Comparez cela à d'autres langues qui sont une ou plusieurs de:

  • Prise en charge étroite (OCML, Fortran, ...)
  • Lent (Java, Javascript)
  • Expérimental (Silverlight)
  • Une cible en mouvement (.NET 1/2/3/4/5? Lequel est le dernier maintenant?)
  • Plate-forme verrouillée (.NET)
  • Avoir un faible support de framework (Fortran)
  • A de petites communautés (rien en dehors du top 10)
  • Sont un cauchemar à résoudre (n'importe quoi avec des concepts de haut niveau à toute épreuve)
  • Nécessite 500 Mo de pré-installation sur la machine du client (JVM / .NETVM)

IMHO, moins nous utiliserons et prendrons en charge les langues, meilleure sera la situation.

Cela entraîne des améliorations automatiques dans les cadres pour la langue, le support, la documentation, le travail des comités de normalisation, de meilleurs livres, plus de connaissances, des logiciels plus faciles à prendre en charge, de meilleurs modèles, des cycles de support de langue plus longs et un code plus habile écrit dans la langue.

Je sais que les gens vont baisser la voix, mais réfléchissez-y, vraiment.

Codeur
la source
71
C ++ "il est très facile de coder" est simplement ridiculement faux, désolé. C'est un langage incroyablement difficile à apprendre et même si vous utilisez les idiomes C ++ modernes et que vous évitez les pointeurs, vous serez confronté à des tonnes d'erreurs de compilation et d'exécution, avant de vous lancer. Et même après que vous l'ayez maîtrisée, la syntaxe vous gêne assez souvent. Safe C ++ utilise souvent un gâchis de modèles imbriqués qui génèrent d'énormes quantités de code standard.
Konrad Rudolph
20
Très expressif et très dynamique, cela ne ressemble pas aux traits C ++ classiques, comparé aux langages dynamiques.
vartec
29
@gbjbaanb “un peu plus difficile à apprendre” est, encore une fois, ridiculement à l’écart. Désolé. Je programme tous ces langages depuis des années, je préfère clairement le C ++ (et y programme les programmes les plus sérieux), mais dire que c'est facile est tout simplement trompeur. Et je ne parle pas de métaprogrammation sophistiquée, mais d’erreurs de compilation générées par le code courant, causées par la dissimulation de noms, l’ADL, les constproblèmes de correction , etc. Quiconque a lu Effective C ++ (comme Coder le prétend) et affirme que C ++ est facile a une déconnexion mentale.
Konrad Rudolph
13
@ gbjbaanb Je suis un programmeur C ++. Encore une fois, je ne pense pas que le C ++ soit facile. Et ce fil de commentaires a également suscité des froncements de sourcils de la discussion en C ++. Donc ce n'est pas ça. Et la différence entre les pièges C ++ et les langages d'autres langages est que si vous ne les connaissez pas dans d'autres langages, vous irez probablement bien. En C ++, vous êtes grillé. Et même si vous les connaissez, vous pouvez toujours obtenir plusieurs pages d’écran des erreurs de compilation pour une seule erreur (m’est arrivé à nouveau aujourd’hui). Et même si l'erreur était simple à corriger (une faute de frappe), il faut du temps pour analyser tout cela.
Konrad Rudolph
6
Quand une langue populaire a-t-elle déjà été bonne? PHP est extrêmement populaire et aucune personne sérieuse ne pense que c'est un "bon" langage, même pour son créneau. La seule "bonne" chose à propos des langages populaires est qu'il existe de nombreuses bibliothèques pour faciliter la programmation de certains domaines. C ++ lui-même est semé d'embûches.
Weberc2
11

C / C ++ est plutôt long dans la dent .... c'est une bonne chose . Cela implique qu'ils ont été suffisamment bien conçus (ahem) pour qu'ils soient encore très utilisables, que beaucoup de gens les utilisent pour les tâches quotidiennes et que vous trouverez un grand nombre de développeurs qui en sont des experts. La maturité est quelque chose à préserver.

Si vous passez tout votre temps à chercher quelque chose de nouveau, simplement parce que son nouveau produit doit être meilleur, vous êtes déçus. Ceci s’applique aux langages logiciels, aux systèmes d’interface graphique (prenez note, Microsoft et Gnome) et aux amoureux (prenez note, jeunes filles :))

Maintenant, certes, si votre expérience du C ++ a 20 ans, lorsque le code C ++ était généralement codé comme le C, il était peut-être temps de réévaluer le langage, toutes les beaucoup plus aujourd’hui, et quelques efforts de normalisation ont légèrement élargi le langage pour le rendre très différent de ces vieux développements de type C. Non pas que C soit mauvais aussi - c’est un langage parfait pour de nombreux types de tâches de codage!

gbjbaanb
la source
16
Je pense que C et C ++ illustrent le commentaire de Hoare sur la conception de logiciel: soit en simplifiant les choses, il n’existe manifestement pas de problèmes, soit en les compliquant, sans défauts évidents.
TMN
1
Comment des vulnérabilités de sécurité répétées dues à une forme de tampon exploitent-elles une "bonne chose", quel que soit l'âge ou la profondeur d'une langue? Et est-ce vraiment différent de faire valoir le maintien d'un mariage établi après des abus répétés?
user2864740
@ user2864740 vous proposez de divorcer car votre femme est âgée et vous voulez un nouveau modèle excitant ... Je vous dis de vous en tenir à ce que vous avez parce que vous connaissez les faiblesses et les bizarreries. Combien de nouveaux langages cools résolvent des problèmes tels que le débordement de mémoire tampon, puis se révèlent avoir des méthodes subtiles de mémoire tampon de débordement? Alors quoi de mieux - le débordement que vous pouvez éviter en ne faisant pas preuve de paresse ni d'utiliser la bonne construction, ou celle dans laquelle vous tombez parce que vous ne saviez pas qu'il y en avait?
gbjbaanb
@gbjbaanb Non, je n'ai jamais dit ça. Je faisais un parallèle spécifiquement avec les dommages causés par l’amélioration du contexte des situations. Je suis généralement assez rationnel et je n’ai pas tendance à choisir "en fanfare" des sujets ou outils tendance (c’est tout simplement ma nature). De plus, C et C ++ sont des langages différents; pourtant, ils sont tous deux justifiés pour le même motif de blanchiment. Et c'est le problème avec un tel.
user2864740
8

Le standard actuel de C ++ est le C ++ 11 , qui a été publié en 2011. Il ne s'agit donc pas d'un standard vieux de 20 ans. Et il y a eu de nombreuses normes entre les deux. Chacun d'entre eux introduisant de nombreuses améliorations de performances.

Les compilateurs ont également été en constante amélioration. Ils sont bien meilleurs en optimisation qu’avant.

Les formats exécutables se sont également améliorés. Il y a 20 ans, vous aviez eu.out , maintenant vous avez ELF .

Globalement, la suggestion que C ++ n’a pas changé en 20 ans ne peut être plus éloignée de la vérité.

De plus, gardez à l'esprit que C et C ++ sont des langages très différents.

vartec
la source
2
Mon hypothèse était que quelque chose qui avait été conçu pour la première fois il y a 20 ans aurait des limitations architecturales inhérentes qui ne pourraient être améliorées qu'avec une ardoise vierge. Je pense que cette hypothèse peut avoir été fausse.
Jeremy French
4
@JeremyFrench: Vous aimez l'architecture x86?
TMN
2
@TMN cela prouve-t-il ou réfute-t-il mon hypothèse?
Jeremy French
6
L'architecture x86 d'origine était un compromis vicieux entre la compatibilité avec les versions antérieures avec le 8080 et un ensemble de fonctionnalités concurrentes des modèles 68000 et NS32032. Mémoire segmentée (avec les pointeurs "far" et "near"), seulement 4 registres à usage général, codage d'instructions de longueur variable, plus de 50 types d'instructions JMP, un bus système à trois états multiplexé ... Et aujourd'hui encore, ce même la conception de base est de plus en plus solide, après que de nombreuses conceptions «de qualité supérieure» (Alpha, MIPS, PowerPC) n’ont pas réussi à la remplacer.
TMN
1
@JeremyFrench Nope, votre hypothèse n'était pas fausse, du moins dans le cas de C ++. Les fonctionnalités de C ++ 11 sont vraiment utiles; Cependant, à ce stade, ils ne sont que de la merde sur le tas de merde. Ils essaient d'intégrer des fonctionnalités des langages modernes, mais pour faire face au désordre C ++ existant, ils doivent avoir des exceptions, et ces exceptions auront des exceptions, et ainsi de suite.
Weberc2
6

Je ne suis pas un grand expert de cette langue, mais je pense que OCaml pourrait être une option intéressante à examiner.

OCaml est un langage compilé, fonctionnel / orienté objet. Pour une comparaison des performances avec C ++, reportez-vous à la section Comparaison de traceurs C ++ vs OCaml: Ray . Bien entendu, il s'agit d'un exemple très spécifique et il convient d'effectuer des tests plus approfondis pour avoir une meilleure idée de la performance d'OCaml.

Giorgio
la source
Le votant inférieur peut-il donner un indice sur la manière dont cette réponse peut être améliorée? Merci.
Giorgio
3

Cela dépend de ce que votre produit va faire. Si les performances sont vraiment essentielles, le langage de prédilection reste le fortran . Je n'écarterais pas non plus Java - il est utilisé dans de nombreuses applications de trading financier à volume élevé. Erlang vaut le coup d'oeil si votre domaine problématique nécessite une grande simultanéité. Objective-C est bien, mais j'ignore à quel point il est pris en charge en dehors de l'écosystème Apple (au-delà des compilateurs et du runtime de base). J'ai également entendu de bonnes choses sur les performances de Haskell, mais je ne suis pas sûr qu'il s'agisse de performances absolues ou simplement de performances par rapport à d'autres langages fonctionnels.

RGT
la source
2
chaque travail de finance que j'ai regardé veulent des développeurs C / C ++, pas Java. De par mon expérience en Java, je ne peux en voir aucune qui soit très performante à moins d’avoir jeté des tonnes de matériel.
gbjbaanb
De nombreux systèmes de trading Java sont en exploitation à Wall Street et dans diverses banques d’investissement aux États-Unis et au Royaume-Uni. Il est également très utilisé au Chicago Mercantile Exchange.
TMN
3

Quand vous dites que votre projet est sensible à la performance, vous voulez dire chaque ligne de code? Ou bien, comme d'habitude, y a-t-il un pourcentage plus faible de performances critiques tandis que le reste correspond au code de votre entreprise courante?

Après avoir répondu à cette question, quel est le plus grand risque pour votre projet: que le résultat final soit trop lent ou que vous ne le finissez jamais?

En supposant que vous répondiez à la seconde pour les deux, vous devriez développer dans un langage de niveau supérieur prenant en charge l’interopérabilité native (Python, Ruby, la famille .Net l’ont tous). Tout d'abord, terminez le projet. Puis profilez, optimisez, rincez, répétez. Ensuite, envisagez de réécrire le segment de choix de votre application en code natif et d’intégrer ce code natif à votre produit fini.

Chris Pitman
la source
Une fois que c'est Java, vous ne pouvez pas le sauver s'il est trop lent.
Coder
6
@Coder Java a un FFI (JNI) qui vous permet de "faire des ravages" dans la langue de votre choix. Ainsi, si vous avez bien conçu les interfaces, vous pouvez simplement remplacer une implémentation Java par une implémentation native. La plateforme Java est bien pensée.
K.Steff
1

Vala est similaire à Java et C #, compile en code natif (ou en code source C si vous préférez) et est très rapide . Il nécessite GLib pour ses bits orientés objet, et il est écrit par des pirates Linux pour des pirates Linux, donc si votre domaine est Windows, il se peut que ce ne soit pas très bon.

Rétablir Monica
la source
1

Objective-C est une alternative moderne et compilée au C et C ++ droits. Il dispose d’une gestion de la mémoire à la fois ordonnée et déterministe, et le moteur d’exécution OO de passage de messages a été optimisé pour la performance.

Il est disponible via GCC et CLang et il existe des bibliothèques d'applications telles que GNUStep et Cocotron qui fonctionnent sur diverses plates-formes.

Si vous effectuez un travail de haute performance, je vais supposer que c'est un peu un travail de calcul ou un autre travail de division et de conquête au lieu de l'interface utilisateur, ce qui signifie que vous pouvez utiliser l'interface utilisateur dans la langue la plus facile pour vous, par exemple HTML via un mini serveur http.

JBRWilkinson
la source
0

Je ne l'ai jamais utilisé, mais l'un de mes amis juré par Cython, qui vous permet d'utiliser des primitives de style C dans des parties critiques de votre code tout en conservant la syntaxe python générale et en exploitant pleinement les constructions de plus haut niveau pour réduire le développement. temps partout ailleurs.

Dan Neely
la source