L'assemblage comme premier langage de programmation? [fermé]

12

Dans quelle mesure pensez-vous qu'il serait bon d'enseigner aux gens l'assemblage (une variante) comme premier langage de programmation? Cela demanderait beaucoup plus d'efforts que d'apprendre par exemple Java ou Python, mais on aurait une bonne compréhension de la machine plus ou moins dès la «programmation du premier jour» (par rapport à de nombreux langages de niveau supérieur, au moins). Qu'est-ce que tu penses? Est-ce une idée réaliste, du moins pour ceux qui sont prêts à faire l'effort supplémentaire? Avantages et inconvénients?

Remarque: je ne suis pas enseignant, juste curieux

Anto
la source
5
Je pense que c'est mieux adapté aux personnes qui étudient l'informatique et non le génie / développement logiciel
Imran Omar Bukhsh
1
@Imran Je suis d'accord en principe, mais tous les programmes de niveau collégial auxquels je peux penser ont des diplômes en informatique qui sont obtenus par des personnes qui travaillent principalement en génie logiciel. (Je suppose que cette question concerne une base sérieuse pour une carrière en programmation, pas par exemple un cours d'enquête au lycée)
G__
7
@Imran - J'ai trouvé cela un peu surprenant. L'informatique penche sûrement plus vers les mathématiques et la théorie? Plus intéressé par les ensembles, les algèbres abstraites et la notation asymptotique que par le tripotage de bits et l'écriture de répétitions sans fin de move-blah-to-blah.
Steve314
2
L'informatique a certes des sujets abstraits, mais elle est aussi très "proche du matériel" à certains égards. J'ai déjà assisté à LICS, une conférence sur l'informatique. Je me souviens qu'il y avait des articles sur la localisation des données de divers algorithmes de tri qui, j'imagine, donnent des bases théoriques à l'étude de l'efficacité pratique des algorithmes. En ce qui concerne l'assemblage, je trouve personnellement qu'il a une certaine ressemblance avec certains modèles de calcul théoriques (machines de Turing, contre-machines ...)
Joh
1
Chaque programmeur devrait au moins lire comment fonctionne l'assemblage, OMI. Cela m'a donné beaucoup d'informations et je suis généralement aussi proche que possible du chrome. Le langage d'assemblage étape par étape de Jeff Duntemann est une lecture amusante pour les débutants.
Erik Reppen

Réponses:

14

Il serait difficile d'inspirer un nouveau programmeur avec du code assembleur. Un bonjour dynamique, le site Web de l'utilisateur est beaucoup plus cool avec moins d'effort. Je ne dis pas que les leçons fondamentales sont les mêmes, mais un cours d'introduction aura un grand contenu inspirant, sinon il n'y aura pas de deuxième cours.

Je me souviens que mes premiers cours de programmation étaient enseignés dans Scheme et j'étais surtout frustré de ne pas pouvoir facilement compiler en un fichier .exe et "exécuter" mon programme (je pensais que MS Visual Basic était la fin de la programmation). Ce n'est que des années plus tard que j'ai vraiment compris avec quel outil puissant je jouais. Je pense que je l'aurais davantage apprécié et mieux retenu ces leçons si j'avais eu une première expérience dans quelque chose d'un peu plus pragmatique au début.

G__
la source
20
J'ai vu de nombreux étudiants beaucoup plus étonnés faire clignoter une LED et bouger un moteur.
whatsisname
1
@Whatsisname +1, cela ferait une belle démo impressionnante, tant que cela peut être fait sans se faire prendre dans l'électronique. Bien sûr, cela pourrait aussi être fait avec un langage de niveau supérieur, c'est-à-dire le piratage de Roomba, si le "conducteur" était une boîte noire fournie par un instructeur.
G__
1
De nombreux nouveaux programmeurs ont été inspirés par l'assemblage sur les machines VIC20, C = 64 et similaires.
Gaius
2
@Gaius Pas au début! Vous allumez ces machines et vous êtes dans un interprète de base. L'assemblage arrive après une bonne expérience et atteint les limites de ce que peut faire le basique ...
G__
1
@whatsisname mais vous pouvez utiliser quelque chose comme un Arduino pour faire clignoter les LED et déplacer les moteurs sans avoir à apprendre l'assemblage
Ken Liu
12

