パンチャーがパンチテープを次々と穴をあけて何時間も突き刺したことを覚えているなら、この記事はあなたにぴったりです!カットの下でようこそ!:)
Lasciate ogni speranza、voi ch'entrate
-Dante Alighieri、La Divina Commedia
EDSAC-「ElectronicDelayStorage Automatic Calculator」は、軍事目的で1949年にケンブリッジで作成されました。現在は忘却の中で、彼らはサンクトペテルブルク州立大学の娘であるあまり知られていないアルママーターのN番目の州での教育目的でのみ彼を覚えています。 EDSACレプリカプロジェクト
もあります 。このプロジェクトでは、強力な愛好家がエミュレーターとEDSACガイドを作成して、この驚くべきデバイスのメモリを保持しています。
EDSACの優れた機能の1つは、概念的には非常に単純なマシンであるということです。
-EDSACシミュレータのチュートリアルガイド
drynduletは次のようになります。
図1.1。-EDSACシミュレーターを間近で。
図1.2。-EDSACシミュレーターを離れて。 こちらから
ダウンロードできます。
左側には、手順のテキストエディタが表示されます。命令には、初期注文1(以下、IO1)と初期注文2(メガアドバンス)の2種類があります。エディターは、変更された行を黄色、緑色、つまり保存された行で強調表示します。コメントは[]で囲まれています。エディタには数ステップ前のメモリがあるため、Ctrl + Zを押してプログラムをロールバックできます。これはすべて、以前はパンチテープで入力されていました。これはリメイクです。IO1の最初の命令はTNSです。ここで、Nは命令+1の最後の行のアドレスです。最も単純なEDSACプログラムは次のとおりです。
リスト1.-最も単純なプログラムであるEDSAC注文コード。
T32S
彼女は何もしません。
ちなみに、デフォルトではシミュレータはIO2に設定されており、IO1に切り替えるには、EDSAC-> IO1のトップパネルをクリックします。これは、[スタート]ボタンで開始し、[停止]、[シングルEP]で停止します。ステップバイステップのデバッグです。このため、最初にZ0S / ZS / Z0F / ZFを書き込む必要があります。
右側には、シミュレータとコンピュータメモリの内容が表示されます。単語は17ビットで合計1024個のメモリセル(または35ビットで512個のメモリセルの方が便利です。真ん中には不思議な 「サンドイッチ桁」があります))。アキュムレータ(RAM)、71ビット、および35ビットの乗算レジスタもあります。シミュレータは、ディスク電話の入力、印刷をサポートしています。 ヒントをオンにするには、マウスでそれらの上にマウスを移動することによって、メモリセルの内容を見ることができます。10CCの数字が上部に表示されます。アキュムレータと乗算レジスタの内容を表示することもできます。
図2.-マシンワードのフォーマット。
図3.-機械命令のフォーマット。
数字について。数値は、PNSまたはPNLという命令を使用して2の補数でメモリに書き込まれます。ここで、Nは2の前の因数です。たとえば、P0S = 2 * 0 + 0 = 0、P0L = 2 * 0 + 1 = 1、P1S = 2、P1L = 3などです。負の数は補数コードで記述されています。これについては、チュートリアルで読むことができます 。 EDSACは小数でも機能します。ショートワードシンボルS(IO2の場合はF)およびL(D)。数字だけでなく、説明書もこれに応じて意味が変わります。 メイン
ガイドと 省略ガイドの2つのガイドがありますが、
それらで指定されたコードを機能させるには、ZOS / ZS / Z0F / ZFの最初の行をX0S / X0Fに置き換える必要があります。そこにある手順、またはすでにコードへのコメントにある手順を参照してください。
数ヶ月の間に、10進印刷手順の多くのバージョンが作成されました。プログラマーが不可解に愚かだった場合、または完全な馬鹿で完全な敗者だった場合、変換ルーチンは彼から約100の命令を受け取ります。しかし、彼の名前に値するハッカーなら誰でも、それをより少ないスペースに収めることができます。最終的に、ある場所から別の場所に交互に命令を削除することにより、手順は約50の命令に削減されました。
-スティーブンレヴィ、ハッカー:コンピューター革命の英雄
それで、私の仕事はパスカルの三角形のn番目の線を印刷するプログラムを書くことでした。
リスト2.-Kotlin、パスカルの三角形の3行目を出力します。
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
}
}
分割は手動で行う必要があるため、ここにはネストされたループがあります。
リスト3.-EDSAC注文コード、整数除算、切り捨て。
[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 [ ]
お気づきかもしれませんが、アドレス指定は絶対的なものであり、
最後に解決策:
リスト4.-EDSAC注文コード、IO1、パスカルの三角形のn行目。
[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, ]
IO2について何が言えますか?サブルーチン、相対アドレス指定、拡張コマンドセットをサポートします。
IO2の同じプログラム:
リスト5.-EDSAC注文コード、IO2、パスカルの三角形のn番目の行。
..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 [ ]
図4.-指標= 5の結論。
この記事を楽しんでいただき、プログラミングの起源に精通していることを願っています。このようなコードを書くと、後で登場するすべてのレベルの抽象化に感謝し始め、プログラミング言語がどのように長い道のりを経てそれらが何であるかを理解します。お時間をいただきありがとうございます!
PS N州の親愛なる友人、私と同じバージョンをお持ちの場合は、私から提供されたコードに感謝しません。RISC-Vで頑張ってください!
EDSACIO2のPPS優れたコード例を ここに示します。
PPPSコードは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.