Języki programowania wprowadzenie Prof. dr hab. inż. Mariusz J. Giergiel KRiDM AGH
dr hab. inż.. Mariusz Giergiel, prof. n. AGH Pok. 412, VIp, D-1 konsultacje czwartek 10:00 11:00 giergiel@agh.edu.pl Telefon 012-6173675 Materiały do laboratorium http://kridm.imir.agh.edu.pl/material/jezyki_p/
Definicja językaj Podstawą każdego języka jest słownik Elementy języka zazwyczaj nazywane są słowami; w świecie języków formalnych nazywa się je symbolami Cechą charakterystyczną języków jest to, że pewne ciągi słów rozpoznawane są jako poprawne, dobrze zbudowane zdania języka,
Definicja języka j c.d. Decydujące znaczenie ma gramatyka, czyli inaczej mówiąc składnia lub struktura języka Składnię definiujemy jako zbiór reguł lub formuł, określający zbiór formalnie poprawnych zdań. Ważne jest, że taki zbiór reguł nie tylko pozwala decydować, czy dany ciąg słów jest zdaniem, ale także dla konkretnego zdania określa jego strukturę, która jest pomocna w rozpoznawaniu znaczenia zdania
Języki programowania Składnia i semantyka (znaczenie) są blisko ze sobą powiązane Dlatego definicje strukturalne traktuje się jako pomocnicze dla ważniejszych celów. Rozważmy przykładowe zdanie: Koty śpią. Zdanie to należy do języka, który może być zdefiniowany za pomocą następującej składni:
Języki programowania c.d. <zdanie> ::= <podmiot> <orzeczenie> <podmiot> ::= koty psy <orzeczenie> ::= śpią jedzą Trzy powyższe wiersze pozwalają stwierdzić, że:
Języki programowania c.d. (1) Zdanie składa się z podmiotu i następującego po nim orzeczenia (2) Podmiot jest albo pojedynczym słowem koty albo psy (3) Orzeczenie jest albo słowem śpią albo jedzą
Koncepcja językaj Podstawowa koncepcja jest następująca: Zdanie języka można wyprowadzić z początkowego symbolu <zdanie> stosując reguły zastępowania Reguły mogą (powinny) być zapisywane za pomocą pewnych formalizmów, z których jeden ma szerokie znaczenie
Koncepcja języka j programowania Formalizm, za pomocą którego zapisywane są reguły w odniesieniu do języków programowania zwany jest notacją BNF (Bacus-Naur-Form). Był on po raz pierwszy użyty do zdefiniowania języka Algol Konstrukcje zdaniowe <zdanie>, <podmiot> i <orzeczenie> nazywa się symbolami końcowymi (terminalnymi)
Koncepcja języka j programowania c.d. Reguły nazywane są produkcjami Symbole ::= i nazywa się metasymolami notacji BNF Jeżeli w celu skrócenia zapisu użyjemy pojedynczych wielkich liter do oznaczenia symboli pomocniczych, małych do symboli końcowych, to możemy zdefiniować język
Definicja przykładowego języka S ::= AB A ::= x y B ::= z w Język zdefiniowany przez powyższą składnię zawiera cztery zdania: xz, yz, xw, yw
Języki programowania Od czasów von Neumana istota programowania pozostaje niezmienna Von Neuman jako pierwszy zaproponował schemat maszyny sterowanej przez przechowywany w pamięci program
Języki programowania - Pierwszy język programowania to kod maszynowy (zerojedynkowy język samej maszyny) - Język asemblera czyli kod maszynowy w zapisie symbolicznym - Języki tzw. Wysokiego poziomu: - Fortran,, Cobol, Basic - C/C+, Pascal, Ada
Cechy językj zyków w programowania Wszystkie języki programowania maja wspólna cechę: Programista musi z dużą dokładnością opisać jak obliczyć wynik, a nie co powinno być obliczone Program napisany w tych językach zawiera ciąg instrukcji, z których każda opisuje akcję, jaką ma wykonać komputer x := 120 * x + 10;
Języki imperatywne. Współczesne języki programowania są zasadniczo imperatywnymi. Zapisane w nich programy zawierają głównie instrukcje określające akcje, które należy wykonać. Służą do opisu zachowania prowadzącego do osiągnięcia pożądanego celu
Języki imperatywne Nasze myślenie ma podobny charakter, częściej jednak bywa inaczej. Pierwsze pytanie zadawane odnośnie programu komputerowego brzmi: Co on robi? a nie Jak on to robi
Program imperatywny a deskryptywny Program {main} read(x,y); if x > y then print(x) else print(y); end.
Języki deskryptywne Alternatywą dla imperatywnego języka programowania zawierającego elementy deskryptywne jest język deskryptywny ze składnikami imperatywnymi. W języki takim programy składają się głównie z opisowych definicji pewnego zbioru funkcji lub relacji Wykonanie programu deskryptywnego polega na użyciu tych definicji do znalezienia wyniku będącego w określonej relacji z danymi wejściowymi
Języki deskryptywne c.d. Określony sposób użycia definicji podczas obliczania wyniku nadaje każdej definicji również znaczenie imperatywne, czyli proceduralne. Biorąc je pod uwagę możemy dokonywać wyboru między dwoma zbiorami definicji lub ulepszać efektywność obliczeń, przez wprowadzenie do definicji dodatkowych warunków sterujących, nieistotnych często przy czysto deskryptywnej interpretacji. To już jest praktyka programowania w języku deskryptywnym, jednakże program wciąż pozostaje opisem tego, co chcemy wykonać a nie sposobu wykonania zadań czy obliczeń.
Prolog Lisp Maple Języki programowania deskryptywne
Problemy z pakietami GUI OK. jeżeli zadanie jest dobrze uwarunkowane i wymagania są małe Syndrom bacy piłującego gałąź Ogólne zagadnienia wiarygodności, rzetelności i fachowości projektanta
Problemy z pakietami GUI c.d. prof. Max Cox w biuletynie NPL z lipca 1997 (bada i zauważa): procedury numeryczne ukryte za symbolami GUI różnych pakietów jeden wylicza średnią geometryczną zbioru liczb jako 0 (liczby bliskie 1/2) zdecydowana większość posługuje się naiwnymi algorytmami OK. jeżeli zadanie jest dobrze uwarunkowane i wymagania są małe
Ewolucja programowania Ponieważ operowanie kodem binarnym było dość uciążliwe, przypisano poszczególnym ciągom zerojedynkowym łatwiejsze do zrozumienia skróty mnemotechniczne. Tak powstał język symboliczny, zwany asemblerem. Jest on uważany za język programowania niskiego poziomu, gdyż jest bezpośrednio związany z kodami języka maszynowego. Programowanie w języku asemblera było bardzo trudne, wymagało znajomości rejestrów procesora i struktury pamięci. Poza tym było związane z konkretnym typem procesora. Wkrótce powstały języki wysokiego poziomu. Jednym z pierwszych języków tego typu jest FORTRAN, który powstał w 1957 roku i do dziś jest podstawowym językiem programowania obliczeń naukowych. Z czasem rozszerzono możliwości języków wysokiego poziomu, takich jak BASIC, PASCAL i C++ o narzędzia wizualne (Rapid Application Development), które znacznie ułatwiają konstruowanie programu.
Programowanie obiektowe Tradycyjne podejście do programowania, zwane programowaniem proceduralnym charakteryzuje się rozdzieleniem danych od operujących na nich funkcji. Odizolowanie danych od kodu może prowadzić do przypadkowych zmian danych przez funkcje, które nie są z nimi logicznie związane. Ponadto modyfikacja programu napisanego w ten sposób jest trudna do realizacji, gdyż nawet niewielka zmiana działania programu może spowodować konieczność wprowadzenia poprawek w wielu miejscach.
Programowanie obiektowe c.d. Takich wad pozbawione jest programowanie obiektowe, będące po programowaniu strukturalnym kolejnym etapem w rozwoju języków programowania.
Właściwości 1). Programowanie obiektowe jest stylem programowania, w którym do tworzenia programów używa się obiektów. obiekt = dane + metody 2). Styl taki powstał w wyniku postrzegania rzeczywistości jako zbioru obiektów różnego typu, które mogą wykonywać określone czynności, potrafią się ze sobą komunikować i na siebie wzajemnie oddziaływać. 3). Obiekty w programie często odzwierciedlają cechy i umiejętności swoich odpowiedników ze świata rzeczywistego.
Mechanizmy OOP Programowanie obiektowe wywodzi się z pewnych własności języka SIMULA, który powstał w latach sześćdziesiątych. Pierwszym językiem programowania obiektowego lub jak nazywają to jego twórcy - językiem obiektowo zorientowanym (Object Oriented Language) był Smalltalk skonstruowany na początku lat 80 -tych zeszłego stulecia. Głównym jego twórcą jest Adele Goldberg.
Mechanizmy OOP c.d. Do podstawowych mechanizmów programowania zorientowanego obiektowo (Object Oriented Programming) należą: enkapsulacja -definiowanie nowego typu danych, łączącego dane i działające na nich metody w jedną całość. dziedziczenie - definiowanie nowego typu obiektowego, zwanego potomnym, na podstawie typu istniejącego, zwanego bazowym. Operacja dziedziczenia powoduje przeniesienie danych i metod z typu bazowego do typu potomnego. polimorfizm - definiowanie metod wirtualnych, które mają tę samą nazwę w typie bazowym i potomnym, ale określają różne działanie.
Obiektowy język j programowania Obiektowy język programowania to taki, który umożliwia lub zachęca do stosowania obiektowych metod programowania.
Języki obiektowe Simula (1967), język stworzony do programowania symulacji komputerowych, była prawdopodobnie pierwszym językiem posiadającym podstawowe cechy języka obiektowego, podstawowym przykładem jest zapewne Smalltalk, przy tworzeniu którego rozwinięto sporą część teorii programowania obiektowego. Java, Eiffel i Python, zaprojektowane głównie do programowania obiektowego, ale posiadające także pewne elementy proceduralności; wreszcie języki takie, jak C++ i Perl, które historycznie rzecz biorąc są językami proceduralnymi, wzbogaconymi o elementy obiektowości.
Języki obiektowe c.d. Niektóre języki posiadają wsparcie dla abstrakcyjnych typów danych, ale nie wszystkie cechy obiektowości. Dziedziczenie i polimorfizm są zwykle używane w celu redukcji zbędnego puchnięcia kodu (ang. code bloat), natomiast abstrakcja i enkapsulacja służą zwiększeniu czytelności kodu. Do języków tych zaliczamy języki "czysto" obiektowe - jak Smalltalk i Ruby, zaprojektowane celowo do ułatwienia lub wręcz wymuszenia stosowania metod programowania obiektowego.
Podstawowe założenia paradygmatu obiektowego Abstrakcja Enkapsulacja Polimorfizm Dziedziczenie
Co to jest paradygmat w rozumieniu wprowadzonym przez filozofa Thomasa Kuhna w książce Struktura rewolucji naukowych (The Structure of Scientific Revolutions) opublikowanej w 1962 r. - to zbiór podstawowych pojęć i teorii tworzących podstawy danej nauki. Teorii i pojęć tworzących paradygmat raczej się nie kwestionuje, przynajmniej do czasu kiedy paradygmat jest twórczy poznawczo - tzn. za jego pomocą można tworzyć teorie szczegółowe zgodne z danymi doświadczalnymi (historycznymi), którymi zajmuje się dana nauka.
Co to jest paradygmat cd. Paradygmat od dogmatu odróżnia kilka cech: nie jest on dany raz na zawsze - lecz jest wypracowany w toku wieloletnich, rzetelnych badań i przyjęty na zasadzie konsensusu większości badaczy; podlega on stałym, powolnym zmianom lub, od czasu do czasu, ulega bardzo głębokim przemianom zwanym rewolucją naukową; nikt nie twierdzi, że jest on na pewno absolutnie słuszny, natomiast każdy kwestionujący go ma obowiązek udowodnienia tego zarzutu.
Co to jest paradygmat cd. Dobry paradygmat posiada kilka cech, i m. in. musi: być spójny logicznie i pojęciowo; być jak najprostszy i zawierać tylko te pojęcia i teorie, które są dla danej nauki rzeczywiście niezbędne; dawać możliwość tworzenia teorii szczegółowych zgodnych ze znanymi faktami
Co to jest paradygmat fleksyjny Paradygmat fleksyjny leksemu to zbiór wszystkich form fleksyjnych danego wyrazu. Na opis paradygmatu oprócz informacji, w jakich formach fleksyjnych może dany wyraz występować, składa się także informacja o właściwych poszczególnym formom końcówkach fleksyjnych.
Co to jest paradygmat??? Paradygmat, w filozoficznej teorii poznania i metodologii ogólnie uznane osiągnięcie naukowe, które dostarcza modelowych rozwiązań w danej dziedzinie nauki, może też pociągać za sobą modelowe rozwiązania w dziedzinach pokrewnych i stawać się istotnym składnikiem poglądu na świat. Przykładami paradygmatów są np.: system Kopernikański (heliocentryczna teoria), mechanika I.Newtona, teoria względności A. Einsteina.
Różne podejścia do realizacji paradygmatu w niektórych językach każda klasa musi mieć nadklasę w niektórych językach nadklas może być więcej niż jedna Tekst Tekst Tekst
Programowanie obiektowe Programowanie obiektowe (ang. object-oriented programming (http://www.wikipedia.org/wiki/objectoriented_programming)) to metodologia tworzenia programów komputerowych, która definiuje programy za pomocą "obiektów" - elementów łączących stan (czyli dane) i zachowanie (czyli procedury, tu: metody). Obiektowy program komputerowy wyrażony jest jako zbiór takich obiektów, komunikujących się pomiędzy sobą w celu wykonywania zadań. Podejście to różni się od tradycyjnego programowania proceduralnego, gdzie dane i procedury nie są ze sobą bezpośrednio związane. Programowanie obiektowe ma ułatwić pisanie, konserwację i wielokrotne użycie programów lub ich fragmentów.
Gdzie można uzyskać więcej informacji Lista dyskusyjna pl.comp.objects oraz archiwum listy Thinking in Java http://www.mindview.net/books/tij/ The Java Tutorial http://java.sun.com/docs/books/tutori al/ http://www.techbooksforfree.com/