Je pense que c'est une idée terrible à la fois pour les étudiants en génie logiciel et pour les étudiants CS, et généralement pour tous ceux qui s'intéressent davantage à la programmation qu'à l'électronique.

Cela peut être fait, mais cela ne signifie pas que cela devrait être fait. À l'époque, la façon de faire des trucs vraiment cool avec des ordinateurs personnels était d'apprendre d'abord l'assemblage. C'était à cause des premières limitations matérielles - les langages de niveau supérieur n'étaient tout simplement pas assez puissants et rapides. De nos jours, vous pouvez faire des choses beaucoup plus cool, en moins de temps, avec un langage de niveau supérieur.

Quoi de plus intéressant, d'écrire un prototype rapide pour un jeu simple et de jouer avec des variations sur un algorithme, ou de lutter avec des registres et des trucs de bas niveau?

Andres F.
la source
3
En tant que pianiste, j'aurais certainement trouvé plus intéressant de sauter directement avec certaines chansons, mais pour devenir décent, vous devez pratiquer des arpèges, des gammes, etc. Et puis faire des trucs vraiment révolutionnaires (jouer avec des "pianos préparés" et etc.), vous devez savoir comment fonctionne le piano de l'intérieur. C'est à quel point vous voulez bien connaître votre métier.
John
10
@John at CashCommons: Mauvaise analogie. Commencer avec l'assembleur, c'est comme démarrer les marteaux, le clavier, les poids et les amortisseurs. Et puis passer à la théorie de la musique (cercle des quintes) pour expliquer le métier clé noire, touche blanche. Passons ensuite à plus de théorie musicale avant de jouer une gamme.
S.Lott
3
@ S.Lott: Ehhhhh ... ne l'achetez pas tout à fait. Je peux écrire un programme de type "hello world" en assemblage sans me soucier des transistors. Il n'est pas nécessaire d'être concepteur de puces pour être programmeur. Les connaissances dont vous parlez seraient les fondements de la construction ou de la réparation d'un piano, qui n'est que vaguement lié à la lecture d'un piano.
John
3
@John at CashCommons: "construire ou réparer un piano". C'est l'analogie avec l'assembleur. Un "bonjour" trivial dans l'assembleur peut être écrit, mais ce ne sont que des appels à l'API du système d'exploitation - en effet, en ignorant tous les détails horribles de l'assembleur. Pour écrire des pilotes d'E / S, l'assembleur est essentiel. De la même manière, les marteaux et les amortisseurs sont destinés à la construction et à l'entretien, et non à l'exécution.
S.Lott
1
@ S.Lott: Hmmmm ... Je suppose que le jeu d'instructions particulier dépend de la puce, n'est-ce pas? Bon point.
John
7

Je ne pense pas que ce soit une idée terrible, mais à quel point un programme complexe allez-vous donner à ces étudiants? L'assemblage demande beaucoup plus de travail. Il serait peut-être bon de commencer avec des choses très basiques, puis de les déplacer vers quelque chose de plus facile à travailler, une fois qu'ils auront apprécié de travailler au niveau inférieur. Les nouveaux étudiants ont parfois des idées en tête, ils coderont le prochain Halo, ou MS Office ou AutoCAD ou quelque chose, et quand ils verront combien de travail va dans un langage d' assemblage simple , ils pourraient avoir peur, alors soyez clair qu'il y a de meilleures choses que l'assemblage, puis déplacez-les vers cela une fois qu'ils ont vu les concepts. Vous pouvez également essayer d'enseigner assemlby en même temps que quelque chose comme C.

Aussi, quel langage d'assemblage? Je me souviens un peu que MIPS était relativement facile à travailler, et je pense qu'il fonctionne dans un émulateur donc pas de danger de causer des problèmes à la vraie machine, bien qu'il puisse y avoir de meilleurs outils que cela maintenant.

Cela pourrait bien fonctionner, s'il est bien fait. Fais attention...

