Wykład 1: Przegląd języka

Podobne dokumenty
Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Język programowania PASCAL

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Programowanie RAD Delphi

Wykład 8: klasy cz. 4

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Programowanie obiektowe

JAVA W SUPER EXPRESOWEJ PIGUŁCE

TEMAT : KLASY DZIEDZICZENIE

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

Kurs WWW. Paweł Rajba.

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Platformy Programistyczne Podstawy języka Java

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

KOTLIN. Język programowania dla Androida

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Programowanie obiektowe - 1.

Szablony funkcji i szablony klas

Wykład 4: Klasy i Metody

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

Programowanie w Internecie. Java

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

20. Pascal i łączenie podprogramów Pascala z programem napisanym w C

Klasy abstrakcyjne i interfejsy

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Klasy abstrakcyjne, interfejsy i polimorfizm

Programowanie obiektowe

Polimorfizm. dr Jarosław Skaruz

Programowanie obiektowe

Delphi Laboratorium 3

Język ludzki kod maszynowy

Java Język programowania

Podstawy Programowania Obiektowego

Programowanie obiektowe

INSTRUKCJA PUSTA. Nie składa się z żadnych znaków i symboli, niczego nie robi. for i := 1 to 10 do {tu nic nie ma};

Podstawy Programowania 2

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

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

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

10. Programowanie obiektowe w PHP5

Pascal - wprowadzenie

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Dokumentacja do API Javy.

Wykład 9: Polimorfizm i klasy wirtualne

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Wykład 5: Klasy cz. 3

Języki i techniki programowania Ćwiczenia 2

PHP: bloki kodu, tablice, obiekty i formularze

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

ForPascal Interpreter języka Pascal

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Wykład 5: Więcej o Klasach i Metodach

Podstawy programowania. Wykład PASCAL. Wstęp do programowania obiektowego. dr Artur Bartoszewski - Podstawy programowania, sem.

Algorytmy i struktury danych. wykład 1

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

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie obiektowe

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

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Programowanie obiektowe

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

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Wykład 2: Podstawy Języka

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Wprowadzenie do szablonów szablony funkcji

Podstawy Języka Java

Programowanie Komputerów

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Wykład 6: Dziedziczenie

Wykład 2: Dane i instrukcje

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Wprowadzenie do szablonów szablony funkcji

Tworzenie własnych komponentów

Instrukcje podsumowanie. Proste: - przypisania - wejścia-wyjścia (read, readln, write, writeln) - pusta - po prostu ; (średnik) Strukturalne:

Programowanie w Turbo Pascal

Język programowania DELPHI / Andrzej Marciniak. Poznań, Spis treści

Multimedia JAVA. Historia

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Wykład 7: Lazarus GUI

Tworzenie aplikacji w języku Java

Podstawy programowania skrót z wykładów:

Technologie i usługi internetowe cz. 2

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Enkapsulacja, dziedziczenie, polimorfizm

Wstęp do programowania

Spis treści. 1 Java T M

Podstawowe części projektu w Javie

Programowanie obiektowe

Podstawy Programowania semestr drugi. Wykład czternasty

Wykład 8: Metaklasy. Interfejsy.

Podstawy programowania obiektowego

1 Atrybuty i metody klasowe

Transkrypt:

Kurs języka Object/Delphi Pascal na bazie implementacji Free Pascal. autor Łukasz Stafiniak Email: lukstafi@gmail.com, lukstafi@ii.uni.wroc.pl Web: www.ii.uni.wroc.pl/~lukstafi Jeśli zauważysz błędy na slajdach, proszę daj znać! Wykład 1: Przegląd języka The Good, The Bad, & The Ugly. 1

Trochę historii Niklaus Wirth zaczął tworzyć Pascala w 1968, opublikował go w 1970, pierwszy kompilator z 1972. Wywodzi się z ALGOLa (Wirth pracował wcześniej nad ALGOL W). Mały, wydajny ( systems programming jak C), edukacyjny. Niklaus Wirth przeszedł do pisania serii języków Modula i Oberon, ale nie zyskały one popularności. Na początku lat 80tych Pascala zaportowano na Apple ach jako alternatywę dla BASICa. W 1983, firma Borland tworzy rewelacyjną implementację Turbo Pascal (kompilator i IDE) dla MS-DOS i CP/M Szybka, działająca bezpośrednio z RAMu, dobre IDE. W 1985 Larry Tesler we współpracy z Wirthem tworzy Object Pascal, zaimplementowany w kompilatorach na Apple Macintosh. 2

Borland wprowadził moduły unit w TP4.0 (1987), oraz dialekt Object Pascala w TP5.5 (1989). Gdy po TP7.0 z 1992 roku Borland rezygnuje z wydawania na MS-DOS, Paul Klämpfl zaczyna tworzyć open-source kontynuację Turbo Pascala jako Free Pascal. W 1995 Borland wydaje Delphi ( jeśli chcesz porozmawiać z wyrocznią [bazą danych Oracle], idź do Delf. ) W 1999 Delphi 5 dodaje frames (enkapsulacja elementów graficznych) i interfejsy ze zliczaniem dowiązań (reference counting). W 2000 wychodzi Free Pascal 1.0, Free Pascal zaczyna adaptować cechy językowe wprowadzone do Delphi. W 2004 roku Free Pascal umie już kompilować na x86, MC680x0, PowerPC, ARM, SPARC, AMD64. W 2008 wychodzi IDE / biblioteka komponentów graficznych Lazarus, w 2010 FP 2.4 (m.in. konstrukcja for...in, klasy abstract). 3

