Języki i gramatyki. Języki i gramatyki formalne. Języki i gramatyki formalne. Języki i gramatyki formalne. Gramatyki formalne



Podobne dokumenty
Języki i gramatyki formalne

Translacja i translatory Translacja

TRANSLACJA I TRANSLATORY

Wprowadzenie do programowania języki i gramatyki formalne. dr hab. inż. Mikołaj Morzy

GRAMATYKI BEZKONTEKSTOWE

Wprowadzenie do programowania

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE

Wykład V. Rzut okiem na języki programowania. Studia Podyplomowe INFORMATYKA Podstawy Informatyki

Języki programowania zasady ich tworzenia

Programowanie komputerów

1. Maszyna Turinga, gramatyki formalne i ONP

Języki formalne i automaty Ćwiczenia 1

2.2. Gramatyki, wyprowadzenia, hierarchia Chomsky'ego

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Gramatyki, wyprowadzenia, hierarchia Chomsky ego. Gramatyka

Czym jest Java? Rozumiana jako środowisko do uruchamiania programów Platforma software owa

Matematyczne Podstawy Informatyki

Technologie informacyjne - wykład 12 -

Programowanie. Pascal - język programowania wysokiego poziomu. Klasa 2 Lekcja 9 PASCAL

Podstawy programowania wykład

Definicje. Algorytm to:

Java EE produkcja oprogramowania

Informatyczna Wieża Babel, czyli o różnych językach programowania. Informatyczna Wieża Babel, czyli o różnych językach programowania

Metody Kompilacji Wykład 3

Podstawy programowania

Podstawy Informatyki Gramatyki formalne


JAO - Wprowadzenie do Gramatyk bezkontekstowych

Gramatyki atrybutywne

Analiza semantyczna. Gramatyka atrybutywna

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Komputer nie myśli. On tylko wykonuje nasze polecenia. Nauczmy się więc wydawać mu rozkazy

Języki formalne i automaty Ćwiczenia 2

Algorytmy od problemu do wyniku

Podstawy programowania. Wprowadzenie

O (o)programowaniu. R. Robert Gajewski omklnx.il.pw.edu.pl/~rgajewski

Efektywna analiza składniowa GBK

Wstęp do Informatyki. Program, proces tworzenia programu Środowisko programistyczne Języki programowania

Hierarchia Chomsky ego Maszyna Turinga

Bazy danych i strony WWW

Parsery LL(1) Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Metody Kompilacji Wykład 1 Wstęp

Gramatyki (1-2) Definiowanie języków programowania. Piotr Chrząstowski-Wachjtel

Wykład 4. Algorytmy i programy. Algorytmy + struktury danych = programy. Niklaus Wirth. Algorytm = logika + sterowanie.

Wstęp do Programowania Obiektowego. Wykład 13 Paradygmaty. Składnia i semantyka.

ALGORYTMY I PROGRAMY

Podstawy Programowania Algorytmy i programowanie

Programowanie w języku Python. Grażyna Koba

Programowanie I. Wprowadzenie. Proces programowania

Wprowadzenie do analizy składniowej. Bartosz Bogacki.

Języki formalne i automaty Ćwiczenia 9

Odwrotna Notacja Polska

Plan wykładu. Kompilatory. Literatura. Translatory. Literatura Translatory. Paweł J. Matuszyk

Algorytm. Krótka historia algorytmów

Metodologie programowania

Języki i metodyka programowania

Sprzęt komputera - zespół układów wykonujących programy wprowadzone do pamięci komputera (ang. hardware) Oprogramowanie komputera - zespół programów

wstęp (podstawowe pojęcia związane z programowaniem, przegląd języków programowania, sieci działań, ogólne zasady programowania zorientowanego

Analiza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Paradygmaty programowania

Matematyczna wieża Babel. 4. Ograniczone maszyny Turinga o językach kontekstowych materiały do ćwiczeń

Algorytmy zapisywane w pseudojęzyku programowania. Klasa 2 Lekcja 6

Wprowadzenie do XML. Joanna Jędrzejowicz. Instytut Informatyki

Podstawy Informatyki Języki programowania

Wstęp do Informatyki dla bioinformatyków

Składnia rachunku predykatów pierwszego rzędu

1 Podstawy c++ w pigułce.

Języki formalne i automaty Ćwiczenia 4

Programowanie w C. dr inż. Stanisław Wszelak

Język ludzki kod maszynowy

Wprowadzenie: języki, symbole, alfabety, łańcuchy Języki formalne i automaty. Literatura

Dla człowieka naturalnym sposobem liczenia jest korzystanie z systemu dziesiętnego, dla komputera natomiast korzystanie z zapisu dwójkowego

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Programowanie w języku C++ Grażyna Koba

Jaki język zrozumie automat?

Java jako język programowania

Programowanie niskopoziomowe. dr inż. Paweł Pełczyński

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Lingwistyka Matematyczna Języki formalne i gramatyki Analiza zdań

Modelowanie i Programowanie Obiektowe

Algorytm - pojęcie algorytmu, sposób zapisu, poziom szczegółowości, czynności proste i strukturalne. Pojęcie procedury i funkcji.

Języki programowania deklaratywnego

Programowanie obiektowe - 1.

Metody Kompilacji Wykład 8 Analiza Syntaktyczna cd. Włodzimierz Bielecki WI ZUT

Języki i paradygmaty programowania. I. Wprowadzenie

10. Translacja sterowana składnią i YACC

Typy przetwarzania. Przetwarzanie zcentralizowane. Przetwarzanie rozproszone

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

WPROWADZENIE. Użycie PHP

Zapisywanie algorytmów w języku programowania

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

5-6. Struktura dokumentu html. 2 Określenie charakteru i tematyki strony. Rodzaje witryn. Projekt graficzny witryny. Opracowanie skryptów

PROGRAM NAUCZANIA DLA ZAWODU TECHNIK INFORMATYK, O STRUKTURZE PRZEDMIOTOWEJ

Programowanie obiektowe. Wprowadzenie

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

Wykład I. Wprowadzenie do baz danych

Wyrażenia regularne.

Transkrypt:

Języki i gramatyki formalne Języki i gramatyki formalne Cechy języka naturalnego - duża swoboda konstruowania zdań (brak ścisłych reguł gramatycznych), duża ilość wyjątków. Języki formalne - ścisły i jednoznaczny opis konstrukcji. Języki i gramatyki formalne Języki i gramatyki formalne Alfabet V = {v 0,..., v n } dowolny skończony i niepusty zbiór symboli (liter), z których będą zestawiane słowa języka Słowo nad alfabetem V wszystkie skończone, uporządkowane ciągi złożone z elementów alfabetu. Słowo puste ε słowo nie mające żadnej litery Jeśli V= {a}, to V*= {ε,{ a, aa, aaa, } Jeśli V={a,b}, to V*={ε, a, b, aa, ab, bb, aaa, aab, } Długość słowa liczba jego liter Języki i gramatyki formalne Język uniwersalny V* zbiór wszystkich słów nad alfabetem V Język dowolny podzbiór języka uniwersalnego V* nad V Syntaktyka (składnia) języka reguły budowy zdań w języku Semantyka języka interpretacja tych reguł, zasady stosowania składni Gramatyki formalne Gramatyka - wyodrębnia język konkretny z języka uniwersalnego: gramatyka generacyjna - zbiór reguł umożliwiających generowanie słów danego języka z liter alfabetu; gramatyka analityczna - podaje jak rozróżnia słowa poprawnie zbudowane od niepoprawnych.

Przykład gramatyki generacyjnej Gramatyka generująca słowa: aaaab, bbbb, a, b, Alfabet = { a, b }; Reguła : a jest poprawne (tzn. słowo złożone z a jest poprawne). Reguła 2: jeżeli a jest poprawne to ab też jest poprawne. Przykłady poprawnych słów: a - na podstawie Reguły. aab na podstawie Reguły i Reguły 2. aaabb - na podstawie Reguły i dwukrotnej Reguły 2. Symbol początkowy: Produkcje: (reguły zastępowania) Produkcje i wywód V* = {,,,... } ) 2) S S S S Wywód: : S : S 2 S 2 S ) 2) 3) 4) 5) Inne produkcje S AB A A A B 0 B B 0 Wywód: 0: S AB 2 B 4 0 00: Gramatyka kombinatoryczna Noama Chomsky'ego Gramatykę Chomsky'ego określa związek 4 elementów: G = < V, T, P, S > V skończony zbiór symboli pomocniczych (zwanych czasem nieterminalnymi lub nieterminalami) T skończony zbiór symboli końcowych (zwanych czasem terminalnymi lub terminalami), P zbiór produkcji, S symbol startowy (aksjomat), z niego wyprowadzane są wszystkie generowane przez gramatyk G napisy. Gramatyka kombinatoryczna Noama Chomsky'ego Gramatyka Pojedynczą produkcję interpretujemy jako możliwość zastąpienia symbolu pomocniczego przez słowo, w skład którego mogą wchodzić zarówno symbole pomocnicze, jak i końcowe. Proces wyprowadzania słów języka zdefiniowanego przez gramatykę odbywa się w taki sposób, że zaczynamy od symbolu S i do poszczególnych symboli pomocniczych stosujemy którąś z produkcji ze zbioru P tak długo, aż wszystkie symbole pomocnicze znikną. S AB A A A B 0 B B 0 Symbol początkowy