FrustratedWithFormsDesigner
la source
+1 pour la complexité du problème. Mon vote serait de comparer quelques implémentations d'assembleur avec des implémentations de langage de niveau supérieur. Et peut-être utiliser par exemple l'assembleur 68000 dans un émulateur plutôt que x86 - Je ne sais pas comment l'assembleur x86 / amd64 a évolué, mais le 68000 était beaucoup plus propre et plus facile à travailler qu'avec 8086 à l'époque. Peut-être aussi vaut-il la peine d'envisager - un assembleur de machine virtuelle tel que vous pouvez l'obtenir avec LLVM. Pas le même que l'assembleur réel, mais il partage beaucoup de principes similaires et est probablement plus pertinent.
Steve314
Enseigner ASM en même temps que C semble être une très bonne idée
Anto
@ Steve314: Je ne suis pas sur l'assembleur x86, mais il semble que c'est devenu plus compliqué que 8086.
David Thornley
@David - Je m'attends à ce que ce soit le cas, mais cela pourrait bien être devenu plus simple à certains égards. Dans les 8086 jours, la gamme de modes d'adresse disponibles dépendait du registre particulier que vous utilisiez, ainsi que des instructions. Sur 68000, il y avait (pour la plupart des utilisations) des registres de données et des registres d'adresses, chaque type étant utilisé de manière assez uniforme, sans tracas is-this-an-index-or-a-base-pointer-or-what. Au fil du temps, peut-être que cela a changé? Le 68000 avait également plus de registres, ce qui permettait d'économiser sur certains mouvements d'entrée et de sortie de mémoire. Quoi qu'il en soit, vous n'avez pas besoin d'apprendre des choses SIMD pour obtenir les principes de base de l'assembleur.
Steve314
@David - Je n'arrive pas à croire que j'ai oublié l'adressage segmenté (réprimé). C'était déjà assez grave dans un langage de haut niveau. Il y a à nouveau un adressage segmenté, mais c'est une chose différente, concernant la mémoire virtuelle, etc., que les programmeurs au niveau des applications ne devraient pas avoir à se soucier.
Steve314
7

L'assemblage était la première langue que nous avons apprise à l'école d'électronique (dans les années 1900) et cela semblait être un choix naturel. Nous avons progressé dans nos cours, des composants discrets à la logique résistance-transistor, aux portes logiques, aux circuits intégrés, aux processeurs et à la programmation en assemblage. Beaucoup d'étudiants de ces classes n'avaient jamais programmé dans aucune langue auparavant et ils l'ont bien compris.

L'assemblage peut donc être un bon choix pour une première langue si les bonnes bases sont posées à l'élève. Pour quiconque dont le but est d'être un développeur d'applications ou Web, cependant, je pense que l'assemblage est probablement un point de départ trop bas.

Bill le lézard
la source
7

Une chose est sûre, si les gens, apprenant d'abord Assembly, réussissent, ils seront des programmeurs incroyables.

Cela me rappelle quand j'ai appris à conduire. Ma maman a insisté

Apprenez sur une voiture automatique jusqu'à ce que vous gagniez en confiance, puis vous pourrez conduire nos voitures manuelles.

Le raisonnement étant qu'elle ne voulait pas que je sois distrait avec plus que ce dont j'avais besoin, tout d'un coup.

Appliquez cela à l'apprentissage de la programmation, est-il nécessaire de tout jeter en même temps sur un apprenant? Ils apprennent ce qu'est une variable en même temps qu'ils apprennent combien de données ils peuvent stocker dans quel type de registre?

Plus de la moitié de ma classe a échoué à notre cours d'assemblage, et c'était un groupe de personnes qui, à cette époque, se considéraient comme connaissant la programmation depuis plus de 2 ans.

Ma préférence personnelle, si je devais tout réapprendre, serait de commencer par une langue qui fait autant que possible pour moi. Puis, au fur et à mesure que j'apprends, recule vers les langues de niveau inférieur.

CrazyPenguin
la source
1
Je pense que c'est un bon et bon conseil. À un moment donné, il est important de connaître les bits et les octets et ce que le processeur en fait, mais commencer par eux est une entreprise extrêmement inutile car nous avons des langages comme ruby ​​et python qui sont parfaits pour les débutants et encouragent d'excellents principes d'ingénierie logicielle.
davidk01
1
Avez-vous envisagé la possibilité que l'instructeur ait fait un travail moins qu'excellent pour enseigner le cours de langue d'assemblage?
John R. Strohm
Je pense qu'il a fait un travail incroyable.
CrazyPenguin
3

