Souhaitez-vous utiliser C, aujourd'hui, pour un projet logiciel? [fermé]


18

Si oui, où et pourquoi l'utiliseriez-vous?

Si non, veuillez expliquer pourquoi C n'est pas acceptable pour vous.


10
Bien sûr, il existe des applications pour lesquelles C est le bon choix et évident, mais personnellement, si je ne malloc jamais plus un bloc de mémoire, je mourrai heureux.
Adam Crossland

Oui - Chevaux pour les cours.
Martijn Verburg

Qu'est-ce que ça veut dire?
Luca Matteis

C'est un vieux dicton pour ceux qui suivent les courses de chevaux. Fondamentalement, cela signifie que tout cheval peut gagner sa journée, tant que le parcours (sec, boueux, long, court, peu importe) lui convient. Il en va de même pour les langages de programmation - cela dépend toujours du contexte et du domaine problématique.
Martijn Verburg,

2
Non, mais seulement parce qu'aujourd'hui je ne travaille sur aucun projet pour lequel C serait un bon choix de langue. Demandez-moi encore demain.
James McNellis

Réponses:


38

C est un excellent langage pour la programmation système

J'utiliserais C si j'implémentais des pilotes de matériel. Et j'utiliserais C si j'implémente mon propre noyau de système d'exploitation ou ma propre machine virtuelle.

C'est un très bon langage pour faire des choses de bas niveau si vous devez gérer du matériel ou des API de bas niveau pour les API Windows, Linux, Mac OS X, Solaris et ainsi de suite ... Les systèmes embarqués ont généralement un bon support pour C avec un compilateur + kit de développement.


4
Pouvez-vous indiquer où "Mac OS est Linux"? Je pensais que Mac OS était Darwin: en.wikipedia.org/wiki/Darwin_%28operating_system%29
LennyProgrammers

1
@Stephen Furlani: LOL - oui, c'est une sorte d'euphémisme. :-) Il existe de nombreux Unix morts comme Xenix, DYNIX et A / UX, et les versions actuelles que la plupart d'entre nous ne voient pas comme HP-UX. L'arbre généalogique est aussi compliqué et emmêlé que celui des familles royales européennes.
Bob Murphy

4
C est un langage horrible pour la programmation système. Nous savons que depuis plus de 20 ans, depuis le Morris Worm, et quiconque l'utilise toujours pour un projet avec des exigences de sécurité, en particulier des systèmes d'exploitation ou des applications réseau, devrait faire face à des accusations de négligence criminelle.
Mason Wheeler

2
@Mason Wheeler: Que devrions-nous utiliser à la place?
Steve S

1
@Mason Wheeler: Hmm ... J'ai renvoyé Pascal dans le passé, mais il est peut-être temps de regarder de plus près. Avez-vous d'autres suggestions?
Steve S

17

Oui bien sûr. J'utiliserais C pour écrire des éléments critiques du système ou des éléments de communication de bas niveau. Par exemple, j'utiliserais C pour écrire des NIF dans le projet Erlang simplement parce que c'est le bon outil (tm) pour ce genre de travail. Ou j'utiliserais C pour écrire des parties similaires (XS) dans le projet Perl.


16

J'utilise C professionnellement, presque tous les jours. En fait, C est la langue de plus haut niveau dans laquelle je programme régulièrement.

Lorsque j'utilise C: j'écris du code de bibliothèque de bas niveau qui doit être aussi efficace que possible. Mon code de colle est écrit en C, les boucles de calcul internes sont écrites en assembleur.

Pourquoi j'utilise C: Il est beaucoup plus simple de gérer des structures d'arguments complexes et des conditions d'erreur que dans l'assemblage, et les frais généraux de performance pour ce type de vérification de condition avant de commencer le calcul réel sont souvent négligeables. Parce que C est un langage simple et bien spécifié, j'ai du mal à travailler avec l'équipe de compilation au travail pour améliorer la génération de code chaque fois que je vois du code compilé avec des risques de performances inacceptables.

