Zaawansowane metody programowania

advertisement
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; }
}
}
}
}
Download