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.
compiler-construction
machine-instruction
Shawn Mclean
la source
la source
Réponses:
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 .
la source
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.
la source
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.
la source
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!
la source
Un humain l'a fait. En savoir plus sur le système A-0 :
la source
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.
la source