La portabilité est une autre grande vertu de C. Mon code de colle est partagé entre plusieurs implémentations spécifiques au matériel des bibliothèques sur lesquelles je travaille, ce qui simplifie vraiment la prise en charge de nouvelles plates-formes. La plupart des plates-formes n'ont pas de machine virtuelle ou d'interprète pour la saveur linguistique du mois. Certaines plateformes n'ont pas un bon compilateur C ++. Il y a très peu de plates-formes qui ne disposent pas d'un compilateur C utilisable (et, comme j'ai une bonne relation de travail avec notre équipe de compilateurs, je n'ai généralement pas de mal à obtenir le support dont j'ai besoin).


6
On dirait que vous avez un travail vraiment amusant!
Paul Nathan

C'est mon travail de rêve.
rsmahanti

5

Oui, j'utiliserais C dans un système embarqué fortement limité en ressources. Je peux utiliser C ++ à la place, car il facilite la promotion d'interfaces solides entre les composants logiciels, mais uniquement si tous les ingénieurs travaillant sur le projet comprennent que C ++ est facile à utiliser à mauvais escient, ce qui entraîne un gonflement de la taille du code (les fonctions virtuelles et les modèles sont des exemples de choses à éviter. ).

J'ai également vu un programmeur C ++ essayer de créer un objet 10K sur une pile 1K, ce n'est pas une bonne idée.


2
en fait, les virtualfonctions sont correctes car elles suivent le principe «vous ne payez pas pour ce que vous n'utilisez pas», mais dans un environnement contraint en mémoire, vous pouvez désactiver les exceptions et RTTI.
Matthieu M.

J'ai l'impression de toujours créer des objets singleton en C ++ pour fournir des interfaces périphériques. Je pense que les gens choisissent C ++ plutôt que C dans les systèmes embarqués car ils pensent que C ++ est "meilleur".
Erik

5

Je travaille principalement avec l'hyperviseur Xen, les bibliothèques assorties qu'il propose et le noyau Linux. À l'occasion, je dois écrire un pilote de périphérique (ou en réécrire un pour que les machines virtuelles nxx puissent partager un seul périphérique tel qu'un HRNG). C est ma langue principale et j'en suis très content.

Vais-je essayer d'écrire un tableur en l'utilisant? En aucune façon. Chaque outil a ses applications, et je suis heureux d'avoir de nombreux outils.

J'adore C, mais je n'essaie pas de marteler les vis avec un marteau.

Si C est un choix judicieux pour un nouveau projet, bien sûr. Sinon, je vais utiliser autre chose.


4

Je le ferais pour certains projets. Je le ferais certainement si je devais mettre en œuvre un système embarqué, par exemple pour le contrôleur d'un avion autonome. Pourrait même aller à un niveau inférieur sur certaines pièces avec assemblage.

Si cela correspond au projet, je n'ai aucun problème avec cela.

Si vous souhaitez développer une application Web, hmm, probablement pas (ou j'aurais besoin d'une justification très solide et étayée par des faits).

Je l'utiliserais également à partir d'autres projets principalement développés avec d'autres langages lorsqu'un goulot d'étranglement a été clairement identifié et qu'une optimisation peut être implémentée en utilisant du code natif. Par exemple, une solution Java qui doit effectuer des calculs intensifs pour certains rendus avancés (par exemple, un moteur de rendu ou quelque chose). Vous pouvez utiliser par défaut une implémentation Java si ce n'est pas une plate-forme prise en charge, mais fournir une implémentation compilée en natif à partir de C pour certaines plates-formes prises en charge, et obtenir une belle amélioration des performances.


