Mengapa BASIC menggunakan nomor baris?

95

Mengapa BASIC lama (dan mungkin bahasa lain) menggunakan nomor baris sebagai bagian dari kode sumber?

Maksud saya, masalah apa yang dipecahkan (coba)?

DerMike
sumber
27
Jika Anda telah melakukan upaya penelitian yang serius, jangan mengubur informasi di dalam komentar, edit pertanyaan Anda sesuai. Selain itu, Google membawa saya langsung ke sini: stackoverflow.com/questions/541421/… dan di sini stackoverflow.com/questions/2435488/…
Doc Brown
13
Saya memberikan suara untuk menutup pertanyaan ini sebagai di luar topik karena jawabannya sudah ada di stackoverflow .
Andres F.
6
Applesoft BASIC adalah bahasa pemrograman pertama yang saya pelajari. Saya ingat pernah mendengar bahwa Pascal tidak memiliki nomor baris dan berkata, "Tapi bagaimana saya melakukan GOTO tanpa nomor baris? Bagaimana itu bisa berfungsi ??"
Jens Schauder
14
Lucu, terakhir kali saya periksa, kami menilai apakah pertanyaannya adalah berdasarkan topik berdasarkan isinya, bukan konten situs lain (dan mungkin jawaban yang ada di sana).
MatthewRock

Jawaban:

130

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 RUNatau 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.


sumber
3
Saus yang enak, saya sudah lupa tentang Mini Assembler. Itu membawa kembali kenangan .
Blrfl
3
@ Blrfl Jika memori berfungsi ... ] CALL -936 * F666 G $ ... Yap, FP dasar untuk memulai.
3
Tidak, itu editor baris. Perintah diidentifikasi dengan tidak memiliki nomor baris. Pernyataan didahului dengan nomor baris untuk menunjukkan bahwa keduanya adalah pernyataan dan untuk menunjukkan apakah mereka pergi dan / atau baris apa yang mereka timpa. Itu adalah bagian editor garis built-in dari BASIC, itu bukan alat atau lingkungan yang terpisah.
RBarryYoung
3
@RBarryYoung ] 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::
4
Seperti disebutkan dalam artikel Wikipedia ( en.wikipedia.org/wiki/Dartmouth_BASIC ) " DTSS (Dartmouth Time Sharing System) menerapkan antarmuka ... baris perintah interaktif awal ... ... Setiap baris yang dimulai dengan nomor baris, ditambahkan ke program, mengganti baris yang sebelumnya disimpan dengan nomor yang sama, apa pun dianggap sebagai perintah DTSS dan segera dieksekusi .... Metode pengeditan ini diperlukan karena penggunaan teleprinter sebagai unit terminal untuk sistem Dartmouth Timesharing. "
RBarryYoung
50

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 90dimasukkan 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.

JacquesB
sumber
38
Mengedit garis? Kemewahan! BASIC pertama yang saya gunakan membuat Anda mengetik ulang seluruh baris. Yang benar-benar tersedot ketika Anda harus memberi nomor baru pada subrutin.
TMN
48
Layar? Layar apa? Dalam Basic pertama saya, "layar" adalah gulungan kertas.
ddyer
18
@ddyer: Dulu saya bermimpi memiliki gulungan kertas! Yang kami miliki hanyalah sekelompok elektroda. Pada malam hari ketika pekerjaan itu seharusnya dilakukan, kita harus menyejajarkan diri dalam barisan dan mengamati siapa yang tersengat listrik, untuk melihat apakah program bekerja dengan benar. ... - Serius, saya kagum bahwa orang benar-benar berhasil menulis program kerja pada masa itu.
leftaroundabout
26
Listrik! Kemewahan berdarah. Kami dulu memahat perintah kami di granit
Michael Durrant
10
@ TMN & ddyer OK, Anda berdua tahu kemana arahnya, kan ...? ;-D ==> dilbert.com/strip/1992-09-08 == imgs.xkcd.com/comics/real_programmers.png
Baard Kopperud
45

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.

Contoh masalah

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!

Solusi sebagian

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+1di loop. Bagaimana Anda menunjukkan di mana baris baru harus dimasukkan?

Solusi kerja

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

Lebih banyak masalah yang baru saja kami selesaikan

Ada manfaatnya (atau kutukan, karena memungkinkan kode spaghetti BASIC yang terkenal) untuk dapat menggunakan nomor baris sebagai konstruksi bahasa, setidaknya sebagai target perintah GOTOAND 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-200untuk 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!

Kesimpulan

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.

