Dartmouth Basic, 1964

Jak wyglądał pierwszy BASIC



      Od powstania języka BASIC mija prawie pół stulecia. Jedne źródła [1], [4] podają rok 1963, inne [2], [3] - 1964. Język BASIC był zaprojektowany jako część Dartmouth Time Sharing System - pierwszego na dużą skalę eksperymentalnego systemu podziału czasu, którego implementacja rozpoczęła sie w Dartmouth College w r. 1963. System ten pozwalał po raz pierwszy na dostęp wielu użytkowników do zasobów tego samego komputera z odległych terminali.

      Pierwsza wersja Basica powstała jeszcze zanim ten system był gotowy. ([3]). Znana jako CardBASIC, do komunikacji z komputerem używała kart dziurkowanych, a wyniki działania programu pojawiały się na szybkiej drukarce. Następne wersje były już interaktywne; 1 maja 1964 uruchomiono pierwsze programy przu użyciu terminala. Kolejna wersja, z niewielkimi zmianami, została udostępniona w październiku 1964 r.

Pierwszy podręcznik Basica. Kliknij, aby powiększyć.

Podręcznik do tego Basica - 58 stron maszynopisu - można zobaczyć dziś pod adresem http://www.bitsavers.org/pdf/dartmouth/BASIC_Oct64.pdf a spod http://www.computer-books.us/basic_1.php ściągnąć go sobie jako *.pdf.

Pierwsze wersje Basica przeznaczone były wyłącznie do obliczeń. Zmienne tekstowe wprowadzono dopiero 5 lat później. Nie jest dziś jasne, jaki był pierwszy program uruchmiony w Basicu. Za to można zobaczyć pierwszy program umieszczony w podręczniku:

   10  READ A1, A2, A3, A4
   15  LET D = A1 * A4 - A3 * A2
   20  IF D = 0 THEN 65
   30  READ B1, B2
   37  LET X1 = (B1*A4 - B2 * A2) / D
   42  LET X2 = (A1 * B2 - A3 * B1)/D
   55  PRINT X1, X2
   60  GO TO 30
   65  PRINT "NO UNIQUE SOLUTION"
   70  DATA 1, 2, 4
   80  DATA 2, -7, 5
   85  DATA 1, 3, 4, -7
   90  END

Ten program rozwiązuje układ dwóch równań z dwiema niewiadomymi

	A1X1 + A2X2 = B1

	A3X1 + A4X2 = B2

dla trzech różnych par wartości B1 i B2. Można go i dzisiaj uruchomić, najlepiej w GW-Basicu:

GW-Basic wykonuje program Dartmouth Basic'a

GW-Basic zgłasza błąd "Out of DATA" w linii 30. W Dartmouth Basicu wyczerpanie danych nie powodowało błędu, tylko zakończenie programu (wg str. 7 skryptu).

W Dartmouth jako terminale służyły dalekopisy - skrzyżowanie maszyny do pisania z telegrafem, z niepodłączoną tarczą telefoniczną i częścią funkcji. (Widok klawiatury można zobaczyć na str. 15 skryptu.) Realizowały one obustronną łączność z komputerem: klawiatura służyła jako wejście, moduł drukujący dalekopisu - jako wyjście. Tak np. wyglądał zapis sesji z pokazanym wyżej programem (str. 19):

Wydruk sesji z programem Basica

Użytkownik włączał się do systemu, wpisując HELLO, w odpowiedzi na zapytania maszyny wpisywał swój numer, nazwę systemu (BASIC), czy program jest nowy, czy już zapisany, oraz odpowiednik nazwy programu - PROBLEM NAME. Maszyna zgłaszała gotowość (READY, odpowiada Ok w GW-Basicu), można było wpisywać program. Na polecenie w trybie bezpośrednim RUN komputer wykonywał program i wypisywał wyniki. Zauważmy, że ten prosty program z niewielką ilością danych zajmował mu całą sekundę. (Czas poniżej 0,5 sekundy był drukowany jako 0 secs.)

http://www.bitsavers.org/pdf/dartmouth/DTSS_descr_Oct64.pdf na sześciu stronach opisuje Dartmouth Time-Sharing System (DTSS). Pracowały w nim wówczas dwa komputery: GE Datanet-30, który zarządzał terminalami i w nim znajdował się wykonywany program, oraz GE-235, którego główną funkcją była arytmetyka zmiennoprzecinkowa. Ścieżka wymiany danych między tymi maszynami w obu kierunkach prowadziła przez pamięć dyskową, dostępną dla obydwu komputerów.

Zespół tych komputerów był równocześnie wyposażony w pamięć taśmową, dziurkarkę i czytnik kart oraz szybkobieżną drukarkę, ale te jego elementy odgrywały w DTSS tylko rolę pomocniczą.

Polecenia edycyjne, które w GW-Basicu należą do interpretera, były częścią systemu DTSS. OLD użyte w sekcji "HELLO" działało jak LOAD w GW-Basicu. Użytkownik mógł zapisać program (SAVE), chociaż zapewne nie był to system plików we współczesnym pojęciu. Polecenie UNSAVE odpowiadało dzisiejszemu Delete ( KILL"filename" w GW-Basic). LIST, tak jak w GW-Basicu, pozwalało wydrukować cały program lub jego wskazaną część. Podobnie polecenie RENAME pozwalało zapisać wskazany program (problem name) pod nazwą inną niż dotąd używana, realizując w ten sposób kopiowanie programów. Wreszczie CATALOGUE drukowało listę wszystkich programów zapisanych przez tego samego użytkownika (prekursor DOS-owskiego DIR). Obszar dysku przenaczony dla zapisu programów mógł ich pomieścić od 2000 do 7000, zależnie od ich długości.

