400 likes | 606 Views
Języki wysokiego poziomu: – funkcje i programowanie bezklasowe. λ. Sebastian Poręba. 1. Wprowadzenie. Klasyfikacja języków programowania. Ze względu na:. Przykłady:. 1. Wprowadzenie. Łatwość nauki Popularność Poziom abstrakcji języka. PHP4 – łatwa nauka
E N D
Języki wysokiego poziomu: – funkcje i programowanie bezklasowe λ Sebastian Poręba
Klasyfikacja języków programowania • Ze względu na: • Przykłady: 1. Wprowadzenie • Łatwość nauki • Popularność • Poziom abstrakcji języka • PHP4 – łatwa nauka • Assembler, Cobol – niski poziom abstrakcji • C++, Java – wysoki (?) poziom abstrakcji, akceptowalny poziom trudności Poziom abstrakcji wysoki niski
Klasyfikacja języków programowania 1. Wprowadzenie popularność C++ C# Java Ruby Python C Pascal Assembler ? Cobol Poziom abstrakcji
Po co programiście gier języki wyższego poziomu? 1. Wprowadzenie OpenGL gamedev == C++ DirectX performance (Java, C, Assembler) QuakeC, UnrealScript Języki skryptowe w silnikach gier Lua, Python
Co się dzieje kiedy definiujemy funkcję w C++ 2. Funkcje lambda classElephant{ voidstep(){ // do somestuff } }; function step // do somestuff Elephant Elephant Elephant *step *step *step
Funkcje lambda 2. Funkcje lambda Funkcje lambda pozwalają na samodzielne zarządzanie wskaźnikiem do funkcji step=function(){ // do somestuff } step();
Do czego to się przydaje? 2. Funkcje lambda • Funkcję można: • zmieniać • zwracać jako wynik innej funkcji • podawać jako argument do funkcji
Zmiana wskaźnika na funkcję 2. Funkcje lambda C++: Niewygodne zarządzanie kodem #defineRK4 #ifdef, #ifndef Zarządzanie kodem tylko przy kompilacji ify przy każdej iteracji pętli programu If/switch wybierający funkcję Przechowywanie niepotrzebnych funkcji w pamięci
Zmiana wskaźnika na funkcję 2. Funkcje lambda Funkcja lambda • Podmiana funkcji w locie • Brak ifów • Zwolnienie pamięci po funkcji do której nie ma żadnego wskaźnika
Generatory funkcji 2. Funkcje lambda Możliwość zwracania funkcji jako wynik funkcji Przykład: funkcja zwracająca algorytm kompresujący na podstawie parametrów pliku do skompresowania
Memoizacja 2. Funkcje lambda • intfib(intn){ • returnn<=2?1:fib(n-1)+fib(n-2); • } • fib(100) -> 708 * 1018wywołańfib( ) longlongmemo[101];// zainicjalizowane na 0 intmemofib(intn){ if(memo[n])returnmemo[n]; memo[n]=memofib(n-1)+memofib(n-2); returnmemo[n]; }
Funkcja jako argument – modyfikatory funkcji 2. Funkcje lambda functionmemoize(func){ varmemo={}; returnfunction(key){ if(!memo[key]){memo[key]=func(key);} returnmemo[key]; }; }; varfib = function(n){returnn<=2?1:fib(n-1)+fib(n-2);} varmemofib=memoize(fib); memofib(100);
Funkcje lambda 2. Funkcje lambda Wprowadzenie tak nieznacznej modyfikacji jak funkcje lambda udostępnia cały wachlarz nowych technik programowania
Powtórka z filozofii 3. Programowanie bezklasowe Platon
Dlaczego w takim razie programujemy z wykorzystaniem klas? 3. Programowanie bezklasowe MIT – Structure and Interpretation of Computer Programs,Wykład 2b, ~36:00prof. Harold Abelson (rok 1986)
Dziedziczenie klasowe 3. Programowanie bezklasowe Obj1 foo() bar() baz
Dziedziczenie klasowe 3. Programowanie bezklasowe Obj1 Klasa, która wykonuje pewne zadania w inny sposób foo() bar() baz Obj2 foo()
Dziedziczenie klasowe 3. Programowanie bezklasowe ObjBase foo() Klasa, która nie zawiera pewnych pól Obj1 Obj2 bar() baz
Dziedziczenie klasowe 3. Programowanie bezklasowe ObjBase foo() Obj12 abc adf Obj1 Obj2 bar() baz Obj72 mattDamon jimmyKimmel time Obj21 foo Różne pola w różnych klasach
Dziedziczenie klasowe 3. Programowanie bezklasowe
Powtórka z filozofii 3. Programowanie bezklasowe Arystoteles
Programowanie klasowe vs bezklasowe • Klasowe • Bezklasowe 3. Programowanie bezklasowe • Definiujemy klasę pewnych obiektów i zależności między nimi • Tworzymy instancje klasy • Obiekty zawierają pola swoje i swoich klas nadrzędnych oraz tablicę wskaźników na metody • Tworzymy obiekty • Obiekty zawierają pola, wskaźniki na swoje metody oraz wskaźnik na prototyp
Dziedziczenie klasowe 3. Programowanie bezklasowe classA{ intpampararam; methodabc(param:int){…} } classBinheritingA{ methodabc(param:int){…} } b=newB(); Enkapsulacja Obiekt B Obiekt A
Dziedziczenie prototypowe 3. Programowanie bezklasowe Wskaźnik na prototyp a={ intpampararam; methodabc(param:int){…} } b={ methodabc(param:int){…} } b.prototype=a; Obiekt A Obiekt B *prototype
Jaka jest praktyczna różnica? • Klasowe • Bezklasowe 3. Programowanie bezklasowe • Każdy obiekt klasy potomnej zawiera w sobie obiekt klasy nadrzędnej • Obiekty klas dziedziczących po innych klasach mogą zawierać pola, które nie są używane • Obiekty przechowują jedynie wskaźnik na obiekt nadrzędny • Jeżeli odczytujemy wartość pola pampararam(z przykładu, w klasie nadrzędnej), jest on szukany w prototypechain • Jeżeli chcemy zapisać wartość pampararam, zostanie utworzone nowe pole w obiekcie B, prototypechain nie będzie potrzebny
Dziedziczenie klasowe 3. Programowanie bezklasowe ObjBase foo() Obj12 abc adf Obj1 Obj2 bar() baz Obj72 mattDamon jimmyKimmel time Obj21 foo() Różne pola w różnych klasach
Dziedziczenie prototypowe 3. Programowanie bezklasowe Obj2={}; Obj2.prototype= { foo: ObjBase.foo, adf: Obj12.adf, time: Obj72.time, foo2: Obj21.foo, bar: Obj1.bar }; Możemy stworzyć nowy, złożony obiektnie modyfikując w ogóle innych obiektów.
Klonowanie obiektów 3. Programowanie bezklasowe A co jeśli chcemy mieć wiele obiektów z tymi samymi metodami? prototype foo adf time cookies bar Obj2={}; Obj2.prototype= { foo: ObjBase.foo, adf: Obj12.adf, time: Obj72.time, cookies: Obj21.cookies, bar: Obj1.bar }; Obj3 = Obj2.clone(); Obj3 Obj2
Klonowanie obiektu 3. Programowanie bezklasowe Prototyp obiektu nie ma nazwy, nie zaśmieca namespace – jedynym odwołaniem do niego jest wskaźnik w obiektach Obj2 i Obj3.
Zmiana delegacji obiektu 3. Programowanie bezklasowe Prototyp obiektu może zawierać zmienne dzielone dla wielu obiektów. W C++ zmienne klasy nadrzędnej mają rezerwowaną osobną pamięć dla każdej instancji.
Zmiana delegacji obiektu 3. Programowanie bezklasowe Prototyp obiektu jest określony za pomocą wskaźnika – nic nie stoi więc na przeszkodzie, żeby zmienić go w czasie wykonywania programu.
Zmiana delegacji obiektu 3. Programowanie bezklasowe DeadNPC NPC talkTo() { return „I seedeadpeople”; }; attack(); giveSandwich(); talkTo(); attack(); giveSandwich(); Pirate // something If(Pirate.isA(DeadNPC)) { // do stuff }
Testy wydajnościowe 3. Programowanie bezklasowe Benchmark kodeka MPEG 1/2 – C vs Lisaac
Wnioski Wnioski Poznawanie nowych języków programowania może być pożyteczne!
Bibliografia Bibliografia MIT SICP 101 - http://www.academicearth.org/ Douglas Crockford, YIU Theather - http://crockford.com/javascript/ Funkcje Lambda w C# http://blogs.msdn.com/b/sriram/archive/2005/08/07/448722.aspx Antero Taivalsaari, Classes vs. Prototypes: Some Philosophical and Historical Observations http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.56.4713&rep=rep1&type=pdf Prototypes with multipledispatch - http://tunes.org/~eihrul/ecoop.pdf Lisaac - http://isaacos.loria.fr/li.html Lua- http://www.lua.org/
THE END Q&A?