Comment le premier compilateur a-t-il été écrit?

166

J'ai entendu parler de la poule et de l'œuf et du bootstrap. J'ai quelques questions.

Qu'est-ce qui a écrit le premier compilateur qui a converti quelque chose en instructions binaires?

L'assembly est-il compilé ou traduit en instructions binaires?

... J'aurais du mal à croire qu'ils ont écrit un compilateur en binaire.

Shawn Mclean
la source
@nawfal, c'est une différence entre un nouveau langage de programmation et le premier compilateur, donc non - ce n'est pas un doublon
@PauliSudarshanTerho quelle est la différence? L'esprit des questions est le même. Vous ne pouvez pas écrire un langage de programmation, cette question parle à son tour du premier compilateur.
nawfal
Dans votre imagination spirituelle peut-être? En réalité, vous ne trouvez rien de mentionné sur le premier compilateur dans ce lien. Et vous ne devriez pas conseiller à quiconque écrivant une nouvelle langue de partir de zéro. Et si oui, pourquoi voudriez-vous cacher les réponses sur la façon dont le premier compilateur est écrit si c'est important pour écrire un nouveau langage?
Apprenez de moi - Ceci est un doublon: stackoverflow.com/questions/4772768/…

Réponses:

133

Les instructions d'assemblage sont (généralement) une correspondance directe avec les opcodes, qui sont des valeurs (multi-) octets de code machine qui peuvent être directement interprétées par le processeur. Il est tout à fait possible d'écrire un programme en opcodes directement en les recherchant dans une table (telle que celle-ci pour le microprocesseur 6039 , par exemple) qui les répertorie avec les instructions d'assemblage correspondantes, et en déterminant manuellement les adresses / décalages de mémoire pour les choses comme des sauts.

Les premiers programmes ont été réalisés exactement de cette manière - des opcodes écrits à la main.

Cependant, la plupart du temps, il est plus simple d'utiliser un assembleur pour «compiler» le code d'assemblage, qui effectue automatiquement ces recherches d'opcode, en plus d'être utile pour calculer les adresses / décalages pour les étiquettes de saut nommées, et cetera.

