Quelles sont les différences entre C, C# et C++ en termes d'applications du monde réel
Que j'ai posté plus tôt ici j'ai décidé de tenter ma chance à l'un de ces, mais compte tenu de mes intérêts en tant que développeur web, j'aimerais savoir la différence entre eux dans leurs applications du monde réel.
Modifier Note:
Alors que je suis un développeur web, s'il vous plaît ne vous laissez pas limiter votre réponse. J'ai 30 ans...j'ai des années d'évolution de carrière devant moi.
- Pouvez-vous préciser si vous êtes intéressé par une comparaison à partir d'une web-application de la perspective?
- Voulez-vous demeurer un développeur web, ou vous cherchez à faire quelque chose de différent? par exemple, les applications de l'iPhone langage de programmation est en grande partie basée sur l'Objective-C
Vous devez vous connecter pour publier un commentaire.
C et C++ vous donner un bas niveau d'abstraction, avec un accroissement de la complexité, offre une largeur de l'accès à la sous-tendent les fonctionnalités de la machine qui ne sont pas nécessairement exposés à d'autres langues. Par rapport à C, C++ ajoute la commodité d'un langage orienté objet(réduction des temps de développement) qui peut, potentiellement, ajouter un supplément de coût. En termes d'applications du monde réel, je vois ces langues appliquées dans les domaines suivants:
C
C,C++
C# fournit une gestion de la mémoire modèle qui ajoute un niveau d'abstraction plus élevé encore. Ce niveau d'abstraction ajoute la commodité et améliore les temps de développement, mais complique l'accès à plus faible niveau de l'Api et rend spécialisé exigences de performance problématique.
Il est certainement possible de mettre en œuvre de très hautes performances du logiciel dans un environnement de mémoire gérée, mais la prise de conscience des conséquences est essentielle.
La syntaxe de C# est certainement moins exigeant (et erreurs) que les C/C++ et a, pour les initiés, programmeur, une moindre courbe d'apprentissage.
C#
Johannes Rössel fait le point valide que l'utilisation de C# Pointeurs, Dangereux et non les mots clés de percer la couche d'abstraction sur laquelle C# est construit. Je tiens à souligner que le type de programmation est l'exception à la plupart des C# scénarios de développement et non pas une partie fondamentale de la langue (comme c'est le cas avec le C/C++).
Garder à l'esprit que je parle ASFAC++B. 🙂 J'ai mis le plus important facteur de différenciation en premier.
La Collecte Des Ordures
Garbage Collection (GC) est le facteur le plus important dans la différenciation entre ces langues.
Tandis que le C et le C++ peut être utilisé avec le GC, il est boulonné sur le coup et ne peut pas être mis en oeuvre comme bien (le plus connu est ici) - il doit être "conservateur", ce qui signifie qu'il ne peut pas rassembler tous la mémoire inutilisée.
C# est conçu à partir du sol en place pour travailler sur une table plate-forme, avec des bibliothèques standard a également été conçu de cette façon. Il fait absolument différence fondamentale de la productivité du développeur qui doit être connu pour être cru.
Il y a une croyance répandue parmi les C/C++ utilisateurs GC assimile à la "mauvaise performance". Mais c'est out-of-date folklore (même les Boehm collecteur sur le C/C++ effectue beaucoup mieux que la plupart des personnes s'attendent à un). Le typique crainte est de la "longue pause" où le programme s'arrête si le GC peut faire un peu de travail. Mais en réalité, ces longues pauses se produisent avec les non-GC programmes, parce qu'ils s'exécutent sur un système de mémoire virtuelle, ce qui a parfois des interruptions de déplacer les données entre la mémoire physique et le disque.
Il y a aussi la croyance répandue que la GC peut être remplacé par shared_ptr, mais il ne peut pas; l'ironie est que dans un programme multi-threadé,
shared_ptr
est plus lent que d'une table de base de système.Il y a des environnements qui sont si jolies que GC n'est pas pratique, mais ceux-ci sont de plus en plus rares. Les téléphones portables ont généralement GC. GC du CLR que C# s'étend généralement sur semble être de l'état-of-the-art.
Depuis l'adoption de C# il y a 18 mois je suis passé par plusieurs phases de pure optimisation des performances avec un profiler, et la GC est si efficace qu'il est pratiquement invisible pendant le fonctionnement du programme.
GC n'est pas une panacée, il ne résout pas tous les problèmes de programmation, il n'est vraiment nettoie l'allocation de mémoire, si vous êtes l'allocation de très gros blocs de mémoire, alors vous aurez toujours besoin de prendre un peu de soin, et il est toujours possible d'avoir ce qui équivaut à une fuite de mémoire dans un complexe suffisamment programme - et pourtant, l'effet de la GC sur la productivité en fait une assez bonne approximation de la panacée!
Comportement Indéfini
C++ est fondée sur la notion de comportement indéfini. C'est le langage de spécification définit le résultat de certaines étroitement défini les usages des fonctionnalités du langage, et décrit l'ensemble des autres usages comme causant comportement indéfini, qui signifie en principe que l'opération pourrait avoir des résultats à tous (dans la pratique, cela signifie difficiles à diagnostiquer les bugs impliquant apparemment non-déterministe de la corruption de données).
Presque tout sur le C++ touche à un comportement indéterminé. Même très agréable à paraître fonctionnalités comme les expressions lambda peut facilement être utilisé comme moyen pratique d'endommager la pile (la capture d'un local par référence, permettent le lambda instance de survivre à l'locale).
C# est fondée sur le principe que toutes les opérations doivent avoir défini les comportements. Le pire qui puisse arriver est une exception est levée. Cela change complètement l'expérience de construction de logiciels.
(Il est dangereux de mode, qui a des pointeurs et, par conséquent, un comportement indéterminé, mais c'est fortement déconseillé pour une utilisation générale, considérez cela comme analogue à embarqués langage d'assemblage.)
Complexité
En termes de complexité, C++ doit être distingué, surtout si l'on considère le très-bientôt-à-être normalisée nouvelle version. C++ ne fait absolument tout ce qu'il peut faire lui-même efficace, à court d'assumer la GC, et comme un résultat, il dispose d'une incroyable courbe d'apprentissage. La langue concepteurs excuse beaucoup de cela en disant que "Ces fonctionnalités sont uniquement pour les auteurs de bibliothèques, pas les utilisateurs ordinaires" - mais pour être vraiment efficace dans n'importe quelle langue, vous avez besoin pour construire votre code réutilisable bibliothèques. Donc vous ne pouvez pas échapper.
Sur le côté positif, C++ est si complexe, c'est comme une aire de jeux pour les geeks! Je peux vous assurer que vous aurez beaucoup de plaisir à apprendre comment il s'adapte à tous ensemble. Mais je ne peux pas sérieusement recommandé comme base pour une nouvelle œuvre (ah, les années perdues...) sur la majorité des plates-formes.
C maintient la langue simple (simple dans le sens de "le compilateur est facile à écrire"), mais cela rend les techniques de codage des plus obscures.
Noter que pas toutes les nouvelles fonctionnalités de la langue que l'on sache qui ajoute à la complexité. Certaines fonctionnalités de langage sont décrits comme "sucre syntaxique", parce qu'ils sont d'abréviation que le compilateur s'étend pour vous. C'est un bon moyen de penser à une grande partie des améliorations à C# au cours des dernières années. La langue standard, même spécifie certaines caractéristiques en donnant la traduction à la main, par exemple
using
déclaration s'étend danstry
/finally
.À un moment donné, il a été possible de penser à des modèles C++ de la même manière. Mais depuis, ils ont devenus tellement puissants qu'ils sont maintenant à la base de toute une dimension distincte de la langue, avec ses propres fervent utilisateur des communautés et des expressions idiomatiques.
Bibliothèques
La chose la plus étrange à propos de C et de C++, c'est qu'ils n'ont pas un standard interchangeables formulaire de pré-compilés de la bibliothèque. L'intégration de quelqu'un d'autre code dans votre projet est toujours un peu délicat, avec d'obscurs de prendre des décisions sur la façon dont vous allez être lier à elle.
Aussi, de la bibliothèque standard est très basic, C++ dispose d'un ensemble complet de structures de données et un moyen de représenter des chaînes de caractères (
std::string
), mais c'est encore minime. Est-il un standard moyen de trouver une liste de fichiers dans un répertoire? Étonnamment, non! Est-il de la bibliothèque standard support de l'analyse ou de la génération de XML? Pas de. Ce sujet de l'accès aux bases de données? Être sérieux! L'écriture d'un site web back-end? Êtes-vous fou? etc.De sorte que vous devez aller à la chasse de plus en plus lointains. Pour XML, essayez Xerces. Mais faut-il utiliser
std::string
pour représenter des chaînes? Bien sûr que non!Et de faire toutes ces bibliothèques tierces ont leurs propres bizarre de douane pour le nommage des classes et des fonctions? Vous betcha!
La situation en C# ne pouvait pas être plus différents; les fondamentaux étaient en place dès le début, donc tout inter-fonctionne magnifiquement (et parce que les principes de base sont fournis par le CLR, il est multi-support de la langue).
Ce n'est pas tous parfaits; les génériques doivent avoir été mis en place dès le début mais n'est-ce pas, qui laisse une cicatrice visible sur les plus anciens des bibliothèques; mais il est généralement simple à résoudre à l'extérieur. Aussi un certain nombre de bibliothèques populaires sont transférés à partir de Java, qui n'est pas aussi bon fit comme il apparaît à première vue.
Fermetures (Anonyme avec les Méthodes Locales de la Variable de Capture)
Java et C sont pratiquement les derniers à intégrer les langues de l'absence des dispositifs de fermeture et des bibliothèques peut être conçu et utilisé de façon beaucoup plus parfaitement avec que sans (c'est une des raisons pour lesquelles porté bibliothèques Java semblent parfois maladroit, C# l'utilisateur).
Le point amusant sur le C++, c'est que sa bibliothèque standard a été conçu comme si les fermetures étaient disponibles que dans la langue (les types de conteneurs,
<algorithm>
,<functional>
). Dix ans ont passé, et maintenant ils sont enfin ajoutés! Ils auront un impact énorme (bien que, comme indiqué ci-dessus, ils fuient underfined comportement).C# et JavaScript sont les langues les plus répandues dans laquelle les fermetures sont "idiomatique établie". (La différence majeure entre ces langages que le C# est statiquement typé alors que JavaScript est dynamiquement typés).
Plate-Forme De Soutien
J'ai mis ce dernier seulement parce qu'il ne semble pas différencier ces langues, comme beaucoup que vous pourriez le penser. Toutes ces langues peut fonctionner sur plusieurs Systèmes d'exploitation et architectures de machines. C est le plus largement pris en charge, puis C++, et enfin C# (bien que C# peut être utilisé sur la plupart des plates-formes grâce à une implémentation open source appelé Mono).
Mon expérience de portage de programmes C++ entre Windows et les différentes saveurs de Unix a été désagréable. Je n'ai jamais essayé le portage de quelque chose de très complexe en C# avec Mono, donc je ne peux pas commenter sur ce point.
C est le bare-bones, simple, propre langage qui vous fait vous faire tout vous-même. Il ne retient pas votre main, il ne vous empêche pas de se tirer une balle dans le pied. Mais il a tout ce dont vous avez besoin pour faire ce que vous voulez.
C++ c'est du C avec des classes ajoutée, et puis tout un tas d'autres choses, et puis un peu plus de choses. Il ne retient pas votre main, mais il va vous permettre de tenir votre propre main, avec complément sur GC, ou RAII et smart-pointeurs. Si il y a quelque chose que vous voulez accomplir, les chances sont, il y a un abus le système de template pour vous donner un moyen relativement facile de syntaxe pour elle. (moreso avec C++0x). Cette complexité vous donne également le pouvoir de accidentellement créer une dizaine de cas de vous-même et tirer dans le pied.
C# de Microsoft, qui est le coup de couteau à l'amélioration sur le C++ et Java. Des tonnes de caractéristiques syntaxiques, mais aucun où près de la complexité de C++. Il s'exécute dans un environnement géré, de sorte que la gestion de la mémoire est faite pour vous. Il ne vous laissez "sale" et d'utiliser le code unsafe si vous en avez besoin, mais ce n'est pas la valeur par défaut, et que vous avez à faire un peu de travail pour tirer vous-même.
Mon avis est C# et ASP.NET serait le meilleur des trois pour le développement web biaisée.
Je doute que quelqu'un écrit de nouvelles applications web en C ou C++ plus. Il a été fait il y a 10 ans, et il y a probablement beaucoup de code ancien, encore en usage, mais ils ne sont pas particulièrement bien adapté, il ne semble pas être autant (en cours) le support de l'outil, et ils ont probablement une petite communauté active qui n'développement web (sauf peut-être pour un serveur web de développement). J'ai écrit de nombreux site web en C++ objets COM retour dans la journée, mais C# est bien plus productif qu'il n'y a pas de raison valable de code C ou C++ (dans ce contexte), sauf si vous en avez besoin.
Je dois encore écrire en C++, si nécessaire, mais c'est généralement pour un petit problème de domaine. par exemple la communication de C# via P/Invoke vieux style C dll - à faire certaines choses qui sont carrément maladroit en C# ont été un jeu d'enfant de créer un C++ objet COM comme un pont.
La bonne chose avec le C#, c'est que vous pouvez aussi transférer facilement dans l'écriture de Windows et la Console d'applications et de rester en C#. Avec Mono vous n'êtes pas limité à Windows (bien que vous pouvez être limité à des bibliothèques que vous utilisez).
De toute façon c'est tout ce à partir d'un web-point de vue biaisé. Si vous avez demandé à propos des périphériques embarqués, je dirais que C ou C++. Vous pourriez vous dire qu'aucune de ces sont adaptés pour le développement web, mais C#/ASP.NET est assez lisse, il fonctionne bien, il y a des tas de ressources en ligne, une énorme communauté, et gratuit outils de dev.
À partir d'une perspective sur le monde réel, la cueillette seulement un de C#, C++ et C comme demandé, en règle générale, vous êtes mieux de rester avec C#.
À partir de vos autres messages, je suppose que vous voulez apprendre une nouvelle langue pour obtenir de nouvelles compétences. Mon avis est que la langue n'est pas vraiment important, ce qui est important c'est la qualité de sa communauté (conseils, mais aussi code existant, vous pouvez lire et d'apprendre) et les librairies/frameworks. À cet égard, je pense que le "C de la famille" n'est pas le meilleur choix pour vous: le site web des bibliothèques et frameworks sont que quelques-uns, pas de portable et pas de grand, et le style de codage de code que vous pouvez étudier varie beaucoup et peut vous confondre beaucoup. (Bien que C est ma langue préférée)
Je vous conseille de simplement apprendre le C, et d'essayer de vraiment comprendre la notion de pointeurs, puis passer à d'autres langages plus adaptés pour le web (python ou javascript vient à l'esprit - ou même java). Aussi, dans la famille C, Objective-C est le meilleur mélange de puissance et de simplicité, à mon avis, mais c'est un acteur de niche.
C - un ancien langage de programmation qui est décrit comme un Mains-sur. En tant que programmeur, vous devez indiquer au programme à tout faire. Aussi cette langue vous permettra de faire presque n'importe quoi. Il ne supporte pas l'objet orriented code. Donc pas de cours.
C++ - une extension de la langue en soi de C. Dans le code C ++ signifie l'échelon 1. Ainsi, C++ est mieux que C. Il permet hautement contrôlé objet orriented code. Une fois de plus un très mains sur la langue qui va dans les détails.
C# - intégralité de l'objet orriented code ressemblant au style de code C/C++. C'est vraiment plus proche de JAVA. C# est la version la plus récente du style C langues et est très bon pour le développement d'applications web.
Pour les matières premières, la vitesse, l'utilisation C. Pour le pouvoir, l'utilisation de C++. Pour .net la compatibilité, l'utilisation de C#. Ils sont tous assez complexe comme langues d'aller; C grâce à des décennies d'accrétion progressive, C++ grâce à des années de plus rapide amélioration, et C# grâce à la puissance de Microsoft.
C est le langage de base qui ressemble le plus à et se traduit directement par un PROCESSEUR du code machine. Les processeurs de suivre les instructions que déplacer, ajouter, combiner de manière logique, de comparer, de sauter, push et pop. C est exactement ce que l'aide beaucoup plus facile de syntaxe. Si vous étudiez le démontage, vous pouvez apprendre à écrire du code C qui est tout aussi rapide et compact de l'assemblée. C'est ma langue préférée sur 8 bits micro-contrôleurs avec une mémoire limitée. Si vous écrivez un gros PC programme en C, vous aurez des ennuis à cause de sa faible organisation. C'est là que la programmation orientée objet devient puissant. La capacité de C++ et C# classes contiennent des données et des fonctions applique organisation qui permet à son tour le plus complexe de l'opérabilité plus de C. C++ a été essentiel pour le traitement rapide dans le passé, lorsque le Cpu n'avaient qu'un seul cœur. Je commence à apprendre le C# maintenant. Sa classe uniquement la structure semble appliquer un degré plus élevé d'organisation qu'en C++ qui devrait, à terme, conduire à une accélération du développement et de promouvoir le partage du code. C# n'est pas interprété comme VB. Il est partiellement compilée au temps de développement et ensuite traduites au moment de l'exécution de devenir plus une plateforme conviviale.