J'aime vraiment la nature simple et transparente de C: quand j'écris du code C, je ne me sens pas gêné par des "abstractions qui fuient" et je peux presque toujours faire une supposition astucieuse quant à l'assemblage que je produis. J'aime aussi la syntaxe simple et familière de C.
Cependant, C n'a pas ces doodads simples et utiles que C ++ propose comme des classes, une gestion simplifiée non-cstring, etc. et pas très sûrs pour différentes raisons.
Cependant, je ne suis pas fan de l'accent mis sur les objets en C ++, et je suis timide face au "nouvel" opérateur et autres. C ++ semble avoir juste un peu trop de hoquets pour, par exemple, être utilisé comme langage de programmation système.
Existe-t-il un langage qui se situe entre C et C ++ à l'échelle des widgets et des doodads?
Avertissement: je veux dire que c'est une question purement factuelle. Je n'ai pas l'intention de vous mettre en colère parce que je ne partage pas votre opinion que C {, ++} est assez bon pour faire tout ce que je prévois.
new
est principalement un renforcementmalloc
qui peut également prendre soin d'initialiser la mémoire pour vous. Avec "placement new" etoperator new
, vous pouvez décider comment et où il alloue de la mémoire. Et en ce qui concerne l'accentuation des objets: quelques lignes ci-dessus, vous déclarez que vous considérez les classes comme un "doodad simple et utile". Décidez-vous!C+
Diclaimer: Désolé, je n'ai pas put resist. It
le 1er avril;)Réponses:
Ce sont peut-être les droïdes que vous recherchez ...
Aller - http://golang.org/
RÉ - http://dlang.org/
Rouille - http://rust-lang.org/
la source
struct
valeurs sont sérieusement devinées par rapport aux valeurs C ++ - pas d'héritage, pas de références rvalue, par exemple, il est donc impossible de produire quelque chose d'aussi simple qu'une classe de chaîne de valeurs en D aussi efficace que son équivalent C ++. Ce sont des faits sur le langage D.Il existe un certain nombre de langages (par exemple, Java, Go, D, Objective-C) qui sont soit à peu près parallèles au C ++, soit des tentatives de résolution de problèmes que les auteurs ont vu avec C ++.
Au moins, l'OMI, cependant, fonctionne tous sensiblement inférieur au C ++ pour la plupart des applications pratiques.
Malheureusement, en fonction de votre goût apparent pour savoir quel code d'assemblage sera produit, nous pouvons probablement exclure immédiatement Objective C et Java.
Théoriquement, je considérerais Go comme le plus intéressant de ceux-ci - il contient des idées vraiment originales et des approches intéressantes pour résoudre des problèmes qui facilitent beaucoup certains types de code. Malheureusement, les compilateurs actuels ne produisent pas de très bon code, et il n'y a pas eu beaucoup d'amélioration à cet égard au cours des dernières années.
Cela laisse à peu près D comme le seul qui a une chance. C'est probablement le plus similaire au C ++ (de ceux-ci), mais aussi le moins susceptible (IMO) de résoudre ce que vous semblez être un problème.
Cela laisse une approche évidente: utilisez C ++, mais n'utilisez que les parties que vous voulez et évitez les parties que vous n'aimez pas.
la source
Désolé, mon pote, alarme de contradiction. La manipulation sans chaîne nécessite
new
. C'est une nécessité fondamentale. Vous ne pouvez pas vous enstd::string
passernew
. Et de plus,new
/delete
est exactement équivalent àmalloc
/free
mais plus sûr , car il garantit une construction et une destruction correctes des objets de tas (totalement nécessaire!) Et utilise une gestion des exceptions au lieu d'unNULL
retour, et est donc supérieur de toutes les manières imaginables. En C ++ 11, il est très possible d'écrire votre proprenew
fonction -style, car une transmission parfaite vous permet de traiter avec n'importe quel constructeur de n'importe quel type. Si vous êtes timidenew
, alors je suggère que vous ne savez tout simplement pas vraiment à quoi vous avez affaire.Oh, oui, et les pointeurs intelligents font en sorte que vous n'ayez jamais, jamais, à vous occuper de tout cela vous-même.
De plus, en C ++, il n'y a pas de suraccentuation. Vous n'êtes pas obligé d'utiliser un objet dont vous ne voulez pas. Vous pouvez programmer fonctionnellement avec des lambdas et ainsi à tout moment. Personne ne vous oblige à utiliser l'héritage et les fonctions virtuelles - en fait, de nombreux bons programmes C ++ présentent rarement l'héritage. Les modèles sont la technique d'abstraction la plus puissante et la plus utile. Ce n'est pas Java.
la source
f(g(x))
semble fonctionner très bien pour moi. Et je crois aussi que le curry peut être fait comme une bibliothèque de manière générique en C ++ 11.std::bind
prend en charge de telles choses.C est presque un sous-ensemble de C ++, vous pouvez donc simplement utiliser les parties de C ++ que vous aimez et ignorer le reste. Il est même possible d'écrire un C valide qui est également un C ++ valide.
Vous n'écrirez pas du C ++ idiomatique, mais c'est à peu près aussi "intermédiaire" que possible.
Alternativement, vous pouvez consulter d'autres langages qui tentent d'étendre C vers quelque chose de plus puissant, notamment D et Objective-C.
Et enfin, selon la nature du projet, vous pouvez opter pour une approche polyglotte: divisez votre projet en modules, et choisissez la langue la plus adaptée à chaque partie. L'inconvénient est que vous devez faire travailler les langues ensemble, ce qui peut être trop de travail pour en valoir la peine.
la source
Juste pour offrir une réponse sauvage et prête à l'emploi: si la langue que vous voulez n'existe pas, pourquoi ne pas en faire une vous-même? Il existe une variété d'outils de développement de langage puissants, dans les anciennes versions de (F) Lex et Yacc / Bison. Puisque vous connaissez déjà C, vous avez juste besoin de votre "compilateur" pour sortir le code C, pour lequel vous utilisez ensuite votre chaîne d'outils existante.
Cela peut être à la fois plus simple et plus puissant que vous ne le pensez. Commencez avec un analyseur / lexeur pour C, puis ajoutez les fonctionnalités supplémentaires que vous jugez importantes. Si les tables de saut sont ennuyeuses pour écrire à la main, trouvez une construction pour exprimer l'abstrait et laissez votre interprète les écrire pour vous. Il s'agit essentiellement d'un niveau supérieur de métaprogrammation préprocesseur, utilisant des outils externes pour effectuer la métaprogrammation. Vous saurez toujours exactement à quoi va ressembler l'assemblage final puisque vous connaissez le C, et vous savez dans quel C vos extensions de langage se développeront.
De toute évidence, il existe certaines limites à l'efficacité de cette opération sans beaucoup de travail supplémentaire. L'ajout d'un système de type statique complet peut être un peu plus complexe que vous ne le souhaitez, mais c'est une option que vous pouvez explorer si vous trouvez que vous en avez le goût. Vos extensions DSL sont aussi puissantes et complexes que vous avez le temps et l'énergie pour les créer, et qui sait, peut-être qu'un jour votre langage d'extension deviendra "le prochain C ++".
la source
Vous n'avez pas dit quelles fonctionnalités C ++ vous ennuyaient. de toute façon, vous pouvez essayer Objective-C. Il met l'accent sur l'objet orienté au lieu de la bibliothèque standard sur C ++.
la source
Le monde embarqué a spécifié Embedded C ++ , qui peut être ce que vous recherchez. Ils ont supprimé des choses comme l'héritage multiple et autres. Pour autant que je sache, il est à peu près éteint cependant.
la source
Vous pourriez trouver cette comparaison côte à côte approfondie de C ++, Objective-C, Java et C # utile. Personnellement, je pense que C # est beaucoup plus propre que C ++. J'ai porté plusieurs fonctions C (numériques / calculs) en C # avant sans trop de changements étant nécessaires en raison de la similitude de la syntaxe et des types de données numériques.
la source