Est-ce une idée réaliste, du moins pour ceux qui sont prêts à faire l'effort supplémentaire?

Non

mais on aurait une bonne compréhension de la machine

Pourquoi est-ce avantageux? Pouvez-vous fournir un exemple ou un indice sur la façon dont cela pourrait être utile?

Avantages et inconvénients?

Avantages: aucun.

Désavantages:

  • Un encombrement d'anecdotes aléatoires sur les drapeaux et les états et registres et les schémas complexes d'adressage de la mémoire et les périphériques d'E / S et DMA et les interruptions et cycles d'horloge et autres. Aucun de ces éléments ne permet de comprendre les langages et les ordinateurs modernes basés sur des machines virtuelles.

  • Déconnexion de la résolution de problèmes réelle à laquelle les ordinateurs sont réellement appliqués.

  • Un divorce avec les utilisateurs finaux et les données pratiques et les problèmes de traitement qu'ils doivent résoudre.

  • Une série inutile d'explications sur la machine et la machine virtuelle, un compilateur et un interprète et toute la pile de tortues qui soutiennent le monde.

  • Beaucoup de détails "c'est l'implémentation physique d'un" objet "" dans le langage de niveau supérieur auquel ils parviennent finalement.

  • Beaucoup de détails "c'est ainsi que les fonctions de la méthode sont distribuées" dans le langage de niveau supérieur auquel elles parviennent finalement.

  • Beaucoup d'explications «cela ne s'applique pas au 80386 mais s'applique au chipset 80586».

  • Un grand nombre d'appels de bas niveau de l'API du système d'exploitation pour qu'un programme ASM fasse tout ce qui semble être utile à quelqu'un.

L'intérêt d'un premier langage de programmation n'est pas de maîtriser le chipset.

Le but d'un premier langage de programmation est de

  1. Comprenez comment penser l'informatique.

  2. Comprendre comment effectuer un traitement de données utile.

  3. Comprenez comment faire quelque chose. Conception - code - test.

S.Lott
la source
1
@ S.Lott - Bien sûr, ce n'est pas le but de ma question d'origine, mais il pourrait être avantageux de les avoir avant de passer aux langues de niveau supérieur. Ne vous méprenez pas, vous faites valoir un argument valable.
Anto
3
-1 Beaucoup de vos inconvénients, je considère les avantages. Il est préférable de savoir comment fonctionne le bas niveau avant de l'utiliser par le haut. Les fondations sont importantes.
Orbling
1
L'assembleur en tant que langage de programmation, vous expose beaucoup mieux à la structure des données, à la logique et à des fondations de plus bas niveau que les langages de niveau supérieur. Les deux ont une place, l'assembleur pourrait bien être plus simple à comprendre que les langages de niveau supérieur, à condition que vous n'essayiez pas de réaliser quelque chose de trop compliqué. Les gens ne devraient pas essayer de faire des choses complexes au début.
Orbling
4
L'avantage de l'assembleur est qu'il démontre le fonctionnement d'un véritable ordinateur. Tu sais. La chose sur laquelle tout fonctionne réellement .
Paul Nathan
1
@ S.Lott - Non, mais cela signifie que vous pouvez très bien utiliser la plupart des anciennes connaissances que vous avez rassemblées et ajouter de nouvelles connaissances au fil du temps. Regardez, les langages de haut niveau tels que Python sont livrés avec de nouvelles versions au fil du temps, mais les anciennes connaissances sont toujours utilisables (et en fait, Python a rompu la compatibilité descendante avec la v3)
Anto
3

Si j'étais chargé de concevoir un programme, j'aurais deux cours en même temps le premier semestre: asm + organisation / architecture informatique de base, et un cours basé sur SICP fondé à Scheme. Le second semestre serait orienté autour des structures de données et des algorithmes élémentaires dans Scheme.

La deuxième année serait un projet d'un an utilisant Delphi, C ++ ou C #, axé sur la conception de logiciels modernes (conception OO, conception fonctionnelle, génie logiciel, contrôle de version, etc.).

