Tuesday, May 14, 2013

BASIC Becomes a Structured Language (Computer Language 1984)

Satu artikel berkenaan "Structured BASIC" yang diterbitkan dalam isu pertama majalah "Programming Language", 1984. Artikel berkenaan amat menarik kerana ianya telah ditulis oleh pakar-pakar yang mencipta BASIC yang asal, iaitu John G. Kemeny, Thomas E. Kurtz, dan Brig Elliott.

Dari artikel berkenaan, beberapa perkara menarik yang dapat dipetik:


  • BASIC yang pertama, Dartmouth BASIC, diterbitkan pada 1 May 1964.
  • Sub-program ditambah di akhir 1960an, grafik ditambah di awal 1970an dan struktur kawalan yang lebih baik ditambah pada pertengahan 1970an.
  • "Structured BASIC" yang dicadangkan oleh mereka dinamakan "True BASIC".
  • True BASIC tidak memerlukan nombor baris, boleh digunakan huruf besar atau kecil, dan 'REM' boleh digantikan dengan '!' untuk meletak komen.
  • Untuk grafik, True BASIC direka-bentuk supaya boleh digunakan pada pelbagai saiz paparan, tanpa pengaturcara perlu mengetahui bilangan pixel sebenar. Arahan SET WINDOW digunakan untuk menetapkan koordinat pada sebarang julat yang dikehendaki oleh pengaturcara.

Sunday, April 21, 2013

Retro: Commodore Structure-BASIC

Berhubung dengan catatan sebelum ini yang bertajuk Retro: Structured BASIC 64, saya terjumpa lagi sebuah artikel dalam COMPUTE! (Issue 35, April 1983) bertajuk Commodore Structure-BASIC. Memandangkan artikel ini tersiar kira-kira empat tahun lebih awal maka amat menarik untuk dilihat apa yang diperkatakan.

Pertama sekali istitlah yang digunakan ialah "stucture-BASIC" dan bukannya "structured BASIC". Mungkin pada masa ini, di awal waktu lahirnya beberapa konsep dan bahasa pengaturcaraan, kseragaman istilah belum lagi menjelma. 

Keduanya, aritikel berkenaan menyebutkan penggunaan konsep structured programming dalam memperkenalkan pengaturcaraan kepada para pelajar dengan menggalakkan penggunaan flowcharts.

Ketiga, aturcara asal ditulis dalam Waterloo Structured BASIC (WatBASIC) kemudian dibuahsuai supaya boleh dilaksanakan dalam SuperPET yang tidak dilengkapi WatBASIC.

Artikel penuh boleh dibaca di archive.org.


Wednesday, April 17, 2013

Retro: Structured BASIC 64

Ada sebuah artikel menarik yang tersorok dalam majalah COMPUTE! (issue 83, April 1987) bertajuk "Structured BASIC 64" oleh Scott Kell. Saya kata "tersorok" kerana ia tidak pun diiklankan di muka depan (cover page) majalah berkenaan. Ia terletak di muka surat 92, berkongsi ruang dengan artikel sebelumnya yang bertajuk "Amiga System Fonts".

Pengenalan kepada artikel "Structured BASIC 64" itu juga agak menarik kerana ia dibuka dengan ayat "This unusual Commodore 64 utility should interest anyone who wants to learn about structured programming techniques". Agaknya ia dikatakan sebagai luar biasa (unusual) kerana pada ketika itu, kekangan utama apabila mengaturcara sebuah komputer 8-bit ialah betapa kuasa pemprosesannya amat terhad: data 8 bit, kelajuan mikroprosessor yang terhad (1 MHz untuk MOS6502/10), RAM yang sedikit (64 KB maksimum) dan sebagainya. Maka lebih banyak usaha ditumpukan untuk mendapatkan hasil yang maksimum dari sumber yang terhad yang terdapat dalam komputer-komputer sumpama itu. BASIC hanya digunakan untuk aturcara-aturcara mudah sahaja. Apabila keperluan menjadi lebih kompleks, maka "machine code" digunakan sebagai ganti BASIC, kerana BASIC, sebagai bahasa interpretasi, tidak cukup pantas.

Versi BASIC yang diperluaskan seperti Simon's BASIC dan Super Expander dapat mengatasi sebagian daripad masalah ini kerana beberapa arahan baru yang ditambah dapat menggantikan proses-proses yang memerlukan pemprosesan yang rumit seperti mengndalikan sprite, kesan bunyi dan grafik. Akan tetapi ianya diletakkan di dalam katrij. Jadi pengguna-pengguna yang tidak mempunyai katrij yang sama tidak dapat menggunakan aturcara yang ditulis dalam versi berkenaan. Tambahan pula Commodore tidak mengeleuarkan satu "extension" yang standard, tetapi dua versi: Super Expander dan Simon's BASIC.

Walaupun terdapat beberapa "BASIC compiler" mula dikeluarkan ketika itu tetapi ia tidak begitu popular kerana dengan RAM yang terhad, maka aturcara perlu dikompilasi daripada disket. Ini ternyata proses yang memerlukan masa yang panjang dan kesabaran yang setara juga.