Vous voulez une raison de l'utiliser pour une application web? Memcached est écrit en C, et il fait partie intégrante de nombreuses applications Web. En outre, un de mes collègues a écrit un morceau de code concernant un site de réseautage social en C - une fois qu'il est algorithmiquement complexe, avec des ensembles de données bordant la taille de la RAM économiquement disponible, et gérant les requêtes qui s'exécutent en moyenne 23 fois par rendu de page. Nous avons économisé 4 mois de salaire de programmeurs sur les serveurs, avec une application C de 4 jours.
qdot

@qdot: C'est une raison valable. Il existe également une raison pour laquelle il existe de bons cadres pour les développeurs Web C et C ++. Ce ne serait tout simplement pas mon premier choix si je devais développer une application Web générale ou un site Web. Dans le cas d'un framework comme memcached, cela a évidemment un sens parfait. De même, avoir le serveur en C peut avoir du sens. D'où probablement pas. Memcached (et votre implémentation C spécifique d'une partie intensive en calcul d'une application Web) sont des utilisations parfaitement valides de C pour le développement Web. Mais vous avez besoin d'un bon programmeur C pour cela. Ce n'est pas quelqu'un qui viendrait le chercher en chemin ou qui s'attendrait à des problèmes.
haylem

Et si d'autres personnes ont d'autres raisons valables comme celles-ci, veuillez les poster ici! C'est utile pour les lecteurs.
haylem

Si vous utilisez C, vous apprenez à attendre d'excellentes performances, une bonne expérience d'apprentissage et des tonnes de problèmes inexpliqués au début. J'ai juste essayé d'encourager les gens à utiliser C, car cela devient rapidement crucial lorsque vous passez du statut de développeur PHP / Ruby / Python "au million" et commencez à vous gratter la tête contre les gros problèmes de calcul.
qdot

@qdot: en effet. Dommage que beaucoup de gens ne connaissent plus vraiment C, vraiment.
haylem

4

Chaque langue a un créneau d'utilisation décent. Je me retrouve souvent à implémenter des choses dans des langages de niveau supérieur, puis à les réduire progressivement en C-land si j'ai besoin qu'elles soient plus performantes ou même simplement plus portables. Il existe des compilateurs C pour presque tout ce qui existe, et si vous écrivez dans une API qui est universellement disponible (comme POSIX), cela peut être très utile.

Ce que je dis souvent aux gens qui souhaitent apprendre la programmation aujourd'hui, c'est de m'assurer qu'à un moment donné, ils apprennent le C et se familiarisent avec. Vous pourriez vous retrouver dans des circonstances où vous en avez besoin. À plusieurs reprises, j'ai dû compiler un petit programme de «redémarrage rapide» lié statiquement et utiliser scp pour le placer sur un disque RAM sur un serveur où le sous-système de disque a complètement disparu. (Serveurs bon marché et bon marché, pas de redondance en ligne et seule la possibilité de charger un petit programme? C est la voie à suivre.)

De plus, apprendre à travailler en C sans se tirer une balle dans le pied peut contribuer considérablement à sa capacité à écrire efficacement dans d'autres langues et dans un autre environnement. C'est du moins mon expérience.

Bien que je ne l'utilise certainement pas pour tout, ni même pour la plupart des choses, il a sa place et il est à peu près universel: alors oui, je l'ai utilisé dans le passé et je l'utiliserai à l'avenir (même si je ne le fais pas savoir quand pour le moment).


4

Oui, je le fais tout le temps.

Si vous n'appelez aucune bibliothèque, le code généré à partir de C ne nécessite aucune prise en charge du système d'exploitation. Il vous donne également un contrôle précis sur le langage machine généré. Il est donc idéal pour écrire des pilotes ou d'autres codes qui vivent dans les espaces du noyau, et d'autres situations contraintes comme de nombreux types de systèmes embarqués fonctionnent. C'est également la langue principale des projets open source avec lesquels je travaille comme X Windows, GTK + et Clutter.