L'effet devrait être de donner une base intense à la fois dans l'abstrait et dans la pratique, menant à des cours approfondis en troisième et quatrième années.

Paul Nathan
la source
3

J'avais l'habitude de faire des cours d'initiation à l'informatique, et je pense que c'est une mauvaise idée.

  1. L'assemblage utilise à la fois la logique (si c'est le cas) et des traductions très difficiles entre les concepts et les nombres. Les étudiants d'Intro CS ont souvent du mal avec la logique (boucles, if / else, expressions booléennes), et doivent vraiment y faire face avant de se soucier également des nombres qui signifient quelles expressions logiques. L'utilisation de langages de niveau supérieur résume cette logique pour les étudiants qui n'ont jamais eu de raison de penser de cette façon auparavant.
  2. Les cours d'introduction CS ne sont pas nécessairement suivis uniquement par les majors CS qui continueront avec CS. Souvent, ils sont également pris par d'autres majors et non-majors de l'ingénierie qui ne font que "tourner" un sujet intéressant pour un cours au choix. L'assemblage est idéal pour une fondation pour les étudiants CS durs et engagés, mais ne donne pas un très bon aperçu de ce que la programmation est souvent pour les étudiants qui envisagent la majeure ou qui ne vont jamais prendre la majeure mais qui veulent une introduction au domaine ; il n'est pas non plus terriblement utile en soi dans la plupart des domaines.
  3. Les langages de niveau supérieur rendent le cœur du travail de programmation réel plus transparent. L'assemblage touche certains sujets fondamentaux - les concepts de base de la mémoire, les concepts de base des performances, etc. - mais n'entre pas vraiment dans la création d'une conception maintenable et lisible, ce qui est plus important de nos jours, IMO. Les premiers élèves semblent souvent avoir les idées à l'ancienne «Les vrais programmeurs écrivent du code que personne d'autre ne peut gérer», et enseigner un langage de niveau supérieur aide à enseigner que le codage est une tâche collaborative et pas seulement d'être brillant.

Cela dit, je pense que le matériel d'assemblage / informatique devrait être une classe très précoce - idéalement, le premier trimestre de la majeure. Demandez aux étudiants d'avoir un langage de haut niveau sous leur ceinture, puis passez immédiatement au matériel de bas niveau avant de passer aux structures de données - idéalement dans un langage qui nécessite une gestion de la mémoire.

Ethel Evans
la source
Très bien dit - je suis d'accord. Le premier cours doit aller droit au but, montrer l'utilité de bout en bout des compétences apprises et stimuler l'imagination: "Mon Dieu! Je peux programmer? Maintenant, que puis-je faire d'autre avec cette nouvelle compétence ..." Convenez également que le meilleur moment pour la langue d'assemblage est après une langue de niveau supérieur. Cela motive à regarder "sous le capot" la façon dont l'ordinateur comprend réellement les choses de niveau supérieur. Voir le langage d'assemblage pour la première fois après un langage de niveau supérieur laisse un autre impact puissant: l'étudiant rencontre l'électronique, les puces, les capteurs, etc.
Assad Ebrahim
3

L'assemblage était ma deuxième langue, juste après BASIC. Cependant, quand j'apprenais, c'était une autre époque. Mon Commodore 64 avait d'autres langues disponibles, mais si vous vouliez que quelque chose semble rapide, ou vouliez faire plus d'une chose à la fois, vous deviez apprendre le langage d'assemblage et comment travailler avec les interruptions. Le système d'exploitation de l'environnement graphique (GEOS) qui a donné au Commodore un système de fenêtrage était également entièrement assemblé. C'était dans l'ensemble la meilleure API d'assemblage que j'ai jamais vue. C'était également la seule plate-forme que j'utilisais pour styliser votre code. C'est vrai, vous pouvez utiliser l'italique et différentes tailles de police - quelque chose qui s'est avéré utile pour lire les commentaires.

J'ai beaucoup appris sur le fonctionnement du Commodore, mais la puce Motorolla avait un ensemble d'opcode très simple. Il n'est pas trop difficile de garder moins de 255 opcodes séparés les uns des autres. Je n'ai pas été en mesure de partager mon expérience sur la puce Motorolla 6510 avec la programmation pour Intel 8086. Les puces et les architectures système étaient trop différentes. J'imagine que j'aurais eu le même problème pour passer à la puce Motorolla 68000 d'Amiga également.