Structured BASIC 64

Artikel berkenaan nampaknya merupakan reaksi kepada bahasa-bahasa pengaturcaraan berstrukur yang mula popular pada ketika itu sperti Pascal, Modula 2, Forth dan C. Sterusnya artikel berkenaan menyentuh hakikat bahawa BASIC bukanlah bahasa yang menekankan kaedah pengaturcaraan berstuktur. Jadi perisian bantuan bernama "Structured BASIC 64" itu diolah untuk membantu pengaturara berubah daripada BASIC ke dunia pengaturcaraan berstrukur.

Beberapa kata-kunci BASIC 2.0 telah diubah atau ditambah kepadnya. Untuk if-else, ianya telah ditambah menjadi:

  • if - then - endif
  • if - then - else - endif
Untuk struktur pengulangan, dari kata-kunci asas for-next, yang berikut ini telah ditambah pula:
  • repeat - until
  • while - wend
Untuk konstruk if-then yang berbagai-bagai, umpamanya untuk membuat pilihan yang banyak kemungkinannya, kadangkala ia diselesaikan dengan menggunakan on-goto atau on-gosub. Namun, seperti yang dibincangkan sebelum ini, penggunaan goto dan gosub boleh mnimbulkan masalah apabila nombor-nombor baris aturcara diubah. Dalam Structured BASIC 64, kata-kunci yang diperkenalkan untuk mengatasi masalah ini ialah:
  • cases of - case - otherwise - endcases
Agak menarik juga kerana kata-kata kunci ini tidak sama seperti yang digunakan oleh Commodore BASIC 7, iaitu select case - case - end select. Mungkin agaknya pada ketika itu tidak ada lagi suatu keseragaman dalam memilih kata-kata kunci tambahan ini.

Untuk subroutine pula, penggunaan label telah diperkenal. Jadi arahan gosub "intro" boleh digunakan menggantikan gosub 1000 atau seumpamanya. Dalam Stuctured BASIC 64, sesuatu label mesti diletakkan di antara tanda "quotation" dan mesti ditempatkan di pangkal baris arahan sebaik sahaj selepas nombor baris. Contohnya:

1200 "introduction": print "Hello World!"

Walaupun dengan penggunaan label, nombor-nombor baris arahan masih perlu digunakan untuk setap baris arahan. Nombor tersbut mungkin tidak lagi diperlukan untuk gosub tetapi perlu untuk susunan atau urutan baris dari baris pertama hingga ke akhir.

Perisian bantuan ini amat menarik dari segi saiznya yang hanya 1,160 bytes. Ianya dicetak dalam bentuk format MLX. Suatu hari nanti, Insya-Allah, saya akan "key in" aturcara bantuan ini dan mencubanya.

Sunday, April 14, 2013

BASIC diperbaiki III: Select-Case

Dalam BASIC asal, terdapat stuktur kawalan ON-GOTO atau ON-GOSUB. Ianya digunakan apabila terdapat pelbagai pilihan yang perlu dibuat bergantung kepada pembolehubah yang sedang dinilai. Umpamanya, berikut ialah jujukan kawalan dalam Commodore BASIC 2.0 bagi membaca input dari pengguna dan seterusnya memilih sub-routine yang ada untuk dilaksanakan:


10 print"enter a number between one and five"
20 input x
30 on x gosub 100,200,300,400,500
40 end
100 print"your number was one":return
200 print"your number was two":return
300 print"your number was three":return
400 print"your number was four":return
500 print"your number was five":return

Sudah tentu apabila perubahan perlu dibuat dengan pernomboran pada mana-mana sub-routine berkenaan, maka keadaan menjadi sukar kerana nombor-nombor baris selepas arahan GOSUB perlu disemak semula.

Dalam FreeBASIC dan seumpamanya, di mana baris-baris tidak lagi perlu dinomborkan, maka struktur kawalan SELECT-CASE digunakan untuk tujuan yang dibincangkan. Contoh tadi apabila diubah menggunakan jujukan kawalan SELECT-CASE, boleh ditulis semula seperti berikut:


Dim x As Integer

Print"enter a number between one and five"
Input x
Select Case x 
   Case 1: Print "Your number was one"
   Case 2: Print "Your number was two"
   Case 3: Print "Your number was three"
   Case 4: Print "Your number was four"
   Case 5: Print "Your number was five"
End Select

Wednesday, April 10, 2013

BASIC diperbaiki II: Struktur kawalan pemilihan yang lebih baik

Kawalan pemilihan


Untuk menggunakan if-then secara lebih berkesan, biasanya GO TO digunakan bersama. Contohnya (Commodore BASIC 2.0):

10 A=1
20 IF A=1 THEN PRINT "ONE": GOTO 40
30 PRINT "NOT ONE"
40 END

Dalam contoh di atas, GOTO 40 diperlukan supaya baris 30 tidak dilaksanakan apabila A = 1. Untuk mengelakkan penggunaan GOTO, maka kata-kunci ELSE ditambah. Maka contoh tadi ditulis semula (Commodore BASIC 7.0) menjadi:

