tomasz.bold@fis.agh.edu.pl 1
Organizacja zajęć Wykłady naprzemiennie z laboriatorami Wykład 1 wstępne informacje o językach skryptowych... trochę historii, zasosowania itp. Wykład 2 bash i okolice, przetwarzanie tekstu laboratoria x 2 pokaz projektów z dyskusją i zbiorowym ulepszaniem i poprawą Wykład 3 python ( nie tak dogłębnie jak na przedmiocie: python ) laboratoria x 3 pokaz projektów Wykład 4 ROOT/CINT laboratoria x 3 pokaz projektów Wykład 4 JavaScript Laboratoria x 1 Pokaz projektów Dodatkowo 3/4 projekty, po jednym z każdego z tych tematów 2
Ocenianie 30% lab 70% projekty na laboratoriach na początku będziemy robić 5-10 minutowy sprawdzian na początku każdych zajęć (na kartkach) z poprzedniego laboratorium sprawdzian z wiedzy teoretycznej w celu motywowania systematyczności 3/4 projekty z każdego zaganienia projekty jedno- osobowe, skrypt do waszych innych zajęć może być projektem na j. skryptowych 3
Do dzieła 4
Dzisiejszy wykład Dlaczego języki skryptowe Kiedy skrypt nie jest najlepszym rozwiązaniem Rozprzestrzenienie języków sktyptowych, rys historyczny i przegląd języków skryptowych Wzorce programistyczne, w szczególności wzrorce skryptowe 5
Czym właściwie jest program skryptowy? (skrypt/script) A script is something you give the actors. A program is what you give the audience. Larry Wall Brak kompilacji Nastawienie na prduktywność, prostota konstrukcji (składnia TCL to ok. 11 pargrafów, dwie strony druku) W sczególności automatyczne zarządzanie pamięcią, zoptymalizowane wbudowane użyteczne typy (np. napisy, tablice asocjacyjne) Często brak kontroli typów (np. wszysto jest napisem) 6
Do czego służą skrypty Nie służą do pisania kompletnych i rozbudowanych programów, przeciwnie, są klejem do składania wielu programów w jeden system! nazywaje czasem systems integrations languages (znów przykład TCL, Julia) Rozbudowa/dopasowanie funkcjonalności programów Ułatwienie integracji komponentów Skrypty są bardzo małe i ich szybkość zależy od szybkości programów/komponentów przez nie używanych 7
Dlaczego czasem warto używać języków skryptowych Wydajność pracy programisty : M/N N linii programu! M instrukcji CPU Najprostszą miarą wykonanej pracy przez programistę jest LOC (Line Of Code)! kloc komentarze? styl? LOC! język programowania! liczba instrukcji/linie kodu 8
N/M przykłady Jedna linia skryptu bash to ok 300 instrukcji maszynowych Przeciętny program w pythonie jest od 3 do 10 razy krótszy niż w Javie Czas programowania (" Wasz czas!) z reguły o wiele krótszy Stąd nazwa VHLL very high programming languages 9
Więcej przykładów Lutz Prechelt An empirical comparison of seven programming languages. IEEE Computer 33(10):23-29, October 2000. Program: konwerter nr. telefonu! słowo: 048-5653399687 == 048- koledzy- 687 3 j. systemowe (C, C++, Java) 4 j. skryptowe (Perl,python, Rexx, TCL), studenci i wolontariusze z usenet 10
Wyniki empirycznych pomiarów Czas pisania programu / ilość linii: 11
Wyniki empirycznych pomiarów Szybkość programów / zużycie pamięci: 12
Program skryptowy: skrypt uruchomienie Nazwa (script: scenariusz) Interpretowany linia po linii wraz z interpretacją następuje: 1. walidacja (analiza syntaktyczna) 2. interepretacja (semantyka) Instrukcje warunkowe powodują pominięcie bloków instrukcji skryptu Pominięte linie te mogą zawierać błędne instrukcje których walidacja (analiza syntaktyczna) nie następuje (być może nigdy). Przykład: konfigurator trygera, walidator konfiguracji, błąd składniowy wykryty po 4 latach działania. 13
Co w zamian za kompilację? Kompilator naszym przyjacielem (i wrogiem) doświadczony programista poprawia błąd kompilacji w ok ~2min. 2min x koszt pracy jest ceną za naprawę usterki Ale niestety ten cykl nie jest jedyny następne etapy dłuższe (czasowo) Nowy raczej złośliwy klolega (personifikacja kompilatora): - kompilator się czepia... - kompilator nie pozwala... - przed chwilą pokazywał jeden błąd a teraz 10... niejednodowne (uruchomienie, debugowanie... zupełnie różne) 14
Cykl pracy z kodem programu Języki kompilowane edit compile execute test & debug najtańszy cykl (max. kilka minut) b. drogi cykl Języki skryptowe edit execute debug 15
(Nie)stosowalność języków skryptowych Program: algorytmy + struktury danych Nie wszystkie j. skryptowe pozwalają na definicje złożonych struktur danych (np. bash to tylko tekst, ew. tablice) Bądź złożonych algorytmów (np. bash nie obsługuje operacji na liczbach zmienno- przecinkowych) 16
Apostołowie najlepszych rozwiązań Podchodź ostrożnie do podpowiedzi ekspertów, którzy nie muszą wysłuchać do końca opisu twojego problemu a już wiedzą jakie jest najlepsze rozwiązanie. 17
Rys historyczny JCL (Job Control language) IBM mainframe!...! shell systemów wielozadaniowych (bash) SETL (lata 60 NY)! ABC (80 Holandia)! Python(91 Holandia) JavaScript (94 Netscape)! ECMA (standaryzacja) ROOT/CINT (91 CERN)! tendencja podchwycona przez przemysł w postaci interpretera zintegrowanego z kompilatorem clang (CLING) 18
The big 6 JavaScript web apps. + natywny HTML5 + MS Windows + grafika Perl przetwarzanie tekstu PHP (LAMP)! Linux+Apache+MySql+PHP Python prawie wszędzie, idealny klej TCL pionier, zaprojektowany do współpracy z modułami w C VisualBasic w Excelu (najwięcej linii kodu na świecie) 19
Inne języki o których powinniście usłyszeć + DSL LUA! superszybki, używany do programowania gier (scenariusze, plansze np. Roblox) lisp AWK, sed DSL: HTML, SQL, YACC, Mathematica, matlabl 20
Wzorce programistyczne Podobne do sposobów rozwiązywania całek: Jeśli w liczniku jest wielomian a w mianowniku... to wtedy przez części... a dalej Podobnie jest ze wzrorcami programistycznymi: Jeśli musisz skonstruować złożony obiekt... użyj wzorca builder. Część wzorców OO stosuje się do programów skryptowych. Możliwe i b. przydatne są inne wzorce implementowalne tylko w j. skryptowych. 21
Wzorce OO Konstrukcja: Singleton-, Fabryka-, Metoda konstrukcyjna+, Budowniczy+, Prototyp+ Zachowania: Łańcuch odpowiedzialności+, Wiadomość+, Interpreter, Iterator-, Mediator+, Memento-, Obwerwator+, Strategia+, Metoda szablonowa+, Wizytator-, Struktura: Adapter, Most-, Kompozyt+, Dekorator+, Pyłek+, Zastępca+ 22
Wzrorce OO w skryptach Wzorce konstrukcyjne z reguły nie mają zastosowania: jeśli wytworzenie obiektu/pliku/... jest złożone/powtarzalne zwykle dobrze jest oddzielić je od logiki programu Wzorce zachowań: Łańcuch odpowiedzialności! łączenie inctrukcji w potoki: cat dane grep xyz grep v ala > filtrowane Wiadomość: generacja skryptów Interpreter: oh yes, bez wysiłku Iterator: z reguły wbudowane, nawet w bashu Mediator, obserwator: rzadko potrzebny... inne techniki jeszcze rzadziej potrzebne Wzorce strukturalne: także rzadko potrzebne 23
Specyficzne wzrorce skryptowe Dane jako skrypt! - - - Active file Normalnie dane (np. wynik częściowy) składuje się w formacie niezależnym od kodu programu Należy z reguły wybrać format (np. XML, binary) napisać kod odpowiadający za konwersję: transient $! persitent W przypadku języków skryptowych można dane zapisać jako kod skryptu: transient! persistent (persitent! transient automatyczny) Tak można bardzo wygodnie dodać konfigurator naszego skryptu: np. bash source ~/.lab.conf... 24
Specyficzne wzrorce skryptowe Ładowacz - - - Bootstrap script Zamiast przetwarzać dane (np. skomplikowane pliki) najpierw konwertujemy dane do postaci skryptów Aliasowanie - - - Command interceptor W przypadku gdy zachodzi potrzeba rozbudowy zachowania jakiejs komendy (np. rm - > mv ~/.trash) Albo wtedy gdy chcemy uprościć wykonanie jakiegoś polecenia: alias ls= ls ltr sort k5 n Interpreter - - - Wykonywanie skryptu w skrypcie bardzo częste i przydatne 25
Podsumowanie Języki skryptowe są i wiele sprawniejsze jako języki integracyjne systemów (klej) Są niezastąpione jako automatyzatory Są o wiele prostsze od języków systemowych Nie nadają się jednak do wszystkich zadań! 26
Następny wykład Następny wykład wstęp do przetwarzania tekstu w bash 27