Wprowadzenie do programowania

Transkrypt

Wprowadzenie do programowania
Wprowadzenie
do programowania
Wojciech Sobieski
Olsztyn 2007-2012
Podstawowe pojęcia
Język - jest to ogólna nazwa zdefiniowanego zbioru znaków i symboli
oraz reguł określających sposoby i kolejność ich użycia. Język, który jest
stosowany do przetwarzania algorytmów nosi nazwę języka
algorytmicznego, a przy zastosowaniu go do celów programowania
określony jest jako język programowania. Ponieważ komputer
posługuje się językiem binarnym, tzn. rozróżnia stany 0,1, program w
języku programowania należy przetworzyć tak, aby był zrozumiały dla
maszyny – zadaniem tym zajmują się translatory.
Podstawowe pojęcia
Język programowania - zbiór zasad składni, instrukcji, dzięki którym
powstaje kod źródłowy programu. Procesor jest w stanie wykonywać
program w kodzie maszynowym. Jednakże tworzenie programów w
tym języku jest praktycznie niemożliwe. Dlatego programista używa
języka zrozumiałego dla człowieka, który następnie jest kompilowany
bądź interpretowany do postaci maszynowej. Istnieje wiele rodzajów
języków programowania. Można je podzielić na języki strukturalne i
obiektowe. Innym kryterium podziału jest zastosowanie języków
(innych używa się do tworzenia programów multimedialnych, a innych
do obliczeń numerycznych czy np. aplikacji sieciowych). Niektóre z
języków są bardziej uniwersalne niż inne.
Podstawowe pojęcia
Translatory
Interpretery
Kompilatory
Python
● MatLab
● HTML
● Java
●
Fortran
● Pascal
● C, C++
●
Podział translatorów
Podstawowe pojęcia
Kod (plik) źródłowy – jest to program komputerowy w postaci tekstu
zawierającego instrukcje języka programowania. Kod źródłowy jest
jedynym formatem programu czytelnym dla człowieka. Kod źródłowy
jest przetwarzany na kod maszynowy przez program zwany
translatorem;
Kod (plik) obiektowy – jest to przetłumaczona na język niskiego
poziomu (asembler) wersja kodu źródłowego;
Podstawowe pojęcia
Kod maszynowy – jest to postać programu komputerowego
przeznaczona do bezpośredniego lub prawie bezpośredniego
wykonania przez procesor. Kod maszynowy wyrażony jest w postaci
rozkazów procesora i ich argumentów. Kod maszynowy przeznaczony
jest do wykonania na konkretnym typie procesora;
Kod (plik) wynikowy – kod, który może być uruchomiony
bezpośrednio w systemie operacyjnym. Najczęściej zawiera on binarną
reprezentację instrukcji konkretnego typu procesora. Oprócz tego
znajdują się w nim zwykle wywołania systemowe, dlatego pliki
wykonywalne zazwyczaj są specyficzne nie tylko dla danego procesora,
ale też dla danego systemu operacyjnego. Nie dotyczy to sytuacji, kiedy
zawierają formę pośrednią, która do uruchomienia wymaga interpretera
lub maszyny wirtualnej – takie pliki mogą być zwykle uruchamiane na
różnych systemach.
Podstawowe pojęcia
Plik dołączany (nagłówkowy) – jest to zewnętrzny plik tekstowy
zawierający fragmenty kodu źródłowego (np. deklaracje typów
zmiennych, wartości stałych, funkcji lokalnych). Zawartość plików
dołączanych dodawana jest do innych plików źródłowych
odpowiednim poleceniem, przy czym odbywa się to automatycznie na
etapie preprocesingu;
Translator – jest to program służący do automatycznego tłumaczenia
kodu źródłowego na język maszynowy. Rozróżnia się dwa rodzaje
translatorów: kompilatory i interpretery;
Podstawowe pojęcia
Kompilator – jest to program jednorazowo tłumaczący cały kod
źródłowy na język maszynowy i zapisujący go do pliku wynikowego.
Kolejne uruchomienia programu (pliku wynikowego) nie wymagają
powtórzenia etapu kompilacji – oznacza to, że kompilator nie jest
potrzebny do uruchamiania programu. Typowymi przykładami języków
kompilowanych są: C, C++, Pascal, Fortran;
Interpreter – jest to program tłumaczący i wykonujący kod źródłowy
linia po linii. W tym przypadku nie ma pliku wynikowego, a każde
uruchomienie wymaga ponownego przeprowadzenia etapu interpretacji
– interpreter jest więc niezbędny do uruchomienia i wykonania
programu. Typowymi przykładami języków interpretowanych są:
Python, MatLab, GNU Plot, HTML, BPL;
Podstawowe pojęcia
Biblioteka statyczna – jest to rodzaj biblioteki, która łączona jest z
programem w etapie konsolidacji. W systemach z rodziny Windows
zwykło nadawać się im rozszerzenia .lib lub .o, natomiast w systemach
z rodziny Unix są to zwykle .a lub .o. Biblioteki statyczne, w
przeciwieństwie do bibliotek dynamicznych, nie wymagają pomocy
systemu operacyjnego komputera – po połączeniu z danym programem
są od razu gotowe do użycia;
Biblioteka dynamiczna – jest to rodzaj biblioteki, która łączona jest z
programem dopiero w momencie jego wykonania. Aby tego dokonać
system operacyjny komputera musi posiadać pewne funkcje, które
umożliwiają łączenie dynamiczne. W systemach Windows biblioteki
dynamiczne mają zazwyczaj rozszerzenie .dll;
Podstawowe pojęcia
Konsolidator (linker) – jest to program, który w trakcie procesu
konsolidacji łączy zadane pliki obiektowe i biblioteki statyczne tworząc
w ten sposób plik wykonywalny;
Etapy kompilacji
biblioteki statyczne
(.lib, .so, .o)
pliki dołączane (.inc)
preprocesor
kod źródłowy
(.for, .f90, .f95)
kompilator
przetworzony
kod źródłowy
konsolidator
kod obiektowy
(w asemblerze)
plik wynikowy
(.exe, .out)
Etapy translacji
(Fortran)
Etapy kompilacji
Etap preprocesingu – obejmuje on odczyt i analizę kodu źródłowego
na podstawie reguł danego języka. W tym etapie dokonywana jest:
•
•
•
analiza leksykalna – rozdzielenie kodu źródłowego na elementarne
jednostki języka programowania zwane tokenami;
analiza składniowa – kontrola, czy ułożenie tokenów nie łamie
reguł danego języka programowania (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.
Etapy kompilacji
Na etapie preprocesingu do kodu źródłowego wstawiana jest również
zawartość plików dołączanych. Realizuje się to specjalną instrukcją (np.
INCLUDE) umieszczoną na początku kodu źródłowego. Po
napotkaniu takiej instrukcji, preprocesor wstawi w miejsce deklaracji
zawartość odpowiedniego pliku. Efektem pracy preprocesora jest tzw.
przetworzony kod źródłowy;
Etapy kompilacji
Etap kompilacji – służy do przetłumaczenia kodu źródłowego na kod
obiektowy. W przypadku jednoczesnej kompilacji wielu plików
źródłowych, każdy z nich przetworzony jest na oddzielny kod
obiektowy. Na tym etapie nie są analizowane zależności pomiędzy
poszczególnymi segmentami programu;
Etap konsolidacji – służy do połączenia wszystkich plików
obiektowych oraz dodatkowych bibliotek statycznych w jeden kod
wynikowy. Na tym etapie sprawdzane są zależności pomiędzy
poszczególnymi segmentami programu. Dodanie biblioteki statycznej
wymaga podania odpowiednich opcji kompilacji. Po konsolidacji
program jest gotowy do uruchomienia.
Środowisko programistyczne
1. Translator – służy do wykonania kompilacji lub interpretacji kodu
źródłowego. Standardowym katalogiem, w których umieszcza się pliki
translatora jest katalog BIN w głównym katalogu aplikacji. Aby proces
translacji był możliwy, system operacyjny musi znać dokładne
położenie translatora i jego bibliotek. W tym celu należy dokonać
odpowiedniego wpisu w pliku wsadowym autoexec.bat (czasami wpis
tworzony jest automatycznie podczas instalacji).
Środowisko programistyczne
Przykłady:
Fortran 90
SET PATH=C:\F90\BIN;"%PATH%"
SET INCLUDE=C:\F90\INCLUDE;"%INCLUDE%"
SET LIB=C:\F90\LIB;"%LIB%"
VFort
SET PATH=%PATH%;C:\VFort\Bin
SET LIBRARY_PATH=C:\VFort\Lib
Środowisko programistyczne
Przykłady:
Delphi
SET PATH=C:\ DELPHI\BIN;C:\ DELPHI\PROJECTS\BPL;%PATH%
FreePascal
SET PATH=C:\FreePas\Bin\Win32;%PATH%
Środowisko programistyczne
2. Biblioteki i dodatkowe pliki wsadowe – służą do rozszerzania
możliwości języka, szczególnie w zakresie pewnych zastosowań
(np. obliczeń matematycznych, numerycznych, obróbki grafiki).
Standardowo instalowane są w katalogach LIBRARY i INCLUDE w
głównym katalogu aplikacji. Biblioteki podstawowe dostarczane są wraz
z
środowiskiem
programistycznym,
biblioteki
dodatkowe
rozprowadzane są w postaci osobnych pakietów.
Środowisko programistyczne
3. Edytor kodu – służący do pisania tekstu kodu źródłowego. Edytory
mogą być uniwersalne (np. ConText, Amigo, Crimson, Codex,
EditPlus, UltraEdit, Editeur, EmEditor i inne) lub też zintegrowane z
konkretną implementacją języka (np. Borland Delphi, Compaq Visual
Fortran i inne). Edytory uniwersalne pozwalają na podłączanie
kompilatorów jednego lub wielu języków i są rozprowadzane jako
oddzielne programy. Podłączenie konkretnego kompilatora odbywa się
poprzez odpowiednią definicję opcji programu. Zaletą edytorów jest to,
że poprawiają znacznie przejrzystość i wygodę tworzenia kodu, a także
„pomagają” pisać kod źródłowy programu wyróżniając, zazwyczaj
kolorem lub wytłuszczoną czcionką, słowa kluczowe danego języka –
łatwo wówczas zauważyć błąd już na etapie jego popełniania.
Środowisko programistyczne
4. Debugger (analizator kodu) – służy do analizy poprawności
tworzonego kodu źródłowego i stanowi zazwyczaj integralną część
translatora (może być to również oddzielny program). Podczas analizy
kodu źródłowego generowane są informacje o błędach – czasami
wymaga to podania dodatkowych opcji kompilacji – na bieżąco
(analizator zatrzymuje się w miejscu wykrycia błędu) lub też w postaci
końcowego raportu. Oprócz sygnałów o błędach, analizatory podają
również tzw. ostrzeżenia, tzn. informacje o znalezieniu niejasności w
kodzie lub o wykryciu miejsca potencjalnie niebezpiecznego. Typowym
ostrzeżeniem jest wiadomość o wykryciu deklaracji zmiennej, która nie
została nigdzie w kodzie wykorzystana.
Środowisko programistyczne
5. Edytor formularzy – służy do budowy okien widzianych przez
użytkownika po uruchomieniu programu (formularzy). Element ten
występuje jedynie w językach wizualnych, takich jak Visual Basic,
Delphi, Compaq Visual Fortan i innych. W różnych implementacjach
języków, edytor formularzy może być dostępny bezpośrednio po
uruchomieniu programu lub też po wybraniu odpowiedniej opcji z
menu. Zaletą stosowania tego narzędzia jest łatwość tworzenia
dowolnie skomplikowanych okien i określania ich właściwości. Nie
traci się wówczas czasu na pisanie elementów kodu, odpowiedzialnych
za tworzenie się formularzy i ich elementów, a programista skupia się
jedynie na realizacji założonego algorytmu. Brak edytora formularzy nie
przesądza o tym, że nie można tworzyć standardowych, „okienkowych”
aplikacji – wygląd definiowany jest wówczas przez programistę w
kodzie źródłowym.
Środowisko programistyczne
6. Menadżer projektu – służy do zarządzania modułami i plikami
projektu. Rzadko bowiem tak się zdarza, że cały kod źródłowy zawarty
jest w jednym pliku – przeważnie jest ich wiele i zawierają nie tylko
poszczególne moduły kodu, ale również biblioteki, różne pliki
wsadowe, grafikę i pliki multimedialne. Zazwyczaj istnieje główny plik
projektu zawierający wszystkie potrzebne do kompilacji informacje. Z
pomocą menadżera łatwo można modyfikować zawartość i strukturę
projektu.
Środowisko programistyczne
7. Narzędzia dodatkowe – służą do tworzenia systemu pomocy, ikon
i kursorów, programów instalacyjnych. Ilość narzędzi i poziom ich
zaawansowania zależy od implementacji języka.
Środowisko programistyczne
8. System pomocy – służy do uzyskiwania informacji o środowisku
programistycznym, zasadach jego użytkowania, elementach języka
(wraz z przykładami), rodzaju licencji, autorach i kontaktach. Zależnie
od implementacji języka oraz jego rodzaju pomoc może być mniej lub
bardziej rozwinięta. Dobrze zorganizowanie, obszerne systemy pomocy
zawierają często kompendium wiedzy na temat danego języka
programowania.
Środowisko programistyczne
Edi
Środowisko programistyczne
Delphi
Generacje JP
Języki programowania można podzielić na pięć wyraźnie różniących się
generacji (niektórzy mówią o czterech). W miarę jak zmieniał się
komputer, wystąpiła konieczność dostarczania użytkownikowi narzędzi
programistycznych, które umożliwiłyby mu maksymalne wykorzystanie
sprzętu. Nie ma jednak pełnej zbieżności chronologicznej między
poszczególnymi generacjami języków i sprzętu.
Generacje JP
Pierwsza generacja - Programowanie pierwszych komputerów
akceptujących zmianę oprogramowania odbywało się bezpośrednio w
kodzie binarnym, który można przedstawić jako ciągi zer i jedynek.
Każdy typ komputera operuje własnym kodem, który dlatego został
określony nazwą język maszynowy lub wewnętrzny.
I to właśnie stanowi główną wadę tych języków, gdyż programista
każdorazowo musi dostosowywać się do języka konkretnej maszyny.
Przykład:
00101010010110110100010101101101011010001011100001000010011
11000010101111100001010101000001010100010101000001010010101
00101101101000101011011010110100010111000010000100111100001
01011111000010101010000010101000101010000010100010010
Generacje JP
Druga generacja - Ponieważ operowanie ciągami zerojedynkowymi
nie jest wygodne dla programisty, przypisano im łatwiejsze do
zrozumienia znaki mnemotechniczne. Tak narodziły się języki
symboliczne, zwane też asemblerami. Choć stanowią proste
tłumaczenie języka maszynowego na symbole i są ściśle związane z
danym modelem komputera, to ułatwiają pisanie instrukcji i czynią je
bardziej czytelnymi.
Przykład:
mov dx, offset info
mov ah, 9
int 21h
mov ah, 0
int 16h
Generacje JP
Trzecia generacja - Kolejnym krokiem w rozwoju języków
programowania było powstanie języków wysokiego poziomu.
Symbole asemblera reprezentujące konkretne instrukcje zostały
zastąpione kodem nie związanym z maszyną, bardziej zbliżonym do
języka naturalnego lub matematycznego.
Przykład:
for i:=1 to MaxN do
begin
Vx[i]:=Vx[i]+dx[i];
end;
Generacje JP
Czwarta generacja - Na czwartą generację języków programowania
składa się szereg narzędzi, które umożliwiają budowę prostych aplikacji
przez zestawianie „prefabrykowanych” modułów. Obecnie wielu
specjalistów uważa, że nie są to języki programowania w ścisłym
znaczeniu, gdyż częstokroć stanowią jedynie rozszerzenie języków już
istniejących. Niektórzy autorzy proponują stosować nazwę „czwarta
generacja” wyłącznie w odniesieniu do programowania obiektowego
(OOP).
Przykład:
Generacje JP
Piąta generacja - Nazwę „język piątej generacji” stosuje się czasem w
odniesieniu do języków używanych do tworzenia programów
wykorzystujących tzw. sztuczną inteligencję (AI) lub inaczej systemów ekspertowych.
Podział JP
Podział ze względu na rodzaj translacji:
•
kompilowane,
•
interpretowane.
Podział JP
Podział ze względu na strukturę (1):
•
•
języki proceduralne (imperatywne) – programista określa JAKIE
operacje maja być wykonane i w JAKIEJ KOLEJNOŚCI,
języki nie proceduralne (deklaratywne) – programista opisuje to,
CO chce wykazać. Decyzja JAK to wykonać należy do kompilatora.
Podział JP
Podział ze względu na strukturę (2):
•
•
języki strukturalne – program rozbity na procedury (podprogramy),
z których każda odpowiada za rozwiązanie określonego problemu.
Procedury stanowią wtedy odrębne, samodzielnie działające całości,
które możemy wykorzystać także i w innych pisanych programach.
języki niestrukturalne – brak wydzielonych obszarów
odpowiedzialnych za rozwiązywanie określonych problemów.
Podział JP
Podział języków ze względu na zastosowania:
1. algorytmiczne: do zapisywania algorytmów
•
•
•
algebraiczne (Fortran, Pascal, C) - do zapisu algorytmów
numerycznego przetwarzania informacji,
ekonomiczne (COBOL, PL/1) - opis algorytmów przetwarzania
informacji o charakterze ekonomicznym, bankowym, handlowym.
Rozbudowane mechanizmy operacji we/wy i pewne możliwości
wykonywania operacji na danych nienumerycznych,
do symbolicznego przetwarzania informacji (LISP) - do zapisu
algorytmów przetwarzania informacji numerycznych i na danych
symbolicznych.
Podział JP
Podział języków ze względu na zastosowania, cd:
2. języki symulacyjne (SIMULA) - ułatwiają opisywanie algorytmów
modelowania i symulacji
3. bezpośredniego dostępu (BASIC) - pozwalają na konwersację z
maszyną.
4. problemowe - ściśle dostosowane do konkretnej klasy zadań.
Podział JP
Podział według struktury (3):
•
•
języki strukturalne (Fortran, Pascal, Algol)
języki zorientowane obiektowo (C++ , Visual C++, Turbo Pascal,
Delphi, Smalltalk, Objective-C, Eiffel , Lisp, Oberon, Actor ,
CLOS, Ada95, Prolog++, Zink, JAVA, J++, Visual Objects,
Python):
Podział JP
W ostatnich latach w projektowaniu oprogramowania zorientowanego
obiektowo wykształcił się wyraźny podział na:
OOA - Object Oriented Analysis
(Analiza Zorientowana Obiektowo)
OOD - Object Oreinted Design
(Projektowanie Zorientowane Obiektowo)
OOP - Object Oriented Programming
(Programowanie Zorientowane Obiektowo)
Podział JP
Przykład
ewolucji wybranych
języków programowania
Dziękuję za uwagę
Wojciech Sobieski
Olsztyn 2007-2012

Podobne dokumenty