web-dev-qa-db-fra.com

Alternatives modernes compilables au C / C ++

J'envisage d'écrire un nouveau produit logiciel. Les performances seront critiques, donc je me méfie d'utiliser un langage interprété ou un langage qui utilise une couche d'émulation (lire Java).

Ce qui m'amène à penser à utiliser du C (ou du C++) mais ceux-ci sont assez longs dans la dent. Je n'ai pas utilisé non plus depuis longtemps. Je me suis dit qu'au cours des 20 dernières années, quelqu'un avait probablement créé quelque chose de relativement populaire, agréable à coder et à compiler.

Quelles sont les alternatives plus modernes à C pour écrire du code compilé hautes performances?

Si C++ est une bête différente de ce qu'elle était il y a 15 ans, je considérerais cela, je suppose que je supposais qu'il avait des problèmes inhérents.

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

39
Jeremy French

Il existe un langage en développement appelé The Rust Programming Language qui poursuit des objectifs similaires à ceux du C++, notamment des abstractions à coût nul et un contrôle précis de la gestion de la mémoire. Cela dit, il est peut-être le candidat à venir le plus notable malgré son très jeune âge.

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

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

Franchement, je ne considérerais pas personnellement C comme un candidat si C++ est une option, principalement en raison du fait 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 performances par rapport à C (dans certains cas C++ est notamment plus rapide). Autrement dit, C++ fournit tout ce que C fournit et plus encore. La plupart des fonctionnalités C sont considérées comme "obsolètes" et des alternatives meilleures, plus sûres, plus rapides et plus intuitives sont fournies par la bibliothèque standard C++.

55
zxcdw

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 bien vivante, avec la mise à jour de la norme linguistique la plus récente actuellement en cours (connue sous le nom d'Ada 2012).

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

  • Fortement typé
  • Prise en charge intégrée de la simultanéité
  • Orienté objet ou procédural, selon vos besoins
  • Pris en charge par GNU toolchain (GCC contient Ada frontend)
  • 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)
19
Schedler

Si C++ est une bête différente de ce qu'elle était il y a 15 ans, je considérerais cela, je suppose que je supposais qu'il avait des problèmes inhérents.

Il y a 15 ans, il n'y avait pas de standard C++. Le deuxième 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 évoluent à nouveau avec la publication de la norme 11.

17
AProgrammer

C/C++ est assez long dans la dent .... c'est un bonne chose. Cela implique qu'ils ont été suffisamment bien conçus (ahem) qu'ils sont toujours 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 sont des experts en eux. La maturité est quelque chose à chérir.

Si vous passez tout votre temps à chercher quelque chose de nouveau, simplement parce que c'est nouveau et pensez donc que cela doit être mieux, vous êtes très déçu. Cela s'applique aux langages logiciels, aux systèmes GUI (attention, Microsoft et Gnome) et aux amoureux (attention, jeunes filles :))

Maintenant, certes, si votre expérience du C++ a 20 ans, lorsque le code C++ était généralement codé comme C, alors peut-être qu'il était temps de réévaluer le langage, toutes les fonctionnalités qui étaient là dans la journée qui n'ont jamais été tout à fait utilisées sont utilisées beaucoup plus aujourd'hui, et quelques efforts de normalisation ont un peu élargi le langage pour le faire apparaître très différent de ces anciens développements de style C. Non pas que C soit mauvais aussi - c'est un langage parfait pour de nombreux types de tâches de codage aussi!

12
gbjbaanb

Pourquoi les gens insistent-ils toujours pour chercher de nouvelles langues?