Alors que vous pouvez tout faire en C, vous pouvez en C ++, souvent les mécanismes de C ++ permettent d'écrire du code plus rapidement et plus facilement. J'adore la POO et la façon dont les classes C ++ encapsulent les fonctionnalités, et j'aime RAII. Une utilisation prudente de l'appel automatique du destructeur lorsqu'un objet sort du cadre élimine la plupart des fuites de mémoire et de ressources qui sont le fléau de la programmation C. Le STL est essentiellement une bibliothèque géante d'algorithmes et de structures de données hautement optimisés; si vous vouliez les utiliser de C, vous devriez les écrire vous-même ou les acheter quelque part.

Malheureusement, pour des raisons que je ne comprends pas, le système d'exécution sous Linux nécessite une bibliothèque d'objets partagés spéciale (équivalente à DLL sur Windows, dylib sur Mac) pour exécuter n'importe quel C ++, et il n'est pas trouvé lorsque vous exécutez un programme C. Je ne peux donc pas faire l'une de mes astuces Mac et Windows préférées, qui est d'écrire un objet partagé basé sur C ++ avec une API basée sur C et de l'appeler à partir d'un programme C.

Voici donc mon processus décisionnel:

  1. Suis-je en train de travailler dans une situation contrainte comme un pilote de périphérique? Utilisez C.
  2. Suis-je en train d'écrire une bibliothèque Linux que quelqu'un d'autre devra utiliser? Utilisez C.
  3. Suis-je en train de travailler dans du code déjà écrit en C? Utilisez C.
  4. Suis-je en train d'écrire une bibliothèque Mac ou Windows, ou une bibliothèque Linux uniquement que je vais utiliser? Écrivez les éléments internes en C ++, mais exposez uniquement une interface C pour éviter le fragile problème d'interface binaire.
  5. Utilisez C ++.

Une bonne chose est que, parce que C ++ peut compiler C, si vous avez vraiment besoin d'un contrôle précis sur le code généré pour une situation particulière, vous pouvez simplement écrire C pour cela, et C ++ pour le reste, et compiler le tout avec le compilateur C ++ .


Vous ne pouvez pas "tout compiler avec un compilateur C" à cause du problème de malloc avec C ++ - vous devez transtyper en C ++ mais pas en C. Bien sûr, tout va bien si vous transformez le code C qui est parfaitement légal mais ennuyeux .
alternative

1
@mathepic: Oui, C ++ est décidément plus strict que C sur beaucoup de choses, y compris l'attribution de pointeurs vides à des pointeurs typés. Cependant, je corrige des bugs dans quelques projets hérités, en partie en compilant des fichiers C avec C ++. Je trouve que les résultats de malloc sont un petit prix à payer pour que le compilateur C ++ découvre des bogues subtils en raison d'un code parfaitement légal en C.
Bob Murphy

3

Oui, mais cela dépend du projet. C est très bon pour certains projets de bas niveau ou fait partie de la plus grande solution.

Par exemple. Pour la logique bussines ok, mais pas pour l'interface utilisateur.


2

s'il doit être à la fois

  • vite et
  • portable

alors j'utilise C. Peut-être C ++.


Rapide et portable, cela pourrait aussi être Java ou C #.
Jonas

11
@Jonas: non. Portable ne signifie pas seulement 'windows ou linux' ;-)
Steven A. Lowe

1
@Jonas: Rapide et portable, ce ne serait ni Java ni C #. C ++ est portable sur toutes les plates-formes et les périphériques intégrés comme le microcontrôleur, et C est même portable (en tant que fonctions étrangères) dans d'autres langages. Les deux sont plus rapides que les langages non fonctionnels et donc basés sur la pile mais toujours récupérés. Vous n'avez pas besoin des deux: une pile et un ramasse-miettes.
comonad

2
@Jonas: lisez-le; notez les mises en garde, et encore une fois, "portable" ne signifie pas uniquement Windows / Linux. La question vous demande quand vous utiliserez C; la réponse est: quand il doit courir vite partout . J'adore Java et C #, mais ce sont des sledgehammers, et les systèmes plus anciens / intégrés n'ont pas de temps d'exécution. Beaucoup d'entre eux n'ont même pas d'espace pour contenir un runtime!
Steven A. Lowe,