Les premiers assembleurs ont été écrits à la main. Ces assembleurs pourraient ensuite être utilisés pour assembler des assembleurs plus compliqués, qui pourraient ensuite être utilisés pour assembler des compilateurs écrits pour des langages de plus haut niveau, et ainsi de suite. Ce processus d'écriture itérative des outils pour simplifier la création du prochain ensemble d'outils est appelé (comme l'a mentionné David Rabinowitz dans sa réponse) bootstrapping .

ambre
la source
18
Mon premier ordinateur était une machine basée sur le Z80 sur le moniteur ROM duquel je devais assembler à la main un chargeur d'amorçage pour faire apparaître les bases d'un système d'exploitation (CP / M) afin que je puisse assembler le reste dudit système d'exploitation dans un système de travail. , avec un chargeur d'amorçage sur disque. Des moments de plaisir. Alors oui, vous pouvez très bien assembler à la main. C'est lent, douloureux et sujet aux erreurs (c'est pourquoi nous avons automatisé les choses) mais c'est possible.
JUSTE MON OPINION correcte
Le premier lien est rompu.
Luke
Écrit à la main. Comment? Câblage ou cartes perforées? Je suppose qu'ils avaient des claviers hexadécimaux.
44

Veuillez lire sur le démarrage du compilateur et l'historique de l'écriture du compilateur

L'idée est d'écrire un compilateur très simple directement dans le code machine, de l'utiliser pour écrire un compilateur plus sophistiqué, d'utiliser le second pour en créer un troisième et ainsi de suite jusqu'à ce que vous puissiez avoir un compilateur complet.

David Rabinowitz
la source
36

Les œufs ont longtemps précédé les poulets. La réponse à la plupart des problèmes «de la poule et de l'œuf» est la même: l'évolution. Certaines personnes ont également du mal à croire en l'évolution biologique, mais l'incrédulité n'est pas un argument (google argumentum ad ignorantiam).

Pour répondre directement à votre question: le premier compilateur a été écrit (par un humain) dans un langage d'assemblage - un programme appelé assembleur traduirait le langage d'assemblage en binaire; il s'agit d'un processus beaucoup plus simple que la compilation car le langage assembleur n'est qu'une forme symbolique de langage machine qui utilise des noms d'opcode au lieu de nombres, représente des adresses avec des symboles, etc. De nombreux compilateurs ultérieurs ont également été écrits dans un langage d'assemblage. Mais le premier compilateur C était un compilateur B modifié, qui a été écrit en B . Le premier compilateur B a été écrit en TMG . Le compilateur TMG utilisé pour compiler ce compilateur B a été écrit en langage d'assemblage PDP-7.

Jim Balter
la source
24

Woz a déclaré dans l'un de ses discours publics que lorsqu'il a commencé, il ne pouvait pas se permettre un compilateur, il a donc compilé en binaire à la main sur papier. Si vous voulez voir quelque chose d'encore plus sauvage, lisez les conditions dans lesquelles Bill Gates et Paul Allen ont écrit le BASIC pour l'Altair 8800.

En ce qui concerne «écrire un ordinateur en binaire», prenez du recul par rapport au programmeur et pensez à ce qu'étaient les premiers ordinateurs. Les trucs de haut niveau n'existaient pas encore - vous avez pensé à tout dans le bas niveau parce que c'était tout ce que c'était. Vous aviez du matériel capable de faire de la logique et de l'arithmétique de base que vous manipuliez via le code machine (qui est juste un assemblage compilé - Amber explique pourquoi cette partie n'est pas difficile à faire à la main) et vous vouliez que ce matériel effectue certains exploits mathématiques. Vous ne vous êtes pas inquiété du système d'exploitation inexistant, vous venez de dire au matériel (en assemblage) comment manipuler les nombres que vous lui donnez. C'était juste une grosse calculatrice. L'ordinateur d'aujourd'hui a été construit une abstraction à la fois.

Si vous voulez briser la barrière qui maintient les ordinateurs comme de la magie, je vous recommande vivement de lire CODE de Charles Petzold et / ou The Elements of Computing Systems . Avec juste une connaissance de base de la programmation, ces livres merveilleusement accessibles vous permettront de comprendre les ordinateurs de haut en bas. De toute évidence, on ne peut pas obtenir de comp. sci. ou diplôme d'EE après seulement 2 livres, mais je peux dire en tant que programmeur autodidacte qui a raté la formation formelle: ces livres ont secoué mon monde!

Dinah
la source
2
Rédaction de l'interprète Altair BASIC après avoir fait le pitch de vente? Coder le bootstrapper lors du trajet en avion pour Albuquerque? Cela semble ridicule. Et amusant.
Ehtesh Choudhury
2
@Shurane: ha! Ces points sont également pertinents, mais pour moi, la façon dont ils ont créé l'interprète BASIC et la façon dont le groupe l'a entassé dans le petit espace est une chose de beauté et une capacité de programmation / hackers étonnante.
Dinah
10

Qu'est-ce qui a écrit le premier compilateur qui a converti quelque chose en instructions binaires?

Un humain l'a fait. En savoir plus sur le système A-0 :

En 1952, Grace Hopper a terminé son premier compilateur pour Sperry, connu sous le nom de A-0. Le système A-0 était un ensemble d'instructions capables de traduire du code mathématique symbolique en langage machine. En produisant A-0, elle a pris tous les sous-programmes qu'elle avait collectés au fil des ans et les a mis sur bande. Chaque routine a reçu un numéro d'appel, afin que la machine puisse le trouver sur la bande. «Tout ce que j'avais à faire était d'écrire un ensemble de numéros d'appel, de laisser l'ordinateur les trouver sur la bande, de les apporter et de faire les ajouts. C'était le premier compilateur», comme décrit par Grace.

Sinan Ünür
la source
1
Le lien semble être 404 en ce moment, en tout cas, "Grace" ci-dessus est Grace Hopper.
Volker Stolz
2
J'ai entendu dire que Hopper a écrit le premier compilateur, mais la description ci-dessus le fait ressembler davantage à un éditeur de liens qu'à un compilateur. Pourtant, bonne histoire. C'est incroyable de penser qu'il fut un temps où les informaticiens étaient sceptiques quant à l'idée des compilateurs ...
Mark E. Haase
1
@mehaase c'est pourquoi on l'appelle "compilateur". il fait une compilation de routines, dont chacune est (potentiellement) écrite directement en langage machine.
Elazar le
@ MarkE.Haase Les personnes auxquelles Hopper fait référence ici étaient des ingénieurs d'application et des scientifiques utilisant des ordinateurs pour des tâches de calcul spécifiques; ils n'étaient pas des "informaticiens". Il y avait une poignée de cybernéticiens en 1952, mais je doute qu'elle ait parlé à l'un d'entre eux.
Jim Balter
9

Les premiers programmes ont été écrits en code machine (pas en langage d'assemblage) - des nombres réels connectés à la mémoire de l'ordinateur à l'aide de commutateurs. Nous avons parcouru un long chemin ...

Parfois, cela se produit encore dans une petite mesure - pour patcher de petits morceaux de code ou créer des thunks. Je me souviens avoir tapé des nombres dans des chaînes de base qui étaient ensuite exécutées comme de petits sous-programmes rapides sur les premiers micros. Je me souviens également d'avoir basculé les commutateurs sur le panneau avant d'un PDP-11 pour entrer un programme de chargeur de démarrage dans sa mémoire pour un cours universitaire.

Ces programmes étaient parfois utilisés pour traiter des fichiers texte afin de créer d'autres programmes, et voila des langages de programmation ont été créés.

Michael Burr
la source
La question concerne le premier compilateur, pas les premiers programmes en général, bien que les programmes soient parfois des compilateurs; l'histoire des deux n'est pas la même. (Une analogie: la réponse à la question de savoir quand les premiers animaux sont apparus sur Terre n'est pas la réponse à la question de savoir quand les premiers chats sont apparus sur Terre, bien que les chats soient des animaux.)
Jim Balter