BCPL
BCPL (Basic Combined Programming Language) – język programowania zaprojektowany przez Martina Richardsa na Uniwersytecie w Cambridge w 1967 roku[1] jako wynik problemów z jego poprzednikiem – językiem CPL – w latach sześćdziesiątych. Pierwszy kompilator BCPL Richards napisał wiosną 1967 w czasie pobytu w MIT. Język został opisany w artykule zaprezentowanym na Spring Joint Computer Conference w 1969 roku. Na podstawie BCPL Dennis Ritchie później zaprojektował język programowania C. BCPL powstał jako narzędzie do pisania kompilatorów, choć jednocześnie, w celu umożliwienia jego stosowania w programowaniu systemowym, zadecydowano, by jego składnia była prostsza niż miało to miejsce w przypadku CPL[2]. BCPL posiadał jeden typ danych – słowo maszynowe, którego długość w bitach zależała od docelowej architektury i była niezmienna w jej obrębie. Najczęściej zawierała się w zakresie od 16 do 36 bitów. Wszystkie wyrażenia i zmienne w języku przyjmowały wartość tego typu, która jednak mogła być odmiennie interpretowana w zależności od kontekstu[3]. Kompilator BCPL, również napisany w tym języku, składa się z trzech komponentów, które po kolei uczestniczą w kompilacji kodu. Pierwsze dwa (analizator składniowy i moduł tłumaczący) są prawie całkowicie niezależne od docelowej architektury. Ich wynikiem jest kod pośredni (nazywany OCODE). Za jego przetłumaczenie na kod maszynowy odpowiada ostatni komponent kompilatora – generator kodu, który musi być przystosowany do architektury docelowego komputera[2]. Stosowany przez kompilator kod pośredni był niezależny od docelowej architektury komputera. Można go porównać do języka asemblera dla pewnej abstrakcyjnej maszyny stosowej, na której opiera się definicja języka[4]. SkładniaProgram w języku BCPL składa się z instrukcji, zwykle każda w osobnej linii. Umieszczenie kilku poleceń w tej samej linii kodu źródłowego jest możliwe, jeśli instrukcje rozdzieli się znakiem średnika[5]. W dowolnym miejscu, w którym można wstawić instrukcję prostą, dozwolone jest umieszczenie instrukcji złożonej (nazywanej blokiem, jeśli zaczyna się od deklaracji). Jej ogranicznikami są tzw. nawiasy sekcji, tradycyjnie oznaczane Nawiasy sekcji mogą być etykietowane dowolną sekwencją złożoną z liter, cyfr i kropki, występujących bezpośrednio po nawiasie. Wszystkie bloki kodu wewnątrz etykietowanego zostaną domknięte automatycznie, wraz z końcem bloku nadrzędnego[9]. Komentarze wprowadza się sekwencją ZmienneZmienne dynamiczne (lokalne) w BCPL deklaruje się z użyciem słowa kluczowego LET, po którym występuje co najmniej jedna nazwa, następnie znak równości oraz lista wartości, którymi zmienne zostaną zainicjalizowane. Inicjalizacja w momencie deklaracji jest obowiązkowa[11]. Nazwa zmiennej może zawierać wielkie litery, cyfry i kropkę, choć musi zaczynać się od litery. Niektóre implementacje dopuszczają również małe litery i/lub użycie znaku podkreślenia zamiast kropki[5]. Identyfikator może mieć dowolną długość i wszystkie znaki są istotne[12]. Zmiennym nie określa się typu danych[10]. Zmienne dynamiczne są widoczne w obrębie bloku programu, w którym nastąpiła ich deklaracja i nie mogą być wykorzystywane w zagnieżdżonych w nim podprogramach[13]. Przypisanie wartości do zmiennej odbywa się z użyciem operatora BCPL pozwala również na tworzenie jednowymiarowych tablic, nazywanych wektorami. Do ich deklarowania służy składnia W momencie tworzenia wektora, oprócz zarezerwowania odpowiedniej liczby komórek pamięci, rezerwowana jest również komórka z adresem zerowego elementu tablicy. Wskaźnik ten jest dostępny pod nazwą tablicy[16].
Wskaźnikiem w BCPL nazywany jest adres słowa w pamięci. Pozyskać go można z użyciem jednoargumentowego operatora LET A, B = 0, 0
B := @A
!B := 5 Następujące po sobie komórki pamięci posiadają adresy różniące się o 1[17]. Zmienne statyczneW przeciwieństwie do zmiennych dynamicznych, statyczne istnieją przez cały czas wykonywania programu. Ich wartości są inicjalizowane w momencie uruchomienia i pozostają zachowane po wyjściu z zakresu widoczności danej zmiennej. Wprowadza je deklaracja Zmienne globalne
Zmienne globalne w BCPL deklaruje się za pośrednictwem tzw. wektora globalnego. Jest on przechowywany w stałym miejscu pamięci operacyjnej i współdzielony ze wszystkimi, oddzielnie kompilowanymi, modułami programu. Każdej zmiennej globalnej przypisuje się lokalizację w wektorze za pomocą składni GLOBAL $( NUMBER:100; COUNTER:101 $) W powyższym przykładzie zmienne StałeW podobny sposób do deklarowania zmiennych globalnych zdefiniować można stałe. Służy do tego konstrukcja Instrukcje warunkoweW BCPL dostępne są cztery rodzaje instrukcji warunkowych[21]:
Słowa Ciało instrukcji PętleBCPL udostępnia sześć rodzajów pętli[24]:
Dodatkową kontrolę nad przepływem sterowania w pętli dają słowa kluczowe: Instrukcja skokuZa realizację skoków w BCPL odpowiada instrukcja Etykiety w BCPL są traktowane jak zmienne, to znaczy można je w szczególności przypisywać do innych zmiennych oraz przekazywać jako argument do podprogramów[27]. Deklaracja etykiety składa się z identyfikatora oraz następującego po nim dwukropka i może występować przed poleceniem oraz deklaracją innej etykiety. Niedopuszczalne jest natomiast etykietowanie innych rodzajów deklaracji[27]. Podprogramy
Język BCPL wyróżnia dwa rodzaje podprogramów: procedury i funkcje. Zasadniczą różnicą między nimi jest fakt, że tylko te drugie mogą zwracać wartość. Oba deklaruje się w podobny sposób, z użyciem słowa // Deklaracja funkcji: zwraca sumę trzech liczb
LET FUNKCJA(ARG0, ARG1, ARG2) = ARG0 + ARG1 + ARG2
// Deklaracja procedury: wypisuje na ekran sumę trzech liczb
LET PROCEDURA(ARG0, ARG1, ARG2) BE WRITEN(ARG0 + ARG1 + ARG2) Po znaku równości musi znaleźć się wyrażenie, którego wartość zostanie zwrócona jako wartość funkcji. Z kolei po słowie Przekazywanie parametrów w BCPL odbywa się na ogół przez wartość. Wyjątkiem są przekazywane przez referencję wektory[29]. Blok zwracający wartośćW przypadku, gdy funkcja jest definiowana z użyciem instrukcji złożonej, wykorzystuje się konstrukcję Wykorzystanie i implementacjeTo właśnie w BCPL napisano oryginalny program Hello world. Pierwszy MUD także powstał w BCPL[32]. Kilka z systemów operacyjnych zostało napisanych częściowo lub w całości w BCPL (dla przykładu TRIPOS i wczesne wersje AmigaDOS – fragment AmigaOS). Był to także język używany jako pierwszy w projekcie Xerox PARC Alto – projekcie pierwszego współczesnego komputera osobistego. System obróbki dokumentów Bravo to kolejny przykład aplikacji napisanej w BCPL. Wczesny kompilator, uruchomiony w 1969 roku poprzez puszczenie w obieg taśmy papierowej z O-kodem kompilatora Atlas 2, zaprojektowany był dla ICT 1900. Maszyny różniły się długością słowa (48 a 24 bity), kodowaniem znaków i różnymi reprezentacjami spakowanych ciągów znaków. Udany rozruch zwiększył wiarę w jego praktyczność zastosowania. W późnych latach 70. istniały implementacje dla Honeywell 635, Honeywell 645, IBM 360, PDP-10, TX-2 , CDC-6400 , UNIVAC 1108, PDP-9, KDF 9 i Atlas 2. W 1974 roku w Bolt Beranek and Newman (BBN) przygotowano dialekt BCPL, który nie wykorzystywał O-kodu. Wstępna implementacja była cross-kompilowana na PDP-10 należących do BBN i służyć miała wykorzystaniu na PDP-11, wykorzystywanych w BBN-owskiej implementacji drugiej generacji IMP obsługujących ARPANET. Istniała także wersja dla BBC Micro opracowana w połowie lat 80. przez Richards Computer Products, firmę pod dyrektorstwem Johna Richardsa, brata dr. Martina Richardsa. Projekt BBC Domesday oparty był na BCPL. Pewne warianty BCPL dla Amstrad CPC oraz Amstrad PCW ujrzały światło dzienne w 1986 roku poprzez Arnor Ltd. MacBCPL został wydany dla Apple Macintosh w 1985 przez Topexpress Ltd. W 1979 istniały implementacje BCPL dla 25 architektur, ale obecnie się go już nie używa. Jego następca, C, jest językiem, w którym tworzy się systemy operacyjne. Budowa BCPL mocno wpłynęła na język B, który następnie wpłynął na język C. Przypisy
Bibliografia
Linki zewnętrzne
|