C++:

  • Est la langue numéro 4 de TIOBE, mais écrase toute concurrence si elle est combinée avec C
  • A beaucoup de cadres
  • Est très facile à coder
  • Est très facile à régler
  • Est très performant
  • Est très sûr
  • A un très bon support de l'industrie
  • Est multiplateforme
  • Ne nécessite pas de VM/Frameworks/déploiement supplémentaires si fait correctement
  • Vous décrochera facilement un emploi
  • A tout le nécessaire pour construire .so/.dll à lancer sur de très vieux systèmes
  • Facile à dépanner
  • Très expressif
  • Très dynamique
  • et plein d'autres trucs intéressants

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 des:

  • Prise en charge étroite (OCML, Fortran, ...)
  • Lent (Java, Javascript)
  • Expérimental (Silverlight)
  • Une cible mobile (.NET 1/2/3/4/5? Lequel est le dernier maintenant?)
  • Plateforme verrouillée (.NET)
  • Avoir un mauvais support de framework (Fortran)
  • A de petites communautés (quoi que ce soit en dehors du top 10)
  • Sont des cauchemars à dépanner (tout avec des concepts et des trucs infaillibles de haut niveau)
  • Nécessite 500 Mo de préintallation sur la machine du client (JVM/.NETVM)

À mon humble avis, moins nous utiliserons et prendrons en charge de langues, meilleure sera la situation.

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

Je sais que les gens vont voter contre cela, mais pensez-y vraiment.

12
Coder

La norme actuelle de C++ est C++ 11 , qui a été publiée en 2011. Il ne s'agit donc pas d'une norme vieille de 20 ans. Et il y a eu de nombreuses normes entre les deux. Chacun d'eux introduisant de nombreuses améliorations de performances.

Les compilateurs se sont également constamment améliorés. 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 a.out , maintenant vous avez ELF .

Dans l'ensemble, la suggestion que le C++ n'a pas changé en 20 ans ne peut pas être plus éloignée de la vérité.

Gardez également à l'esprit que C et C++ sont des langages très différents.

8
vartec

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

OCaml est un langage compilé, fonctionnel/orienté objet. Pour une comparaison des performances avec C++, voir C++ vs OCaml: comparaison de Ray Tracer . Bien sûr, ceci est un exemple très spécifique et il faut faire des tests plus approfondis pour avoir une meilleure idée des performances d'OCaml.

7
Giorgio

Cela dépend de ce que votre produit va faire. Si les performances sont vraiment critiques, alors la langue de choix est toujours FORTRAN . Je n'écarterais pas non plus Java - il est utilisé dans de nombreuses applications de trading financier à volume élevé. Erlang mérite le détour si votre domaine problématique nécessite une concurrence élevée. Objective-C est sympa, bien que Je ne sais pas à quel point il est bien pris en charge en dehors de l'écosystème Apple (au-delà des compilateurs et de l'exécution de base). J'ai également entendu de bonnes choses sur les performances de Haskell, mais je ne sais pas si c'est des performances absolues ou simplement des performances par rapport aux autres langages fonctionnels.

3
TMN

Lorsque vous dites que votre projet est sensible aux performances, voulez-vous dire chaque ligne de code de celui-ci? Ou, comme d'habitude, y a-t-il un pourcentage plus faible qui est critique en termes de performances alors que le reste correspond à votre gestion ordinaire du code d'entreprise de l'usine?

Après avoir répondu à cela, quel est le plus grand risque pour votre projet: que le résultat final soit trop lent ou que vous ne le terminiez jamais en premier lieu?

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

3
Chris Pitman

Objective-C est une alternative moderne et compilée au C et C++ simples. Il a à la fois une gestion de la mémoire récupérée et déterministe et le passage du message OO runtime a été optimisé pour les performances.

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

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

1
JBRWilkinson

Je ne l'ai jamais utilisé, mais un ami de mes jurons par Cython qui vous permet d'utiliser des primitives de style C dans les parties critiques de la performance de votre code tout en conservant le général python syntaxe et être en mesure de tirer pleinement parti des constructions pythons de niveau supérieur pour réduire le temps de développement partout ailleurs.

Vala est similaire à Java et C #, compile en code natif (ou 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 peut ne pas être très bon.

1
Brendan Long