Mengapa BASIC lama (dan mungkin bahasa lain) menggunakan nomor baris sebagai bagian dari kode sumber?
Maksud saya, masalah apa yang dipecahkan (coba)?
Mengapa BASIC lama (dan mungkin bahasa lain) menggunakan nomor baris sebagai bagian dari kode sumber?
Maksud saya, masalah apa yang dipecahkan (coba)?
Jawaban:
BASIC perlu dibawa ke dalam konteks dengan bahasa kontemporernya: fortran awal, cobol dan assembly.
Kembali ketika saya mencoba - coba 6502 perakitan tanpa label, ini berarti bahwa ketika Anda menemukan bahwa Anda perlu menambahkan instruksi di suatu tempat di tengah-tengah kode yang penuh sesak (saya kemudian menambahkan NOP ) Anda perlu melewati dan mengulang semua lompatan alamat. Ini menghabiskan waktu.
Fortran adalah sistem berbasis nomor baris yang mendahului BASIC. Di Fortran, kolom 1-5 adalah nomor baris yang akan digunakan untuk target percabangan. Hal utama dengan Fortran adalah bahwa kompiler cenderung sedikit lebih pintar daripada penerjemah BASIC dan menambahkan beberapa instruksi hanya masalah meninju beberapa kartu dan meletakkannya di geladak di tempat yang tepat.
BASIC, di sisi lain harus menjaga semua instruksinya tetap tertata. Tidak ada banyak konsep 'kelanjutan dari garis sebelumnya'. Sebagai gantinya, dalam Applesoft BASIC (salah satu dialek yang banyak digunakan yang saya kenal dan dapat menemukan informasi) setiap baris dalam memori direpresentasikan sebagai:
NN NN TT TT AA BB CC DD .. .. 00
Itu dua byte untuk alamat baris berikutnya ( NN NN
). Dua byte untuk nomor baris dari baris ini ( TT TT
), dan kemudian daftar token ( AA BB CC DD .. ..
) diikuti oleh akhir dari penanda garis ( 00
). (Ini dari halaman 84-88 dari Inside the Apple // e )
Poin penting untuk disadari ketika melihat representasi memori adalah bahwa garis dapat disimpan dalam memori rusak. Struktur memori adalah daftar yang ditautkan dengan pointer 'baris berikutnya' dalam struktur. Ini membuatnya mudah untuk menambahkan baris baru di antara dua baris - tetapi Anda harus memberi nomor setiap baris agar dapat berfungsi dengan baik.
Sering kali ketika bekerja dengan BASIC, Anda sebenarnya bekerja di BASIC sendiri. Secara khusus, string yang diberikan adalah nomor baris dan instruksi BASIC, atau perintah ke juru bahasa dasar untuk RUN
atau LIST
. Ini membuatnya mudah untuk membedakan kode dari perintah - semua kode dimulai dengan angka.
Kedua informasi ini mengidentifikasi mengapa angka digunakan - Anda bisa mendapatkan banyak informasi dalam 16 bit. Label berbasis string akan membutuhkan lebih banyak ruang dan lebih sulit untuk dipesan. Angka-angka itu mudah dikerjakan, dimengerti, dan lebih mudah diwakili.
Kemudian dialek-dialek BASIC di mana Anda tidak berada dalam penerjemah sepanjang waktu dapat menghilangkan setiap garis yang diberi nomor dan alih-alih hanya perlu memberi nomor pada garis-garis yang menjadi target cabang. Akibatnya, label.
] PRINT "FOO"
dijalankan oleh penerjemah BASIC segera. Itu adalah pernyataan. Jika Anda ingin menjalankannya nanti, Anda akan melakukannya ] 10 PRINT "FOO"
dan kemudian ] RUN
. Dalam lingkungan BASIC AppleSoft, setiap pernyataan BASIC dapat dijalankan segera atau ditunda - hanya ada beberapa perintah yang disediakan oleh DOS yang bukan pernyataan BASIC yang valid. Perbedaan antara pernyataan sekarang dan pernyataan kemudian adalah nomor baris. Anda juga dapat mengubah pernyataan yang tertunda dengan memasukkan kembali nomor baris yang sesuai. Anda juga dapat meletakkan beberapa pernyataan pada satu baris::
Pada awal mikrokomputer, pengeditan berbasis garis. Anda tidak bisa hanya bergerak dengan bebas dalam kode sumber dan mengedit. Anda memiliki satu baris di bagian bawah layar tempat Anda bisa mengetik perintah dan memasukkan kode. Sisa layar adalah daftar kode hanya baca dan output perintah. Jika Anda ingin mengedit katakan baris 90 dalam program yang Anda tulis " EDIT 90
", dan isi baris 90
dimasukkan ke buffer edit satu baris. Ketika Anda telah mengedit baris yang Anda tekan enter, dan daftar program diperbarui. Jadi, Anda memerlukan nomor baris agar dapat mengedit program.
Ketika editor kode menjadi lebih maju dan memungkinkan Anda untuk memindahkan kursor di dalam daftar kode Anda tidak perlu nomor baris lagi.
Jika Anda berpikir tentang dialek BASIC dari mikrokomputer rumah 8-bit tahun 80-an, maka komputer-komputer itu tidak memiliki editor teks (kecuali Anda membeli beberapa aplikasi pengolah kata). Tidak ada cara untuk memiliki seluruh kode sumber program BASIC "terbuka di editor", seperti yang akan Anda miliki saat pemrograman hari ini. Pemrogram bahkan tidak akan berpikir tentang program sebagai file kode sumber, atau teks, sungguh.
Jadi, katakanlah Anda memiliki program sederhana tanpa nomor baris di kepala Anda:
FOR I=1 TO 42
PRINT I
NEXT I
Anda boot komputer Anda. Anda memiliki prompt "siap" atau sesuatu seperti itu, dan kursor duduk di baris berikutnya. Ini sangat mirip dengan lingkungan REPL saat ini dari berbagai bahasa scripting, meskipun tidak benar-benar berbasis garis, lebih seperti berbasis layar. Jadi tidak seperti REPL hari ini, tapi tutup.
Sekarang jika Anda mulai memasuki program, Anda mungkin mendapatkan kesalahan setelah baris pertama, karena penerjemah BASIC mencoba untuk segera mengeksekusi (dan melupakan) itu, dan itu tidak masuk akal tanpa BERIKUTNYA untuk mengakhiri loop. Ini bukan editor teks tempat Anda mengedit teks, ini adalah tempat Anda memberikan perintah ke komputer!
Jadi, Anda perlu beberapa cara untuk mengatakan, ini adalah baris program, simpan! Anda dapat memiliki perintah khusus atau hanya simbol yang mengatakan bahwa hei, ini adalah baris program, simpanlah. Mari kita bayangkan ini:
#FOR I=1 TO 42
#PRINT I
#NEXT I
Ok, sekarang penerjemah BASIC imajiner kami menyimpan program dan Anda dapat menjalankannya. Tetapi sekarang Anda ingin mengedit baris PRINT. Bagaimana Anda melakukannya? Anda tidak berada dalam editor teks, Anda tidak bisa hanya memindahkan kursor ke baris dan mengeditnya. Atau Anda ingin menambahkan baris lain seperti LET COUNT=COUNT+1
di loop. Bagaimana Anda menunjukkan di mana baris baru harus dimasukkan?
Nomor baris menyelesaikan ini dengan cara yang sangat mudah, jika agak klunky. Jika Anda memasukkan baris program dengan nomor yang sudah ada, baris lama akan diganti. Sekarang lingkungan REPL berbasis layar menjadi berguna, karena Anda bisa memindahkan kursor ke daftar program di layar, mengedit garis pada layar dan tekan ENTER untuk menyimpannya. Sepertinya Anda sedang mengedit baris, padahal sebenarnya Anda mengedit teks di layar lalu mengganti seluruh baris dengan yang baru dari layar. Selain itu, memasukkan baris baru menjadi mudah jika Anda meninggalkan nomor yang tidak digunakan di antaranya. Untuk menunjukkan:
10 FOR I=1 TO 42
20 PRINT I
30 NEXT I
Setelah memasukkan kembali baris 20 dengan perubahan, dan menambahkan baris baru, bisa jadi
5 LET COUNT=0
10 FOR I=1 TO 42
20 PRINT "Index", I
25 LET COUNT=COUNT+1
30 NEXT I
Ada manfaatnya (atau kutukan, karena memungkinkan kode spaghetti BASIC yang terkenal) untuk dapat menggunakan nomor baris sebagai konstruksi bahasa, setidaknya sebagai target perintah GOTO
AND GOSUB
. Ini bisa diganti dengan label, tetapi menggunakan nomor baris jauh lebih mudah untuk diterapkan dalam penerjemah BASIC, yang masih merupakan bonus yang pasti di komputer rumah 8-bit khas tahun 80-an.
Lebih penting lagi, dari perspektif pengalaman pengguna, nomor baris benar-benar adalah antarmuka yang mudah namun lengkap untuk mengedit kode. Cukup ketikkan baris yang dimulai dengan angka untuk memasukkan kode baru. Gunakan LIST 100-200
untuk menampilkan garis 100-200. Untuk mengedit sebuah baris, daftarkan di layar, edit teks di layar, dan masukkan kembali baris. Untuk menghapus sebuah baris, edit menjadi kosong, yaitu cukup berikan nomor baris tanpa apa-apa setelahnya. Satu paragraf untuk menggambarkan ini. Bandingkan dengan mencoba menggambarkan penggunaan editor teks lama seperti edlin dari DOS, atau ed atau ex dari Unix: Anda memerlukan satu paragraf (hanya sedikit hiperbola) hanya untuk menjelaskan bagaimana pengguna dapat keluar dari mereka, ketika mulai secara tidak sengaja!
Jawaban lain menjelaskan bagaimana nomor baris muncul. Saya mencoba untuk membahas di sini, mengapa nomor baris bertahan selama mereka lakukan, bagaimana mereka terus memecahkan masalah dunia nyata: Mereka menawarkan cara untuk melakukan pemrograman yang sebenarnya tanpa editor nyata, dengan cara yang sangat sederhana. Setelah editor teks layar penuh yang layak dan mudah digunakan menjadi cara utama untuk mengedit kode, baik dengan keterbatasan perangkat keras menghilang dan ketika inersia orang yang beradaptasi dengan hal-hal baru diatasi, maka dialek BASIC berbasis nomor baris dengan cepat menghilang dari penggunaan, karena masalah kegunaan inti yang mereka selesaikan tidak lagi menjadi masalah.
Di tempat dan era ketika Basic dikembangkan, perangkat I / O terbaik yang tersedia adalah teletype. Mengedit program dilakukan dengan mencetak (di atas kertas) daftar seluruh program, atau bagian yang menarik darinya, dan kemudian mengetikkan baris pengganti dengan nomor baris.
Itu juga sebabnya penomoran baris default adalah 10, sehingga akan ada nomor yang tidak terpakai di antara baris yang ada.
ren
perintah, untuk memberi nomor baru. Doa yang khas adalah ren 10, 10
(nomor mulai dari sepuluh, bertambah sepuluh - perilaku default jika seseorang hanya mengetik ren
. Perintah goto
dan gosub
dan then (linenumber)
akan diperbarui secara otomatis. Tapi ini jelas tidak tersedia di BASIC paling awal. Tetapi IIRC, tersedia di Apple Integer Basic, Applesoft FP basic, TI Basic / Extended Basic, MS Basic / GW Basic, dll.
"Nomor baris" berarti beberapa hal yang berbeda.
Pertama-tama, perlu diingat bahwa konsep "garis" belum ada selamanya. Banyak bahasa pemrograman di era ini menggunakan kartu berlubang , dan memiliki nomor urut (biasanya dalam beberapa kolom terakhir kartu) membantu Anda memulihkan kartu Anda dalam urutan yang tepat jika Anda menjatuhkannya, atau sesuatu yang mengerikan terjadi pada pembaca kartu. Ada mesin untuk melakukan ini secara otomatis.
Nomor baris untuk digunakan sebagai target GOTO
pernyataan adalah konsep yang sama sekali berbeda. Dalam FORTRAN IV, mereka opsional, dan mendahului pernyataan (dalam kolom 1-5). Selain lebih mudah diterapkan daripada label bentuk-bebas, ada juga konsep GOTO yang dihitung dan ditugaskan , yang memungkinkan Anda untuk beralih ke nomor baris sewenang-wenang. Ini adalah sesuatu yang sebagian besar bahasa pemrograman modern tidak miliki (walaupun switch
pernyataan hampir sama), tetapi merupakan trik yang biasa dilakukan oleh programmer assembler.
BASIC berasal dari FORTRAN, dan dimaksudkan untuk lebih sederhana untuk diterapkan dan dipahami, sehingga memaksa setiap "baris" untuk memiliki nomor baris (baik untuk urutan dan sebagai target GOTO
/ GOSUB
pernyataan) mungkin merupakan keputusan desain yang dibuat untuk alasan itu.
goto array_of_labels[some_computation()];
GOTO
(atau ASSIGN
) dan alias aritmatika alias threeway asli IF
, dan (jarang digunakan) pengembalian alternatif CALL
, dan sort-of-target (pembatas yang bisa dibilang) dari DO
, dan FORMAT
pernyataan. Pada pernyataan lain, itu opsional.
GOTO 1000+N*100
untuk meniru switch
pernyataan.
Saya mulai pemrograman dalam COBOL yang menggunakan nomor baris di kolom 1-6 dari setiap baris. Karena tidak ada IDE pada tahun 1970 semuanya dilakukan melalui kartu berlubang dan nomor baris digunakan untuk mengidentifikasi baris mana dalam sumber asli yang harus diganti dan baris baru ditambahkan. Kami biasa menambah nomor baris sebanyak 100 untuk memberi kami ruang untuk menambahkan lebih banyak baris.
BASIC muncul lebih lambat dari FORTRAN, di era terminal-line. Ini menampilkan lingkungan read-exe-print-loop yang lebih interaktif daripada setumpuk kartu.
Saya belajar memprogram, di BASIC, pada tampilan satu baris yang menampung 24 karakter. Nomor baris adalah cara alami untuk menentukan ke mana Anda ingin pergi, apakah mengedit satu atau menyisipkan di antara yang lain.
Saya benar-benar tidak bisa membayangkan bagaimana lagi Anda melakukannya.
Satu hal yang belum disebutkan adalah bahwa lebih mudah bagi pemula untuk alasan tentang aliran program di mana target cabang eksplisit. Jadi daripada harus mencocokkan (mungkin bersarang) pernyataan BEGIN / END (atau pembatas blok apa pun yang digunakan), itu cukup jelas ke mana aliran kontrol pergi. Ini mungkin berguna mengingat target audiens BASIC (bagaimanapun, ini adalah Kode Instruksi Simbolik Serba Guna Pemula ).
Dartmouth Time Sharing System menggunakan antarmuka teletype. Oleh karena itu digunakan antarmuka berbasis perintah. Awalnya, nomor baris hanya digunakan sebagai sarana untuk mengedit program. Anda dapat memasukkan, mengganti, atau menghapus dengan menggunakan nomor baris. Tampaknya versi awal tidak menggunakan nomor baris untuk pernyataan goto, tetapi ini merupakan tambahan bahasa selanjutnya.