L'apprentissage du C est-il essentiel pour l'informatique? [fermé]


15

Je suis un développeur front-end qui voit à peine un fichier avec .hou.c extension. Je connais la syntaxe C de base, je l'ai apprise dans Unreality mais je n'ai jamais été intéressée par une programmation de si bas niveau car elle était tout simplement trop configurée pour des choses simples.

Je suis très intéressé à apprendre tous les aspects de l'informatique, mais je veux croire que je n'ai pas vraiment à connaître un langage spécifique pour comprendre la plupart des concepts de l'informatique. Pourtant, lorsque je commence à lire des livres et des articles sur les concepts fondamentaux de l'informatique comme les structures de données et la conception d'algorithmes, il semble que je doive apprendre le C, car tous les exemples et même les leçons sont en C (et parfois en Java).

Ma question est la suivante: le C est-il un langage de programmation essentiel pour l'informatique ou nous venons d'avoir toutes nos ressources en CS écrites en C? Peut-on apprendre l'informatique sans apprendre le C?


4
Voici l'opinion de Joel Spolsky à ce sujet: joelonsoftware.com/articles/CollegeAdvice.html C'est discutable, mais je pense qu'il a ses points.
Doc Brown

2
Les puristes diraient que l'informatique ne concerne pas les ordinateurs, ce qui rend les langages de programmation inutiles.
Blrfl

1
Qu'entendez-vous par «informatique»? Ce que vous décrivez est principalement la partie génie logiciel de l'informatique, je pense. De plus, je ne vois pas comment toutes les ressources sont écrites en C.J'ai lu pas mal de livres sur les algorithmes / structures de données et aucun n'a utilisé C. Presque tous utilisaient une sorte de langage pseudocode, facilement compréhensible pour tout le monde (enfin, sauf TAOCP qui utilise l'assemblage ... mais c'est une autre histoire)
Bakuriu

Irréalité? Était-ce censé être une bizarrerie d'auto-correction de l'Université ou est-ce une école de magie noire? Je connais l'Université Unseen, cependant: [
Deer Hunter

Réponses:


31

Je vais aller à contre-courant ici et dire oui, vous devez apprendre C. Je suis en fait d'accord avec les points dans de nombreuses autres réponses, mais vous faites la déclaration très forte que

Je suis très intéressé à apprendre tous les aspects de l'informatique, mais je veux croire que je n'ai pas vraiment à connaître un langage spécifique pour comprendre la plupart des concepts de l'informatique.

