FOCAL (język programowania) - FOCAL (programming language)

OGNISKOWY
Paradygmat tryb rozkazujący
Rodzina BOŻEK CHIŃSKI
Zaprojektowany przez Richard Merrill
Deweloper DEC
Po raz pierwszy pojawiły się 1968 ; 53 lata temu ( 1968 )
Wpływem
BOŻEK CHIŃSKI
Pod wpływem
BASIC-PLUS

FOCAL (skrót od Formulating On-line Calculations in Algebraic Language lub FORmula CALculator ) to interaktywny interpretowany język programowania oparty na JOHNNIAC Open Shop System ( JOSS ) i najczęściej używany na maszynach z serii Digital Equipment Corporation (DEC) Programd Data Processor (PDP) .

FOCAL jest bardzo podobny do JOSS pod względem obsługiwanych poleceń i ogólnej składni języka. Różni się tym, że wiele zaawansowanych funkcji JOSS, takich jak zakresy i funkcje zdefiniowane przez użytkownika, zostało usuniętych w celu uproszczenia parsera . Niektóre z zastrzeżonych słów (słów kluczowych) zostały zmienione tak, aby wszystkie zaczynały się unikalną pierwszą literą. Pozwala to użytkownikom na wpisywanie programów przy użyciu jednoznakowych instrukcji, co dodatkowo zmniejsza zapotrzebowanie na pamięć. Była to ważna uwaga w przypadku PDP-8 , który często ograniczał się do kilku kilobajtów (KB).

Podobnie jak JOSS, a później BASIC , FOCAL na PDP-8 był kompletnym środowiskiem, które zawierało edytor linii , interpreter i procedury wejścia/wyjścia . Pakiet jako całość został nazwany FOCAL-8 , który działał również na PDP-5 i PDP-12 . Po przeniesieniu do PDP-11 , powstały FOCAL-11 opierał się na bazowym systemie operacyjnym , RT-11 , aby zapewnić obsługę plików i edycję. Definicja języka została zaktualizowana dwukrotnie, do FOCAL-69 i bardzo nieznacznie zmodyfikowanej FOCAL-71 . Dostępny był również port do Intel 8080 .

FOCAL jest znany jako język, w którym napisano oryginalne wersje wczesnych gier wideo Hamurabi i Lunar Lander . Oba zostały później przeniesione do BASIC, gdzie stały się znacznie lepiej znane. FOCAL nie był popularny poza platformą PDP i w dużej mierze zniknął podczas przechodzenia na VAX-11 . Miał silne odrodzenie w Związku Radzieckim, gdzie klony PDP-11 były używane jako komputery edukacyjne i domowe .

Historia

BOŻEK CHIŃSKI

JOSS został wydany w maju 1963 na jednorazowym komputerze JOHNNIAC firmy RAND Corporation . W firmie RAND wykorzystanie gwałtownie rosło, a maszyna, zbudowana w 1953 r., szybko przestała działać. JOHNNIAC został wycofany z eksploatacji w 1966 roku, a JOSS został ponownie wdrożony w nowo zakupionej PDP-6 , pierwszej „dużej” maszynie firmy Digital Equipment Corporation (DEC). Wykorzystanie nadal rosło, a do 1970 roku system był używany przez 500 do 600 użytkowników w całym kraju i zrodził kilka innowacji, takich jak mobilne terminale komputerowe, które można było przenosić z pokoju do pokoju i podłączać w celu szybkiego dostępu.

JOSS był bardzo wpływowy. Pojawił się, gdy wprowadzono podział czasu . Zainteresowanie interakcją człowiek-maszyna było duże, a komputery znalazły szersze zastosowanie. Podczas gdy większość ówczesnych systemów operacyjnych z podziałem czasu koncentrowała się na kontach użytkowników i zarządzaniu plikami, pozostawiając użytkownikom samodzielne programowanie, JOSS zapewnił edycję plików i język programowania w jednym pakiecie. Firma RAND pokazała system paradzie ludzi z branży.

OGNISKOWY

PDP-6 był pierwszym komputerem mainframe firmy DEC , a JOSS w pełni wykorzystał jego moc i pojemność pamięci. Napisany przez Richarda Merrilla , FOCAL usunął funkcje z JOSS zgodnie z wymaganiami, aby móc działać w znacznie bardziej ograniczonej przestrzeni pamięci PDP-8 i innych 12-bitowych maszyn z linii DEC. Aby to osiągnąć, wprowadzono poważną zmianę w celu zmniejszenia ilości danych tymczasowych, czyli stanu , potrzebnych do przeanalizowania wyciągów. Jednym z zauważalnych skutków tej decyzji było to, że warunki warunkowe mogły być używane tylko dla gałęzi , w przeciwieństwie do JOSS, gdzie warunki warunkowe można zastosować do dowolnej instrukcji.

Inną zauważalną zmianą była zmiana kolejności słów kluczowych, tak aby każde zaczynało się od unikalnej litery. To uprościło parser , który musiał czytać tylko pierwszą literę polecenia w wierszu kodu, a następnie mógł przeskoczyć do następnego znaku odstępu . Następnie porównałby to z wewnętrzną listą możliwych słów kluczowych, która zawierała jeden znak na wpis. W przeciwieństwie do tego, JOSS musiał kontynuować czytanie, dopóki nie przeczyta całego słowa polecenia, a następnie porówna je z listą zawierającą pełne słowa. Ta zmiana nie tylko oszczędzała pamięć w parserze, ale także użytkownicy mogli oszczędzać pamięć, wpisując tylko tę literę, zmniejszając rozmiar kodu źródłowego .

