Existe-t-il un langage entre C et C ++?

18

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.

Robert Martin
la source
10
Vous dites que votre question est "purement factuelle", mais vous ne tenez pas compte du c ++ car il "semble" avoir trop de hoquet. Quels sont ces hoquets et sont-ils des raisons valables de réduire le c ++?
whatsisname
2
Quelle est «l'échelle des widgets et des doodads»? Si vous voulez de vraies réponses à une question "purement factuelle", vous devez éviter les métriques sans signification.
Caleb
2
Et les quelques choses que vous dites sur le C ++ trahissent de la désinformation. newest principalement un renforcement mallocqui peut également prendre soin d'initialiser la mémoire pour vous. Avec "placement new" et operator 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!
25
Use C+ Diclaimer: Désolé, je n'ai pas pu t resist. Itle 1er avril;)
knut
2
Cela ressemble énormément à l'hypothèse du continuum, et probablement avec la même réponse. ( en.wikipedia.org/wiki/Continuum_hypothesis )
John Smith

Réponses:

29

Ce sont peut-être les droïdes que vous recherchez ...

Aller - http://golang.org/

RÉ - http://dlang.org/

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

Jacks_Gulch
la source
5
@dtech: D a ce GC inutile / "Tout hérite de l'objet" / Les valeurs doivent être nulles. J'ai déjà C # pour ça et il a en fait des outils décents. Allez, j'avoue que ma mémoire de la raison pour laquelle je l'ai écarté est quelque peu floue, mais si je me souviens bien, elle a coupé plusieurs fonctionnalités très utiles.
DeadMG
4
-1 pour "ce que C ++ aurait dû être". Le C ++ est ce qu'il est et si vous ne pouvez pas le gérer, c'est en grande partie votre problème. Vous pouvez y faire face en utilisant un langage qui vous convient mieux, mais cela ne signifie pas que C ++ aurait dû être comme ce langage.
back2dos
7
@DeadMG Sur D, vous avez fait 2 déclarations significatives: GC est obligatoire et tout doit être un objet. Les deux ont tort. Cela m'amène à penser que votre conclusion est plus basée sur l'ignorance que sur la connaissance réelle. Je dois être d'accord avec CodexArcanum.
deadalnix
5
@deadalnix: Techniquement, vous pouvez choisir de ne pas utiliser le GC. Mais comme vous n'avez aucun moyen de savoir ou de contrôler quelles fonctions de bibliothèque ou quelles fonctionnalités de langage utilisent le GC, il n'y a en réalité aucun moyen de produire un programme qui ne l'utilise pas. Et vous ne pouvez pas créer une classe qui n'hérite pas d'Object. Et leurs structvaleurs 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.
DeadMG
5
@DeadMG: Faire des structures sans héritage est une fonctionnalité , pas un "gimping". C'est quelque chose qu'ils ont bien compris, quelque chose que presque tous les langages OO de l'histoire non nommés "C ++" ont raison (y compris Simula, le langage OO original) et que C ++ s'est incroyablement trompé. Les types d'héritage et de valeur ne se mélangent pas. Il brise l'identité de l'objet, il brise la substitution Liskov, il brise tout le paradigme OO.
Mason Wheeler
19

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.