Write once, compile everywhere 4

Program w Pascalu { Copyright 2008-2010 Michalis Kamburelis. [...] Popsuty w celach demonstracji przyklad. } {$mode objfpc}{$h+}{$c+} program radiance_transfer; uses VectorMath, Boxes3D, X3DNodes, GL, GLU, CastleWindow; type PViewMode = ^TViewMode; TViewMode = (vmnormal, vmsimpleocclusion, vmfull); var Window: TCastleWindowCustom; ViewMode: TViewMode = vmfull; const LightSHBasisCount = 25; var Komentarz Dyrektywy kompilatora (m.in. tryb Object Pascal) Program główny (czyli nie moduł biblioteczny) Użyte moduły Definicje/deklaracje typów Typ wskaźnikowy na typ zdefiniowany później Typ wyliczeniowy Zmienne Zmienna z wartością początkową Stałe Deklaracje różnych rodzajów mogą się przeplatać LightSHBasis: array [0..LightSHBasisCount - 1] of Single; Tablica stałego rozmiaru LightIntensity: Single = 1.0; (wtedy podajemy zakres którym indeksowana) 5

procedure DrawLight(ForMap: boolean); glpushmatrix; gltranslatev(lightpos); if not ForMap then gldisable(gl_blend); glpopmatrix; Procedura z jednym argumentem (typu boolean) Pascal nie jest wrażliwy na wielkość liter (boolean to to samo co Boolean) Wcięcia pomagają uniknąć błędów type TMySceneManager = class(tcastlescenemanager) procedure RenderFromViewEverything; override; procedure TMySceneManager.RenderFromViewEverything; glclear(gl_color_buffer_bit or GL_DEPTH_BUFFER_BIT); glloadmatrix(renderingcamera.matrix); Definicja klasy dziedziczącej z TCastleSceneManager (procedura dynamicznie zastąpi tą z klasy bazowej) Implementacja metody Operacje boolowskie nazywają się or, and, not function UpdateViewMode: Boolean; forward; procedure Open(Glwin: TCastleWindowBase); glenable(gl_light0); if UpdateViewMode then WriteLn( OK ); Deklaracja funkcji (w celu rekursji wzajemnej) Wywołując funkcję bezargumentową nie musimy podawać nawiasów 6

function UpdateViewMode: Boolean; UpdateViewMode := True; Definicja funkcji bezargumentowej Wartość do zwrócenia przypisujemy do zachowującej się jak zmienna nazwy funkcji type TOctreeSubnodeIndex = array[0..2]of boolean; function SubnodeWithPoint(const P: TVector3Single): TOctreeSubnodeIndex; result[0] := P[0] >= MiddlePoint[0]; result[1] := P[1] >= MiddlePoint[1]; Zamiast nazwy funkcji możemy użyć słowa kluczowego result Rezultat wypełniamy jak każdą inną zmienną result[2] := P[2] >= MiddlePoint[2]; (inny przykład: result.intfield := 7) procedure Idle(Glwin: TCastleWindowBase); procedure ChangeLightPosition(Coord, Change: Integer); LightPos[Coord] += Change * Glwin.Fps.IdleSpeed * { scale by Box3DAvgSize, to get similar move on all models } Scene.BoundingBox.AverageSize; Glwin.PostRedisplay; Procedura zagnieżdżona (może używać argumentów procedury nadrzędnej) procedure ChangeLightRadius(Change: Float); LightRadius *= Power(Change, Glwin.Fps.IdleSpeed); Glwin.PostRedisplay; Z parametrem -Sc kompilatora możemy używać przypisań w stylu C 7

if Glwin.Pressed[K_A] then ChangeLightPosition(0, -1); if Glwin.Pressed[K_R] then if mkshift in Glwin.Pressed.Modifiers then ChangeLightRadius(1/1.8) else ChangeLightRadius(1.8); Blok kodu procedury Window := TCastleWindowCustom.Create(Application); Scene := TCastleScene.Create(Application); OnWarning := @OnWarningWrite; Window.OpenAndRun; FreeAndNil(RenderParams); end. Blok kodu programu głównego Przypisanie do zmiennej proceduralnej Wywołanie procedury bezargumentowej (nawiasy są niepotrzebne) 8

Cechy języka Object Pascal Free Pascal Klarowna struktura programów i bibliotek. Porównaj: public class HelloWorld { public static void main (String[] args) { System.out.println("Hello "+args[0]+"!"); } } program HelloWorld; WriteLn ( Hello +ParamStr(1)+! ) end. Podział na procedury: funkcje, które nie uczestniczą w wyrażeniach, oraz funkcje: procedury, które zwracają (główny) rezultat obliczeń. Tryby argumentów procedur: wejściowy const, wyjściowy out oraz dwukierunkowy var. Jest też tryb domyślny, wejściowy przekazujący przez wartość. procedure FindParents(const Child: Float; out Mother: Parent; out Father: Parent); 9

