Wydział Elektroniki Kierunek: AiR Zaawansowane metody programowania Wykład 1 Zaawansowane metody programowania Dane podstawowe Wykład: 1 Laboratorium: 2 Wykład: ocena (kolokwium na ostatnim wykładzie) Laboratorium: ocena Dr inż. Jerzy Kotowski Instytut Informatyki Automatyki i Robotyki Zakład Sterowania i Optymalizacji pok. 219 C-3 http://jerzy.kotowski.staff.iiar.pwr.wroc.pl Zaawansowane metody programowania Opis przedmiotu • Cele zajęć: – Opanowanie zaawansowanych technik programowania umożliwiających samodzielną implementację rozwiązań, praktyczne posługiwanie się narzędziami informatycznymi i biegłością w programowaniu • Krótki opis zawartości całego kursu: – Omawiane są techniki programowania umożliwiających programowanie w środowisku rozproszonym i równoległym/sieciowym. Ponadto prezentowane są metody przyspieszania programów uwzględniające architektury wybranych systemów komputerowych. Poszczególne techniki ilustrowane są za pomocą programów w językach C++, Java i C#. • Zespół dydaktyczny: – – – – Prof. dr hab. inż. Czesław Smutnicki dr inż. Jerzy Kotowski dr inż. Grzegorz Mzyk dr inż. Przemysław Śliwiński Zaawansowane metody programowania Zawartość tematyczna wykładu 1. Wprowadzenie do wybranych języków wysokiego poziomu (Java, C#, C++; Wybrane języki środowiska programowania) 2. Szablony, generyki a programowanie obiektowe 3. Kontenery, iteratory, algorytmy 4. Strumienie, przetwarzanie łańcuchów, wyrażenia regularne, wyszukiwanie wzorców 5. Obsługa wyjątków. Procesy i wątki. Komunikacja i synchronizacja zadań (Współbieżność, procesy wątki) 6. Wzorce projektowe. Uruchamianie programów (Testowanie oprogramowania) 7. Omówienie bibliotek interfejsu graficznego użytkownika, multimedialnych i sieciowych. 8. Zaliczenie Zaawansowane metody programowania Literatura • Literatura podstawowa 1. 2. 3. 4. 5. 6. • B. Stroustrup, Język C++, Wydawnictwo Naukowo Techniczne, Warszawa, 2002. B. Eckel, Thinking In Java, Wydawnictwo Helion, 2006 S.B. Lippman, J. Lajoie, Podstawy języka C++, Wydawnictwo Naukowo Techniczne, Warszawa, 2003. S. Meyers, Język C++ bardziej efektywny. 35 praktycznych sposobów ulepszenia programów, Wydawnictwa Naukowo-Techniczne, 1998 H. Sutter, Wyjątkowy język C++ 47 łamigłówek, zadań programistycznych i rozwiązań, Wydawnictwa Naukowo-Techniczne, 2002 D. Vandevoorde, N. M. Josuttis, C++ szablony. Vademecum profesjonalisty, Helion, 2003 Literatura uzupełniająca 1. 2. 3. 4. 5. 6. 7. B. Stroustrup, Projektowanie i rozwój języka C++, Wydawnictwo Naukowo Techniczne, Warszawa, 1996. D. Vandevoorde, Język C ++. Ćwiczenia i rozwiązania, Wydawnictwo Naukowo Techniczne, Warszawa, 2001. D. E. Knuth, Sztuka programowania, T. I-III, Wydawnictwo Naukowo Techniczne, Warszawa, 2001. S. Lippman, Model obiektu w C++, Wydawnictwa Naukowo-Techniczne, 1999. Przyszłe wydania standardów ANSI C++ (http://www.boost.org). Oficjalna strona języka Java (http://java.sun.com) Oficjalna strona języka C# (http://msdn.microsoft.com/vcsharp/) Trochę historii ENIAC • • Electronic Numerical Integrator And Computer; Elektroniczny i Numeryczny Integrator i Komputer; konstrukcja 1943-1945; do 1955; kilka liczb: • • – – – – • • masa ponad 27 ton, około 18 000 lamp elektronowych powierzchnia ok. 140 m2 zapotrzebowanie na moc 180 kW Szybkość obliczeń: 5 tysięcy dodawań liczb dziesiętnych dziesięciocyfrowych na sekundę pluskwa – bug, debugger, debugging Trochę historii Superkomputer • • FLOPS – FLoating point Operations Per Second Wydajność komputera megaflops gigaflops teraflops petaflops eksaflops zettaflops jottaflops – 106 – 109 – 1012 – 1015 – 1018 – 1021 – 1024 Rok Komputer Wydajność 1946 ENIAC 5000+ 350* 40/ na sek. 1976 Cray-1A 133 MFLOPS 1983 Cray X-MP 235 MFLOPS 1997 ASCI Red / 9152 1.3 TFLOPS 2002 Earth-Simulator 35.9 TFLOPS 2004 IBM Blue Gene 70.7 TFLOPS 2005 IBM Blue Gene 140 TFLOPS 2008 IBM Roadrunner 1 PFLOPS Trochę historii Roadrunner • Posiadacz: Department of Energy USA • Gdzie: Los Alamos National Laboratory • 12960 mikroprocesorów Cell oraz 6948 dwurdzeniowych mikroprocesorów AMD. • System operacyjny: Red Hat Linux. • Koszt: 100 mln $ • Waga: 250 t • Szybkość docelowa: 1.5 PFLOPS Trochę historii Generacje języków programowania • W ciągu 50 lat powstały cztery generacje języków programowania. • W językach pierwszej generacji (FORTRAN 1, COBOL) charakterystyczny jest wspólny obszar danych globalnych, do którego odwołują się podprogramy. • Podstawami rozwoju drugiej generacji języków byłą taka modyfikacja podprogramów, by mogły one przekazywać między sobą parametry, być zagnieżdżane i mieć zróżnicowany zakres widoczności deklaracji stałych i zmiennych. Wymienione własności spowodowały powstanie strukturalnych metod projektowania oprogramowania. • Charakterystyczną cechą języków trzeciej generacji była modułowość. Wyodrębnienie modułów w procesie dekompozycji funkcjonalnej pozwalało na rozdzielenie pracy pomiędzy samodzielnych programistów (język ANSI C). Trochę historii Języki czwartej generacji • Języki czwartej generacji, zwane językami obiektowymi (np. C++), zmieniają podejście do zagadnienia struktur danych. • Języki obiektowe rozszerzają pojęcie struktury danych o nowy element zwany obiektem (typem obiektowym). • Typ obiektowy zawiera dane i sposoby posługiwania się tymi danymi (metody obiektu, funkcje składowe). • Programowanie obiektowe jest metodą tworzenia oprogramowania, w której programy są organizowane jako kolekcje obiektów. • C++, Java, C# są językami programowania obiektowego. Trochę historii C++ • Język C++ jest ewolucyjnym rozszerzeniem języka C • Język C++ zaprojektowano w celu: zachowania wysokiej efektywności i przenoszalności języka C, pełnej zgodności z językiem C, likwidacji wad języka C, w szczególności słabej kontroli typów danych, wyposażenia języka w nowoczesne mechanizmy ukrywania danych. • C++ powstał w Bell Labs w połowie 1980 - Bjarne Stroustrup • C++ dodaje do C koncepcję klasy - mechanizm, który pozwala wprowadzać nowe typy danych definiowane przez użytkownika abstract data types - ADT. W konsekwencji pozwala to na object oriented programming OOP. • C is a machine level, while C++ is a problem level • C++ is an improved C Trochę historii Java Powstanie: 1991 rok (18 miesięcy) Twórcy: James Gosling, Patrick Naughton, Chris Warth, Ed Frank, Mike Sheridan (Sun Microsystems). Potrzeba zdefiniowania języka niezależnego od platformy, do tworzenia oprogramowania wbudowanego w sprzęt elektroniczny powszechnego użytku (kuchenki mikrofalowe, pilot zdalnego sterowania). W miedzy czasie, pojawił się znacznie ważniejszy czynnik: sieć WWW. Przeniesienie uwagi projektantów Javy z elektroniki powszechnego użytku na programowanie dla Internetu. Wpierw: Oak. Zmiana w 1995 na Java. Trochę historii C# • • • • • Projekt C# rozpoczął się w 1998 roku. Celem projektu było opracowanie prostego, nowoczesnego i obiektowego języka programowania przeznaczonego dla nowej platformy .NET (nazwa .NET pojawiła się później). C# został zaprojektowany przez zespół pod kierunkiem Andersa Hejlsberga dla firmy Microsoft. Program napisany w języku C# jest kompilowany do języka Common Intermediate Language (CIL), tzn. kodu pośredniego wykonywanego w środowisku uruchomieniowym takim jak .NET Framework. Wykonanie skompilowanego programu przez system operacyjny bez takiego środowiska nie jest możliwe. Zaawansowane metody programowania Microsoft Visual Studio 2008 Microsoft Visual C# 2008 Pierwszy program • Create Project (File – New – Project) -> Other languages -> Visual C# -> Console Application -> Name: ZaMePro1 -> OK. • Zwyczajowo pliki C# mają rozszerzenie *.cs • Inaczej niż w C++ w C# (tak samo w Javie) nie jest możliwe tworzenie funkcji globalnych ani globalnych wskaźników do danych. • Każda aplikacja w C# musi posiadać klasę definiującą metodę Main(), która zostanie wykorzystana do punktu początkowego aplikacji. • Styl komentarzy w C# został zapożyczony z C++. • static - metoda statyczna w klasie ma zasięg klasy i może zostać wywołana bez tworzenia instancji obiektu. Microsoft Visual C# 2008 Pierwszy program – code using using using using System; System.Collections.Generic; System.Linq; System.Text; namespace ZaMePro1 { class Program { static void Main(string[] args) { Console.WriteLine("Ala ma kota"); Console.ReadKey(); } } } 1.1 Microsoft Visual C# 2008 Składowe Console Class • Console Class - Represents the standard input, output, and error streams for console applications. This class cannot be inherited. • WriteLine(String) - Writes the specified string value, followed by the current line terminator, to the standard output stream. • ReadKey() - Obtains the next character or function key pressed by the user. The pressed key is displayed in the console window. • Beep()- Plays the sound of a beep through the console speaker • Clear() - Clears the console buffer and corresponding console window of display information. Microsoft Visual C# 2008 Drugi program – code using using using using 1.2 System; System.Collections.Generic; System.Linq; System.Text; namespace ZaMePro1 { class Program { static void Main(string[] args) { Console.WriteLine("Ala ma kota"); Console.ReadKey(); Console.Beep(); Console.BackgroundColor = ConsoleColor.DarkBlue; Console.ForegroundColor = ConsoleColor.Yellow; Console.Clear(); Console.WriteLine("Ela ma kota"); Console.ReadKey(); Console.Beep(); } } } Microsoft Visual C# 2008 Argumenty funkcji main using using using using System; System.Collections.Generic; System.Linq; System.Text; namespace ZaMePro1 { class Program { static void Main(string[] args) { Console.WriteLine("Ala ma kota"); Console.WriteLine(); // argumenty funkcji Main for (int x = 0; x < args.Length; x++) Console.WriteLine("Argument {0}: {1} ", x, args[x]); Console.WriteLine("\nKoniec"); Console.ReadKey(); } } } 1.3 Microsoft Visual C# 2008 Konstruktory 1.4 class Program { public Program() // konstruktor bez argumentów { Console.WriteLine("Ala ma kota"); } public Program(string text) // Konstruktor z argumentem { Console.WriteLine(text); } public Program(int x) // Konstruktor z argumentem { X = x; Console.WriteLine("Cena programu: {0} $", X); } int X; // Klasa Program ma składowe typu dane static void Main(string[] args) { // p1, p2, p3, p4 - tworzone wewnątrz klasy Program p1 = new Program(); // Konstrukcja obiektu Program p2; // Tylko referencja p2 = new Program("Jest i Pies!"); Program p3 = new Program(125); Program p4 = new Program(1024); Console.ReadKey(); } } • • • • • Klasa Program ma trzy konstruktory Nie ma destruktora Garbage collection Klasa ma składowe typu dane Metoda klasy tworzy instancje obiektów swojego typu Microsoft Visual C# 2008 Wszystko jest obiektem - Everything is an Object • Podstawowa różnica pomiędzy C++ i C#: – – – w C# wszystko jest obiektem (nawet liczba) istnieje garbage collector (tzn. że nie musimy, a nawet nie możemy usuwać samemu niepotrzebnych obiektów) C# został stworzony dla Microsoftu (?). • The object type is an alias for Object in the .NET Framework. In the unified type system of C#, all types, predefined and user-defined, reference types and value types, inherit directly or indirectly from Object. • You can assign values of any type to variables of type object. • When a variable of a value type is converted to object, it is said to be boxed. (pakowanie, paczka) • When a variable of type object is converted to a value type, it is said to be unboxed. (rozpakowywanie) Microsoft Visual C# 2008 Everything is an Object using using using using 1.5 System; System.Collections.Generic; System.Linq; System.Text; namespace ZaMePro1 { class Program { static void Main(string[] args) { object A1 = 3; // pakowanie object A2 = "Ala ma kota"; // pakowanie int A3 = (int)A1; // rozpakowywanie string A4 = (string)A2; // rozpakowywanie Console.WriteLine("A1: {0} \t\t typ: {1}", A1, A1.GetType()); Console.WriteLine("A2: {0} typ: {1}", A2, A2.GetType()); Console.WriteLine("A3: {0} \t\t typ: {1}", A3, A3.GetType()); Console.WriteLine("A4: {0} typ: {1}", A4, A4.GetType()); Console.ReadKey(); } } } Struktura programu w języku C# Klasa stos – plik Program.cs • Podstawowe pojęcia organizacyjne: – – – – – namespace ZaMePro_2 Programy { Przestrzenie nazw class Program Typy { static void Składowe { Podzespoły (assemblies). • Programy C# składają się z jednego lub kilku plików źródłowych • W języku C# nie ma potrzeby używania dyrektywy #include i plików nagłówkowych. } 1.6 } Main() Stack s=new Stack(); s.push(1); s.push("Ala ma kota"); s.push(3.14); Console.WriteLine(s.Pop()); Console.WriteLine(s.Pop()); Console.WriteLine(s.Pop()); Console.ReadKey(); } Struktura programu w języku C# Klasa stos – plik Stack.cs namespace ZaMePro_2 { class Stack { Element top; 1.6 class // Element // klasa zagnieżdżona obiekt na szczycie stosu { public void push(object dane) //next; składanie na stosie public Element // następny element { public object top = new Element(top, dane);dane; // element na stosie public Element(Element next, object dane) } public object Pop()// //konstruktor pobieranie ze stosu { { if (top == null) throw new InvalidOperationException(); this.next = next; object result = top.dane; this.dane = dane; top = top.next; return result; } } } } }