(c'est moi qui souligne)

Eh bien, les systèmes d'exploitation et les piles de réseau sont deux aspects importants de l'informatique, et tous les systèmes d'exploitation et piles de réseau dominants sont écrits en grande partie en C. Si vous voulez les comprendre, vous devriez apprendre C. Oui, certaines écoles parviennent à enseigner leurs classes OS en Java, mais c'est comme lire Homer en anglais.

De plus, C n'est pas si gros que ça. Si vous voulez vraiment apprendre tous les aspects de l'informatique, vous devriez hausser les épaules et dire «meh», «quelle est une autre langue?


Je suis généralement d'accord avec cela, bien que pour moi, "apprendre" C signifie que je parle assez couramment la langue pour y écrire des programmes non triviaux sans aide. Je ne sais pas si ce niveau de compréhension est une condition préalable pour les systèmes d'exploitation et la programmation réseau.
Telastyn

3
@Telastyn: cela signifie que vous êtes suffisamment à l'aise pour comprendre et modifier le code des systèmes d'exploitation et le code de mise en réseau - les domaines pour lesquels C est utilisé, et c'est tout. Cela ne signifie pas que vous devez savoir comment écrire des jeux en C, créer de jolies interfaces utilisateur et des applications graphiques en C, des graphiques ou des moteurs d'intelligence artificielle en C; car pour chaque autre domaine de CS, il existe d'autres choix de langue.
rwong

12

Pendant très longtemps, à l'apogée de l'informatique en tant que science plutôt que vocation, il y avait quelques choix limités pour une langue qui fonctionnait sur tous les systèmes utilisés par toutes les différentes universités.

De loin, les universités avaient tendance à utiliser les systèmes Unix. Idéalement, cela a été programmé en C. On pourrait commencer par apprendre le C sur n'importe quelle machine, et finalement entrer dans le code source unix en C. À la maison, les étudiants pouvaient utiliser un compilateur C tel que Borland Turbo C sur Windows, ou MPW sur un Mac - cela a fonctionné partout.

Pascal était une autre option, mais cela avait tendance à avoir le problème qu'à un certain moment de la programmation, ce n'était tout simplement pas assez de langage pour faire ce que vous aviez vraiment besoin de faire (programmer un OS en pascal serait douloureux).

Certaines écoles plus anciennes ont appris le Fortran, mais encore une fois, ce n'était pas un langage assez puissant dans de nombreux cas pour être en mesure d'enseigner des classes de CS de niveau supérieur (théorie de l'IA dans fortran? Faisable mais douloureuse).

Et donc, pendant longtemps C était le choix.

Ce n'est pas le seul choix et il y a maintenant de nombreux collèges qui enseignent dans d'autres langues pour passer en revue certains des internes et apprendre des concepts de niveau supérieur sans avoir à faire face à la laideur de la gestion de la mémoire et autres. Certains pensent que c'est bon, certains pensent que c'est mauvais .


Donc non, l'apprentissage du C n'est pas essentiel à l'apprentissage de l'informatique. Vous pouvez trouver de nombreux autres livres qui enseignent l'informatique à partir de Java ou de Python. C'est juste que pendant longtemps, C a été le choix et les livres académiques avancent lentement.


Pour mémoire, la formation à l'IA était traditionnellement effectuée avec le compagnon de tête de C dans les années 70 et 80, LISP, mais la réponse est sur la tête.
jwrush

@jwrush ma réponse était plus dans le sens que vous pouvez aussi faire des études d'IA en C, par rapport aux autres langues de l'époque (pas LISP - et j'ai pris un cours de lisp dans les années 90 pour l'IA). Certes, le MIT (la maison des têtes d'œufs) à l'époque enseignait beaucoup de leurs cours en LISP - et c'était certainement une autre option, mais pas tout à fait aussi pratique dans d'autres domaines. Dans l'enseignement, il était important de travailler sur la même base dans chaque classe afin de ne pas avoir à passer la première semaine ou deux à enseigner aux étudiants une autre langue spécialisée dans cette classe.

12

J'admets que l'on peut obtenir un emploi bien rémunéré et être productif sans jamais toucher au C, mais je recommande fortement d'apprendre le C pour quiconque souhaite sérieusement avoir une bonne compréhension. de l'informatique.

Bien que l'informatique concerne les concepts, qui pourraient être appris indépendamment de tout langage de programmation spécifique, il existe des domaines qui peuvent être beaucoup mieux compris en apprenant C ou en apprenant ce domaine en utilisant C.

  • Algorithmes et structures de données. La norme C n'en contient pratiquement aucune - les avoir déjà implémentées dans la langue ou dans sa bibliothèque standard a tendance à être démotivante pour les étudiants: " Pourquoi devrais-je prendre la peine d'implémenter quelque chose de facilement disponible? "En regardant un morceau de code C, vous voyez immédiatement son coût algorithmique, car tout en C ne se compile qu'en quelques instructions machine. Les langages de haut niveau (par exemple Perl ou Python) utilisent souvent des structures de données avancées sous le capot de la syntaxe légère. Le code semble léger, mais ce n'est pas le cas. Vous avez déjà besoin de beaucoup de connaissances pour bien raisonner sur la complexité algorithmique de ces morceaux de code. Par conséquent, ces langages ne sont pas aussi adaptés à l'apprentissage des algorithmes et des structures de données, et beaucoup les programmeurs qui vivaient toujours sur des langages de haut niveau, ont tendance à être incapables de faire face aux problèmes de performances, lorsqu'ils les rencontrent.

  • Systèmes d'exploitation. La plupart des systèmes d'exploitation sont écrits en C. Comment voulez-vous comprendre la création de processus sans jamais appeler fork? La couche d'abstraction de la machine virtuelle Java n'est pas utile ici. Et en parler sans jamais créer de processus est encore pire ... Comment pouvez-vous écrire un logiciel comme Eclipse qui peut rediriger la sortie standard dans l'une de ses fenêtres? Pour cela, vous devez comprendre les concepts au niveau du système d'exploitation et vous pouvez les toucher directement en C uniquement.

  • Indirection. Vous ne pouvez pas faire C sans traiter avec des pointeurs. Les pointeurs vous obligent à penser à deux niveaux, ce qui étire vos compétences d'abstraction.

La connaissance C présente également certains avantages techniques:

  • Interopérabilité multilingue. Vous souhaitez intégrer un excellent module Ruby dans votre projet Python (remplacez ici deux langages arbitraires). Il y a de fortes chances que la seule façon de le faire soit via C, car les deux langages ont une interface étrangère à C.

  • Rédaction de logiciels critiques pour les performances. On ne peut omettre d'aller à bas niveau pour ce faire.


Je ne dis pas que chaque programme doit être écrit en C. Mais C peut vous aider à la connaissance, qui est utile quelle que soit la langue dans laquelle vous programmez.


L'arithmétique du pointeur est essentielle à la compréhension des systèmes d'exploitation, car elle conduit au pourquoi. Par exemple, pourquoi les tas et les piles sont-ils différents, pourquoi la mémoire virtuelle fonctionne-t-elle bien ou mal, pourquoi certaines boucles fonctionnent-elles plus rapidement que d'autres, etc.
Michael Shopsin

6

Je vais également aller à contre-courant ici et essayer de faire un cas esthétique (légèrement humoristique) pour C. Alors que certaines personnes pourraient l'appeler "moche" pour différentes raisons, telles que le manque de constructions de niveau supérieur comme les classes ou sa dépendance aux pointeurs, je trouve que ce n'est pas le cas pour moi .

TL; DR : À mon avis, le C est simple, le bon C est lisible et il y a une certaine joie à se retrouver dans les morceaux.

C est simple

La norme C ne définit que quelques types et mécanismes de base pour créer des fonctions, des pointeurs et des tableaux à partir d'eux. En plus de cela, il existe un petit nombre de constructions de composition pour créer des types plus complexes à partir des primitives (comme les structures et les unions). Remarquez comment j'ai décrit la plupart du langage en deux phrases. Cela signifie que vous n'avez pas à garder trop de règles et de formes syntaxiques dans votre tête lors du codage.

C'est simple c'est beau .

C n'est pas mystérieux

Contrairement à de nombreux langages de niveau supérieur, vous auriez du mal à trouver beaucoup de symboles étranges et inintelligibles en C. Dans le monde C, la fonction principale pour l'abstraction et la "compression syntaxique" est la fonction - sémantiquement très simple et construction auto-explicative. Un bon style C encourage une beauté presque poétique et lisible. Pour illustrer cela, essayons de lire l'extrait suivant du noyau Linux. Même sans avoir une bonne compréhension des structures de données sous-jacentes et des détails d'implémentation, nous pouvons comprendre beaucoup de choses comme suit:

bool kthread_freezable_should_stop(bool *was_frozen)
{
    bool frozen = false;

    might_sleep();

    if (unlikely(freezing(current)))
        frozen = __refrigerator(true);

    if (was_frozen)
        *was_frozen = frozen;

    return kthread_should_stop();
}

Le milieu de la fonction indique "dans le cas peu probable où le courant gèle, demandez au réfrigérateur si la congélation s'est réellement produite". Le Dr Seuss n'aurait pas pu mieux l'écrire.

Lisable est beau .

C est transparent

Sauf si une instruction C inclut un appel de fonction, vous pouvez généralement avoir une très bonne idée de son coût d'exécution et de ses effets secondaires. C donne au programmeur le contrôle et finalement lui fait confiance pour faire la bonne chose. Nous pouvons obtenir une image de ce qui se passe lorsque cet extrait (légèrement reformaté pour SE) de l'implémentation de strlen()dans la bibliothèque GNU C s'exécute, car chaque opérateur a une sémantique bien définie. Il n'y a pas de surcharge en C.

for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0;
        ++char_ptr)

if (*char_ptr == '\0')
    return char_ptr - str;

Aux fins de "l'optimisation", cette propriété est grande. On peut dire que certains langages de niveau supérieur facilitent l'expression concise d'algorithmes de niveau supérieur (comme C ++ avec des classes et la surcharge), mais pour les fins C a été conçu pour - agissant comme un assembleur portable - C est idéal. Parfois, lors de l'exécution réussie de code de bas niveau, un programmeur peut se sentir un avec la machine, dans un sens (ou zéro - c'est un détail d'implémentation). Cela ne veut pas dire que les autres langues sont mauvaises, pas assez "zen" ou quelque chose de stupide comme ça, juste que l'OMI C peut être intéressant d'une manière que de nombreuses autres langues ont choisi de ne pas l'être, pour de nombreuses raisons valables.

À mon avis, les trois points présentés ci-dessus rendent gérable la création de systèmes complexes - mais efficaces -, incarnés dans mon esprit par Linux. Je trouve que ce monde fait appel à mes sensibilités esthétiques et je conseillerais à quiconque considère C comme sa prochaine cible de considérer ces points. Je pense que les arguments sur les systèmes d'exploitation et autres sont mieux pris en charge en les énonçant explicitement car on n'a certainement pas besoin de comprendre les noyaux pour être un programmeur performant, mais on pourrait trouver ces champs convaincants subjectivement.


3

Le langage de programmation que vous utilisez pour discuter de la science de l'informatique est en grande partie sans rapport avec la tâche d'apprendre les moyens et la science de l'informatique.

Le travail (sans doute) séminal sur l'informatique, l'art de la programmation informatique , n'utilise aucun langage existant pour informer le sujet. Au lieu de cela, Donald Knuth a choisi de définir un ordinateur fictif et un langage machine fictif (et un langage d'assemblage associé) en fonction desquels il aborde tous les sujets.

Un autre ouvrage très apprécié sur le sujet, La structure et l'interprétation des programmes informatiques , a adopté une approche similaire, concevant un dialecte simplifié du langage de programmation LISP pour agir comme son propre contexte. Cette langue est ce que nous connaissons maintenant sous le nom de Scheme.

Pourtant, un autre très bon travail sur l'informatique, Les éléments des systèmes informatiques (qui est en fait à parts égales en génie informatique et informatique, et très bref), prend l'approche plus fondamentale de l'enseignement de la logique numérique, à partir de laquelle il construit la machine, les outils , et la langue, avant d'enseigner l'informatique élémentaire.

Donc, non, C n'est pas nécessaire pour comprendre l'informatique. Ce qui compte, c'est votre compréhension des concepts fondamentaux des algorithmes et de leur application.


2

J'ai commencé une carrière dans la programmation en apprenant la vb3 à partir des manuels livrés avec les disquettes sur lesquelles elle était fournie. J'ai appris le java et j'ai pu produire des programmes respectables mais ce n'est que lorsque j'ai étudié le C à l'université que j'ai senti que je comprenais vraiment ce qui se passait "sous le capot". Je travaille maintenant uniquement avec .net et je ne m'inquiète plus vraiment des pointeurs, des adresses non valides ou des débordements - mais je les comprends, cela informe les décisions que je prends quotidiennement et certains des trucs de la vieille école sont toujours là dans les langages interprétés modernes, les drapeaux , opérations peu sages, logique booléenne, tous outils puissants et très efficaces.

Apprenez C. Il vous sera très utile. J'ai gardé une copie du manuel des programmeurs c pendant des années et j'ai lu Kernighan et Ritchie de bout en bout. Peu importe la langue dans laquelle vous finissez par travailler avec Understanding C vous aidera certainement.


1

Peut-on apprendre l'informatique sans apprendre le C?

La réponse est oui. J'ai mon diplôme en CS et je n'étais pas obligé d'apprendre le C, mais plutôt Java. Au moins dans mon école, l'accent était mis sur l'apprentissage de la programmation orientée objet, avec quelques enseignements sur le langage d'assemblage, les structures de données et la conception de bases de données.


7
Êtes-vous sûr que votre diplôme couvre " tous les aspects" de la CS?
SK-logic

Je dirais tous les aspects nécessaires. Aucun diplôme ne couvre tous les aspects d'un programme d'études. De plus, «tout» est subjectif.
PhillyNJ

1
Comment définissez-vous «nécessaire»? Tout est tout - ce qui signifie, couvrant toutes les applications CS possibles. Ce n'est pas "subjectif", c'est assez quantifiable.
SK-logic

Je définis «nécessaire» dans le contexte où CS couvre l'étude du calcul et de la technologie informatique, du matériel et des logiciels et non un langage spécifique, qui répond à la question initiale.
PhillyNJ

D'accord, et comment allez-vous couvrir le matériel sans les langages de bas niveau? Comment couvrirez-vous l'histoire des langages de programmation (qui est une partie exceptionnellement importante de "tous" le CS) sans un tel langage clé? Comment allez-vous couvrir la sémantique du langage de programmation sans au moins un langage avec l'arithmétique des pointeurs? D'une manière ou d'une autre, mais un langage similaire à C doit être présent dans tout programme d'études CS complet.
SK-logic

0

Cela dépend vraiment de ce que vous voulez faire avec ce que vous apprenez. Il est certainement vrai que beaucoup d'algorithmes sont donnés en C, ou descendants de ceux-ci. Cependant, au fil des ans, j'ai vu plus d'exemples C ++, C # et Java. Ce que CS est censé enseigner, c'est une compréhension générale de l'informatique et, par conséquent, comment choisir ou créer un langage approprié pour la tâche à accomplir.

Cependant, il y a encore beaucoup de gens dont la première et la dernière langue est une variante du C ou de Java, et tous ne vont pas avoir la formation pour comprendre n'importe quel langage donné par un diplôme CS. Même certains diplômés CS ont des problèmes avec la programmation. Vous devrez donc peut-être avoir une assez bonne compréhension de ces langues pour pouvoir communiquer avec elles, en fonction de votre parcours professionnel. Si vous prévoyez de vous en tenir au monde universitaire, vous aurez encore plus de barrières linguistiques au contenu, en particulier dans les domaines interdisciplinaires (où les gens utilisent prolog, lisp, haskell, mathématique, etc.)


-1

Si vous voulez vraiment apprendre "tous les aspects de l'informatique" (plan ambitieux!), Vous devrez faire face à plusieurs langages d'assemblage différents, et au moins un HDL (et vous entraîner à coder au niveau d'une netliste).

Et comme une étape de niveau supérieur pour aborder ces choses vraiment fondamentales, vous devrez prendre quelque chose comme C ou Pascal, c'est inévitable. Sauter des étapes sur une échelle d'abstraction est contre-productif.

Quoi qu'il en soit, je doute que cette question mérite même d'être posée. Après tout, C n'est qu'un petit langage. Vous auriez pu apprendre ses bases en moins de temps que vous ne l'avez perdu en réfléchissant à savoir si vous devez ou non apprendre le C.

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.