Przeciążanie operatorów jak w C++. Wbudowany typ zbiorów. (Niestety?) tylko nad typami porządkowymi, i w obecnej implementacji (na bitmapie) ograniczony do 256 elementów. Wbudowane typy: podzakresy typów porządkowych. Pozwalają zawężać typy danych, i typy argumentów funkcji, dla pełniejszej zgodności z zamierzoną semantyką (tzn. znaczeniem). Oczywiście sprawdzane w czasie działania programu a nie kompilacji. (I to po włączeniu opcji range check.) Idiom: type TEType = Succ(Low(TPossEType)).. High(TPossEType); gdy pierwsza wartość typu wyliczeniowego oznacza nic / żaden. Tablice o statycznych rozmiarach można indeksować podzakresami typów porządkowych, gdy jest powód żeby nie numerować liczbami od 0. Najczęściej typem wyliczeniowym, lub liczbami od 1. 10

Instrukcja for...in jak w Pythonie i Javie. Szablony templates jak w C++. Bardzo Pascalowa konstrukcja: properties. type MyClass = class private Field1 : Longint; Field2 : Longint; Field3 : Longint; procedure Sety (value : Longint); function GetY : Longint; function GetZ : Longint; public property X : Longint read Field1 write Field2; property Y : Longint read GetY write SetY; property Z : Longint read GetZ; 11

Zagnieżdżone funkcje, z leksykalnymi zakresami zmiennych. Funkcja zagnieżdżona korzysta z argumentów funkcji zewnętrznej. Brak wielokrotnego dziedziczenia, ale klasy implementują interfejsy jak w Javie. Klasy ze zliczaniem dowiązań (reference counted). W szczególności AnsiString. W najnowszej wersji, typy zagnieżdżone, jak w Javie. 12

Wbudowane typy plikowe file of Typ okazały się pojęciem zbyt mało abstrakcyjnym jak na konstrukcję językową, nie dają łatwej kontroli nad rodzajem przeprowadzanego I/O. W praktyce zastępowane przez klasy pochodzące z TStream. Brak możliwości przeplatania bloku z kodem i definicji/deklaracji typów, zmiennych i procedur. Chyba poprawia to klarowność, o ile pamięta się żeby bloki z kodem były małe. Brak możliwości inicjalizowania zmiennych obliczanymi wartościami. Jest to zgodne z separacją deklaracji od bloku z kodem, ale psuje klarowność funkcji zagnieżdżonych. Szablony templates jak w C++. Programista musi decydować o zarządzaniu pamięcią: czy stworzyć rekord/obiekt na stosie, czy na stercie, czy używać reference counting czy samemu zwalniać (i wtedy pamiętać np. o try...finally). 13

Podział modułów na interfejs i implementację niemal pozwala definiować abstrakcyjne typy danych w lekki sposób na styl SMLa i OCamla. Używane moduły są zawsze otwarte, dostęp kwalifikowany modul.funkcja jest opcjonalny (chyba że nazwa jest zasłonięta). Nie można zadeklarować w interfejsie typów abstrakcyjnych (nawet wskaźnikowych), dlatego abstrakcyjne typy danych to muszą być obiekty / klasy z polami prywatnymi. Brak domknięć funkcyjnych closures. W nowym Free Pascalu można przypisywać funkcje zagnieżdżone do zmiennych, ale ich zwrócenie z funkcji nadrzędnej jest niebezpieczne. Ale można ręcznie budować closures jako wskaźniki na metody. (Nawiasem, Java wbrew pozorom ma closures: obiekt klasy lokalnej, np. anonimowej, jeśli korzysta tylko z final funkcji zewnętrznej.) 14

Szok kulturowy dla mnie: niekonsystentność autorów dokumentacji Free Pascala co do wielkości liter w słowach kluczowych i identyfikatorach. Ale w praktyce stosuje się głównie: małe litery dla słów kluczowych, i CamelCase dla identyfikatorów (z wyjątkiem: małe litery dla zmiennych pomocniczych). 15

Brak możliwości nadawania nazw wartościom, jak robią zmienne final w Javie. Powinien być blok definicji val (słowo kluczowe m.in. w Scali), podobny do var, ale z wyrażeniem do obliczenia za =. Tak zdefiniowana nazwa na wartość nie byłaby przypisywalna. Na pocieszenie, są argumenty const funkcji oraz twórca klasy może łatwo zapewnić pola niemodyfikowalne klasa sama ich nie modyfikuje (pola read-only) dzięki properties. jeśli No cóż, Pascal jest językiem imperatywnym, a nie zorientowanym na wyrażenia. <rant> Idealnie, razem z val trzebaby dodać closures do języka, zwracalne funkcje wewnętrzne które nie używają var funkcji zewnętrznej. Od strony implementacji to byłyby automatycznie budowane obiekty pamiętające co trzeba, i zwracany byłby wskaźnik na metodę takiego obiektu. </rant> 16