Pierwsza wersja FOCAL została wydana w 1968 roku dla PDP-8 . Zaktualizowana wersja pojawiła się w następnym roku, później znana jako FOCAL-69. System jako całość, niezależnie od wersji, był znany jako FOCAL-8, kiedy został przeniesiony do innych maszyn z serii 12-bitowej, w tym PDP-5 i PDP-12 . Był popularny, ponieważ był bardzo wydajny w użyciu pamięci, która często była poważnie ograniczona na tych maszynach do kilku kilobajtów (KB). Podobny FOCAL-11 działał na PDP-11 pod RT-11 .

Procesor Technologia oferowana również wersja 8k ogniskowej, wraz z Lunar Lander, dla Intel 8080 opartym Altair 8800 systemu. Zostało to zapewnione w ramach opłaty za kopiowanie taśmy, podczas gdy kod źródłowy był dostarczany za darmo przy innych zakupach.

PODSTAWOWY

Podczas gdy FOCAL stawał się popularny na maszynach DEC, BASIC stawał się coraz popularniejszą alternatywą na innych platformach. Pod koniec lat sześćdziesiątych kilka firm wtargnęło do twierdzy minikomputerów DEC , sprzedając podobne maszyny z dzielonymi w czasie wersjami BASIC. Wśród nich na uwagę zasługuje seria HP 2100 , obsługująca HP Time-Shared BASIC .

David H. Ahl dołączył niedawno do grupy PDP-8 firmy DEC, gdy firma zainteresowała się sprzedażą maszyny w środowisku edukacyjnym. Ze względu na popularność BASICa na rynku edukacyjnym, zwłaszcza z rosnącą biblioteką programów BASIC z Minnesota Educational Computing Consortium , Ahl stwierdził, że sprzedaż maszyny z FOCAL była trudna pomimo jej zalet. Jak później zauważył:

Język DEC FOCAL był w większości aspektów równy językowi BASIC, aw niektórych nawet lepszy, ale miał jedną ogromną wadę: DEC nie chciał licencjonować go innym producentom komputerów. FOCAL toczył zaciętą walkę z BASIC, który był dostępny na GE, Honeywell, HP i innych komputerach.
Myślę, że skończyło się to sytuacjami takimi jak Sony i Betamax. Sony mówi: „Betamax jest nasz i jest to lepszy format niż VHS”, co było. Ale potem JVC mówi: „Mamy VHS i Toshibę. Hej, chcesz go użyć? W porządku, udzielimy ci licencji za bezcen”.

Ahl wziął na siebie produkcję systemu BASIC dla tej platformy, zatrudniając firmę, o której później dowiedział się, że jest pojedynczym programistą na Brooklynie, aby wyprodukować wersję dla 4 kWord PDP-8. DEC zaczął sprzedawać pakietowe wersje PDP-8 z terminalami i BASIC jako linię „EduSystem”, przy czym większe systemy w serii mają rozszerzone wersje BASIC, aw niektórych przypadkach także FOCAL i FORTRAN . Powstały również niektóre EduSystems oparte na PDP-11.

Następnie Ahl zaczął przenosić programy z FOCAL do BASIC, w szczególności The Sumer Game (którą przemianował na Hamurabi ), wersję Lunar Lander i wiele mniejszych dem FOCAL. Łącząc swoje porty z zgłoszeniami od zewnętrznych programistów, udało mu się zebrać wystarczającą ilość materiału, aby DEC opublikował 101 BASIC Computer Games w 1973 roku. Książka odniosła natychmiastowy sukces i ostatecznie doczekała się trzech druków do 1975 roku.

W połowie lat 70. BASIC był standardową cechą wszystkich maszyn DEC, a użycie FOCAL wyparowało.

Odrodzenie w Związku Radzieckim

PDP-11 został sklonowany w Związku Radzieckim w latach 70. do celów wojskowych. W latach 80. wyprodukowano wersje jednoukładowe podobne do LSI-11 , które dały początek serii komputerów domowych kompatybilnych z PDP-11 . Wśród kilku modeli najbardziej godna uwagi była seria Electronika BK , wydana w 1985 roku. Początkowo były one dostarczane z wkładką FOCAL na wkładce ROM , podczas gdy wkładka BASIC była opcjonalnym dodatkiem. Późniejsze modele dostarczały domyślnie BASIC.

Język

Poniższy opis oparty jest na FOCAL-69, jak widać w instrukcji obsługi języka FOCAL-8.

Tryby bezpośrednie i pośrednie

FOCAL zastosował model JOSS w zakresie interakcji za pośrednictwem interfejsu wiersza poleceń . Umożliwiło to użytkownikom wpisywanie poleceń w „trybie bezpośrednim”, które były wykonywane natychmiast, lub poprzedzenie ich numerem linii, w którym to przypadku były one dodawane do programu, jeśli były unikalne, lub zastępowanie istniejącego kodu, jeśli ten sam numer miał wcześniej używany.

Sposób działania jest podobny do „trybu natychmiastowego” w BASICu a „trybem programu”. Kontrastuje to z JOSS, w którym wszystkie polecenia, zarówno programowe, jak i bezpośrednie, były zapisywane i ładowane jako część obszaru roboczego użytkownika. To pozwoliło JOSS mieć polecenia bez numerów linii, których używali do Formdefinicji i innych zadań. FOCAL nie miał tej możliwości, więc te instrukcje, które musiały zostać załadowane i zapisane, stały się opcjami innych poleceń trybu programowego, takich jak Type.

Oświadczenia programowe

Każda linia w programie FOCAL musi zaczynać się od numeru linii. Podobnie jak w przypadku JOSS, numery wierszy to liczby stałoprzecinkowe składające się z dwóch dwucyfrowych liczb całkowitych oddzielonych kropką. W FOCAL-8 prawidłowe numery linii mieszczą się w zakresie od 1,01 do 31,99. Po wydrukowaniu przy użyciu WRITE, FOCAL odpowiednika BASIC'a LIST, zostaną dodane wiodące zera; 1.10 zostanie wydrukowany jako 01.10. To sprawia, że ​​wszystkie numery linii mają długość pięciu cyfr podczas wyprowadzania, tak aby wszystkie numery linii były wyrównane. Instrukcje odwołujące się do tych wierszy nie wymagają wiodących zer, na przykład GOTO 1.10.

