Pourquoi avons-nous besoin d'un langage d'assemblage?
Eh bien, il n'y a en fait qu'une seule langue dont nous aurons besoin , appelée "langage machine" ou "code machine". Cela ressemble à ceci:
0010000100100011
C'est la seule langue que votre ordinateur peut parler directement. C'est la langue parlée par un CPU (et techniquement, différents types de CPU parlent des versions différentes). Ça craint aussi de regarder et d'essayer de comprendre.
Heureusement, chaque section de binaire correspond à une signification particulière. Il est divisé en plusieurs sections:
0010|0001|0010|0011
operation type source register other source destination register
0010 0001 0010 0011
Ces valeurs correspondent à:
operation type 0010 = addition
source register 0001 = register 1
other source 0010 = register 2
destination register 0011 = register 3
Donc, cette opération ajouterait les nombres dans les registres 1 et 2 et mettrait cette valeur dans le registre 3. Si vous placez littéralement ces valeurs dans un CPU et lui dites "go", cela ajoutera deux nombres pour vous. L'opération "soustraire" pourrait être un 0011 ou quelque chose, au lieu de 0010 ici. Quelle que soit la valeur, le CPU fera une soustraction.
Donc, un programme pourrait ressembler à ceci (n'essayez pas de le comprendre, car j'ai créé cette version particulière du code machine pour expliquer les choses):
instruction 1: 0010000100100011
instruction 2: 0011000110100100
instruction 3: 0101001100010111
instruction 4: 0010001001100000
Est-ce que ça craint de lire? Absolument. Mais nous en avons besoin pour le CPU . Eh bien, si chaque code machine correspond à une action particulière, faisons simplement un raccourci "anglais", puis une fois que nous comprenons ce que fait le programme, convertissez-le en vrai code machine binaire et donnez-le au CPU pour qu'il s'exécute.
Ainsi, nos instructions d'origine ci-dessus pourraient ressembler à:
(meaning) operation type source register other source destination register
(machine code) 0010 0001 0010 0011
("English") add r1 r2 r3
Notez que cette version anglaise a une correspondance exacte avec le code machine . Ainsi, lorsque nous écrivons une ligne de cet «anglais», nous écrivons vraiment un code machine plus convivial et plus compréhensible.
Eh bien, c'est du langage d'assemblage. C'est pourquoi il existe et pourquoi il a été créé à l'origine.
Pour comprendre pourquoi nous en avons besoin maintenant, lisez les réponses ci-dessus, mais la clé à comprendre est la suivante: les langages de haut niveau n'ont pas une seule représentation est le code machine. Par exemple en C, ou Python, ou autre:
z = x + y
Cela ressemble à notre ajout ci-dessus, en supposant qu'il x
est dans le registre 1, y
est dans le registre 2 et z
devrait se retrouver dans le registre 3. Mais qu'en est-il de cette ligne?
z = x * 2 + (y / 6) * p + q - r
Essayez de représenter cette ligne en 16 bits de binaire et de dire à un CPU "go". Tu ne peux pas. Le code machine n'a pas d'instruction d'opération unique pour effectuer une addition, une soustraction et quoi que ce soit d'autre avec 4 ou 5 variables à la fois. Il doit donc d'abord être converti en une séquence de code machine. C'est ce que vous faites lorsque vous "compilez" ou "interprétez" un langage de haut niveau.
Eh bien, nous avons des programmes pour le faire, alors pourquoi avons-nous besoin d'assemblage maintenant? Disons que votre programme s'exécute plus lentement que prévu et que vous voulez savoir pourquoi. En regardant la "sortie" en langage machine de cette ligne, cela pourrait ressembler à ceci:
1010010010001001
0010001000010000
0110010000100100
0010001011000010
0010100001000001
0100010100000001
0010010101000100
0010101010100000
0000100111000010
Juste pour faire une seule ligne de Python. Donc vous voulez vraiment déboguer ça?!?!?! Non . Au lieu de cela, vous demandez à votre compilateur de bien vouloir vous fournir le résultat sous la forme que vous pouvez réellement comprendre facilement, qui est la version du langage d'assemblage correspondant exactement à ce code machine. Ensuite, vous pouvez déterminer si votre compilateur fait quelque chose de stupide et essayer de le réparer.
(Remarque supplémentaire sur les conseils de @ Raphael: vous pouvez réellement construire des processeurs qui fonctionnent avec des choses autres que les codes binaires, comme les codes ternaires (base 3) ou décimaux, ou même ASCII. Pour des raisons pratiques, nous avons vraiment collé au binaire.)