En bref, je suis en désaccord sans réserve avec tous ceux qui disent que l'Assemblée devrait être une bonne première langue. Voici pourquoi:

  • Vous n'avez aucune structure inhérente, aucun moyen commun de décomposer les fonctionnalités d'une application. C'est ce qui rend les langues de niveau supérieur si utiles.
  • Vous devez savoir des choses inutiles comme comment appeler correctement une méthode dans une bibliothèque. Lorsque la bibliothèque a été créée par C, cela signifie manipuler la pile (mieux vaut tout mettre dans le bon ordre), mais dans un autre langage, cela pourrait signifier définir des registres. Ce sont toutes des choses prises en charge par un compilateur ou un interprète - et vous ne pouvez pas les optimiser.
  • Votre code ne peut pas être utilisé sur une autre puce et il est très probable qu'il rompra avec une plate-forme matérielle différente.

De nos jours, le langage d'assemblage est utilisé pour accélérer certaines actions finies où l'assemblage artisanal serait plus rapide que l'assemblage généré par le compilateur. La structure principale de l'application se fait dans un langage de niveau supérieur comme C, C ++, etc. Bien sûr, la programmation d'assemblage deviendrait très importante si vous commencez à écrire des compilateurs. Combien d'entre nous le font?

Berin Loritsch
la source
1

J'ai pris l'assemblée dans ma dernière année de lycée. J'avais déjà pris des cours en Java, Pascal, C et C ++, et je n'étais compétent dans aucun d'entre eux et j'ai vraiment aspiré à l'Assemblée - était la seule personne à suivre le cours dans un programme d'apprentissage à distance au collège communautaire, m'a pris un mois ou deux avant que quiconque puisse même faire fonctionner le compilateur pour moi.

Je ne pense pas qu'il soit nécessaire ou sage d'apprendre le langage d'assemblage en premier, mais il est judicieux d'apprendre ce qu'ils vous apprennent au cours des premières semaines d'assemblage, sur le fonctionnement du processeur et certaines des astuces de débogage. Ce truc que j'ai trouvé très intéressant et instructif en tant que néophyte.

Peter Turner
la source
0

Je ne vois pas pourquoi cela ne pourrait pas être fait, bien que la qualité d'une idée dépende totalement de la foule que vous lui enseigneriez également. Quelqu'un dont l'objectif final est d'être un développeur Web s'ennuierait probablement et pourrait quitter car cela ne lui donnerait pas la satisfaction immédiate de créer quelque chose que Python, Ruby, etc. S'ils veulent éventuellement travailler sur du matériel ou d'autres projets de bas niveau, je pense que ce serait un bon début (à condition que vous donniez suffisamment de fond d'architecture informatique pour que cela ait du sens). Je pense que cela pourrait aider les gens à écrire un meilleur code à l'avenir, bien que je pense que ce serait plus difficile que d'apprendre d'autres langues pour commencer.

Jetti
la source
0

Je pense que le langage d'assemblage n'aura de sens que si vous vous concentrez sur des choses comme:

  • Techniques de gestion de la mémoire
  • HW IO (en particulier les défis liés au timing et aux performances)
  • Fonctions CPU - en particulier, fonctions de sécurité

Sans accent dans ce domaine, c'est juste un langage simpliste qui aura tendance à enseigner les mauvaises habitudes d'organisation. Le codage au niveau de la machine est bien d'avoir dans la trousse à outils pour savoir comment les choses fonctionnent, mais ce n'est pas une bonne langue maternelle.

Je voudrais obtenir quelqu'un intéressé par une langue de niveau supérieur. Ensuite, enseignez le C ++; puis assemblage en mettant l'accent sur la façon dont les compilateurs C ++ génèrent du code assembleur. Comprendre les v-tables et d'autres fonctionnalités de langage de niveau supérieur aidera grandement le développeur à réfléchir au fonctionnement réel des langues plutôt que de simplement classer les informations sous «magie».

Jim Rush
la source