Liczba po lewej stronie okresu jest znana jako „numer grupy”. Grupy zapewniają pewien poziom organizacji kodu, którego brakuje w językach takich jak Fortran czy BASIC. Ich głównym zastosowaniem było użycie grupy jako podprogramu, który można wywołać za pomocą DO, na przykład DO 5przeskoczy do podprogramu napisanego w grupie 5. Edytor używał ich również podczas edycji, na przykład można WRITE 2było utworzyć wypisanie kodu w grupie 2 lub ERASE 4usunięcie wszystkich wierszy w grupie 4.

Każda linia musi zaczynać się słowem kluczowym komendy następującym po numerze linii. Nie ma pojęcia „domyślnego polecenia”, jak to ma miejsce w BASICu z jego opcjonalną LETinstrukcją. W jednym wierszu można umieścić wiele instrukcji, oddzielonych średnikami. Zwykle zachowanie nie różni się od tego, gdyby instrukcje znajdowały się w osobnych wierszach, z wyjątkiem pętli FOR.

Polecenia

ZAPYTAĆ SIĘ

ASKPolecenia (skrót A) odbędzie listę ciągów i zmiennych, echo sznurki i przechowywać dane wprowadzone przez użytkownika w zmiennych. Odpowiednik BASICa INPUT.

01.01 ASK "NAME", NAME
01.02 ASK "COORDINATES", X, Y
01.03 ASK "A1",A1,"OMEGA",W,"T0",T0,"DAMPING FACTOR",DAMPINGFACTOR

Jeśli użytkownik nie wprowadzi liczby, ale wprowadzi tekst, system zamieni początkowy znak na liczbę z „A”=1, „B”=2 itd.

KOMENTARZ

COMMENTPoleceń (skrót C) tworzy się informację. Odpowiednik BASICa REM.

01.01 COMMENT: THE SUMER GAME, BY RICHARD MERRILL

ROBIĆ

DOPolecenia (skrót D) oddziały wykonanie do podprogramu. Jest to odpowiednik BASIC-a GOSUB. Do podprogramu odwołuje się numer grupy lub numer wiersza. Jeśli podano numer wiersza, ten pojedynczy wiersz jest uruchamiany, a następnie powraca do instrukcji po DO. Jeśli nie podano numeru wiersza, wykonanie rozpoczyna się od pierwszego wiersza bloku i trwa aż do osiągnięcia końca bloku lub RETURNnapotkania a. RETURNwymagane jest jedynie wcześniejsze wyjście z grupy, nie jest potrzebne na koniec grupy.

01.15 DO 7.24
01.16 DO 8

DLA

FORPoleceń (skrót F) implementuje pętli . Gdy określone są trzy argumenty, pierwszy jest wartością początkową zmiennej pętli, drugi jest przyrostem, a trzecia jest wartością końcową pętli. Jeśli podano dwie wartości, pierwsza jest wartością początkową, a druga wartością końcową, a przyrost jest ustawiony na 1.

W przeciwieństwie do innych części języka, w których wiele instrukcji w wierszu jest niezależnych, FORzawsze uruchamia instrukcje następujące po nim w wierszu przed zakończeniem, a następnie przechodzi do następnego wiersza. Tak więc pętle muszą znajdować się w jednej linii lub alternatywnie wywoływać podprogram za pomocą DO. Nie ma odpowiednika BASIC-a NEXT.

01.01 FOR X=1,10; TYPE X,!
01.02 FOR X=0,10,100; DO 2

Przykładowa pętla FOR:

01.10 ASK "HOW MUCH MONEY DO YOU WANT TO BORROW ?",PRINCIPAL
01.20 ASK "FOR HOW MANY YEARS ?",TERM
01.30 FOR RATE=4.0,.5,10;DO 2.0
01.40 QUIT
02.10 SET INTEREST=PRINCIPAL*(RATE/100)*TERM
02.20 TYPE "RATE",RATE,"   ","INTEREST",INTEREST,!

IŚĆ DO

GOTOPolecenia (skrót G) skacze wykonywania programu na określony numer linii. Jest identyczna z instrukcją o tej samej nazwie w języku BASIC. W FOCAL GOTOjest również używany do rozpoczęcia wykonywania, podobnie jak BASIC RUN, ale w tym przypadku dokumentacja odnosi się do niego jako GOzamiast GOTOpomimo tego, że podstawowe polecenie jest takie samo.

01.05 GOTO 1.01
02.90 TYPE !!,"TRY AGAIN.",!!!!!;GOTO 1.1

JEŚLI

IFPolecenia (skrót I) zapewnia warunkową oddział w oparciu o znak wyrażenia. Po wyrażeniu liczbowym polecenie IF może przyjąć od jednego do trzech numerów wierszy. Jeśli wyrażenie jest mniejsze od zera, wykonanie rozgałęzia się na pierwszy numer wiersza; jeśli równa się zero, do drugiego wiersza; jeśli jest większe od zera, do trzeciego numeru wiersza. W języku brakowało operatorów względnych, takich jak większy niż, równy lub mniejszy niż. Aby rozgałęzić się, jeśli X > 5, należy porównać X - 5.

02.20 IF (25-25) 2.4,2.3,2.4
03.01 IF (X) 3.1,3.02,3.1

IF można skrócić, umieszczając średnik (lub koniec wiersza) poza pierwszym numerem wiersza. Na przykład:

02.20 IF (X)1.8; TYPE "Q"
02.30 IF (X)1.8,2.50
02.40 TYPE "P"

