Jika Anda ingat bagaimana pelubang menembus selotip berlubang, satu lubang demi satu, selama berjam-jam, maka artikel ini cocok untuk Anda! Selamat datang di bawah potongan! :)
Lasciate ogni speranza, voi ch'entrate
- Dante Alighieri, La Divina Commedia
EDSAC - "Electronic Delay Storage Automatic Calculator", dibuat di Cambridge pada tahun 1949 untuk keperluan militer. Sekarang terlupakan, mereka mengingatnya hanya untuk tujuan pendidikan di provinsi N-th di Alma Mater yang kurang terkenal, putri dari Universitas Negeri Petersburg.
Ada juga Proyek Replika EDSAC , di mana sekelompok penggemar yang kuat membuat emulator dan panduan EDSAC untuk menjaga memori perangkat luar biasa ini.
Salah satu fitur yang lebih baik dari EDSAC adalah mesin yang secara konseptual sangat sederhana.
- Panduan Tutorial untuk EDSAC Simulator
Dryndulet terlihat seperti ini:
Gambar 1.1. - Simulator EDSAC dari dekat.
Gambar 1.2. - Simulator EDSAC pergi.
Anda bisa mendownloadnya disini .
Di sebelah kiri Anda dapat melihat editor teks untuk instruksi. Ada dua jenis instruksi: Pesanan Awal 1 (selanjutnya IO1) dan Pesanan Awal 2 (mega lanjutan). Editor menyoroti garis yang diubah dengan warna kuning, hijau - yang disimpan. Komentar dilampirkan dalam []. Editor memiliki memori beberapa langkah mundur, sehingga Anda dapat memutar kembali program dengan menekan Ctrl + Z. Semua ini dulu diketik di pita berlubang, ini adalah pembuatan ulang. Instruksi pertama pada IO1 adalah TNS, dimana N adalah alamat baris terakhir dengan instruksi + 1. Program EDSAC yang paling sederhana adalah:
Kode 1. - Kode pesanan EDSAC, program paling sederhana.
T32S
Dia tidak melakukan apapun.
Omong-omong, secara default simulator disetel ke IO2, untuk mengalihkannya ke IO1, klik panel atas EDSAC -> IO1. Ini dimulai oleh tombol Start, dihentikan oleh Stop, Single EP - debugging langkah demi langkah, untuk ini Anda perlu menulis Z0S / ZS / Z0F / ZF terlebih dahulu.
Di sebelah kanan Anda bisa melihat simulator dan isi memori komputer. Kata-katanya 17-bit, total 1024 sel memori (atau 35-bit, 512 sel memori, karena akan lebih nyaman, di tengah ada "digit sandwich" misterius ). Ada juga akumulator (RAM), 71-bit, dan register perkalian 35-bit. Simulator mendukung input telepon disk, pencetakan. Dengan mengaktifkan petunjuk , Anda dapat melihat konten sel memori dengan mengarahkan mouse ke atasnya. Nomor di 10CC akan muncul di atas. Anda juga dapat melihat konten akumulator dan register perkalian.
Gambar 2. - Format kata mesin.
Gbr 3. - Format instruksi mesin.
Tentang angka. Nomor tersebut ditulis ke dalam memori dalam komplemen dua menggunakan instruksi: PNS atau PNL, di mana N adalah faktor sebelum dua. Misalnya, P0S = 2 * 0 + 0 = 0, P0L = 2 * 0 + 1 = 1, P1S = 2, P1L = 3, dll. Bilangan negatif ditulis dalam kode pelengkap, Anda dapat membaca tentang ini di tutorial . EDSAC juga bekerja dengan bilangan pecahan. Simbol kata pendek S (F untuk IO2) dan L (D). Tidak hanya angka, tetapi juga petunjuknya berubah artinya tergantung pada ini.
Ada beberapa panduan, yang utama dan yang disingkat , saya merekomendasikan yang terakhir karena
Agar kode yang diberikan di dalamnya berfungsi, Anda perlu mengganti baris pertama ZOS / ZS / Z0F / ZF dengan X0S / X0F. Lihat instruksi di sana, atau sudah di komentar ke kode.
Selama beberapa bulan, banyak versi prosedur pencetakan desimal telah diproduksi. Jika programmer itu benar-benar bodoh, atau benar-benar bodoh dan benar-benar kalah, maka rutinitas konversi akan mengambil sekitar seratus instruksi darinya. Tetapi setiap peretas yang sepadan dengan namanya dapat memasukkannya ke dalam ruang yang lebih sedikit. Akhirnya, dengan memindahkan instruksi secara bergantian dari satu tempat ke tempat lain, prosedurnya dikurangi menjadi sekitar lima puluh instruksi.
- Stephen Levy, Peretas: Pahlawan Revolusi Komputer
Jadi, tugas saya adalah menulis program untuk mencetak garis ke-n segitiga Pascal.
Kode 2. - Kotlin, mengeluarkan baris ke-3 dari segitiga 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
}
}
Akan ada loop bersarang di sini, karena pembagian harus dilakukan secara manual.
Kode 3. - Kode urutan EDSAC, pembagian integer, pembulatan ke bawah.
[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 [ ]
Seperti yang mungkin Anda perhatikan, pengalamatannya mutlak, yang menyebabkan
Akhirnya solusinya:
Kode 4. - Kode urutan EDSAC, IO1, baris ke-n segitiga 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, ]
Apa yang dapat saya katakan tentang IO2? Mendukung subrutin, pengalamatan relatif, set perintah diperpanjang.
Program yang sama di IO2:
Kode 5. - Kode urutan EDSAC, IO2, baris ke-n segitiga 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 [ ]
Gambar 4. - Kesimpulan untuk indikator = 5.
Saya harap Anda menikmati artikel ini dan mengetahui asal mula pemrograman. Ketika Anda menulis kode seperti itu, Anda mulai menghargai semua tingkat abstraksi yang muncul kemudian, Anda memahami betapa lama bahasa pemrograman itu menjadi seperti sekarang. Terima kasih atas waktu Anda!
PS Teman-teman yang terhormat dari provinsi N, tidak, terima kasih atas kode yang saya berikan dengan baik, jika Anda memiliki versi yang sama dengan saya. Semoga berhasil dengan RISC-V!
Contoh kode PPS yang sangat baik untuk EDSAC IO2 disediakan di sini .
Kode PPPS diterbitkan di bawah lisensi 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.