Stefan Sokołowski ZAAWANSOWANE JĘZYKI PROGRAMOWANIA Inst Informatyki, UG Gdańsk, 2016/2017 Zaawansowane Języki Programowania Wykład1,str1 Na http://infugedupl/ stefan/dydaktyka/zaawjezprog będą się stopniowo pojawiać: slajdy do wykładów szkicowy plan wykładu zadania z laboratorium spis literatury itd Uwaga: przeczytanie tych materiałów nie wystarczy do zaliczenia!
Zaawansowane Języki Programowania Wykład1,str2 Wymagania wstępne: zaliczone Języki programowania z I roku st lic(lub równoważne); obycie z programowaniem i biegłość w uruchamianiu programów Wymagania na zaliczenie: zaliczyć laboratorium przez sprawdziany(łatwa droga), lub sprawdziany+rozbójnik pod koniec semestru(trudniejsza droga), lub zaliczenie poprawkowe(bardzo trudna droga) na co najmniej 51%; zdać egzamin w sesji podstawowej lub poprawkowej procenty ocena p<51% 20 51% p<61 30 61% p<71 35 71% p<81 40 81% p<91 45 91% p 50 Tradycyjne dziedziny zastosowań Wykład1,str3 Nauka(fizyka, astronomia, technika) proste struktury danych(tablice), dużo obliczeń na liczbach rzeczywistych Fortran,Algol60, Biznes sporządzanie skomplikowanych zestawień i sprawozdań Cobol Sztucznainteligencja działania na symbolach(listy), elastyczność Lisp, Prolog Programowaniesystemowe dostęp do cech niskiego poziomu(dla efektywności) PL/I,C, Internet niezależność od platformy, wymagania bezpieczeństwa PHP,JavaScript,
Wykład1,str4 Człowiek kulturalny zamienia się w bestię w trzech przypadkach: kiedy siada za kierownicę samochodu, kiedyjegodrużynagraważnymecz, kiedy dyskutuje o wyższości jednego języka programowania nadinnym Wykład1,str5 czytelność programów pisalność (łatwość pisania) programów niezawodność programów koszty
Wykład1,str6 Czytelność programów rozumienie kodu praca wspólna pielęgnacja prostota języka: wiele konstruktów podstawowych dłuższa nauka programiści często znają tylko podzbiór, każdy inny wiele sposobów powiedzenia tego samego czytanie programów wymaga staranniejszej analizy wiele sposobów powiedzenia prawie tego samego jeszcze gorzej n=n+1; n+=1; n++; ++n; wieloznaczności w języku(np w C: & ma dwa różne znaczenia) bardzo zmniejszają czytelność ALE języki bardzo proste wymagają długich programów, co zmniejsza czytelność Wykład1,str7 Czytelność programów rozumienie kodu praca wspólna pielęgnacja ortogonalność pojęć ogólne zasady, stosowalne w ten sam sposób do wszystkiego (ortogonalność) M w C elementy struktury mogą mieć dowolny typ, również tablicowy w C elementy tablicy mogą mieć dowolny typ, również strukturowy tablicewewnątrzstruktur,zawartewtablicach,itpsąok tablice i struktury są ortogonalne (nieortogonalność) MwCwartośćoddawanaprzezfunkcjęmożemiećdowolnytypzwyjątkiem tablicowego typy i funkcje nie są ortogonalne
Wykład1,str8 Czytelność programów rozumienie kodu praca wspólna pielęgnacja ortogonalność pojęć ogólne zasady, stosowalne w ten sam sposób do wszystkiego (ortogonalność) M w języku wewn minikomputerów VAX: dodawanie komórki do rejestru ozn ADDL rejestr komórka dodawanie rejestru do rejestru ozn ADDL rejestr rejestr można w ten sposób dodać wszystko do wszystkiego (nieortogonalność) M w języku wewn dużych komputerów IBM: dodawanie komórki do rejestru ozn A rejestr komórka dodawanie rejestru do rejestru ozn AR rejestr rejestr w żaden sposób nie można dodać niczego do komórki pamięci Wykład1,str9 Czytelność programów rozumienie kodu praca wspólna pielęgnacja ortogonalność pojęć ogólne zasady, stosowalne w ten sam sposób do wszystkiego ALE zbyt dużo ortogonalności może zmniejszyć czytelność MW Algolu 68 wyrażenia warunkowe i inne rzeczy mogą występować po obu stronach przypisania: ifa<bthenaelsebfi := 0
Wykład1,str10 Czytelność programów szczegóły składni: język C x=arg; nizej=0; wyzej=x+1; while(wyzej-nizej > 1) { srodek =(nizej+wyzej)/2; if(srodek*srodek <= x) { nizej = srodek; else { wyzej = srodek; printf(" sqrt(%i) =%i\n", x,nizej); gorzej:identyczneklamry { język Bash x=$1 nizej=0; wyzej=x+1 while[$[wyzej-nizej]-gt1] do srodek=$[(nizej+wyzej)/2] if[$[srodek*srodek]-le$x] then nizej=$srodek else wyzej=$srodek fi done echo" sqrt($x) =$nizej" lepiej:słowakluczoweiffi dodone Wykład1,str11 Łatwość pisania programów prostota i ortogonalność: duża liczba gotowych konstrukcji trudno się ich nauczyć i łatwo użyć błędnie mała liczba gotowych konstrukcji i reguły do ich łączenia łatwo(po minimalnej nauce) wymyślić dobry program ALE przesadna ortogonalność, kiedy każda kombinacja symboli coś dla kompilatora znaczy, utrudnia wykrycie błędu
Wykład1,str12 Łatwość pisania programów abstrakcja możliwość definiowania złożonych danych i operacji i używania ich bez pamiętania szczegółów definicji abstrakcja procesu: np podprogram(funkcja), którego wywołania mogą być używane jak predefiniowane operacje abstrakcja danych: np definicja drzewa binarnego jeśli możemy zdefiniować wierzchołki drzewa: 4 2 1 5 3 jeśli drzewo musimy implementować w tablicach: 1 2 3 2 4 5 3 0 0 4 0 0 5 0 0 Wykład1,str13 Łatwość pisania programów ekspresywność łatwość wyrażenia w języku pojęć potrzebnych do obliczeń M dla każdego elementu tablicy wydrukować jego indeks i wartość język C for(int i=0; i<dlug TABL; i++) printf("%i:%lf\n", i,tabl[i]); gorzej: obliczenie język PHP foreach($tabl as $ind => $wart) echo" $ind: $wart\n"; lepiej: wyrażone wprost
Wykład1,str14 Łatwość pisania programów ekspresywność łatwość wyrażenia w języku pojęć potrzebnych do obliczeń M zaprogramować wieże Hanoi 1 2 3 mamy przełożyć wszystkie krążki z pałeczki 1 na pałeczkę 3, używając pomocniczo pałeczki 2, na raz wolno przełożyć tylko jeden krążek, nigdy nie wolno kłaść krążka większego na mniejszy Wykład1,str15 Łatwość pisania programów ekspresywność łatwość wyrażenia w języku pojęć potrzebnych do obliczeń M zaprogramować wieże Hanoi zrekursją void Hanoi(int n, inta,intb,intc) { /*nkrążków zpałeczkianapałeczkęc*/ if(n>0) { Hanoi(n-1, a, c, b); przełóżkrążekzanac; Hanoi(n-1, b, a, c); bez rekursji skomplikowane operacje na stosie rekursja poprawia ekspresywność
Wykład1,str16 Niezawodność sprawdzanie typu: M printf("witam!\n"+1); bez sprawdzania typów: itam! ze sprawdzaniem typów: sygnał błędu M printf("%i\n",100); bez sprawdzania typów: 1624615624 (C daje ostrzeżenie) ze sprawdzaniem typów: sygnał błędu Wykład1,str17 Niezawodność reakcja na wyjątki(błędy wykonania): M double srednia(int N, double tab[n]) { doublesuma=00; for(inti=0;i<n;i++) suma+=tab[i]; return suma/n; Co zmienić, żeby program sensownie reagował na sytuację, gdy N = 0? bez obsługi wyjątków: przebudować funkcję srednia, albo zgodzić się, że program czasem padnie z obsługą wyjątków: zaprogramować własną reakcję
Wykład1,str18 Niezawodność unikanie aliasów: M inta;int b=&a; a=0; b=1; printf("a==%i\n",a); Drukuje: 1, chociaż wartość zmiennej a nie została jawnie zmieniona Aliasy pozwalają na niejawną zmianę wartości, a to prowadzi do błędów Wykład1,str19 Koszt stworzenia programu pielęgnacji niezawodności koszt każdorazowego wykonania programu(zależy od natury zagadnienia i jakości stosowanego algorytmu) koszt kompilacji programu(zależy od prostoty języka i jakości kompilatora) koszt napisania programu(zależy od łatwości pisania) koszt pielęgnacji programu(zależy od czytelności) koszt zawodności programu koszt nauczenia się języka(zależy od jego prostoty i ortogonalności)
Co kształtuje języki programowania? Wykład1,str20 Architektura komputera(bardzo uproszczona) PAMIĘĆ PROCESOR 0 1 2 3 4 5 licz rozkazów rejestr arytm WEJŚCIE/WYJŚCIE n 1 Komputer von Neumanna: bierna pamięć adresowana(numerowana); w niej rozkazy i dane; czynnyprocesor: licznik rozkazów wskazuje adres rozkazu do wykonania, działania wykonują się między rejestrem a komórką pamięci Co kształtuje języki programowania? Wykład1,str21 Architektura komputera(bardzo uproszczona) Komputer von Neumanna: inicjalizuj licznik rozkazów; while(prawda) { /*czylibezkońca*/ pobierz instrukcję spod adresu w licznrozk; zwiększ licznrozk o 1; wykonaj pobraną instrukcję; Taka architektura powoduje, że programowanie imperatywne(rozkazy dla komputera, jeden po drugim) jest bardziej naturalne dla komputera chociaż nie dla człowieka