Hyde
sumber
4
Kamu berhasil. Memiliki layar multi-line daripada hanya tty pencetakan atau satu baris membuatnya lebih mudah, tetapi tanpa konsep file sumber itu masih berorientasi garis.
JDługosz
Kenyataan bahwa sistem tersebut adalah arsitektur 8-bit bukanlah faktor pembatas sebenarnya. Sekarang, fakta bahwa sistem tersebut mungkin hanya memiliki beberapa kilobyte RAM dan beberapa kilobyte ROM, dan bahkan mungkin tidak ada penyimpanan permanen (jika kaset tape Anda rusak) ...
sebuah CVn
masih sulit membayangkan pengkodean tanpa editor teks
phuclv
@ LưuVĩnhPhúc Nah, ada banyak emulator untuk menjalankan "hal yang nyata", seperti hampir semua komputer rumah 8-bit, atau MSDOS dan GWBASIC dengan dosbox. Sama seperti contoh, Anda bisa mendapatkan salah satu dari banyak emulator C64, dan kemudian Google untuk menemukan Panduan Pengguna sebagai PDF :-)
hyde
1
@ phuclv - Sulit membayangkan pengkodean tanpa editor teks sekarang. Pada saat itu, sulit membayangkan ketidaknyamanan karena harus menggunakan editor teks, menyimpannya, dan mengompilasinya sebelum dapat dijalankan ... dan itulah yang sebenarnya terjadi di sebelah dunia PC; Pascal dan C. Keduanya mengkompilasi bahasa, keduanya dapat diedit secara bebas dengan editor teks, keduanya jelas bukan lingkungan pemrograman di dalam dan dari diri mereka sendiri (BASIC adalah lingkungan pemrograman dan lingkungan runtime). Pascal adalah bahasa saya berikutnya, dan dalam banyak hal cukup membebaskan. Jelas lebih kuat. Namun dengan cara lain, sedikit kurang mendebarkan.
DavidO
17

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.

ddyer
sumber
1
Sebenarnya, pembaca kartu (disertai dengan penekanan tombol) dan printer garis lebih baik perangkat I / O daripada teleprinter, tetapi teleprinter jauh lebih murah.
supercat
Penomoran baris oleh 10 adalah standar de facto, bukan persyaratan yang ketat. Dan banyak BASIC punya renperintah, 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 gotodan gosubdan 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.
DavidO
13

"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 GOTOpernyataan 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 switchpernyataan 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/ GOSUBpernyataan) mungkin merupakan keputusan desain yang dibuat untuk alasan itu.

Mike Harris
sumber
2
Ah, dihitung dan ditugaskan gotos. Kenangan array variabel label di PL / 1, perulangan melalui satu array untuk menemukan yang cocok dan kemudian menggunakan yang cocok dengan indeks array sebagai indeks dalam array variabel label untuk melakukan goto. Atau Cobol mengubah foto. Dan tidak menggunakan nomor baris! BBC dasar memiliki pernyataan baru yang sangat berguna.
Kickstart
GCC memungkinkan GOTO dihitung sebagai ekstensi (walaupun tidak dengan nomor baris secara langsung tentu saja) - Anda dapat melakukan hal-hal sepertigoto array_of_labels[some_computation()];
user253751
Minor: FORTRAN memerlukan label untuk target 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 FORMATpernyataan. Pada pernyataan lain, itu opsional.
dave_thompson_085
Beberapa BASIC (misalnya Atari) bahkan memungkinkan ekspresi numerik sewenang-wenang untuk digunakan dalam pernyataan GOTO. Jadi, dengan konvensi penomoran baris yang tepat, Anda bisa menulis GOTO 1000+N*100untuk meniru switchpernyataan.
dan04
6

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.

Keith Miller
sumber
14
COBOL tidak menggunakan nomor baris itu. Mereka benar-benar nyaman, sehingga ketika schlub yang malang menjatuhkan geladaknya, dan kartu-kartu pergi ke mana-mana, ia bisa mengumpulkannya dan menjalankannya melalui penyortir kartu untuk mengembalikannya ke urutan yang benar. Anda TIDAK diharuskan memasukkan nomor baris ke dalam kartu. (Siswa tidak. Toko-toko produksi melakukannya.)
John R. Strohm
5

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.

JDługosz
sumber
2
ini tampaknya tidak menawarkan sesuatu yang substansial atas poin yang dibuat dan dijelaskan dalam 4 jawaban sebelumnya
nyamuk
2
Itu membuatnya buruk? Saya pikir Jaques tidak benar-benar membahas esensi dari pengeditan satu baris sehubungan dengan memasukkan garis dan secara mental melacak kode.
JDługosz
1
@jameslarge Apakah saya melewatkan poin itu di paragraf yang diawali dengan "Berkali-kali ketika bekerja dengan BASIC ..."? Saya juga ragu menyebut BASIC sistem operasi. Itu DOS. Dan DOS tidak perlu BASIC, itu hanya apa yang Anda miliki sebagian besar waktu untuk bekerja.
2
@Ian sementara itu benar, itu dirancang untuk sistem yang menggunakan teletipe untuk io (Sistem Berbagi Waktu Dartmouth).
Jules
3
@MichaelT, Ups! Saya akan menarik kembali setengah dari komentar saya, tetapi saya akan mendukung bagian tentang BASIC sebagai OS di beberapa komputer. Saya berpikir; Apple] [, TI 99/4, IBM 5100, HP 9830a, Compucolor 8001, TRS-80 Model 1, Comodore Vic20, Sinclair ZX80, dan lainnya. Semua boot ke BASIC dari ROM. Beberapa memiliki sistem operasi opsional yang dapat dimuat dari kaset audio atau, dari floppy disk jika Anda membayar $$ ekstra untuk floppy drive.
Solomon Slow
1

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 ).

TMN
sumber
1

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.

C. Fugate
sumber