W tym przypadku test o godzinie 2.20 spowoduje, że program przejdzie do wiersza 1.8, jeśli test jest negatywny, w przeciwnym razie będzie kontynuował i wpisze "Q" do konsoli. Linia 2.30 przeskoczy do 1.8 lub 2.5, jeśli wartość jest ujemna lub zero, w przeciwnym razie kontynuuje wpisywanie "P" w konsoli.

ZREZYGNOWAĆ

QUITPoleceń (skrót P) kończy wykonanie programu i sterowanie powraca do środowiska edycji. Odpowiednik BASIC'a STOPlub END.

01.10 FOR X=-10,1,10;TYPE X
01.20 QUIT

POWRÓT

RETURNPolecenia (skrót R) oddziały wykonanie podprogramu z powrotem do lokalizacji wywołującego. Użycie RETURNjest opcjonalne w ostatnim wierszu podprogramu, podprogram i tak powraca w ostatnim wierszu grupy. Poniżej znajduje się przykładowy podprogram służący do konwersji monitu tak/nie na wartość. [1]

22.78 COMMENT: 'YES OR NO' SUBROUTINE
22.80 ASK "ANSWER YES OR NO ?  ",AN
22.82 IF (AN-0YES)22.84,22.86
22.84 IF (AN-0NO)22.8,22.88,22.8
22.86 SET X=2;RETURN
22.88 SET X=1;RETURN

USTAWIĆ

SETPoleceń (skrót S) przypisuje wyniki wyrażenia dla określonej zmiennej. Odpowiednik BASICa LET.

01.30 SET PI=3.14156
01.60 SET INTEREST=PRINCIPAL*(RATE/100)*TERM

RODZAJ

TYPEPoleceń (skrót t) stanowi, na wyjściu jednego lub więcej oddzielonych przecinkami. Odpowiednik BASICa PRINT.

Elementy mogą być zmiennymi, literałowymi ciągami ujętymi w podwójne cudzysłowy lub różnymi znakami sterującymi. Znaki sterujące obejmują !znak powrotu karetki i wysuwu wiersza, #sam powrót karetki i :znak tabulacji. Znaki sterujące mogą być połączone ze sobą, na przykład !!!wyprowadzą trzy CR/LF bez konieczności oddzielania ich przecinkami.