10 a=1
20 if a=1 then print "one": else print "not one"
30 end

Jika arahan-arahan yang diperlukan dalam sesuatu kes IF atau ELSE adalah lebih daripada apa yang boleh dimuatkan dalam satu baris, maka kata-kata kunci BEGIN dan BEND boleh digunakan (Commodore BASIC 7.0)

10 a=1
20 if a=1 then begin
30 print "one"
40 print "only one"
50 bend

Jika digabungkan bersama penggunaan else:

10 a=2
20 if a=1 then begin
30 print "One"
40 print "Only one"
50 bend: else print "NOT one"

Ditambah pula dengan penggunaan BEGIN/BEND selepas ELSE:

10 a=2
20 if a=1 then begin
30 print "One"
40 print "Only one"
50 bend: else begin
60 print "NOT one"
70 print "Definitely NOT"
80 bend

Ianya boleh menghasilkan aturcara yang tidak lagi bergantung dengan nombor baris yang betul untuk GOTO. Malah jika ditambah baris baru di antara baris-baris yang sedia ada, atau ditambah baris-baris baru, selagi kata-kata kunci berkenaan digunakan dengan betul, maka aturcara akan terlaksana dengan betul. Ianya juga lebih mudah dibaca kerana tidak perlu "melompat" ke sana-sini menurut arahan GOTO yang digunakan.

Walaupun begitu masih terdapat beberapa kelemahan yang boleh diperbaiki. Antaranya ialah tidak adanya "indentasi" dalam sesetengah versi BASIC seperti Commodore BASIC. Indentasi boleh memudahkan aturacara dibaca kerana blok-blok tertentu disusun sebegitu cara supaya kelihatan terkumpul sekali.

Kelemahan ke-dua ialah kata-kunci BEGIN tidak boleh diletakkan pada barisnya sendiri. Ia mesti mengikuti kata-kunci THEN atau ELSE. tambah pula kata-kunci ELSE mesti mengikut kata-kunci THEN sebelumnya atau selepas BEND.

BASIC diperbaiki: Struktur ulangan yang lebih canggih

BASIC yang asal telah tersedia dibangunkan masing-masing dalam pelbagai versi oleh pengelaur-pengeluar komputer 8-bit pada ketika itu. BASIC yang diperbaiki (extended) ini juga keluar dalam pelbagai versi juga. Oleh itu tidak ada satu standard dalam mana pembaikan-pembaikan ini dibuat. Namun boleh dikatakan ada macam suatu kesamaan dalam kata-kata kunci dan konsep yang digunakan.

Pembaikan-pembaikan ini kelihatan seprti dipengaruhi oleh bahasa Pascal yang memang terkenal dengan formatnya yang snagat berstruktur sehinggakan menjadi bahasa yang paling popular di akhir u80an sebagai baha utama yang deiperlkenalkan untuk pengaturcaraan di universiti-universiti. pada ketika itu arahan-arahan kawalan seperti while dan repeat-until serta konsep prosedur dan fungsi telah menjadi sesuatu yang diterima-pakai. Ini ketara dalam pembaikan-pembaikan yang dilakukan ke atas BASIC. Berikut ialah serba ringkas beberapa contoh pembaikan ini.


BASIC yang asal mempunyai struktur-struktur kawalan yang mudah dan terhad bilangannya. Antaranya ialah:
  1. if-then -- untuk pemilihan 
  2. for-next -- untuk pengulangan
Untuk melakukan operasi atau jujukan perlaksanaan yang lebih kompleks, pengaturcara-pengaturcara BASIC banyak bergantung kepada arahan GOTO. Berikut ialah perbincangan bagaimana struktur-struktur kawalan BASIC yang tradisi diubah menggunakan kata-kata kunci baru untuk mengelakkan penggunaan GOTO dalam versi-versi BASIC yang diperbaiki (extended BASIC, second genration BASIC)

Pengulangan

Untuk mengelakkan penggunaan GOTO semasa membuat "loop" maka beberapa kata kawalan baru diperkenalkan:

  • do-loop
  • do-loop-until
  • do-loop-while
Contohnya, ulangan tak terhingga (infinite loop) dalam program asal BASIC:

10 print "I can do this all day"
20 goto 10

Diubah menjadi (Commodore BASIC 7.0): 

10 do
20 print "I can do this all day"
30 loop

Ulangan bersyarat (conditional loop) dalam BASIC asal, contoh 1:

10 print "I'll do this until you tell me to stop"
20 input "Do you want me to stop?"; a$
30 if a$<>"yes" then 10
40 print "OK."

Diperbaiki menggunakan do-loop-until:

10 do
20 print "I'll do this until you tell me to stop"
30 input "Do you want me to stop?"; a$
40 loop until a$="yes"
50 print "OK."

Diperbaiki menggunakan do-loop-while:

10 do
20 print "I'll do this until you tell me to stop"
30 input "Do you want me to stop?"; a$
40 loop while a$<>"yes"
50 print "OK."