Programowanie Komputerów Łukasz Kuszner pokój 209, WETI http://www.kaims.pl/ kuszner/ kuszner@eti.pg.gda.pl Wykład 30 godzin, Laboratoria 30 godzin 2012/ Strona 1 z 26
1. Zasady Wykład i laboratorium są oceniane osobno. Zaliczenie laboratorium jest na podstawie pracy na zajęciach. Zaliczenie wykładu na podstawie zaliczenia pisemnego na koniec semestru. Strona 2 z 26
2. Pomoc pakietu Visual Studio Dokumentacja dostępna on-line na stronach MSDN Andrew Troelsen, Pro C# 2010 and the.net 4 Platform (cz. 1 i 2, fragmenty cz. 3). Wydanie polskie: 2010 i platforma.net 4.0, Wydawnictwo Naukowe PWN, 2011. Standard ECMA-334 C# Language Specification (obejmuje tylko wersję 1.0, 1.2 i 2.0) Strona 3 z 26
Wprowadzenie do programowania na platformie.net.net Framework jest częścią systemu operacyjnego Windows firmy Microsoft. Na platformę.net składają się dwie części: The common language runtime (CLR) oraz.net Framework class library. CLR jest środowiskiem uruchomieniowym implementującym standard CLI (Common Language Infrastructure, ISO/IEC 23271, ECMA-335). Class Library jest rozbudowaną, zorientowaną obiektowo biblioteką klas, które mogą być użyte do tworzenia różnego rodzaju aplikacji: od tekstowych poprzez graficzne do sieciowych aplikacji opartych na ASP.NET. Strona 4 z 26
Języki na platformie.net C# Visual C++ Visual Basic Visual J# inne Strona 5 z 26
Programy narzędziowe csc.exe - kompilator C# ildasm.exe - deasembler AL.exe - assembly linker vbc.exe - visual basic compiler cl.exe - C, C++ compiler Strona 6 z 26
3. jest językiem stworzonym na potrzeby platformy.net przez firmę Microsoft. Pierwsza szeroko rozpowszechniona implementacja z roku 2000 była częścią tej właśnie platformy. Za twórców języka uważani są Anders Hejlsberg, Scott Wiltamuth i Peter Golde. Istnieje ogólnie dostępny standard C# oznczony ECMA-334, opracowany na podstawie zgłoszenia trzech firm: Microsoft, Intel i Hewlett-Packard. Strona 7 z 26
Implementacje Open Source Obecnie istnieje kilka projektów implementujących ten standard, również z jawnym kodem źródłowym. Przykłady: Mono - projekt open source na licencjach MIT, LGPLv2 i GPLv2 pierwotnie prowadzony przez firmę Novell (obecnie przez Xamarin), (http://www.mono-project.com/). DotGNU Portable.NET - PNET (http://www.dotgnu.org/) inne... Strona 8 z 26
Kolejne wersje języka C# C# 1.0,.NET Framework 1.0, Visual Studio.NET 2002 C# 1.2,.NET Framework 1.1, Visual Studio.NET 2003 C# 2.0,.NET Framework 2.0, Visual Studio 2005 C# 3.0,.NET Framework 3.5, Visual Studio 2008 C# 4.0,.NET Framework 4.0, Visual Studio 2010 C# 5.0,.NET Framework 4.5, Visual Studio spodziewana w 2012 Strona 9 z 26
Motywacja twórców Cele, które przyświecały twórcom języka można zawrzeć w kilku punktach: C# ma być nowoczesnym, łatwym do opanowania językiem obiektowym ogólnego przeznaczenia. Język i jego implementcja powinny zapewniać takie udogodnienia jak: silna kontrola typów, sprawdzanie zakresów tablic, wykrywanie prób użycia niezainicjalizowanych zmiennych i autmatyczne zwalnianie pamięci (ang. garbage collection). Język ma umożliwiać tworzenie alpikacji działających w środowisku rozproszonym. Język ma zapewnić przenośność kodu jak i łatwość jego przyswojenia przez programistów znających C i C++. Strona 10 z 26
Motywacja twórców (2) Język ma wspierać tworzenie aplikacji wielojęzykowych (ang. internationalization). Mimo że projektanci dołożyli starań aby aplikacje tworzone w C# działały szybko i nie używały zbyt wielu zasobów pamięciowych, to należy pamiętać, że język nie został wymyślony po to, by konkurować pod tym względem z C czy asemblerami. Strona 11 z 26
4. Pierwszy program Przykład 1. using System ; public class Test { public static void Main ( ) { Console. WriteLine ( Witaj p r z y j a c i e l u ) ; } } Mówiąc w dużym skrócie powyższy program musi zostać przetłumaczony z kodu źródłowego na kod pośredni lub kod wykonywalny. Program, który do tego służy nazywamy kompilatorem, a sam proces tłumaczenia kompilacją. Strona 12 z 26
Elementy kodu programu Program w języku C# musi zawierać definicję klasy, w której znajduje się się metoda Main oznaczona słowem static. Nasz pierwszy program zawiera tylko i wyłącznie tę metodę, która składa się z jednej instrukcji: Console.WriteLine("Witaj przyjacielu);, ta wypisuje tekst zawarty w cudzysłowie. Strona 13 z 26
Struktura programu Kod programu może zostać umieszczony w jednym bądź wielu plikach. Program składa się głównie z definicji typów (klas). Klasy składają się głównie z metod (funkcji), które z kolei zbudowane są z instrukcji. Każda instrukcja zakończona jest średnikiem. Instrukcje składają się ze słów kluczowych, operatorów, nazw zmiennych, wywołań funkcji, oraz znaków grupujących i separujących (nawiasy, przecinki, średniki). Strona 14 z 26
Uruchomienie programu Program zaczyna działanie od wykonania funkcji Main w głównej klasie programu. Wykonywane są instrukcja po instrukcji w kolejności zgodnej z umieszczeniem w kodzie źródłowym. Pozostałe klasy mogą być napisane przez programistę lub pochodzić z bibliotek. Przed uruchomieniem program należy skompilować i scalić (linkowanie, konsolidacja) z funkcjami bibliotecznymi. Strona 15 z 26
5. Edycja kodu źródłowego Pożądane cechy edytora kodu programu: Podświetlanie składni Wielokrotne cofnij/powtórz Zaznaczanie blokowe Parowanie nawiasów Autowcięcia Autouzupełnianie Ukrywanie części kodu Ukrywanie części tekstu Integracja z kompilatorem Możliwość sprawdzania pisowni (np. w komentarzach) Łatwość obsługi Niska cena Zasady Strona 16 z 26
6. to proces automatycznego tłumaczenia kodu napisanego w jednym języku programowania na inny (kod maszynowy lub kod pośredni). Dane wejściowe najczęściej nazywa się kodem źródłowym. Program wykonujący tłumaczenie to kompilator. Przeważnie kompilacja jest częścią większego procesu tłumaczenia, a tworzony w jej trakcie kod wynikowy jest przekazywany do linkera (konsolidatora). Strona 17 z 26
Proces przetwarzania kodu źródłowego preprocessing - przetworzenie wstępne, na przykład włączenie plików nagłówkowych kompilacja konsolidacja - łączenie skompilowanych modułów i utworzeniu pliku wykonywalnego. Strona 18 z 26
Etapy kompilacji Faza wstępna - odczyt i analiza kodu na podstawie reguł języka, tworzenie reprezentacji pośredniej kodu źródłowego w postać grafu lub drzewa zależności. Analiza leksykalna - rozdzielenie kodu na elementarne jednostki języka programowania zwane tokenami. Analiza składniowa - dopasowanie tokenów do gramatyki języka (sprawdzenie, czy kod źródłowy był poprawny składniowo) Analiza semantyczna - określenie znaczenia poszczególnych tokenów. Przykładem może być sprawdzanie, czy nie występuje niezgodność typów. Optymalizacja - reprezentacja pośrednia jest upraszczana tak, aby program otrzymany na jej podstawie charakteryzował się pewnymi cechami (np. większą wydajnością lub mniejszą objętością). Generacja kodu na podstawie reprezentacji pośredniej generowany jest kod wynikowy. Zasady Strona 19 z 26
Błędy kompilacji Bezproblemowy przebieg kompilacji programu jest rzadkim zjawiskiem nawet u doświadczonych programistów. Przykład 2. using System ; public class Test { public static void Main ( ) { Console. WriteLine ( Witaj p r z y j a c i e l u ) } } Powyższy przykład jest błędny. Próba kompilacji takiego programu zakończy się niepowodzeniem. Strona 20 z 26
Przykładowe komunikaty wyświetlone przez kompilator mogą mieć następującą postać: Zasady Przykład 3. prog.cs(7,3): error CS1525: Unexpected symbol }, expecting ; prog.cs(8,1): error CS8025: Parsing error Compilation failed: 2 error(s), 0 warnings Kompilator uznał, że błąd znajduje się w linii 7 przed symbolem {, mimo że średnik zwyczajowo piszemy bezpośrednio po instrukcji. Mimo to sytuacja jest wielce komfortowa; otrzymaliśmy precyzyjny komunikat o błędzie, który łatwo poprawić. Strona 21 z 26
7. (ang. debugging = odpluskwianie) - to proces śledzenia działania systemu mikroprocesorowego lub programu komputerowego za pomocą specjalnego programu - debugera w celu wychwycenia i naprawy błędów w działaniu uruchamianego urządzenia lub oprogramowania. Istotą uruchamiania przy pomocy debugera jest możliwość wykonywania programu w trybie pracy krokowej lub z zastawianiem tzw. pułapek (ang. breakpoints), czyli miejsc w programie, po osiągnięciu których dalsze wykonywanie programu jest zatrzymywane, a także podglądania i ew. zmiany zawartości rejestrów, pamięci itd. Strona 22 z 26
8. Kod programu możemy podzielić na tak zwane Tokeny (lub leksemy), czyli ciągi znaków rozumiane jako abstrakcyjne jednostki danego języka programowania. W C# tokenami są: Identyfikatory (Nazwy stałych, zmiennych, funckji, klas), np: Test, Main, Słowa kluczowe, np: public, static Literały, np: 42 Operatory i separatory, np:!=, {, } (, ). Strona 23 z 26
Identyfikatory Identyfikatory stosują zalecenia: załącznika 15 do standardu Unicode (ang. Unicode Standard Annex 15). Dodatkowo można stosować znak podkreślenia ( ) również na początku nazwy (jest traktowany jak litera), kody escape, dopuszczalny jest również znak @, jako prefiks dla słów kluczowych. Strona 24 z 26
Literały Literały reprezentują wartość (liczbową, tekstową, itp.) wpisaną bezpośrednio w kod programu. Strona 25 z 26
Operatory arytmretyczne: + - * / % logiczne: &&,,! porównania: <, <=, >, >=, ==,!= przypisania: = bitowe: & ^ ~ << >> Strona 26 z 26