Gramatyka Gramatyka S AB A A A B 0 B B 0 Symbol początkowy Symbole nieterminalne V = {S, A, B} S AB A A A B 0 B B 0 Symbol początkowy Symbole nieterminalne V = {S, A, B} Symbole terminalne T = {0, } S AB A A A B 0 B B 0 Gramatyka Symbol początkowy Symbole nieterminalne V = {S, A, B} Symbole terminalne T = {0, } Produkcje Przykłady gramatyk Jeśli w trakcie wywodu słowa s pojawia się kilka identycznych symboli pomocniczych, to każdy z nich może e samodzielnie decydować o tym, co z siebie wyprodukować. Przykład Gramatyka generująca wszystkie parzyste słowa s złożone one z samych liter (uwaga słowo s puste jest słowem o parzystej długod ugości!): G =<{S}, {a}, {S ε, S aas}, S> Przykłady gramatyk Przykład 2 Gramatyka generująca wszystkie parzyste palindromy nad dwuelementowym alfabetem G 2 =<{S}, {a}, {S ε, S asa, S bsb}, S> Język generowany przez gramatykę To, co zostanie, czyli słowo złożone z samych symboli końcowych, nazywamy słowem wyprowadzalnym z gramatyki. Zbiór wszystkich słów wyprowadzalnych z danej gramatyki nazywa się językiem generowanym przez gramatykę.