Sam język programowania zawierał tylko 15 poleceń. Były to, dobrze nam znane do dzisiaj:

    LET		   READ		DATA		PRINT		GOTO

    IF - THEN	   FOR		NEXT		END		STOP

    DEF FN	   GOSUB	RETURN		DIM		REM

Zwraca uwagę brak polecenia INPUT, które pojawiło się dopiero w wersji z roku 1966. Do tamtej pory wprowadzanie danych odbywać się więc musiało przez DATA i READ.
Inna charakterystyczna rzecz to przekreślone Ø na odróżnienie litery O od zera - odwrotnie, niż to się przyjęło później np. w drukarkach, gdzie to właśnie zero ma kreskę.

Inaczej niż większość późniejszych Basiców, Datmouth BASIC był kompilatorem. Posiadał szereg ograniczeń, głównie ze względu na dostępną pamięć komputera:

Maksymalna długość programu - było to około dwóch stóp papieru, co z grubsza odpowiada dwóm kartkom A4. Ponieważ każda linia programu mogła zawierać tylko jedno polecenie, można oszacować ich maksymalną liczbę na około 120. Linie programu były numerowane liczbami maksymalnie pięciocyfrowymi i, jak w GW-Basicu, można było je wprowadzać w dowolnej kolejności. Podobnie również wprowadzenie samego tylko numeru linii usuwało linię z programu.
Polecenie END obowiązkowo kończyło program i musiała to być linia o najwyższym numerze.

Spacje, podobnie jak 20 lat później w niektórych Basic-ach z komputerów ośmiobitowych, nie były wymagane, można więc było napisać

15LETD=A1*A4-A2*A3
równie dobrze jak
15 LET D = A1 * A4 - A2 * A3

Nazwy zmiennych mogły składać się z jednej litery i jednej cyfry, co dawało 286 kombinacji, nazwy zmiennych tablicowych - tylko z litery (i indeksu); liczba elementów tablicowych w całym programie nie mogła przekraczać 1500. Dopuszczalne były tablice jedno- i dwuwymiarowe. Podobnie jak współcześnie, tablice z indeksami 0 do 10 nie wymagały deklaracji (DIM).

Dartmouth BASIC akceptował liczby maksymalnie dziewięciocyfrowe plus ewentualnie kropka dziesiętna i znak minus. Na wyjściu dawał do sześciu miejsc znaczących, a dla liczb całkowitych - do dziewięciu. Używał także zapisu wykładniczego, np. -.12345E2

Miał wbudowane osiem funkcji matematycznych: SIN(X), COS(X), TAN(X), ATN(X), EXP(X), ABS(X), LOG(X) I SQR(X), gdzie argument X mógł byc wyrażeniem o dowolnej złożoności. Oprócz nich miał także funkcje INT(X) i RND(X). RND miało jako argument zmienną fikcyjną, której wartość nie miała znaczenia, i wytwarzało zawsze ten sam ciąg liczb losowych; omijano tą niedogodność przez ignorowanie części liczb już wygenerowanych.

Polecenie DEF pozwalało zdefiniować funkcję użytkownika inną niż te wbudowane; nazwa jej musiała być trzyliterowa, zaczynająca się od FN. Można było zdefiniować do 26 takich funkcji (bo tyle liter było do dyspozycji).

W pętlach FOR...NEXT można było definiowac krok (STEP). W całym programie mogło być do 26 pętli FOR...NEXT.

Linie DATA - jedyne źródło danych - mogły zawierać do 300 liczb.

W poleceniu PRINT działały już separatory , i ;. Dalekopis miał 5 stref tabulacji po 15 znaków, przecinek po PRINT kierował wydruk do nastepnej strefy; ta konwencja utrzymała się w Basicu do dzisiaj. Natomiast średnik, inaczej niż obecnie, powodował wydruk w strefach o długości trzech znaków.

 

System DTSS był używany w Dartmouth College od 1964 aż do 1999 roku [5]. Basic, który był jego częścią, ewoluował w ciągu kolejnych lat [3]. Jego trzecia wersja (1966) wprowadziła polecenie INPUT, RESTORE i polecenia MAT do operacji na macierzach.
Wersja czwarta (1969) wprowadziła operacje na tekstach i zmienne łańcuchowe (do tamtej pory można było tylko wypisywać komunikaty tekstowe jako stałe w poleceniu PRINT). Wersja piąta (1970) zawierała już obsługę plików. Szósta, z 1971 r., wprowadzała oddzielnie kompilowane procedury z parametrami; jest to wersja, od której pochodzi większość poźniejszych dialektów Basica. W roku 1979 Kemeny i Kurtz opracowali kompilator ANSI BASIC jako siódmą i ostateczną wersję BASICa dla Dartmouth, zanim opuścili uczelnię koncentrując się na dalszym rozwoju ANSI BASICa do postaci True BASIC [5], wypuszczonego na rynek w roku 1985.

31 grudnia 1999r. minutę przed północą, DTSS został wyłączony na zawsze. Minutę po północy, 1 stycznia 2000 r. grupa "przyjaciół DTSS" postanowiła odtworzyć go jako emulator [7]. 11 maja 2004 r. emulator został udostępniony w wersjach dla Windows i MacOS. Plik DTSS.zip, który można pobrać z http://www.dtss.org/DTSS.zip, ma 516 KB. Archiwum zawiera m.in. skrócony, czterostronicowy (*.pdf) opis języka, podpisany "Thomas E. Kurtz 2004 April 19", DTSS.exe - emulator napisany w True BASIC, oraz szereg przykładowych programów. Można teraz na własnym pececie odtworzyć czas sprzed półwiecza:

Zapis sesji z emulatorem

 



http://deger.republika.pl - luty 2007