Jerry Coffin
la source
13
+1 pour "utilisez C ++ et évitez les parties que vous n'aimez pas". Et je suggérerais à l'OP d'en savoir plus sur le C ++, les gens refusent souvent des choses simplement parce qu'ils ne les connaissent pas assez bien.
Doc Brown
1
@DocBrown C'est peut-être parce qu'il n'est pas si facile de bien connaître le C ++.
Malcolm
3
@Malcolm: il est bien sûr difficile d'apprendre en profondeur le C ++ moderne. Mais d'un autre côté, il n'y a absolument aucune raison d'être «timide face au nouvel opérateur», cela me semble juste superstitieux.
Doc Brown
3
@Malcolm: Probablement parce que le concept est très simple . Ai-je besoin d'un littéral de chaîne UTF-32 ou d'un littéral de chaîne UTF-16? Eh bien, c'est une question assez facile à répondre, en supposant que vous connaissez les bases des encodages de chaînes wtf. Et cette multitude de fonctionnalités matérielles? Ils existent pour une raison . Par exemple, les génériques de Java. Ils sont pathétiques par rapport aux modèles. Bien sûr, il y a moins à apprendre, mais c'est simplement parce qu'ils ne sont tout simplement pas très utiles. C'est comme appeler quelque chose de plus complexe que Brainfuck difficile.
DeadMG
3
@ Malcolm: Ce n'est pas vrai du tout. La popularité est influencée par 99999 choses indépendamment du fait que la langue soit bonne / utile.
DeadMG
16

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.

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 en std::stringpasser new. Et de plus, new/ deleteest exactement équivalent à malloc/ freemais 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'un NULLretour, et est donc supérieur de toutes les manières imaginables. En C ++ 11, il est très possible d'écrire votre propre newfonction -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.

DeadMG
la source
1
Je suis d'accord. Il est préférable d'utiliser le C ++ comme vous le souhaitez que de rechercher une alternative (probablement inférieure)
dtech
1
Je ne pense pas que les lambdas suffisent pour programmer fonctionnellement. Je m'attendrais également à avoir un opérateur de composition de fonctions, le curry, etc. Voir aussi stackoverflow.com/questions/1981400/functional-programming-in-c . Pour moi, c'est comme faire de la POO en Do ...
Giorgio
@Giorgio: Les réponses à cette question disent simplement "C'est difficile!". Ils ne montrent aucune preuve que c'est en fait difficile . Pourquoi voudriez-vous un opérateur séparé pour la composition des fonctions? 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.
DeadMG
1
@DeadMG: Un opérateur de composition de fonctions est un concept de base assez bien établi en programmation fonctionnelle. Je m'attendrais à le trouver dans une langue prenant en charge FP. Je trouve très pratique (concis) de définir une fonction complexe comme la composition d'autres fonctions (par exemple comme vous le faites avec des tuyaux sous Unix) sans utiliser de variables: k = h. g . f
Giorgio
1
@Giorgio: std::bindprend en charge de telles choses.
DeadMG
5

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.

tdammers
la source
En effet, travailler dans des secteurs comme le développement de jeux sur console, où nous voulions vraiment "un langage entre C et C ++", c'est exactement ce que nous avons fait. Nous avons utilisé un sous-ensemble de fonctionnalités C ++, avec certaines choses hors limites, ou plus probablement hors limites dans les boucles critiques pour les performances.
Carson63000
3

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

CodexArcanum
la source
2

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

néant
la source
2
imho Objective-C est une maigre tentative d'introduire des classes en C et inférieures à bien des égards au C ++. De plus, il est très peu utilisé en dehors de Mac OS X / iOS.
dtech
1
@dtech: Intéressant, un ancien collègue à moi, qui n'est pas un fan de Mac (plutôt un gars Debian / Linux) était convaincu qu'Objective-C était une extension OO beaucoup plus propre du C que du C ++. Je n'ai cependant jamais essayé Objective-C, donc je n'ai pas d'opinion là-dessus.
Giorgio
1
@dtech: Ensuite, je vous suggère humblement de reconsidérer votre opinion;) Objective-C concerne l'orientation des objets, et il fait un bien meilleur travail que C ++, car il introduit le passage de messages. Bien que je convienne que le langage est inférieur au C ++ à bien des égards, il l'est tout autant à d'autres égards.
back2dos
@Giorgio Je suis d'accord avec votre collègue, même si Obj-C a aussi des limites (peut-être que certaines d'entre elles ont disparu avec Obj-C 2.0), par exemple, j'aimerais avoir une surcharge de "méthodes" (sélecteurs) - btw je voudrais fonction de surcharge à la Fortran en C ...
ShinTakezou
2

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.

mattnz
la source
0

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.

dodgy_coder
la source