2
@Jonas: J'apprécie votre passion, mais les "nouvelles plateformes" ne sont pas le sujet. Permettez-moi de vous donner un exemple plus spécifique, pour voir si cela aide: les microprocesseurs qui fournissent un support de contrôle de tir pour les chars sur le champ de bataille ont des compilateurs C. Ils n'ont pas et n'auront jamais de machine virtuelle Java.
Steven A. Lowe

2

Oui, en fait je l'ai fait récemment!

J'aime la programmation en C. Je fais la plupart de ma programmation en python, mais il y a des moments où j'ai besoin de code rapide et j'apprécie vraiment l'élégance qui vient de la simplicité du langage.

Le projet sur lequel je travaille maintenant est une base de données qui, comme vous pouvez l'imaginer, est critique en termes de performances. Pour le moment, j'utilise C et du python, mais ce sera finalement principalement, sinon entièrement C.


2

Oui!

C est un langage de bas niveau et il y a des situations où C est presque la seule option comme j'utilise C pour programmer des micro-contrôleurs, ou assembler du code pour interagir avec des appareils à partir de ports classiques comme Parallel, Serial ou même Modem!


2

Oui. J'ai passé la majeure partie de ma carrière à programmer du C ++, mais maintenant j'écris la plupart de mon code en Ruby et si j'ai besoin de performances ou d'un accès à des trucs de bas niveau, j'écris une extension C. C'est le futur homme!


Certaines réponses traitaient de la portabilité et de la vitesse comme des avantages du code C, mais la liaison est une autre caractéristique importante. Il est relativement facile de lier du code "étranger" écrit en C en raison de sa discipline de pile "classique" simple. De nombreux compilateurs C permettront à "l'assembleur en ligne" de passer très bas dans une architecture (sacrifiant évidemment la portabilité dans l'acte).
hardmath

1

J'utiliserais C si j'écrivais un système d'exploitation. Étant donné que cela ne se produira pas dans les vingt prochaines années, à moins que je frappe au loto et que je n'ai rien d'autre à faire que de créer ma propre distribution Linux, je vais probablement m'en tenir à C #, Java, Python, etc., etc. 'ai pas utilisé C depuis très longtemps mais j'ai toujours aimé l'utiliser; Je pense cependant que ces jours-ci, ma tête est tellement enroulée autour de OO si je dois y revenir, il me faudrait un peu pour recommencer.


0

Le C ++ est portable sur toutes les plates-formes et les appareils embarqués comme les microcontrôleurs. (C ++ peut être compilé en C, donc des microcontrôleurs.)

C est même portable (en tant que fonctions étrangères) dans d'autres langues. Par conséquent, si je programme des bibliothèques de bas niveau, je veux plus de compatibilité que C ++.

Haskell est portable sur toutes les plateformes (ARM arrive bientôt) mais PAS sur les appareils embarqués comme les microcontrôleurs. Sa vitesse est comparable à C et C ++; mais parce qu'il est fonctionnel, il utilise un garbage collector au lieu d'une runtime-stack, donc il peut être plus rapide et plus lent que C à différents moments (garbage collection) et dans différentes situations (continuations au lieu d'appels de sous-routine).


Je choisis le langage le plus abstrait possible, car la vitesse du programme ne diffère pas mais le temps de développement et le taux de bogues. C et C ++ diffèrent beaucoup, mais pas du point de vue de Haskell.

Je ne préfère pas d'autres langues, même si je connais bien une ou deux mains. … Sauf dans quelques cas, eh bien, bash .


0

Les systèmes embarqués n'ont souvent que quelques kilo-octets de RAM et peut-être quelques dizaines de kilo-octets de flash, avec une fréquence d'horloge du processeur de quelques MHz. C est la seule option qui a du sens dans un tel environnement de métal nu.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.