Język generowany przez gramatykę Język generowany przez gramatykę G jest to zbiór wszystkich możliwych słów powstałych na bazie listy produkcji i wyprowadzonych z symbolu startowego języka L(G)={x: x V* S x} Gdzie: V* zbiór r wszystkich możliwych słóws proces wywodu słowa x z symbolu startowego S na podstawie listy produkcji P Przykład gramatyki generującej język L={a n b n c n d n, n=, 2,..} Szukana gramatyka: G = < V, T, P, S > V = { S, B, D, E } T = { a, b, c, d} P = { r,,, r 9 } Lista produkcji: r : S abde r 2 : S abcd r 3 : B abde r 4 : B abc r 5 : bd bbc r 6 : cd Dc r 7 : ED DE r 8 : ce cdd r 9 : de dd Przykład wywodu słowa s aaabbbcccddd Wywód 3: Przykład wywodu słowa s aaabbbcccddd Teraz nie osiągnęliśmy symboli końcowych. Ta gramatyka nie jest przydatna do definiowania języka programowania. Klasyfikacja Chomsky ego Klasyfikacja Chomsky ego W teorii Chomsky ego wyróżnia się cztery typy gramatyk. Wyodrębnia się je przez nakładanie adanie kolejno coraz silniejszych ograniczeń na układ reguł P Gramatyka klasy 0 charakteryzuje się tym, że wszystkie produkcje mają postać: u w, gdzie u u V* \ { ε }, w V* Gramatyka klasy (kontekstowa) charakteryzuje się tym, że e wszystkie produkcje mają postać: uaw ubw, gdzie: u,w V*,, A S, b V* \ { ε } Gramatyka klasy 2 (bezkontekstowa( bezkontekstowa) w układzie reguł P dopuszcza się jedynie reguły y postaci: A b, gdzie A S, b V* \ { ε }

Klasyfikacja Chomsky ego Klasyfikacja Chomsky ego Gramatyka klasy 3 (regularna, liniowa) w układzie reguł P dopuszcza reguły y postaci: A bb,, albo A Bb, gdzie A S, B S { ε }, b T* \ { ε } Każda gramatyka klasy i jest jednocześnie nie gramatyką klasy j dla 0 j i Każdy zbiór r ciągów wywodliwych zgodnie z gramatyką klasy i jest jednocześnie nie zbiorem ciągów wywodliwych zgodnie z gramatyką niższych klas. Odwrotne twierdzenie nie jest prawdziwe. Im wyższa klasa gramatyki tym mniej precyzyjnie określa się rozmaitość wywodliwych ciągów. Klasyfikacja Chomsky ego Gramatyki klasy 0 Gramatyki kontekstowe Gramatyki bezkontekstowe Gramatyki liniowe Ilustracja poszczególnych gramatyk Jako ilustrację do poszczególnych gramatyk rozpatrzymy przykład ciągów: aaa bbb ccc W skrócie będziemy je oznaczać a k b l c m Ilustracja poszczególnych gramatyk Nie nakładamy żadnych ograniczeń na wartości k, l, m Można znaleźć prawostronnie regularną gramatykę G = < V, T, P, S > generującą szukany ciąg: V = { a, b, c } T = { S, V, U} P = { r,,, r 6 } Lista produkcji: r : S as r 2 : S av r 3 : V bv r 4 : V bu r 5 : U cu r 6 : U c Ilustracja poszczególnych gramatyk Dla ciągów ograniczonych, gdzie k = m nie można zbudować gramatyki regularnej Ciągi można określić przez gramatykę bezkontekstową G = < V, T, P, S > : V = { a, b, c } T = { S, V} P = { r,,, r 4 } Lista produkcji: r : S asc r 3 : V Vb r 2 : S avc r 4 : V b

Ilustracja poszczególnych gramatyk Zdefiniowanie ciągów o jednakowej liczbie wystąpień dla każdej z liter (k = l = m) wymaga gramatyki kontekstowej lub gramatyki klasy 0, np. G = < V, T, P, S > : V = { a, b, c } T = { S, U } P = { r,,, r 4 } Lista produkcji: r : S abc r 3 : cu Uc r 2 : S asuc r 4 : bu bb Notacja Backusa-Naura (BNF) Umożliwia opisanie gramatyki bezkontekstowej, w sposób w sposób alternatywny do algebraicznego zapisu. Podstawowe konwencje notacji BNF: symbole nieterminalne: symbole zamknięte w nawiasy < > "strzałka" reguły: symbol ::= alternatywne wyprowadzenia: rozdzielone pionową kreską opcjonalne elementy: zamknięte w nawiasy [ ] jedno- lub wielokrotne powtórzenie: { } n zerowe, jedno lub wiele powtórzeń: { } n 0 połączenie : { } Przykład notacji algebraicznej Gramatyka G = < V, T, P, S > generująca proste wyrażenia arytmetyczne V = {a, b, d, +, *, (, )} T = {W, K, C} Semantyka powyższych symboli jest następująca: W wyrażenie; K - składnik, C czynnik; Symbol startowy S: S = W P = { r,,, r 0 } Lista produkcji: r : W K r 2 : W W + K r 3 : W K + W r 4 : K C r 5 : S C * K r 6 : S K * C r 7 : C a r 8 : C b r 9 : C d 0 : C ( W ) r 0 Przykład notacji BNF Gramatyka G = < V, T, P, S > generująca proste wyrażenia arytmetyczne V = {a, b, d, +, *, (, )} T = {W, K, C} Semantyka powyższych symboli jest następująca: W wyrażenie; K - składnik, C czynnik; Symbol startowy S: S = W ::= <K> + <K> <K> + <K> ::= * <K> <K> * ::= ( ) a b d Symbole zapisane bez nawiasów < > i nie będące symbolami używanymi przez notację BNF są symbolami terminalnymi. Drzewa rozbioru Drzewa rozbioru Historię wyprowadzeń słowa w danej gramatyce możemy zapisać za pomocą drzewa wywodu (nazywanego też drzewem rozbioru lub drzewem analizy składniowej). Wierzchołki drzewa rozbioru etykietuje się albo symbolami terminalnymi, albo kategoriami syntaktycznymi, albo symbolem ε. Liście są etykietowane jedynie symbolami terminalnymi lub symbolem ε. Wierzchołki wewnętrzne są etykietowane jedynie kategoriami syntaktycznymi. Każdy wierzchołek wewnętrzny v reprezentuje zastosowanie produkcji. Oznacza to, że kategoria syntaktyczna etykietująca wierzchołek v stanowi cześć nagłówkową produkcji. etykiety potomków wierzchołka v, od strony lewej do prawej, tworzą cześć zasadniczą tej produkcji.

Przykład drzewa rozbioru Rozpatrzmy gramatykę G=(V,T,P,S), V = {S,A} T = {a,b} P = { r,,, r 5 } Lista produkcji: r : S aas r 2 : S a r 3 : A SbA r 4 : A SS r 5 : A ba Wywód dla tej gramatyki: r r 3 r 2 r 5 r 2 S aas asbas aabas aabbas aabbaa Przykład drzewa rozbioru S ::= aas a A ::= SbA SS ba S aas asbas aabas aabbas aabbaa S a A S S b A a a b a Przykład drzewa rozbioru Drzewo rozbioru dla ciągu znaków 3 * (2 + 4) przy użyciu gramatyki zdefiniowanej poniżej: <Cyfra> 0 2 3 4 5 6 7 8 9 <Liczba> <Cyfra> <Liczba> <Liczba> <Cyfra> 3 <Wyrażenie> <Liczba> <Wyrażenie> ( < Wyrażenie> ) <Wyrażenie> <Wyrażenie> + <Wyrażenie> <Wyrażenie> <Wyrażenie> - <Wyrażenie> <Wyrażenie> <Wyrażenie> * <Wyrażenie> <Wyrażenie> <Wyrażenie> / <Wyrażenie> < W > < W > < W > * ( ) < W > < W > + < W > 2 4 Etapy konstruowania drzewa rozbioru 3*(2+4) (a) Konstruujemy jednowierzchołkowe drzewo dla każdego symbolu terminalnego w drzewie. Używamy produkcji <Cyfra> 0 2 3 4 5 6 7 8 9 4 2 3 Etapy konstruowania drzewa rozbioru 3*(2+4) (b) Określamy że cyfry są liczbami. Używamy produkcji <Liczba> <Cyfra> Etapy konstruowania drzewa rozbioru 3*(2+4) (c) Określamy że cyfr i liczba jest liczba. Wynikiem drzewa jest 4. Używamy produkcji <Liczba> <Liczba> <Cyfra> 2 3 4

Etapy konstruowania drzewa rozbioru 3*(2+4) (d) Tworzymy drzewa rozbioru dla wyrażeń 3, 2, 4. Używamy produkcji: <Wyrażenie> <Liczba> < W> 3 < W> 2 < W > 4 Etapy konstruowania drzewa rozbioru 3*(2+4) (e) Tworzymy drzewo dla sumy 2 + 4. Używamy produkcji <Wyrażenie> <Wyrażenie> + <Wyrażenie> < W> 2 < W > + < W > 4 Etapy konstruowania drzewa rozbioru 3*(2+4) Etapy konstruowania drzewa rozbioru 3*(2+4) (f) Tworzymy drzewo dla sumy (2 + 4). Używamy produkcji: <Wyrażenie> ( <Wyrażenie> ) < W > ( < W > ) < W> + < W > < W > < W > < W > * ( ) < W > 3 < W > + < W > 2 4 (g) Tworzymy drzewo 3* (2 + 4). Używamy produkcji: <Wyrażenie> <Wyrażenie> * (<Wyrażenie> ) 2 4 Uzasadnienie poprawności konstrukcji drzew rozbioru Można udowodnić, że wyniki drzew rozbioru o korzeniu <S> odpowiadają dokładnie ciągom znaków języka L(<S>) dla dowolnej kategorii syntaktycznej <S>. To znaczy:. Jeżeli T jest drzewem rozbioru o korzeniu zaetykietowanym przez <S> i daje ono wynik s, to ciąg s należy do języka L(<S>). 2. Jeżeli ciąg s należy do języka L(<S>), to istnieje drzewo rozbioru dające wynik s oraz posiadające korzeń zaetykietowany przez <S>. Czy (a + b ) * d jest prostym wyrażeniem arytmetycznym? Lista produkcji: r: W S r2: W W + S r3: W S + W r4: S C r5: S C * S r6: S S * C r7: C a r8: C b r9: C d r0: C ( W )

Drzewa rozbioru i drzewa wyrażeń Mając sformułowaną gramatykę wyrażeń możemy drzewa rozbioru przekonwertować na drzewa wyrażeń, dokonując trzech transformacji:. Wierzchołki związane z poszczególnymi operandami niepodzielnymi są łączone w jeden wierzchołek zaetykietowany danym operandem 2. Operatory zostają przesunięte z liści do ich wierzchołków nadrzędnych. To znaczy symbol operatora, taki jak +, staje się etykietą wierzchołka umieszczonego nad nim, który wcześniej był zaetykietowany kategoria syntaktyczna wyrażenia. 3. Wierzchołki wewnętrzne, których etykietami wciąż są wyrażenia zostają usunięte. drzewo rozbioru < W > < W > < W > * ( ) < W > 3 < W > + < W > 2 4 drzewo wyrażeń 3 * ( + ) 2 4 Niejednoznaczność i projektowanie gramatyk Rozważmy gramatykę: G = < {S}, {a,b}, {S ::= SaS b}, S > Za pomocą tej gramatyki możemy wygenerować dowolną naprzemienną sekwencję liter a oraz b zaczynającą się i kończącą na literę b. Na ile sposobów można otrzymać słowo babab? W notacji liniowej tych sposobów jest 2, np.: S SaS SaSaS SaSab basab babab S SaS Sab SaSab Sabab babab Niejednoznaczność i projektowanie gramatyk Istnieją dwa drzewa wywodu tego słowa: S SaS SaSaS SaSab basab babab S S a S S a S b b b Niejednoznaczność i projektowanie gramatyk Istnieją dwa drzewa wywodu tego słowa: S SaS Sab SaSab Sabab babab S S a S b S a S Niejednoznaczność i projektowanie gramatyk Można gramatykę tak skonstruować, żeby słowo babab, podobnie jak i każde inne generowane przez powyższą gramatykę, miało tylko jedno drzewo wywodu. Oto ta gramatyka: G = < {S}, {a,b}, {S ::= ε, S ::= bas b}, S > Taka gramatyka ma już tylko jedno drzewo wywodu dla słowa babab. b b

Niejednoznaczność i projektowanie gramatyk Gramatyka G jest jednoznaczna, jeśli każde słowo wyprowadzalne z G ma tylko jedno drzewo wywodu. Gramatyka w której istnieją dwa lub więcej drzewa rozbioru o tym samym wyniku oraz tej samej kategorii syntaktycznej etykietującej korzeń jest nazywana gramatyką niejednoznaczną. Wystarczy żeby istniał choć jeden taki ciąg który jest niejednoznaczny. Powiemy, że gramatyka G jest zgodna z językiem L T*, jeśli każde słowo wyprowadzalne z G należy do L. Powiemy, że gramatyka G jest pełna względem języka L, jeśli wszystkie słowa należące do L są wyprowadzalne z G. Niejednoznaczność gramatyk wyrażeń może być poważnym problemem. Niektóre drzewa rozbioru mogą dawać złe wartości dla wyrażeń. Dwa drzewa rozbioru dla wyrażenia: -2+3 - <L> + <L> <L> 2 Poprawne drzewo rozbioru -2+3 = 2 3 <L> - <L> 2 + <L> Niepoprawne drzewo rozbioru -2+3=-4 3 Niejednoznaczność gramatyk + <L> <L> * <L> 3 2 Niepoprawne drzewo rozbioru + 2 * 3 = 9 <L> + * <L> 2 <L> 3 Poprawne drzewo rozbioru + 2 * 3 = 7 + <S> - <S> <Cz> <L> <Cz> <L> 2 <S> <Cz> <L> 3 Poprawne drzewo rozbioru 2 + 3 Poprawne drzewo rozbioru + 2 * 3 <S> <Cz> <L> + <S> <Cz> <L> 2 <S> * <Cz> <L> 3 Istota niejednoznaczności Analizator składniowy który konstruuje drzewa rozbioru dla programów stanowi podstawowy element kompilatora. Jeżeli gramatyka opisująca język programowania jest niejednoznaczna, oraz jeżeli jej niejednoznaczności są wyprowadzone jednostronnie, to w przypadku przynajmniej części programów istnieje więcej niż jedno drzewo rozbioru. Jeżeli gramatyka programu jest niejednoznaczna, kompilator nie może podjąć prawidłowej decyzji odnośnie do drzewa rozbioru dla pewnych programów, a w związku z tym nie może zdecydować, jakie działania powinien wykonać program w języku maszynowym. Kompilatory muszą korzystać ze specyfikacji które są jednoznaczne. Języki generowane przez gramatyki klasy 0-30 0 rekurencyjnie przeliczalne, kontekstowe, 2 bezkontekstowe, 3 regularne.

Zadania Dana jest gramatyka G = <V,T,P,,P,S>: V = { S, A, B } T = { a, b, c } Produkcje: B aa B Sb A cab S c Przedstawić wyw abcbacabbaa. A BaA S ababb owa wywód d i drzewo wywodu słowa s S ababb abbaabb absbaabb abcbaabb abcbacabbb abcbacabba Zadania Zdefiniować gramatykę G generującą liczby całkowite. Liczba składa się z niepustego ciągu cyfr i może zawierać znak. V = {0,,2,3,4,5,6,7,8,9,+,-} T = { LC, L, C, Z} Produkcje: <LC> ::= <Z><L> <L> <L> ::= <L> ::= 0 2 3 4 5 6 7 8 9 <Z> ::= + - S = LC Dany jest język j L(G): G = <V,T,P,,P,S> V = { S, A } T = { a, b } Produkcje: S aas a Zadania A SbA SS ba Czy słowo s aabbaa należy y do języka? j Aby słowo s należało o do języka j należy y udowodnić, że Słowo jest wyprowadzalne z S Słowo to musi należeć do T Zadania Dany jest język j L(G): G = <V,T,P,,P,S> T = {a,b{ a,b,,z,+,(,),*} V = {W,S,C{ W,S,C} Produkcje: ::= +<S< W>+<S> <S> <S> ::= <S>* < S>* <C ::= () a b c... z S = W Czy słowo: s (((a+b * d) * d + a)) + a+b+d jest słowem poprawnym języka j L(G) )? Zadania Dany jest język j L(G): G = <V,T,P,,P,S> T = {a,b{ a,b,,z,+,(,),*} V = {W,S,C{ W,S,C} Produkcje: ::= +<S< W>+<S> <S> <S> ::= <S>* < S>* <C ::= () a b c... z S = W Czy słowo: s (((a+b * d) * d + a)) + a+b+d jest słowem poprawnym języka j L(G) )? Translacja W praktyce informatycznej często zachodzi konieczność tłumaczenia tekstu zapisanego w jednym języku formalnym na inny język (np. przetworzenie tekstu zapisanego w języku wysokiego poziomu na kod maszynowy) Proces tłumaczenia nosi nazwę translacji. Translacja to przekład tekstów zredagowanych w jednym języku zwanym źródłowym na równoważny semantycznie tekst w innym języku zwanym wynikowym.

Translacja Translacja W przypadku gdy dany język wysokiego poziomu ma stosunkowo łatwą gramatykę, translacja może być wykonana samoczynnie przez maszynę cyfrową przy pomocy specjalnego programu translacji zwanego translatorem. Translatory dzielimy zazwyczaj na dwie kategorie: kompilatory interpretatory. Translacja Kompilator jest translatorem, operującym na całym tekście programu źródłowego generując tekst przekładu jako całość Interpreter operuje na poszczególnych jednostkach syntaktycznych programu źródłowego i generuje ich przekłady. Translacja Jeśli wykonywamy program początkowo zapisany w języku zewnętrznym to używając kompilatora: możemy przystąpić do wykonania programu w postaci docelowej dopiero po zakończeniu translacji. Oznacza to, że uzyskany tekst będący przekładem tekstu źródłowego w całości wprowadzany jest do maszyny cyfrowej; Translacja Translacja Jeśli wykonywamy program początkowo zapisany w języku zewnętrznym to używając interpretatora: możemy wykonywać przekłady poszczególnych jednostek syntaktycznych, nie czekając na cały proces translacji. Oznacza to, że cały czas operujemy na tekście źródłowym tłumacząc tylko te jednostki syntaktyczne, które są potrzebne aby poszczególny fragment programu mógł zadziałać.

Translacja W praktyce rzadko dokonuje się bezpośredniej translacji programów z języka zewnętrznego na język maszynowy. Najczęściej stosuje się proces pośredni to znaczy, najpierw dokonuje się translacji z języka zewnętrznego na język asemblerowy, a potem z języka asemblerowego na język maszynowy. Zastosowanie takiej dwuetapowej translacji niesie za sobą wiele zalet, m.in. możliwość łączenia poszczególnych części programów zapisanych w różnych językach zewnętrznych. Schematyczny przebieg powstawania programu algorytm programowanie programowanie w języku wysokiego poziomu kompilacja program w języku symbolicznym kod maszynowy pomysł programista (człowiek) algorytm oprogramowany kompilator (program) komputer Stos i ONP Bardzo ważnymi pojęciami bez których trudne byłoby zrozumienie zasad jakiejkolwiek translacji są : stos odwrotna notacja polska (ONP). Stos Stos jest to organizacja sekwencyjna pamięci operacyjnej maszyny cyfrowej. Stos działa jak pojemnik określonych jednostek, przy czym pobieranie elementów w nim zgromadzonych odbywa się w kolejności odwrotnej do magazynowania. Jest to struktura LIFO Dla stosu określa się dwie podstawowe operacje: dopisz a na stosie - w wyniku wykonania tej operacji jednostka a zostaje umieszczona na szczycie stosu (staje się pierwszym elementem stosu) odczytaj a ze stosu - w wyniku wykonania tej operacji jednostka a zostaje wydana na zewnątrz stosu. Odwrotna Notacja Polska (ONP) jeden z wariantów beznawiasowego zapisu wyrażeń formalnych, wynalezionego przez polskiego logika Jana Łukasiewicza (878-956). w tym beznawiasowym zapisie symbole operandów w poprzedzają bezpośrednio symbol operatora (notacja przyrostkowa) na przykład wyrażenie: a+b zapisujemy w ONP jako a b + Odwrotna Notacja Polska (ONP) Możemy wyróżni nić trzy rodzaje notacji: Infiksową : a + b Prefiksową: : + a b Postfiksową: : a b +

Odwrotna Notacja Polska (ONP) ze względu na łatwość obliczania wyrażeń zapisanych w ONP przy użyciu u stosu znalazła ona szerokie zastosowanie w arytmetyce komputerów Wyrażenia arytmetyczne w ONP Przykłady prostych wyrażeń arytmetycznych i odpowiadający im zapis w ONP:. ( a + b ) * d a b + d * 2. ( a + ( b * c ) ) a b c * + 3. ( ( a + b ) * ( z + x ) ) a b + z x + * 4. ( ( a + t ) * ( ( b + ( a + c ) ) ^ ( c + d ) ) ) a t + b a c + + c d + ^ * Gramatyka generująca wyrażenie arytmetyczne Gramatyka G = < V, T, P, S > generująca proste wyrażenia arytmetyczne, np. (a + b ) * d V = {a, b, d, +, *, (, )} T = {W, K, C} Semantyka powyższych symboli jest następująca: W wyrażenie; K - składnik, C czynnik; Symbol startowy S: S = W P = { r,,, r 0 } Lista produkcji i BNF Lista produkcji: r : W K r 2 : W W + K r 4 : K C r 5 : S C * K r 3 : W K + W r 6 : S K * C r 7 : C a r 8 : C b r 9 : C d r 0 : C ( W ) Zapis w notacji BNF: ::= <K> + <K> <K> + <K> ::= * <K> <K> * ::= ( ) a b d Wyrażenie arytmetyczne w ONP Zapis w notacji BNF: ::= <K> + <K> <K> + <K> ::= * <K> <K> * ::= ( ) a b d Gramatyka prostych wyrażeń arytmetycznych w ONP: ::= <O> <X> <X> ::= a b d <O> ::= + * Obliczanie wartości w ONP Pobieramy po kolei symbole wyrażenia od lewej strony do prawej; Jeżeli symbol jest liczbą (zmienną), to odkładamy go na stos; Jeżeli symbol jest opisem operacji - pobieramy dwa elementy ze stosu, wykonujemy te operacje, a wynik przesyłamy z powrotem na stos. Czynności te wykonujemy aż do wyczerpania się danych wejściowych. Obliczana wartość wyrażenia znajduje się na stosie.

Obliczanie wartości w ONP start pobierz symbol z lewej ku prawej ONP - przykład obliczania wartości Obliczyć wartość wyrażenia: 2 3 4 5 + * + Posługujemy się tabelką. Przedstawimy symbole pojawiające się kolejno na wejściu oraz zawartość stosu po każdym obiegu pętli głównej algorytmu obliczającego wyrażenie. argument T stos N N φ N T operator T pobierz argumenty ze stosu, wykonaj działanie, wynik na stos błąd KONIEC Obliczanie wartości wyrażenia - przykład Translacja wyrażeń arytmetycznych Obliczyć wartość wyrażenia: 2 7 + 3 / 4 3-4 * + 2 / Współczesne podejście translacji wyrażeń arytmetycznych polega na wydzieleniu dwu etapów translacji: translacja do ONP translacja ONP na język symboliczny Translacja wyrażeń arytmetycznych Translacja wyrażeń arytmetycznych W celu zobrazowania translacji do ONP przyjmujemy, że: źródłowy zapis wyrażeń arytmetycznych pojawia się na wejściu specjalnego automatu. na wyjściu uzyskamy zapis ONP tych wyrażeń, sam zaś automat wyposażony jest w pamięć stosową: Wyrażenie arytmetyczne Wyrażenie arytmetyczne Wyrażenie arytmetyczne Model automatu ze stosem do translacji wyrażeń arytmetycznych Podczas translacji wyrażeń arytmetycznych szczególnej analizie poddawane są symbole operacji (+,-,*,itp.) zwane ogranicznikami Wprowadza się dodatkowo listę priorytetów ograniczników Operator Funkcja (lg, sin, exp,...) Potęgowanie ( ) Mnożenie, dzielenie, negacja ( *, /, ) Dodawanie, odejmowanie (+, - ) Wzrost priorytetu Priorytet 0 2 3

Algorytm działania ania automatu do translacji Pobieramy kolejne znaki wyrażenia, które ma zostać przekształcone znak po znaku, począwszy od lewej strony. Dalsze postępowanie zależy od symbolu. Jeśli pobrany znak jest: argumentem, to należy przesłać go na wyjście, nawiasem otwierającym (, to należy położyć go na stos, nawiasem zamykającym ), to zawartość stosu, aż do napotkanego znaku ( należy przesłać na wyjście i usunąć nawias (, Algorytm działania ania automatu do translacji operatorem, to przeglądamy zawartość stosu w poszukiwaniu operatora o wyższym priorytecie : jeśli taki znajdziemy, to przesyłamy zawartość stosu na wyjście, zaś nowy operator wkładamy na stos, jeśli nie, operator odkładamy na stos. stos przeszukujemy do napotkania nawiasu ( lub do końca stosu, jeżeli nawias nie występuje. jeżeli nawias ( wystąpił i znaleźliśmy przed nim operator o wyższym priorytecie, to na wyjście trafia wszystko ze stosu do (, ale sam nawias zostaje na stosie, Algorytm działania ania automatu do translacji pobierz symbol z lewej ku prawej start znacznikiem końca wprowadzanego napisu, to kopiujemy zawartość stosu na wyjście, w przeciwnym wypadku sygnalizujemy błąd. Przetwarzanie kończymy w momencie napotkania znacznika końca napisu wejściowego. Nawiasów ( i ) nie kopiujemy na wyjście. błąd argument N φ T T wyjście N T ( stos N N ) operator N T T Zawartość stosu aż do ( na wyjście N Czy wyższy w stosie do ( lub dna T Stos na wyjście Zawartość stosu do ( lub do dna na wyjście, po czym operator na stos KONIEC stos Dokonać konwersji wyrażenia (((a))+b+d)*(d+e) na ONP Przykład konwersji () Dokonać konwersji wyrażenia na ONP Przykład konwersji (2) b * c + ( d - e*k ) Otrzymaliśmy na wyjściu ciąg: abd++de+* Otrzymaliśmy na wyjściu ciąg: b c d e k * - + *

Dokonać konwersji wyrażenia na ONP Przykład konwersji (3) ( ( a + b ) ( 3 * x + 7 * y ) ) Dokonać konwersji wyrażenia ( ( a + t ) * ( ( b + ( a + c ) ) ^ ( c + d ) ) ) na ONP Przykład konwersji (4) Otrzymaliśmy na wyjściu ciąg: a b + 3 x * 7 y * + - Otrzymaliśmy na wyjściu ciąg: a t + b a c + + c d + ^ * Generacje językj zyków Języki programowania można podzielić na pięć wyraźnie różniących się generacji (niektórzy mówią o czterech). W miarę jak zmieniał się komputer, wystąpiła konieczność dostarczania użytkownikowi narzędzi programistycznych, które umożliwiłyby mu maksymalne wykorzystanie sprzętu. Nie ma pełnej zbieżności chronologicznej między poszczególnymi generacjami języków i sprzętu. I generacja Programowanie pierwszych komputerów akceptujących zmianę oprogramowania odbywało się bezpośrednio w kodzie binarnym, który można przedstawić jako ciągi zer i jedynek. Każdy typ komputera operuje własnym kodem, który dlatego został określony nazwą język maszynowy lub wewnętrzny. I to właśnie stanowi główną wadę tych języków, gdyż programista każdorazowo musi dostosowywać się do języka konkretnej maszyny. Przykład: 0000000000000000000000 000000000000000000000000000 II generacja Ponieważ operowanie ciągami zero-jedynkowymi nie jest wygodne dla programisty, przypisano im łatwiejsze do zrozumienia znaki mnemotechniczne. Tak narodziły się języki symboliczne, zwane też asemblerami. Choć stanowią one proste tłumaczenie języka maszynowego na symbole i są ściśle związane z danym modelem komputera, to ułatwiają pisanie instrukcji i czynią je bardziej czytelnymi. Przykład: mov dx, offset info mov ah, 9 int 2h mov ah, 0 int 6h III generacja Języki wysokiego poziomu - symbole asemblera reprezentujące konkretne instrukcje zostały zastąpione kodem nie związanym z maszyną, bardziej zbliżonym do języka naturalnego lub matematycznego. Są to języki ogólnego przeznaczenia o dużym stopniu uniwersalności; ich rozwój ewoluował w kierunku języków problemowo zorientowanych Przykład: for i:= to MaxN do begin Vx[i]:=Vx[i]+dx[i]; end;

IV generacja Na czwartą generację języków programowania składa się szereg narzędzi, które umożliwiają budowę prostych aplikacji przez zestawianie prefabrykowanych modułów. Obecnie wielu specjalistów uważa, że nie są to języki programowania w ścisłym znaczeniu, gdyż częstokroć stanowią jedynie rozszerzenie języków już istniejących. Niektórzy autorzy proponują stosować nazwę czwarta generacja wyłącznie w odniesieniu do programowania obiektowego (OOP). V generacja Nazwę język piątej generacji stosuje się czasem w odniesieniu do języków używanych do tworzenia programów wykorzystujących tzw. sztuczną inteligencję (AI) lub inaczej systemów ekspertowych. Podział ję Podział ję Podział ze względu na rodzaj translacji: kompilowane, interpretowane. Podział ze względu na strukturę: języki proceduralne (imperatywne) programista określa JAKIE operacje maja być wykonane i w JAKIEJ KOLEJNOŚCI, języki nieproceduralne (deklaratywne) programista opisuje to, CO chce wykazać. Decyzja JAK to wykonać należy do kompilatora. Podział ję Podział ze względu na strukturę: języki strukturalne program rozbity na procedury (podprogramy), z których każda odpowiada za rozwiązanie określonego problemu. Procedury stanowią wtedy odrębne, samodzielnie działające całości, które możemy wykorzystać także i w innych pisanych programach. języki niestrukturalne brak wydzielonych obszarów odpowiedzialnych za rozwiązywanie określonych problemów. Podział ję Podział ze względu na zastosowania: algorytmiczne: do zapisywania algorytmów algebraiczne (Fortran, Pascal, C) - do zapisu algorytmów numerycznego przetwarzania informacji, ekonomiczne (COBOL, PL/) - opis algorytmów przetwarzania informacji o charakterze ekonomicznym, bankowym, handlowym. Rozbudowane mechanizmy operacji we/wy i pewne możliwości wykonywania operacji na danych nienumerycznych, do symbolicznego przetwarzania informacji (LISP) - do zapisu algorytmów przetwarzania informacji numerycznych i na danych symbolicznych.

Podział ję Podział ję Podział ze względu na zastosowania: języki symulacyjne (SIMULA) - ułatwiają opisywanie algorytmów modelowania i symulacji bezpośredniego dostępu (BASIC) - pozwalają na konwersację z maszyną. problemowe - ściśle dostosowane do konkretnej klasy zadań. Podział według struktury: języki strukturalne (Fortran, Pascal, Algol) języki zorientowane obiektowo (C++, Visual C++, Turbo Pascal, Delphi, Smalltalk, Objective-C, Eiffel, Lisp, Oberon, Actor, CLOS, Ada95, Prolog++, Zink, JAVA, J++, Visual Objects, Python): Podział ję W ostatnich latach w projektowaniu oprogramowania zorientowanego obiektowo wykształcił się wyraźny podział na: OOA - Object Oriented Analysis (Analiza Zorientowana Obiektowo) OOD - Object Oreinted Design (Projektowanie Zorientowane Obiektowo) OOP - Object Oriented Programming (Programowanie Zorientowane Obiektowo) Programowanie Podstawowym celem każdego języka programowania jest pomoc w budowie programu (programowaniu) w sferze: projektowania programu (zakres programu,specyfikacja danych); przejrzystości (wyrażanie akcji w sposób zrozumiały); dokumentacja powinna być integralną częścią procesu programowania; program powinien być zapisany czytelnie, aby umożliwić jego konserwację i dokonywanie w nim poprawek i rozszerzeń; weryfikacji (łatwość określania poprawności i testowania). http://www.levenez.com/lang/history.html Ada - język programowania wysokiego poziomu, opracowany w latach 975-98 na zamówienie Departamentu Obrony USA, spokrewniony z językiem Pascal. Przeznaczony do bezpośredniego sterowania procesami lub maszynami, np. samolotami wojskowymi. Służy głównie do oprogramowywania systemów czasu rzeczywistego, pozwala na kontrolowanie procesów zachodzących jednocześnie. Nazwa języka pochodzi od imienia Ady Augusty Lovelace (85-852), córki G.G.N. Byrona, matematyczki współdziałającej z Ch. Babbage em przy pracach nad pierwszą programowalną maszyną liczącą.

Visual Asembler Asembler - język programowania niskiego poziomu, wykorzystujący instrukcje procesora. Program napisany w asemblerze jest tłumaczony na (binarny) kod maszynowy. Program w asemblerze jest bardzo efektywny w porównaniu do programów napisanych w innych językach, jednakże jego tworzenie jest stosunkowo trudne. Basic (Beginners All-purpose Symbolic Instruction Code) - przełomowy w chwili powstania w 964, potem mocno krytykowany za brak strukturalności, prosty, interpretowany język programowania, spopularyzowany w komputerach ośmiobitowych i kalkulatorach programowanych. Basic z założenia nadawał się do pracy interakcyjnej i miał ujmować prostotą (m. in. brak typów, numerowane instrukcje ułatwiały redagowanie programu). Odrodzony i zmetamorfozowany zarówno pod względem struktur sterowania i danych, jak i interfejsu systemowego Basic znajduje szerokie zastosowanie pod postacią platformy programowania RAD o nazwie VisualBasic. W tym nowoczesnym produkcie z Basica pozostała głównie nazwa. ibasic C - proceduralny język programowania wysokiego poziomu, zaprojektowany w 972 przez D. M. Ritchiego i zrealizowany pod systemem operacyjnym UNIX dla komputera PDP-. Początkowo C był językiem oprogramowania systemowego (powstał jako język do przeprogramowania systemu UNIX). Szybko zyskał popularność jako uniwersalny język programowania. Cechami języka C są zwięzłość i elastyczność, przy jednoczesnym przerzucaniu dużej odpowiedzialności na programistę (nie ma np. wbudowanej kontroli indeksowania tablic). W latach 983-988 język C uległ standaryzacji. Znormalizowany język C nosi nazwę ANSI C.

C++ - obiektowy język programowania zaprojektowany przez B. Stroustrupa i in., w warstwie proceduralnej osadzony w notacji języka C, wpływ języków Algol 68 i Simula 67 oraz Ada, ML i Clu. Charakterystyczne cechy: dociążanie funkcji i operatorów, dziedziczenie z wielu klas, obsługa wyjątków, klasy parametryczne. Wersja pierwotna (979) nosiła nazwę C z klasami (C with classes), a jej kompilatory generowały kod w języku C. Standaryzowany od 994, standard ostateczny ISO/ANSI C++ (ANSI 4882) z września 998. Liczne kompilatory, m. in. Borland C++, Microsoft C++, Watcom C++, implementacje systemów operacyjnych, baz danych. Java, Smalltalk. DevC++ lcc Clips (C Language Integrated Production System) - rozwijany od 984 r. język przeznaczony do badania i rozwijania systemów ekspertowych, służący do programowania typu optymalizacji algorytmowej (rule-based), proceduralnego i obiektowego (COOL - Clips Object Oriented Language). CLIPS ma składnię przypominającą Lisp-a. Obecnie (2002) dostępna jest wersja 6.20 beta. Css (Cascading Style Sheets) - technologia (język) umożliwiająca przydzielanie stylu, tj. charakterystyk takich jak położenie, barwa, rozmiary, itp., elementom HTML. Arkusze styli są wzorcami (templates) przypominającymi wzorce znane np. z edytora tekstu Word (mogą być również dołączane z zewnątrz). CSS są w znacznym stopniu niezależne od platformy (stopień ich rozumienia przez nowe przeglądarki IE 5.5, Netscape 6 i Opera 5 jest oceniany odpowiednio na 92%, 98% i 99%).

DHTML (Dynamic HTML) - rozszerzenie języka HTML o wzorce stylu (style sheets), rozmieszczanie elementów na stronie WWW według upodobań użytkownika (content positioning) oraz możliwośćstosowania indywidualnych krojów pisma, sprowadzanych z komputera macierzystego danej strony WWW (downloadable fonts). Fortran (FORmula TRANslator) - jeden z pierwszych szeroko używanych, algorytmicznych języków programowania, opracowany przez J. Backusa w 957. Po wielu unowocześnieniach i zmianach (Fortran 77, Fortran 90) stosowany do dzisiaj. Język Fortran powstał jako wynik wczesnych doświadczeń w programowaniu komputerów za pomocą autokodów z lat 95-56. Pierwszą implementację Fortranu wykonano dla maszyny IBM-704. W 958 powstała wersja Fortran II wprowadzająca możliwość kompilacji niezależnej (IBM- 704), a w 959 jej odpowiednik dla komputera IBM-709. HTML (HyperText Markup Language) - specjalny język służący do opisu strony oraz odniesień z poszczególnych jej elementów do innych dokumentów. Język ten powstał na potrzeby internetowej usługi WWW. HTML Umożliwia umieszczenie na stronie tekstu zdefiniowanych dyrektyw co do sposobu jego prezentacji, wyróżnienia pewnych jego elementów edytorskich jak akapity, nagłówki itp. Pozwala także umieszczać bezpośrednio na opisywanych stronach grafikę, a w najnowszych wersjach również inne typy dokumentów. Java - popularny język programowania obiektowego autorstwa J. Goslinga, zaprojektowany w firmie Sun Microsystems, Używany szeroko do oprogramowywania specjalizowanych mikroprocesorów, wzbogacania prezentacji danych zawartych w dokumentach HTML, pamiętanych w komputerach sieci Internet oraz do opracowywania samodzielnych aplikacji wielowątkowych i rozproszonych. Kompilatory języka Java produkują bajtokod, który nadaje się do interpretacji w środowisku JVM. Znaczenie języka Java systematycznie rośnie. Przykład skryptu w Javie JavaScript, opracowany przez firmę Sun Microsystems język programowania obiektowego, przypominający C++, jednak przeznaczony do zastosowań sieciowych. Java nie przenosi wirusów i nie może uszkodzić komputera-klienta (o ile wiadomo). Java jest także środowiskiem przetwarzania online, działającym w tzw. maszynie wirtualnej Javy - JVM (Java Virtual Machine). Ta ostatnia jest rodzajem pośrednika pomiędzy programem Javy i komputerem. Kompilator Javy tworzy bowiem nie kod przeznaczony dla konkretnej platformy, lecz kod niezależny od sprzętu (przynajmniej na ogół), interpretowany przez JVM.

Lisp - język programowania oparty na przetwarzaniu list. Główny wkład w jego powstanie w latach 50. wniósł J. McCarthy, profesor wielu amerykańskich uczelni, m.in. Instytutu Technologicznego Massachusetts i Uniwersytetu Stanforda. Wywodzi się z badań teoretycznych nad tzw. rachunkiem lambda i stał się podstawowym językiem sztucznej inteligencji. Eclips Lisp Logo - edukacyjny język programowania biorący początek z badań nad psychologią uczenia się i jego wpływem na kształtowanie osobowości (J. Piaget), opracowany przez Seymoura Paperta i spopularyzowany przez niego w książce, rewolucyjnej z punktu widzenia metodologii nauczania, pt. Burze mózgów dzieci i komputery (Wydawnictwo Naukowe PWN, 996). Logo jest stosowane w początkowym nauczaniu matematyki oraz jako język komunikacji dziecka z komputerem; odznacza się interakcyjnością, znakomicie przemyślanym, prostym zestawem operacji graficznych i ogólnością składni wzorowanej na języku Lisp. MSW Logo NET Logo Star Logo

Visual Logo Pascal - strukturalny język programowania stworzony przez N. Wirtha na początku lat 70. Jego zastosowanie w praktyce jest obecnie bardzo ograniczone. Najważniejszym zastosowaniem języka Pascal jest nauka programowania. Pozostaje on przez to jednym z najszerzej znanych i popularnych języków, zwłaszcza wśród początkujących programistów. Perl (Practical Report and Extraction Language) interpretowany język programowania, zewnętrznie bardzo podobny do C/C++, dostosowany przez twórcę (Larry Wall, koniec lat 80-tych) przede wszystkim do przetwarzania plików tekstowych. Perl służy do administracji i oprogramowania WWW, w tym do pisania tzw. skryptów cgi. Trudno uznać Perl za język szczególnie przyjazny; jest jednak tak uniwersalny i przy tym rozpowszechniony, że warto go poznać, pomimo tego, że w ostatnich latach pojawiły się języki pod wieloma względami wydajniejsze (m.in. ASP i PHP). Perl powstał w środowisku unixowym, jednak niemal od razu został zaimplementowany jako ActivePerl również do Win32. Przykład skryptu w Perlu PHP - język skryptowy stosowany po stronie serwera podobnie jak np. Perl, z którym jest zresztą spokrewniony. Za pośrednictwem skryptów php typowy serwer (np. PWS, IIS, Apache) może przesyłać na strony sieciowe dane z relacyjnych baz danych (np. MySQL, msql, PostgreSQL a także MS Access). Mówiąc w uproszczeniu, kod php wbudowany jest w plik HTML pomiędzy znaczniki <?php i?>, chociaż można skonfigurować php tak, aby używać innych znaczników, np. <% i %>, jak w przypadku ASP. Kod php jest interpretowany przez serwer, przekształcany w tekst a następnie przesyłany do przeglądarki. Przykład skryptu w PHP

Prolog (PROgraming in LOGic) - deklaratywny język programowania w logice. Program w takim języku nie jest sekwencją działań, jak np. w języku proceduralnym, lecz zbiorem faktów i reguł pozwalających w oparciu o fakty formułować wnioski. Python - interpretowany współczesny język obiektowy. Istnieją implementacje dla różnych systemów operacyjnych. Posiada przejrzystą i łatwą do nauki strukturę. Python jest językiem darmowym - tworzone w nim aplikacje można również sprzedawać. Visual Prolog Python Ruby - interpretowany, w pełni obiektowy język programowania Ruby bazuje na wielu językach, takich jak Perl, Smalltalk, Python, CLU czy LISP. Składnia jest zorientowana liniowo i oparta na składni CLU (w mniejszym stopniu Perla). Program pisane w Ruby charakteryzują się wysoką wymiennością pomiędzy platformami (istnieją implementację na wiele maszyn UNIXowych, DOS, Windows, Mac, BeOS itd.). Język popularny w Japonii, oparty na języku japońskim. Ruby SQL (Structured Query Language) - standardowy język zapytań do obsługi relacyjnej bazy danych. Język programowania baz danych i ich sieciowych serwerów. Pierwowzorem SQL był opracowany przez IBM we wczesnych latach siedemdziesiątych XX w. język SEQUEL (E. F. Codd). Niezależnie od specyficznych właściwości standardów język SQL pozwala formułować działania na tabelach w formie zbliżonej do zdań w języku angielskim.

VRML (Virtual Reality Modeling Language) - opracowany w 993r. język udostępniający operacje na obiektach trójwymiarowych w Internecie. Dostępny dla większości przeglądarek po zainstalowaniu dodatkowej wtyczki. Od 995 r. dostępna jest wersja VRML 2.0. Przykład modelu w VRML XML (extensible Markup Language) - standard Internetowy (metajęzyk), oparty na SGML, a będący poszerzeniem techniki używania markerów (tagów) nie tylko do określania sposobu prezentacji, lecz także rodzaju przesyłanej informacji. Znaczniki nie są opisane w XML lecz definiowane przez użytkownika. Do opisu danych XML używa DTD - Document Type Definition. Jeśli więc HTML zajmuje się wyświetlaniem danych i ich wyglądem, to XML skupia się na opisie, przechowywaniu i przesyłaniu danych (lecz nie ich prezentacji) niezależnie od sprzętu, oprogramowania systemowego i aplikacji. Ma uzupełniać a nie zastępować HTML, nie jest językiem, jest uproszczoną wersją metajęzyka SGML. Hello Kolekcję ponad 300 programów Hello world w różnych językach programowania i w ponad 50 językach naturalnych : http://www.roesler-ac.de/wolfram/hello.htm Standardowe: Hello Pierwszy Hello powstał w 972 roku i był napisany w B (taki poprzednik C ;-). Na wyróżnienie zasługują: Assembler-Z80- Console i HQ9+ (za długość), Argh!, BrainFxxx, G-Code, Malbolge i MAMASH (za zakręcenie), CSS (za spryt), LabVIEW i Logo-graphical (za efekty specjalne).

Hello Assembler-Z80-Console Hello Na wyróżnienie zasługują: Assembler-Z80-Console i HQ9+ (za długość), Argh!, BrainFxxx, G-Code, Malbolge i MAMASH (za zakręcenie), CSS (za spryt), LabVIEW i Logo-graphical (za efekty specjalne). Assembler-Z80-Console Hello Assembler-Z80-Console Hello Assembler-Z80-Console Hello Assembler-Z80-Console Hello

Hello Hello Argh! BrainFxxx: G-Code: Hello Hello Malbolge : Hello Hello MAMASH : CSS :

Hello Hello LabVIEW : Logo-graphical :