Pendant des années, j'ai envisagé de creuser dans ce que je considère comme des langues de «bas niveau». Pour moi, cela signifie C et l'assemblage. Cependant, je n'avais pas encore le temps pour cela, et cela n'a jamais été nécessaire.
Maintenant, parce que je ne vois aucune nécessité, je pense que je devrais simplement planifier un moment précis où j'étudierai le sujet ou abandonner le plan pour toujours.
Ma position
Au cours des 4 dernières années, je me suis concentré sur les "technologies Web", qui peuvent changer, et je suis un développeur d'applications, qui est peu susceptible de changer.
Dans le développement d'applications, je pense que l'utilisabilité est la chose la plus importante. Vous écrivez des applications à "consommer" par les utilisateurs. Plus ces applications sont utilisables, plus vous avez de valeur.
Afin d'atteindre une bonne convivialité, je crois que les choses suivantes sont viables
- Bon design : fonctionnalités bien pensées accessibles via une interface utilisateur bien pensée.
- Exactitude : le meilleur design ne vaut rien, s'il n'est pas mis en œuvre correctement.
- Flexibilité : une application A doit évoluer en permanence, afin que ses utilisateurs n'aient pas besoin de basculer vers une autre application B, dotée de nouvelles fonctionnalités, que A pourrait implémenter. Les applications traitant le même problème ne doivent pas différer par leurs fonctionnalités mais par leur philosophie.
- Performance : La performance contribue à une bonne expérience utilisateur. Une application est idéalement toujours réactive et exécute ses tâches assez rapidement (en fonction de leur fréquence). La valeur de l'optimisation des performances au-delà du point où elle est perceptible par l'utilisateur est discutable.
Je pense que la programmation de bas niveau ne va pas m'aider, sauf pour les performances. Mais l'écriture d'une application entière dans un langage de bas niveau pour des raisons de performances est pour moi une optimisation prématurée.
Ma question
Que pourrait m'apprendre la programmation de bas niveau, quelles autres langues ne m'apprendraient pas? Suis-je en train de manquer quelque chose, ou s'agit-il simplement d'une compétence, qui est très peu utile pour le développement d'applications? Veuillez comprendre que je ne remets pas en question la valeur de C et de l'assemblage. C'est juste que dans ma vie quotidienne, je suis très heureux que toutes les subtilités de ce monde soient abstraites et gérées pour moi (principalement par des couches écrites en C / C ++ et assemblées elles-mêmes). Je ne vois tout simplement pas de concepts, cela pourrait être nouveau pour moi, seulement des détails avec lesquels je devrais me bourrer la tête. Alors qu'est-ce que ça m'apporte?
Ma conclusion
Merci à tous pour leurs réponses. Je dois dire que personne ne m'a vraiment surpris, mais au moins maintenant, je suis sûr de laisser tomber ce domaine d'intérêt jusqu'à ce que le besoin s'en fasse sentir.
À ma connaissance, l'écriture d'assemblages de nos jours pour les processeurs tels qu'ils sont utilisés dans les processeurs d'aujourd'hui est non seulement compliquée inutilement, mais risque d'entraîner des performances d'exécution moins bonnes qu'un homologue C. L'optimisation à la main est presque impossible à cause d'OOE, alors que vous n'obtenez pas toutes sortes d'optimisations qu'un compilateur peut faire automatiquement. En outre, le code est soit portable, car il utilise un petit sous-ensemble de commandes disponibles, soit optimisé, mais il ne fonctionne probablement que sur une seule architecture.
L'écriture en C n'est plus aussi nécessaire que par le passé. Si je devais écrire une application en C, j'utiliserais tout autant des bibliothèques et des frameworks testés et établis, qui m'éviteraient d'implémenter des routines de copie de chaînes, des algorithmes de tri et d'autres types de choses servant d'exercice à l'université. Mon propre code s'exécuterait plus rapidement au détriment de la sécurité des types. Je ne souhaite ni réinventer la roue au cours du développement normal des applications, ni essayer de déboguer en regardant les vidages de mémoire: D
J'expérimente actuellement avec les langues et les interprètes, donc s'il y a quelque chose que je voudrais publier, je suppose que je ferais porter un concept de travail en C, bien que C ++ pourrait tout aussi bien faire l'affaire.
Encore une fois, merci à tous pour vos réponses et vos idées.
Réponses:
La programmation de bas niveau est destinée aux cas d'angle où une exigence n'est pas immédiatement présente sur les ordinateurs de bureau normaux. Cela peut être un goulot d'étranglement de la vitesse, ou un goulot d'étranglement de la mémoire ou quelque chose de complètement différent, et il est très souvent très intéressant de voir ce qui peut être fait compte tenu de ces exigences.
Considérez-le comme Haikus ou Limericks, où les restrictions le rendent intéressant.
Pour vous donner une idée de ce qui est possible dans ce qui semble impossible aujourd'hui, voici l'un des plus grands hacks de tous les temps. Échecs dans 1 Ko de RAM! http://users.ox.ac.uk/~uzdm0006/scans/1kchess/
la source
Je pensais juste à ça récemment. Je me considère actuellement comme un développeur C # - ce qui est parfaitement bien pour ma carrière.
Cependant, de temps en temps, je passe à côté des choses de très bas niveau (essentiellement «se salir les mains» en faisant des assembleurs ou des pilotes de périphériques en C). Je manque juste la programmation. Je ne m'attends pas à ce que cela m'aide massivement dans ma carrière. Si les pilotes de périphérique ou les systèmes embarqués sont votre truc, alors cela pourrait aider beaucoup.
Plus je programme dans les langues abstraites, plus je manque ce qui m'a amené dans les ordinateurs en premier lieu: fouiner autour de l'ordinateur et voir ce qui se trémousse. Assembleur et C sont très bien adaptés pour piquer :)
En utilisant les anciennes langues, je pense que vous êtes obligé de faire à peu près tout vous-même. En C #, je peux faire quelque chose comme
myArray.SortBy(x=>x.Name)
. Je ne pourrais pas faire ça en C. J'accepte que la langue fasse le meilleur tri pour moi. Si je devais le faire en C, je pourrais revenir à l'époque de mes modules universitaires et réviser mes différents algorithmes de tri et de recherche.Donc, je pense que les langages de niveau inférieur vous aideraient à réviser tous les bits oubliés depuis longtemps qui ont tous été résumés. Plus un défi personnel qu'une carrière en progression.
la source
Ma suggestion est de jouer avec C comme une curiosité intellectuelle. Ne faites pas un investissement lourd en temps car cela n'en vaut pas la peine.
Objectifs suggérés:
la source
si vous voulez comprendre comment fonctionne la machine , et pas seulement la machine virtuelle dont dépend votre langage de haut niveau, alors Assembly vous l'apprendra
si vous n'avez aucune raison de vous en soucier - et la plupart des programmeurs ne le font vraiment pas de nos jours - alors ne vous en faites pas.
cela améliorera votre fondation, mais cela n'améliorera probablement pas vos applications Web
la source
Chaque langage de programmation change un peu la façon dont vous pensez de la programmation en général. Un exemple concret que je peux vous donner est quand j'ai commencé à apprendre le haskell et tout d'un coup, les éléments fonctionnels de javascript, ruby et python ont pris tout leur sens. Je n'avais jamais utilisé foldl dans aucun de mes codes auparavant mais après haskell je le vois à peu près partout où je vois des tableaux. Les chances sont donc élevées que si vous apprenez un certain C, vous deviendrez beaucoup plus conscient des caractéristiques de performances relatives de diverses constructions dans votre langue préférée. Il y a quelques minutes, j'écoutais un discours sur l'écriture de javascript rapide et optimisé et le conférencier a dit: "Si c'est difficile à faire en C, ce sera vraiment lent en javascript." Son intention étant que javascript soit un langage interprété et que l'interprète soit écrit en C ou C ++.
la source
Si vous ne le faites pas juste pour le plaisir, parce que les geeks aiment vraiment avoir un contrôle total sur leur matériel, vous pourriez au moins avoir une meilleure idée de la vitesse à laquelle un programme peut devenir lorsqu'il est écrit en C au lieu, disons, de Java. Vous pourriez également apprendre à vraiment apprécier les fonctionnalités des langages de niveau supérieur, comme la récupération de place.
la source
Hourra pour la curiosité!
C'est très bien d'avoir une idée de ce qui se passe vraiment aux niveaux les plus bas d'un système complexe, même s'il n'y a pas de besoin logique de savoir pour ses tâches quotidiennes. De loin, la meilleure façon de faire bouger les choses au niveau des bits est de construire votre propre CPU. Vous devez penser aux opcodes au niveau du langage machine, comprendre pourquoi les ensembles d'instructions orthogonales sont si bons, les complications de la gestion des interruptions, les compromis entre les circuits complexes et les microcodes (par exemple dans les unités de multiplication), et oh tellement d'autres amusements!
Mais cela prend évidemment du savoir-faire en électronique et prend du temps, alors la meilleure chose à faire est de jouer avec un processeur 8 bits de style ancien. Les microcontrôleurs comme le 8051 sont encore largement utilisés et disponibles pour les amateurs. Cela nécessite encore un certain savoir-faire dans la gestion de l'électronique et la mise en lumière des LED sans fumer, et coûte $$ si vous n'êtes pas déjà équipé pour l'électronique.
Ensuite, la meilleure chose après cela: jouer dans un simulateur de processeur (émulateur? Je mélange ces termes) - ils existent pour Z80, 6502, 8086 ... tous les anciens 8-bitters. C'est peut-être le plus éducatif et le plus amusant pour un programmeur d'applications qui ne sait pas quelle extrémité du fer à souder contenir (bien que l'on apprenne cela assez rapidement :) Comment le texte est écrit dans la mémoire vidéo, comment les astuces de code d'assemblage contribuent aux performances. .. il y a beaucoup de choses amusantes à explorer à ce niveau.
Je ne suis pas sûr d'apprendre C comme juste un autre langage, sans une première compréhension du fonctionnement interne du processeur. Savoir comment les bits sont envoyés entre les registres du processeur et comment la mémoire accède, aide énormément à obtenir réellement des pointeurs et d'autres concepts du langage C.
la source
En un mot, amusant. Quand je jouais avec l'assembleur (après avoir travaillé de VB à C ++, C, etc.), c'était tout simplement génial de déplacer des données d'une partie du processeur à une autre. C'était un sentiment génial de savoir exactement ce qui se passait à l'intérieur du CPU, sans se soucier de ce qui se passait sous ce que vous ne saviez pas. De plus, un grand sentiment de liberté - vous pouvez faire à peu près n'importe quoi, car il n'y a pas de limitations intégrées que vous trouvez dans les langues de niveau supérieur.
De plus, pouvoir se tourner vers n'importe qui qui a programmé dans une autre langue que ce soit et aller 'bien, si vous n'êtes pas assez hardcore ...' était enfantin, amusant enfantin.
la source
Y a-t-il une bonne raison d'apprendre / pratiquer la programmation de bas niveau? J'ai moi-même différentes réponses selon le contexte.
Tout d'abord, j'enseigne la programmation C (mais aussi OCaml et Java), motiver les étudiants à apprendre la programmation du côté dur est probablement la partie la plus difficile de la tâche. Le meilleur argument que j'ai trouvé jusqu'à présent est la "compréhension": les langages de niveau supérieur cachent beaucoup de mécanismes sous-jacents et parfois pas pour de bon, ils vous poussent également à rester au niveau supérieur même lorsque certaines astuces de bas niveau pourraient vraiment être utiles ( pour la performance, la plupart du temps.) Comprendre ce que vous utilisez peut vraiment aider à mieux l'utiliser. Mon expérience d'enseignement me prouve que les étudiants qui ont appris la programmation de niveau inférieur (et d'autres compilateurs non orientés utilisateur) sont plus adaptables et apprennent plus rapidement de nouveaux concepts ou outils de niveau supérieur.
Deuxièmement, comme vous le dites, les performances font partie de l'expérience utilisateur. La plupart du temps, les performances sont vues comme une question d'écriture complexe et proche du code machine. Ce n'est pas toujours le cas, les performances sont bien plus une question d'algorithmes et de structures de données mais aussi d'interaction entre algo et données. J'utilise un projet spécial sur le sujet, fondamentalement c'est une simple recherche de chemin, mais le vrai problème est la taille des données: le graphique est infini. La seule façon d'obtenir des performances de descente et de tenir en mémoire est d'écrire un allocateur de mémoire dédié (en fait deux, un allocateur de pool et un allocateur de recyclage). C'est quelque chose que vous ne pouvez pas faire dans la plupart des langages de niveau supérieur. En fait, la plupart des langues récupérées avec des déchets auront des problèmes de performances et de mémoire.
Il y a probablement beaucoup plus d'arguments tels que la stabilité (dans le sens de l'histoire et de la longévité) des langages de niveau inférieur contre ceux "hype" (le fait qu'un langage considéré comme référence future pour la programmation puisse disparaître dans quelques années est long histoire, on ne peut pas prédire la longévité d'une nouvelle substance, mais cet argument reste vrai pour les langues plus anciennes ...), bien sûr, il y a aussi une question de goût, ou le fait que ce qui peut être fait dans la plupart des langues de haut niveau peut aussi être fait dans des langages de niveau inférieur mais pas l'inverse (mais compte tenu de cela, nous devrions tous coder en assembleur uniquement ...)
Je suis moi-même piège dans les deux mondes (tout à fait différemment), je passe plusieurs années à travailler sur le concept de programmation théorique, la conception et la preuve de systèmes de types, et pour ce faire, je n'utilise et n'étudie que des langages de très haut niveau (principalement fonctionnels, mais aussi purs) orienté objet.) Récemment, je reviens de l'autre côté (principalement la programmation système et noyau) et me suis retrouvé assez à l'aise dans ce domaine, je m'amuse beaucoup! Pour moi, l'étape suivante consiste à trouver le point commun: des fonctionnalités de langage de niveau supérieur pour une programmation de niveau inférieur! Donc, jusqu'ici, il n'y a pas de langage pour cela (peut-être google's go pour la programmation du système userland) et j'envisage l'idée de construire mon propre langage, mais c'est une autre histoire.
la source
Je dirais qu'il n'y a pas beaucoup de raisons dans votre domaine, mais si vous deviez faire du calcul haute performance (par exemple, jeux, sciences, etc.), cela serait justifié.
la source
Je pense que de nos jours, la programmation de bas et de haut niveau peut être assez séparée. Fondamentalement, cela signifie que vous pouvez vivre toute votre vie professionnelle sans connaître C et assembleur sans aucun problème. Cela dit, le langage de programmation C ne peut pas vous apprendre beaucoup du point de vue de la programmation et de la conception.
Juste par curiosité, vous pouvez apprendre comment les choses fonctionnent à un niveau inférieur. Quand j'étais à l'université, par exemple, j'ai aimé utiliser gcc pour générer du code assembleur à partir de C ++. Il était utile de comprendre comment le polymorfisme et l'exception sont mis en œuvre. Mais à part cela, les seules choses que vous pouvez apprendre de C de nos jours sont:
1) astuces de mémoire sale. C est le meilleur moyen de comprendre qu'il n'y a pas de bas en bas dans la folie des programmeurs :)
2) Les GOTO sont réellement utilisés (et utiles) pour annuler les erreurs
3) apprenez mieux comment fonctionne l'allocation de mémoire (différence entre tas et pile?).
Donc, fondamentalement, ma thèse est la suivante: si vous avez déjà terminé l'Université et que vous n'avez toujours pas besoin de C, alors ne l'apprenez pas :)
la source
Vous n'avez pas besoin de comprendre les langues de bas niveau, mais vous devez comprendre ce qui se passe sous les couvertures de votre langue de haut niveau choisie. L'utilisation d'un langage de bas niveau vous apprendra cela, mais ce n'est pas le seul moyen.
Voici quelques exemples de concepts de bas niveau qui peuvent avoir un impact sur les langages de haut niveau.
Pointeurs:
Cordes:
Listes:
Quand utilisez-vous une liste par rapport à une liste chaînée? (Presque impossible de le savoir sans comprendre à un niveau assez bas le fonctionnement d'une liste)
-
Faut-il connaître tout ça? Non, mais cela peut avoir un impact et si vous voulez maîtriser une langue de haut niveau, vous devez avoir une assez bonne idée du fonctionnement interne.
la source
Plus particulièrement, il vous apprendra comment les ordinateurs fonctionnent réellement. Il n'y a pas d'autre moyen d'apprendre cela que par le biais d'une programmation de bas niveau. Peu importe le type d'applications que vous programmez, cela vous sera toujours utile. Vous comprendrez réellement ce qui se passe au fond de tout ce truc sur le Web. Et si vous travaillez avec Windows, toute l'API est écrite en C, sachant que cette langue vous permettra de communiquer directement avec le système d'exploitation, chaque fois que vous aurez besoin d'utiliser une fonctionnalité qui fait défaut à vos langues actuelles et à leurs bibliothèques.
Bien sûr, la programmation de bas niveau vous permettra de travailler avec des choses entièrement différentes, comme la programmation intégrée et la programmation en temps réel où asm / C / C ++ est un must. Si vous n'avez aucun intérêt pour ce type d'applications, il n'y a en effet pas grand besoin d'apprendre asm / C / C ++.
En outre, vous apprendrez des bits et des octets. Manipulations de bits, hexadécimales, etc. Les algorithmes de chiffrement en sont un exemple lorsqu'il est utilisé.
la source