web-dev-qa-db-fra.com

Programmation de bas niveau - qu'en est-il pour moi?

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 Assemblée. Cependant, je n'ai pas encore eu 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 constamment évoluer, afin que ses utilisateurs n'aient pas besoin de basculer vers une autre application B, qui a 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: Les performances contribuent à 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 performance est une optimisation prématurée pour moi.

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 Assembly. C'est juste que dans ma vie quotidienne, je suis assez 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 Assembly 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, écrire des assemblys de nos jours pour les processeurs tels qu'ils sont utilisés dans les processeurs d'aujourd'hui est non seulement compliqué inutilement, mais risque d'entraîner de moins bonnes performances d'exécution 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 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 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 porterais 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 votre perspicacité.

32
back2dos

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 en 1 Kb RAM! http://users.ox.ac.uk/~uzdm0006/scans/1kchess/

9
user1249

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 tord. 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 remonter à 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 n'importe lequel des morceaux oubliés depuis longtemps qui ont tous été résumés. Plus un défi personnel qu'une carrière en progression.

29
Jonathon

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:

  • Rafraîchissez votre mémoire sur les structures et algorithmes de données de base.
    • C'est juste une bonne chose à savoir, comme l'algèbre et la géométrie.
    • Essayez de faire des exercices de manuels universitaires ou des puzzles de programme en C.
  • Une meilleure appréciation de la hiérarchie de la mémoire (bande passante), depuis le cache CPU jusqu'à la latence du réseau transocéanique. Cela aidera vos compétences en développement d'applications à tous les niveaux.
    • Plus important encore, il est bon de se renseigner sur les scénarios dans lesquels a petit un réarrangement discret du code de haut niveau peut entraîner un dramatique amélioration de la vitesse.
      • Parfois, la raison ne peut être comprise que dans l'implémentation de bas niveau dans le contexte de la hiérarchie de la mémoire.
      • Ne pas comprendre la cause naturelle de cette possibilité conduit à l'ignorance , la peur , et finalement le déni , pensant qu'il est mal pour les développeurs de haut niveau de puiser dans ce type d'optimisation. En réalité, il n'y a rien de mal à cela.
  • Appréciez l'esthétique des systèmes logiciels basés sur les composants , qui permet aux composants de bas niveau développés en C/C++/Assembly d'être utilisés par les systèmes de haut niveau.
    • L'esthétique est exactement la même que la convivialité du logiciel:
      • Bon design (puissant, facile à utiliser, bien pensé)
      • Exactitude
      • Flexibilité (extensions et nouveaux comportements via la composition de pièces existantes, chacune avec un objectif clairement défini)
      • Performance (sans compliquer la convivialité)
    • Bien que vous ne puissiez pas concevoir vos propres composants de bas niveau, votre compréhension vous aidera à évaluer et à choisir les bons composants à utiliser dans vos projets de haut niveau.
  • Enfin, sachez que les composants de bas niveau sont presque toujours plus compliqués dans leurs implémentations , loin d'être insondables en regardant simplement l'interface.
    • Le niveau bas est toujours compliqué. Une bonne bibliothèque cache la complexité sans diminuer sa puissance.
    • Apprenez à lire les "notes techniques" rédigées par les développeurs de composants, qui sont des suggestions aux utilisateurs de niveau supérieur sur la meilleure façon d'utiliser les composants.
15
rwong

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

8
Steven A. Lowe

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 à coup les bits fonctionnels de javascript, Ruby et python vient de faire beaucoup plus de sens. Je n'avais jamais utilisé replier dans l'un de mes codes avant mais après haskell je le vois à peu près partout où je vois des tableaux. Donc, les chances sont élevées que si vous apprenez du 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 l'interprète est écrit en C ou en C++. Cela m'est passé par la tête parce que j'ai très peu d'expérience en C et je n'ai aucune idée de ce qui est difficile ou facile en C.

8
davidk01

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.

7
user281377

Hourra pour la curiosité!

Il est très bon d'avoir une idée de ce qui se passe réellement aux niveaux les plus bas d'un système complexe, même s'il n'y a aucun 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 créer 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 bien d'autres amusements!

Mais cela, évidemment, nécessite un savoir-faire en électronique et prend du temps, donc 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. Cela peut être le plus éducatif et 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 aident-elles 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 CPU. 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.

5
DarenW

En un mot, c'est amusant. Quand je jouais avec l'assembleur (après avoir travaillé de VB vers C++, C etc.), c'était tout simplement génial de déplacer des données d'une partie du processeur à une autre. C'était une excellente sentiment 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 trouverez dans les langues de niveau supérieur.

De plus, être capable de se tourner vers n'importe qui qui a programmé dans une autre langue que ce soit et de faire 'bien, si vous n'êtes pas assez hardcore ...' était enfantin, amusant enfantin.

4
Dan O

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, en gros 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 étant donné que nous devrions tous coder dans Assembly uniquement ...)

Je suis moi-même un 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'à présent, il n'y a pas de langage pour cela (peut-être google's go for userland system programming) et j'envisage l'idée de construire mon propre langage, mais c'est une autre histoire.

2
Marwan Burelle

Je dirais qu'il n'y a pas beaucoup de raison dans votre domaine, mais si vous deviez faire du calcul haute performance (par exemple, jeux, sciences, etc.), cela serait justifié.

1
Darknight

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 :)

1
Emiliano

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:

List<object> listOne = new List<object>();
List<object> listTwo = listOne;

listTwo.Add(new object());

Debug.WriteLine(listOne.Count); //do you know what this will be?

Cordes:

string initial = "initial";
string another = initial;

another = "changed!";
Debug.WriteLine(initial); //what about this?

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.

1
Alistair

Que pourrait m'apprendre la programmation de bas niveau, quelles autres langues ne m'apprendraient pas?

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 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, l'ensemble de l'API est écrit 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é.

1
user29079