TYPE [NUMBERS, E1, "TEXT", !, #, :, $ OR %] ...OUTPUT
01.10 TYPE "HI THERE, GOOD LOOKING.  HOW MUCH MONEY DO YOU WANT TO BORROW?",!
01.50 TYPE "INTEREST",INTEREST,!
01.80 TYPE "THE INTEREST FOR",TERM," YEARS",!,"IS",INTEREST, " DOLLARS.",!!
01.90 TYPE "NEW YORK",!,"WASHINGTON",!,"ATLANTA",!,"DALLAS",!
02.10 TYPE "X",X,"   ","X^2",X^2,"   ","SQRT",FSQT(X)
03.20 TYPE ".",#
02.20 TYPE !!!!!

TYPEzawiera również opcjonalny specyfikator formatu wskazany przy użyciu format %x.yz, gdzie x to liczba cyfr po lewej stronie przecinka dziesiętnego, a yz to liczba cyfr po prawej stronie kropki. Domyślny format to %8.4, co oznacza maksymalnie osiem cyfr i cztery z prawej strony kropki. Na przykład:

SET A=67823
TYPE %6.01,A
=  67823.0
TYPE %5,A
= 67823
TYPE %8.03,A
=   67823.000
TYPE %,A
= 6.7823E4

Zwróć uwagę na dodatkowe spacje wiodące w niektórych przykładach, wypełniając pełną zdefiniowaną szerokość. Użycie samego % spowodowało, że wyjście zostało wydrukowane w „formatze zmiennoprzecinkowym” przy użyciu E.

Był specjalny znak kontrolny, $który powodował wypisanie tabeli wszystkich zdefiniowanych zmiennych i ich wartości. Tylko dwie pierwsze litery nazwiska zostaną wydrukowane, w razie potrzeby uzupełnione zerem. Elementy tablic są drukowane w osobnych wierszach, a zmienne zawierające tylko jeden element będą indeksowane (00). Na przykład:

TYPE $
A0(00)=67823

Zmienne

Nazwy zmiennych mogą zaczynać się od dowolnej litery z wyjątkiem F (F jest zarezerwowane dla funkcji) i mogą zawierać dowolny ciąg liter i cyfr. Jednak tylko dwa pierwsze znaki mają znaczenie. Na przykład następujący przykładowy kod z FOCAL: A New Conversational Language odnosi się do tej samej zmiennej co DESTINATION, a następnie DES. Wewnętrznie oba odniesienia odnoszą się do zmiennej oznaczonej DE:

01.80 ASK DESTINATION
02.30 IF (DES-14) 2.4,3.1,2.4

Dowolna zmienna może być traktowana jako tablica, pozwalająca na indeksy od -2048 do 2047. [2]

Matematyka

FOCAL-69 zawierał pięć operatorów matematycznych:

  • ^ dla wykładników – wykładnik jest zamieniany na 12-bitową liczbę całkowitą
  • * do mnożenia
  • / do podziału
  • + na dodatek
  • - do odejmowania

Jedną z ciekawostek FOCAL było to, że wszyscy operatorzy mieli niezależne pierwszeństwo, tak jak w powyższej kolejności. Oznacza to, że formuła SET T=2-3+1, byłaby oceniana w kolejności 2-(3+1), a zatem dawałaby -2. Było to zupełnie inne niż w większości języków, w których + i - miały równe pierwszeństwo i byłyby oceniane (2-3)+1, dając 0. Może to powodować drobne błędy podczas konwersji kodu źródłowego FOCAL na inne systemy.

FOCAL był niezwykły, ponieważ wyrażenia matematyczne mogły używać zamiennie (), [] i <> w dopasowanych parach w celu ustalenia pierwszeństwa. Na przykład poprawnym wyrażeniem jest poniższe:

  01.30 SET A=<10*[5+1]*(1+5)>

Wszystkie są na tym samym poziomie pierwszeństwa i czytane od lewej do prawej na tym samym poziomie, więc to stwierdzenie zostanie ocenione [], następnie (), a następnie <>, aby wytworzyć 360.

Język zawierał następujące wbudowane funkcje:

  • FABS() - Całkowita wartość
  • FATN() – Arcus tangens
  • FCOS() – Cosinus argumentu w radianach
  • FEXP() – Naturalna podstawa do potęgi argumentu
  • FITR() – Część całkowita argumentu
  • FLOG() – kłoda Napera
  • FRAN() - Liczba losowa
  • FSGN()– Znak argumentu; FSGN(0)=1 w FOCAL-69, ale FSGN(0)=0 w FOCAL-71 i nowszych wersjach
  • FSIN() – Sinus kąta podanego w radianach
  • FSQT() - Pierwiastek kwadratowy

Inne funkcje

FOCAL zawierał również kilka funkcji specjalnego przeznaczenia:

  • FDIS przyjął dwie wartości i narysował kropkę na ekranie terminali graficznych
  • FADC odczytać wartość z numerowanego wejścia analogowego i zwrócić wartość całkowitą

Polecenia środowiskowe

Uruchamianie programów

FOCAL używany GOTOw edytorze do uruchamiania programu. Jednak ogólną zasadą było skrócenie tego do GO. Jest to odpowiednik RUNw języku BASIC. GOTOmoże być również użyty w edytorze do rozpoczęcia wykonywania od określonej linii.

Polecenia edycyjne

Nowe wiersze są wprowadzane do programu przez proste uruchomienie polecenia z numerem wiersza. Polecenia edycji to ERASE(skrót E), MODIFY(skrót M) i WRITE(skrót W):

  • ERASE– wyzeruj wszystkie zmienne; jest to czasami używane w programach, aby je zresetować
  • ERASE ''line number'' – usuń wyciąg w określonej linii
  • ERASE ''group number'' – usuń wszystkie wyciągi z określonej grupy
  • ERASE ALL – usuń cały program
  • MODIFY ''line number'' – zezwól na edycję określonej linii
  • WRITE ''line number'' – wyświetl wyciąg w określonej linii
  • WRITE ''group number'' – wyświetl wszystkie wypowiedzi w określonej grupie
  • WRITE ALL – wyświetlić określony program

Polecenia dotyczące plików

Polecenie pliku to OPEN (skrót O):

  • OPEN INPUT [device:][file][,ECHO] – przygotuj się do czytania od początku pliku
  • OPEN OUTPUT [device:][file][,ECHO] – przygotuj się do pisania od początku pliku
  • OPEN RESTORE INPUT[,ECHO] – wznowienie wprowadzania
  • OPEN RESTORE OUTPUT[,ECHO] – wznowienie wyjścia
  • OUTPUT CLOSE – wypisz bufor i zamknij plik

Polecenia biblioteczne

FOCAL obejmował możliwość zarządzania kolekcjami programów FOCAL jako biblioteką kodów. Programy mogą wywoływać inne programy w sposób łańcuchowy za pomocą LIBRARY CALL, lub wywoływać pojedynczy podprogram w innym programie za pomocą LIBRARY GOSUB. Nazwy programów mogą mieć długość sześciu znaków. Polecenie LIBRARY (skrót L) miało następujące podpolecenia:

  • LIBRARY DELETE [device:]''program name – usuń program
  • LIBRARY LIST [device:][file name] – katalog
  • LIBRARY RUN [device:]''program name'' [line number] – łańcuch programu, opcjonalnie wznawianie od podanego numeru wiersza
  • LIBRARY SAVE [device:]''program name'' – zapisz program
  • LIBRARY EXIT – powrót do programu monitora PDP-8

Dodano FOCAL-71:

  • LIBRARY CALL [device:]''program name'' – wczytać program
  • LIBRARY GOSUB [device:]''program name'' [group number] – wywołać podprogram w zewnętrznym programie

Kody błędów

Ponieważ interpreter nie miał wystarczającej ilości pamięci do przechowywania komunikatów o błędach, a nawet tabeli numerów błędów, firma FOCAL zastosowała obejście, zgłaszając adres kodu wykrywającego błędy jako liczbę stałoprzecinkową. Na przykład wykryto błąd dzielenia przez zero?28.73 @ 01.10 , gdzie 28.73 reprezentuje kod sprawdzający ten błąd na stronie pamięci 28 plus przesunięcie 73 słów, a 01.10 to numer wiersza, w którym wystąpił błąd. Strony w PDP-8 miały 128 bajtów, więc ten adres przekłada się na lokalizację 3657.

Zmiany między wersjami

DEC wydał trzy wersje FOCAL dla serii PDP-8, oryginalną, znaną po prostu jako FOCAL, oraz dwie zaktualizowane wersje, FOCAL,1969 i FOCAL,1971. FOCAL,1969 był w dużej mierze identyczny z oryginałem, ale FOCAL,1971 był główną aktualizacją, która dodała obsługę plików, nową matematykę i wiele innych zmian. W przeciwieństwie do pierwszych dwóch wersji, które były samodzielnymi systemami, FOCAL 1971 był oparty na powstającym OS/8 (wtedy jeszcze znanym jako PS/8) i w większym stopniu polegał na tym systemie operacyjnym w zakresie obsługi i edycji plików.

FOCAL,1971

Jedną ze zmian w nowej wersji był 10-cyfrowy pakiet matematyczny zwiększający precyzję. FSGNTeraz funkcja wróciła do zera, jeśli wyrażenie wejściowe ocenione na zero. Wcześniej to zwróci jeden. FRANObecnie wykorzystywane lepszy algorytm, który wyprodukował losowo rozłożonych liczb. Dodano również nową FINfunkcję, która pobierała łańcuch i zwracała jego wartość ASCII (podobną do BASICa ASC), a FOUTktóra pobierała liczbę i zwracała łańcuch z tym znakiem ASCII ( CHR).

Ponieważ wszystkie te opcje zużywały ograniczoną pamięć, po uruchomieniu FOCAL, 1971 otworzył okno dialogowe, w którym pytano użytkownika, jakich funkcji chce użyć.

Porównanie z JOSS

FOCAL jest, na dobrą sprawę, oczyszczoną wersją JOSS ze zmianami, które sprawiają, że składnia jest zwięzła i łatwiejsza do przeanalizowania. Prawie wszystkie komendy FOCAL mają bezpośrednią korespondencję z JOSS i różnią się jedynie szczegółami. W FOCAL brakowało kilku funkcji JOSS.

Jedną z głównych różnic jest to, że JOSS zawierał kompletny zestaw operacji porównawczych i system logiki logicznej , który działał wewnątrz ifi forkonstruował. Co więcej, ifs i pętle można było zastosować do dowolnej instrukcji, w przeciwieństwie do FOCAL, gdzie jedyną operacją, którą można wykonać, był odpowiednik goto. Na przykład w JOSS można:

 1.10 Type A if X>10.
 1.20 Type i for i=1(1)10.

Pierwsza linia opcjonalnie wypisuje A na podstawie wartości X, a druga wypisuje liczby od 1 do 10. W przeciwieństwie do tego, FOCAL nie miał możliwości porównywania wartości, a pętle były stosowane przez przeskakiwanie do następnego wiersza po zakończeniu. Równoważny kod w FOCAL to:

1.10 IF (X-10) ,,1.30
1.20 TYPE A!
1.30 FOR I=1,1,10;TYPE I,!

Implementacja JOSS sprawia, że ​​wspólne konstrukcje są łatwiejsze do zbudowania i lepiej pasują do intencji programisty, kosztem bardziej złożonego środowiska wykonawczego. Na przykład JOSS umożliwiał opisywanie zakresów w pętlach w elastyczny sposób, np. 1,2,3,10(5)50,75,78. Ta elastyczność ma swoją cenę; w FOCAL start, stop i step mogą być zapisane w niestandardowej strukturze w pamięci i łatwo aktualizowane podczas wykonywania pętli, podczas gdy JOSS wymaga ponownej oceny wyrażenia, które może być, ale często nie jest, bardziej złożone.

Zmiany w zwięzłości kodu były stosunkowo niewielkie. Na przykład JOSS' Do part 20.staje się nieco mniejszym FOCAL DO 20, podczas gdy Do step 20.1staje się DO 20.1. Słowa kluczowe poleceń zostały również skrócone tam, gdzie było to możliwe, więc JOSS' Demandstaje się FOCAL ASK, zarówno po to, aby je skrócić, jak i aby litera D była używana w unikalny sposób DO. Usunięto okres potrzebny do wskazania końca wiersza w JOSS.

Aby uprościć parser, usunięto niektóre opcje FOCAL. Na przykład, JOSS mógł wykonywać wiele zadań, Set S=P, P=Q, Q=S.podczas gdy w FOCAL musiały to być indywidualne oświadczenia, SET S=P; SET P=Q; SET Q=S. Podobnie JOSS' Form, używany do formatowania danych wyjściowych, został połączony z FOCAL's TYPEz %.

Porównanie z BASIC

Porównania między FOCAL i BASIC były nieuniknione, ponieważ oba języki były wspólne na minikomputerach z tej samej epoki, a oba języki mają wiele wspólnego pod względem składni i struktury. W większości przypadków następuje bezpośrednia konwersja kodu FOCAL do iz BASIC. Na przykład, aby poprosić użytkownika o wprowadzenie wartości, w FOCAL należy:

 ASK "What is your age?",AGE

podczas gdy w BASICu odpowiednikiem jest:

 INPUT "What is your age?",AGE

Z wyjątkiem kilku funkcji, których brakowało w jednej lub drugiej oraz kilku stosunkowo niewielkich różnic w składni, oba języki są bardzo podobne.

Jednym godnym uwagi wyjątkiem jest IFin BASIC, który pozwalał na umieszczanie dowolnych instrukcji po THEN, czyniąc je bardziej podobnymi do struktur kontrolnych JOSS. BASIC odwrócił kolejność kodu w porównaniu z JOSS, umieszczając wyrażenie warunkowe na początku linii, a nie na końcu; w BASICu używa się IF this THEN thatFOCAL that IF this, jak w JOSS. Wersja BASICa ma tę zaletę, że środowisko wykonawcze może natychmiast przerwać czytanie reszty instrukcji, jeśli wyrażenie nie jest prawdziwe. W przeciwieństwie do tego, FOCAL IFbył bardziej podobny do obliczonego goto BASIC'a , ON X GOTO 10,20,30ale ON...GOTOdozwolona była dowolna liczba linii jako celów, w przeciwieństwie do tylko trzech dla ujemnych, zerowych i dodatnich, jak w JOSS i FOCAL.

Inną ważną różnicą między nimi jest to, że FOCAL nie miał wbudowanej obsługi ciągów znaków jako elementów danych, które można przypisać do zmiennych. Tak jak miało to miejsce we wczesnych wersjach BASIC lub FORTRAN przed dodaniem łańcuchów (w F77), tego ograniczenia generalnie uniknięto poprzez użycie literalnych łańcuchów w poleceniach wejścia i wyjścia. Dopiero przy manipulowaniu pojedynczymi ciągami lub znakami w nich zawartymi stało się to poważnym problemem.

Jako zmienne znakowe nie były obsługiwane, wprowadzając ciąg używany kludge że przekształca żadnych znaków wpisanych przez użytkownika w celu ich liczbowej wartości znaków. Na przykład, jeśli ktoś wpisze "HELLO" w instrukcji wejściowej, FOCAL przekonwertuje H na "8", wartość numeryczną "H" w sześciobitowych kodach znaków PDP-8 ("H" to ósma litera) . Następnie interpretowałby „E” jako początkowy wykładnik, a następnie próbowałby obliczyć „8” do mocy „LLO”, co zajęłoby kilka sekund czasu procesora i dało wartość 0.76593020E+103, a nie pomocna odpowiedź. Niemniej jednak, zadając pytania, na które można by odpowiedzieć, używając odpowiedzi jednoliterowych, takich jak Do you need instructions, Y or N", programiści mogli przetestować wynik ze znanymi wartościami znaków, aby uzyskać coś, co wyglądało jak wprowadzanie znaków.

Implementacja PDP-8 firmy FOCAL wykorzystywała zmiennoprzecinkową reprezentację, która reprezentowała liczby jako cztery 12-bitowe słowa, łącznie czterdzieści osiem bitów, trzydzieści sześć bitów mantysy i dwanaście bitów wykładnika. Pozwoliło to na uzyskanie zarówno znacznie większej precyzji, jak i znacznie szerszego zakresu wartości niż większość współczesnych interpretatorów, czyniąc FOCAL rozsądnym wyborem do poważnych prac numerycznych. Ta wysoka precyzja i dobry wybór domyślnego formatowania danych wyjściowych dziesiętnych oznaczały, że trudności z zaokrąglaniem binarnym do dziesiętnego nie były oczywiste dla początkujących użytkowników. Dla porównania Microsoft BASIC początkowo używał formatu 32-bitowego , podczas gdy późniejsze wersje rozszerzyły go do 40-bitowego. Większość BASIC-ów miała problemy z zaokrąglaniem, co prowadziło do prostych równań, które dawały małe niezerowe reszty.

Powszechnie uważa się, że system FOCAL był bardziej wydajny pod względem wykorzystania zasobów niż porównywalne systemy BASIC. Na typowej maszynie dnia, często z 6 do 24 kilobajtami pamięci z rdzeniem magnetycznym , FOCAL mógł obsługiwać większe i bardziej złożone zadania programistyczne niż BASIC.

Wersje i spin-offy

Firma Coca-Cola Corporation zastosowała dostosowaną wersję FOCAL o nazwie COKE.

FOCAL został później wdrożony na PDP-7, PDP-9, PDP-10, PDP-11, PDP-12, PDP-5 i LINC-8.

Podręcznik FOCAL pokazał, jak dodawać polecenia do parsera FOCAL, więc wiele witryn dodało wyspecjalizowane polecenia do obsługi niestandardowego sprzętu.

Stowarzyszenie Użytkowników Komputerów Sprzętu Cyfrowego zebrało wiele poprawek i ulepszeń dla FOCAL. Były nawet poważniejsze ulepszone odgałęzienia FOCAL, takie jak FOCAL-W, które dodały wiele funkcji, w tym lepsze I/O plików pamięci masowej, a nawet wirtualną pamięć zmiennych.

W połowie lat 70. DELTA była bardziej wyrafinowaną wersją FOCAL. Numery linii programu przeszły od 00 do 99 "części" i od 000000 do 999999 "kroków" wykonanych w kolejności alfanumerycznej. Firma DELTA miała kilka wyspecjalizowanych poleceń dla lunety wyświetlacza Tektronix 4010/14.

W Rosji był używany dopiero na początku lat 90. w masowo produkowanych komputerach domowych z serii Electronika BK .

Przykładowy kod

Oryginalny Lunar Lander stanowi doskonały przykład do badania kodu FOCAL, ponieważ wykorzystuje większość funkcji języka. Ten kod pochodzi z oryginału, który można znaleźć na stronie Lunar Lander Jima Storera .

01.04 T "CONTROL CALLING LUNAR MODULE. MANUAL CONTROL IS NECESSARY"!
01.06 T "YOU MAY RESET FUEL RATE K EACH 10 SECS TO 0 OR ANY VALUE"!
01.08 T "BETWEEN 8 & 200 LBS/SEC. YOU'VE 16000 LBS FUEL. ESTIMATED"!
01.11 T "FREE FALL IMPACT TIME-120 SECS. CAPSULE WEIGHT-32500 LBS"!
01.20 T "FIRST RADAR CHECK COMING UP"!!!;E
01.30 T "COMMENCE LANDING PROCEDURE"!"TIME,SECS   ALTITUDE,"
01.40 T "MILES+FEET   VELOCITY,MPH   FUEL,LBS   FUEL RATE"!
01.50 S A=120;S V=1;S M=32500;S N=16500;S G=.001;S Z=1.8

02.10 T "    ",%3,L,"       ",FITR(A),"  ",%4,5280*(A-FITR(A))
02.20 T %6.02,"       ",3600*V,"    ",%6.01,M-N,"      K=";A K;S T=10
02.70 T %7.02;I (200-K)2.72;I (8-K)3.1,3.1;I (K)2.72,3.1
02.72 T "NOT POSSIBLE";F X=1,51;T "."
02.73 T "K=";A K;G 2.7

03.10 I (M-N-.001)4.1;I (T-.001)2.1;S S=T
03.40 I ((N+S*K)-M)3.5,3.5;S S=(M-N)/K
03.50 D 9;I (I)7.1,7.1;I (V)3.8,3.8;I (J)8.1
03.80 D 6;G 3.1

04.10 T "FUEL OUT AT",L," SECS"!
04.40 S S=(FSQT(V*V+2*A*G)-V)/G;S V=V+G*S;S L=L+S

05.10 T "ON THE MOON AT",L," SECS"!;S W=3600*V
05.20 T "IMPACT VELOCITY OF",W,"M.P.H."!,"FUEL LEFT:"M-N," LBS"!
05.40 I (1-W)5.5,5.5:T "PERFECT LANDING !-(LUCKY)"!;G 5.9
05.50 I (10-W)5.6,5.6;T "GOOD LANDING-(COULD BE BETTER)"!;G 5.9
05.60 I (22-W)5.7,5.7;T "CONGRATULATIONS ON A POOR LANDING"!;G 5.9
05.70 I (40-W)5.81,5.81;T "CRAFT DAMAGE. GOOD LUCK"!;G 5.9
05.81 I (60-W)5.82,5.82;T "CRASH LANDING-YOU'VE 5 HRS OXYGEN"!;G 5.9
05.82 T "SORRY,BUT THERE WERE NO SURVIVORS-YOU BLEW IT!"!"IN "
05.83 T "FACT YOU BLASTED A NEW LUNAR CRATER",W*.277777," FT.DEEP.
05.90 T !!!!"TRY AGAIN?"!
05.92 A "(ANS. YES OR NO)"P;I (P-0NO)5.94,5.98
05.94 I (P-0YES)5.92,1.2,5.92 
05.98 T "CONTROL OUT"!!!;Q

06.10 S L=L+S;S T=T-S;S M=M-S*K;S A=I;S V=J

07.10 I (S-.005)5.1;S S=2*A/(V+FSQT(V*V+2*A*(G-Z*K/M)))
07.30 D 9;D 6;G 7.1

08.10 S W=(1-M*G/(Z*K))/2;S S=M*V/(Z*K*(W+FSQT(W*W+V/Z)))+.05;D 9
08.30 I (I)7.1,7.1;D 6;I (-J)3.1,3.1;I (V)3.1,3.1,8.1

09.10 S Q=S*K/M;S J=V+G*S+Z*(-Q-Q^2/2-Q^3/3-Q^4/4-Q^5/5)
09.40 S I=A-G*S*S/2-V*S+Z*S*(Q/2+Q^2/6+Q^3/12+Q^4/20+Q^5/30)

Program jest wyraźnie podzielony na wiele podprogramów. Było to niemal uniwersalne w programach FOCAL (i JOSS), ponieważ schemat numerowania linii czynił takie konstrukcje łatwymi w użyciu. Ten program wykorzystuje dziewięć procedur. Pierwsza, grupa 1, po prostu drukuje instrukcje za pomocą instrukcji Type i ustawia początkowe wartości dla przebiegu. Masa paliwa nie jest zapisywana bezpośrednio, zamiast tego używa aktualnej Mmasy Npaliwa i pustej masy, więc pozostałe paliwo to MN i lądownikowi kończy się paliwo, gdy MN wynosi 0. Zwróć także uwagę na Erasę na końcu wiersza 1.20, co resetuje wszystkie wartości zmiennych.

Główna pętla gry jest sterowana przez grupę 2. Ponieważ kod „przechodzi” przez grupę 1 do grupy 2 podczas pierwszego uruchomienia, początkowe wartości są wypisywane w pierwszych dwóch wierszach. Pod koniec wiersza 2.20 użytkownik jest Aproszony o wprowadzenie szybkości nagrywania jako K, a następnie licznik pętli jest resetowany za pomocą S T=10. Linia 2.70 testuje dane wejściowe użytkownika pod kątem kilku możliwości, jeśli jest powyżej 200 lub poniżej 8, wpisuje „NIE MOŻLIWE” i rząd kropek, a następnie powraca do użytkownika, aby spróbował ponownie. Jeśli wartość znajduje się pomiędzy tymi wartościami, przeskakuje do grupy 3. Zauważ, że ograniczone możliwości IFpolecenia FOCAL są tutaj oczywiste, w BASIC można to zredukować do pojedynczegoIF K>200 OR K<8 THEN...

Grupa 3 najpierw testuje, czy paliwo się skończyło, i przechodzi do grupy 4, jeśli się skończyło. Następnie sprawdza, czy Tupłynął 10-sekundowy okres w programie , a jeśli tak, zapętla się, aby wydrukować wszystko ponownie, co ma efekt uboczny polegający na zresetowaniu T i S do 10. Wiersz 3.40 sprawdza, czy ilość spalonego paliwa ten okres, S*K, zmniejszy masę pojazdu jako całości, S*KM, poza masę własną, N. Jeśli nie, pojazd porusza się dalej, jeśli tak, zamiast tego ustawia licznik pętli na wartość czas, gdy pozostałe paliwo będzie się palić, tym samym kończąc pętlę wcześniej. W obu przypadkach wywołuje grupę 9, aby zaktualizować prędkość i pozycję. Następnie zapętla się nad grupami 7, 8 i 9, aż wartość I zbiegnie się.

Gdy skończy się 10-sekundowy timer lub dojdzie do końca z powodu testu paliwa w linii 3.10 lub testu wysokości w 7.10. W tych ostatnich przypadkach przeskoczy do grupy 4 i przejdzie do grupy 5 lub bezpośrednio do grupy 5. Grupa 5 wpisuje wyniki na koniec gry, a następnie pyta użytkownika, czy chciałby spróbować ponownie. Jeśli tak, skacze do 1,20, aby wyczyścić wszystkie wartości i ponownie wydrukować nagłówki, jeśli nie, jeśli spadnie do 5,98 i Quits.

Zobacz też

  • JOSS , język Rand, który zainspirował FOCAL
  • MUMPS , język manipulacji danymi oparty na koncepcjach JOSS i FOCAL

Bibliografia

Bibliografia

Zewnętrzne linki