Si vous vous souvenez comment un perforateur a percé un ruban perforé, un trou après l'autre, pendant de nombreuses heures, alors cet article est pour vous! Bienvenue sous la coupe! :)
Lasciate ogni speranza, voi ch'entrate
- Dante Alighieri, La Divina Commedia
EDSAC - "Electronic Delay Storage Automatic Calculator", a été créé à Cambridge en 1949 à des fins militaires. Désormais dans l'oubli, ils ne se souviennent de lui qu'à des fins éducatives dans la N-ième province de la peu connue Alma Mater, fille de l'Université d'État de Pétersbourg.
Il y a aussi le projet de réplique EDSAC , où un groupe puissant de passionnés crée un émulateur et des guides EDSAC pour préserver la mémoire de cet appareil étonnant.
L'une des caractéristiques les plus intéressantes de l'EDSAC est qu'il s'agit d'une machine très simple sur le plan conceptuel.
- Guide didactique du simulateur EDSAC
Le dryndulet ressemble à ceci:
Fig 1.1. - Simulateur EDSAC de près.
Fig 1.2. - Simulateur EDSAC loin.
Vous pouvez le télécharger ici .
Sur la gauche, vous pouvez voir un éditeur de texte pour obtenir des instructions. Il existe deux types d'instructions: les commandes initiales 1 (ci-après IO1) et les commandes initiales 2 (méga avancées). L'éditeur met en évidence la ligne modifiée en jaune, vert - celles enregistrées. Les commentaires sont placés entre []. L'éditeur a une mémoire de plusieurs pas en arrière, vous pouvez donc restaurer le programme en appuyant sur Ctrl + Z. Tout cela était tapé sur du ruban perforé, c'est un remake. La première instruction dans IO1 est TNS, où N est l'adresse de la dernière ligne avec l'instruction + 1. Le programme EDSAC le plus simple est:
Listing 1. - Code de commande EDSAC, le programme le plus simple.
T32S
Elle ne fait rien.
Au fait, par défaut, le simulateur est réglé sur IO2, pour le basculer sur IO1, cliquez sur le panneau supérieur d'EDSAC -> IO1. Il est démarré par le bouton Démarrer, arrêté par Stop, Single EP - débogage pas à pas, pour cela, vous devez d'abord écrire Z0S / ZS / Z0F / ZF.
Sur la droite, vous pouvez voir le simulateur et le contenu de la mémoire de l'ordinateur. Les mots sont 17 bits, un total de 1024 cellules de mémoire (ou 35 bits, 512 cellules de mémoire, car ce sera plus pratique, au milieu il y a un mystérieux "sandwich-digit"). Il existe également un accumulateur (RAM) de 71 bits et un registre de multiplication de 35 bits. Le simulateur prend en charge l'entrée de téléphone à disque, l'impression. En activant les astuces , vous pouvez consulter le contenu des cellules mémoire en les survolant avec la souris. Un numéro en 10CC apparaîtra en haut. Vous pouvez également afficher le contenu de l'accumulateur et du registre de multiplication.
Fig 2. - Format d'un mot machine.
Fig 3. - Format des instructions de la machine.
À propos des nombres. Le nombre est écrit en mémoire en complément à deux à l'aide de l'instruction: PNS ou PNL, où N est un facteur avant deux. Par exemple, P0S = 2 * 0 + 0 = 0, P0L = 2 * 0 + 1 = 1, P1S = 2, P1L = 3, etc. Les nombres négatifs sont écrits en code complémentaire, vous pouvez lire à ce sujet dans le tutoriel . EDSAC fonctionne également avec des nombres fractionnaires. Symbole de mot court S (F pour IO2) et L (D). Non seulement les chiffres, mais aussi les instructions changent de signification en fonction de cela.
Il y a quelques guides, le principal et le raccourci , je recommande le dernier car il y a
Pour faire fonctionner le code qui y est donné, vous devez remplacer la première ligne de ZOS / ZS / Z0F / ZF par X0S / X0F. Voir les instructions là-bas, ou déjà dans les commentaires du code.
Au cours de plusieurs mois, de nombreuses versions de la procédure d'impression décimale ont été produites. Si le programmeur était incroyablement stupide, ou était un idiot complet et un perdant complet, alors la routine de conversion lui prendrait une centaine d'instructions. Mais tout pirate informatique digne de ce nom pourrait l'intégrer dans moins d'espace. Au final, en supprimant alternativement les instructions d'un endroit à un autre, la procédure a été réduite à une cinquantaine d'instructions.
- Stephen Levy, Hackers: Heroes of the Computer Revolution
Donc, ma tâche était d'écrire un programme pour imprimer la n-ième ligne du triangle de Pascal.
Listing 2. - Kotlin, sortie de la 3ème ligne du triangle de Pascal.
fun main(args: Array<String>) {
var a = 1
var row = 3
row += 1
for (i in 1..row) {
print(a)
print(" ")
a = a * (row - i) / i
}
}
Il y aura une boucle imbriquée ici, car la division doit être faite manuellement.
Listing 3. - Code de commande EDSAC, division entière, arrondi vers le bas.
[31] T56S
[32] E37S [ ]
[33] P3L [ = 5]
[34] P1L [ = 2]
[35] P0S [ , 0]
[36] P0L [1]
[37] A35S [ ]
[38] T2S [ 2 ]
[39] A33S [ ]
[40] T1S [ 1 ]
[41] A1S [ ]
[42] S34S [ ]
[43] T1S [ 1]
[44] A2S [ ]
[45] A36S [ 1]
[46] T2S [ 1 ]
[47] A1S [ ]
[48] G50S [ < 0, ]
[49] T1S [ ]
[50] E41S[ ]
[51] T0S [ ]
[52] A2S [ ]
[53] S36S [ 1]
[54] T2S [ ]
[55] Z0S [ ]
Comme vous l'avez peut-être remarqué, l'adressage est absolu, ce qui provoque des
Enfin la solution:
Listing 4. - Code commande EDSAC, IO1, nième ligne du triangle de Pascal.
[31] T154S [ +1]
[32] E84S [ 84 , ]
[33] PS [ ]
[34] PS [ ]
[35] P10000S [ , 10, 10^4]
[36] P1000S [ , 10, 10^3]
[37] P100S [ , 10, 10^2]
[38] P10S [ , 10, 10^1]
[39] P1S [ , 10, 10^0]
[40] QS [ ]
[41] #S [ ]
[42] A40S [ ]
[43] !S [ ]
[44] &S [ ]
[45] @S [ ]
[46] O43S [ ]
[47] O33S [ 10]
[48] PS [ ]
[49] A46S [ 46 ]
[50] T65S [ 65, ]
[51] T300S [ ]
[52] A35S [ 35, 10000<<1]
[53] T34S [ 34, ]
[54] E61S [ >= 0, 61]
[55] T48S [ 48, ]
[56] A47S [ 47 ]
[57] T65S [ 65, ]
[58] A33S [ 33 ]
[59] A40S [ 40 ]
[60] T33S [ 33, ]
[61] A48S [ 48 ]
[62] S34S [ ]
[63] E55S [ >= 0, , 55]
[64] A34S [ 34 ]
[65] PS [ , ]
[66] T48S [ 48, ]
[67] T33S [ 33,
]
[68] A52S [ 52 ]
[69] A4S [ 1]
[70] U52S [ 52]
[71] S42S [ ]
[72] G51S [ < 0, 51 ]
[73] A103S [ 103 ]
[74] T52S [ 52, ]
[75] PS [ ]
[76] PS [ ]
[77] PS [const = 0]
[78] PS [const = 0]
[79] PS [const = 0]
[80] E100S [ 100]
[81] E104S [ 104]
[82] P5S [ , P S,
10]
[83] E123S [ , 123]
[84] A110S [ 2]
[85] T30S [ 30, ]
[86] O41S [ ]
[87] T300S [ ]
[88] O44S [ ]
[89] O44S [ ]
[90] A76S [ ]
[91] A4S [ 1]
[92] T76S [ , ]
[93] E113S [ 113]
[94] T300S [ ]
[95] A30S [ 30 , ]
[96] T48S [ 48, ]
[97] A80S [ 80]
[98] T75S [ 75 , ]
[99] E49S [ ]
[100] A81S [ 81]
[101] T75S [ 75, ]
[102] E49S [ ]
[103] A35S [ ]
[104] A76S [ 76]
[105] S82S [ ]
[106] S110S [ 2]
[107] G87S [ <0, 87]
[108] X0S [ ]
[109] ZS [ , ]
[110] P1S [const = 2]
[111] P2S [const = 4]
[112] P0L [const = 1]
[113] T300S [ ]
[114] A76S [ 76 ]
[115] S111S [ 111 , 4]
[116] E124S [ >=0, 124 ]
[117] T300S [ ]
[118] A30S [ 30 ]
[119] T48S [ 48, , ]
[120] A83S [ 83]
[121] T75S [ 75 ]
[122] E49S [ ]
[123] O44S [ ]
[124] O44S [ ]
[125] T300S [ ]
[126] A82S [ ]
[127] A110S [ 2]
[128] S76S [ ]
[129] T29S [ 29, ]
[130] H29S [ 29 ]
[131] V30S [ 30 , ]
[132] L64S [ 8 ]
[133] L32S [ 7 ]
[134] T30S [ 30 ]
[135] T2S [ 2, ]
[136] A30S [ 30]
[137] T1S [ 1 , ]
[138] A1S [ 1, ]
[139] S76S [ 76]
[140] T1S [ 1, ]
[141] A2S [ 2]
[142] A110S [ 1 110]
[143] T2S [ 1 2, ]
[144] A1S [ 1]
[145] G147S [ < 0, , 147]
[146] T1S [ 1, ]
[147] E138S[ >= 0, , 138 , ]
[148] T300S [ ]
[149] A2S [ 2]
[150] S110S [ 1 110]
[151] U2S [ 2]
[152] T30S [ 30, ]
[153] E94S [ 94, ]
Que puis-je dire sur IO2? Prend en charge les sous-programmes, l'adressage relatif, le jeu de commandes étendu.
Le même programme sur IO2:
Listing 5. - Code commande EDSAC, IO2, nième ligne du triangle de Pascal.
..PK
T56K
[P6, ]
GKA3FT25@H29@VFT4DA3@TFH30@S6@T1F
V4DU4DAFG26@TFTFO5FA4DF4FS4F
L4FT4DA1FS3@G9@EFSFO31@E20@J995FJF!F
..PZ
[ n- ]
GK [ ]
[0] XF [ , ]
[1] O34@ [ , 34]
[2] O35@ [ , 35]
[3] O36@ [ , 36]
[4] TF [ ]
[5] A27@ [ 27 ]
[6] TF [ 0 , ]
[7] A7@ [ ]
[8] G56F [ P6]
[9] T20@ [ 20 ]
[10] A28@ [ ]
[11] A31@ [ 1]
[12] U28@ [ 28]
[13] T20@ [ 20, ]
[14] A33@ [ ]
[15] A31@ [+1]
[16] S28@ [ 28]
[17] T20@ [ 20, ]
[18] E37@ [ , 37]
[19] PD [const = 1]
[20] XF [ ]
[21] XF [ ]
[22] A33@ [ 33 ]
[23] A31@ [+1]
[24] S28@ [ 28 , ]
[25] E2@ [ >= 0, , 2]
[26] ZF [ , ]
[27] PD [ ]
[28] PF [ ]
[29] PD [ ]
[30] PD [ ]
[31] PD [const = 1]
[32] P1F [ ]
[33] P2D [ , EDSAC]
[34] #F [ ]
[35] @F [ ]
[36] &F [ ]
[37] H20@ [ 20 ]
[38] V27@ [ 27 , ]
[39] L1024F [ 12 ]
[40] L4F [ 4 ]
[41] T20@ [ 20 , ]
[42] T102@ [ 102, ]
[43] A20@ [ 20]
[44] T101@ [ 101 , ]
[45] A101@ [ 101, ]
[46] S28@ [ 28]
[47] T101@ [ 101, ]
[48] A102@ [ 102]
[49] A31@ [ 1 31]
[50] T102@ [ 1 102, ]
[51] A101@ [ 101]
[52] G54@ [ < 0, , 54]
[53] T101@ [ 101, ]
[54] E45@ [ >= 0, , 45 , ]
[55] T200@ [ ]
[56] A102@ [ ]
[57] S31@ [ 1 102]
[58] U102@ [ 102]
[59] T27@ [ 27, ]
[60] E22@ [ 22, ]
[61] EZPF [ ]
Fig 4. - Conclusion pour l'indicateur = 5.
J'espère que vous avez apprécié cet article et que vous êtes imprégné des origines de la programmation. Lorsque vous écrivez un tel code, vous commencez à apprécier tous ces niveaux d'abstraction qui sont apparus plus tard, vous comprenez le long chemin parcouru par le langage de programmation pour devenir ce qu'ils sont. Merci pour votre temps!
PS Chers amis de la province de N, non merci pour le code aimablement fourni par moi, si vous avez la même version que moi. Bonne chance avec RISC-V!
PPS D'excellents exemples de code pour l'EDSAC IO2 sont fournis ici .
Le code PPPS est publié sous la licence MIT.
Copyright 2021, ALEKSEI VASILEV
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the «Software»), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED «AS IS», WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the «Software»), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED «AS IS», WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.