Oprogramowanie i wykorzystanie stacji roboczych Wykład 1 Plan

Transkrypt

Oprogramowanie i wykorzystanie stacji roboczych Wykład 1 Plan
Plan wykładów
Wybrane narz˛edzia wspomagajace
˛ proces tworzenia
oprogramowania
Oprogramowanie i wykorzystanie
stacji roboczych
Podstawy systemu X Window
Biblioteka Qt
Tworzenie grafiki trójwymiarowej na przykładzie blioteki OpenGL
Wykład 1
Programowanie wielowatkowe
˛
Poprawa wydajności oprogramowania
Dr inż. Tomasz Olas
[email protected]
Instytut Informatyki Teoretycznej i Stosowanej
Politechnika Cz˛estochowska
Wykład 1
Wykład 1 – p. 1/24
Konkurs programistyczny
Literatura
N. Matthew, R. Stones: Zaawansowane programowanie w systemie
Linux, Helion, 2002.
D. Solin: Poznaj programowanie przy u|yciu biblioteki Qt w 24
godziny, Infoland, 2001
www.trolltech.com.
J. D. Folley i inni: Wprowadzenie do grafiki komputerowej, WNT.
R. S. Wright jr, M. Sweet: OpenGL ksiega
˛
ekperta. Helion, 1999
P. Andrzejewski, J. Kurzak: Wprowadzenie do OpenGL, Kwantum
2000.
Witryna internetowa projektu OpenGL: www.opengl.org.
B. Lewis, D. J. Berg: Multithreaded Programming with Pthreads, Sun
Microsystems Press, 1998.
B. Nichols, D. Buttlar: Pthreads Programming, O’Reilly„ 1996.
Adres strony www konkursu: www.power.com.pl/pl/konkurs
Wykład 1 – p. 3/24
Wykład 1
Konstrukcja wielomodułowa programów
Zapewnia logiczna˛ strukture˛ i poprawia czytelność programu.
Niezależne moduły moga˛ być oddzielnie testowane i po kompilacji
wykorzystywane w różnych programach.
Make
Make jest narz˛edziem automatycznie określajacym,
˛
które fragmenty
kodu wymagaja˛ ponownej kompilacji i wykonuje ich kompilacje.
˛
Umożliwia wykorzystywanie w programie w jezyku
˛
C/C++ procedur
napisanych w innych jezykach
˛
programowania.
Plik makefile (Makefile) - opisuje relacje pomiedzy
˛
plikami w
projekcie oraz polecenia służace
˛ do uaktualniania poszczególnych
plików.
Zwieksza
˛
szybkość kompilacji w trakcie modyfikowania programu.
wywołanie:
make
make -f makefile_name
make nazwa_reguly
Reguły, dyrektywy i definicje makr powinny rozpoczynać sie˛ w
pierwszej kolumnie tekstu, natomiast polecenia musza˛ być
poprzedzone co najmniej jednym znakiem pustym.
Wykład 1
Wykład 1 – p. 5/24
Make - reguły
Make - makrodefinicje
Można rozróżnić dwa rodzaje reguł:
Definiowanie makrodefinicji:
Reguły jawne:
nazwa_makrodefinicji=tekst_rozwini˛
ecia
zbiór_uakt [zbiór_uakt [...]]: {{ścieżki}][zbiór-uzal ...]
polecenie
przykład:
PROGRAM=bierki
OBJS=foo.c
przykład:
Rozwijanie makrodeficji:
foo.o : foo.c defs.h
gcc -c -g foo.c
$(nazwa_makrodefinicji)
Reguły niejawne:
przykład:
[katalog_źródł].rozsz_źródł[katalog_docelowy].rozsz_docelowe:
polecenie
$(PROGRAM): $(OBJS)
g++ -c $(OBJS) -o $(PROGRAM)
przykład:
.c.o:
gcc -c $<
Wykład 1 – p. 7/24
Wykład 1
Make - przykład
Make - makrodefinicje predefiniowane
$* - Makro to rozwija sie˛ w nazw˛e zbioru uzależniajacego
˛
(ze
ścieżka˛ dostepu,
˛
lecz bez rozszerzenia).
$< - Makro to działa tak jak $*, z ta˛ różnica,˛ że uzyskana nazwa
zbioru zawiera rozszerzenie.
$@ - Makro to rozwija sie˛ w nazw˛e zbioru uzależnianego (wraz z jego
rozszerzeniem).
PROJECT = bierki
INC
=
./include
INSTALLBIN = $(HOME)/opt/bin
CXX = g++-2.95
CXXFLAGS += -I$(INC)
OBJS = $(PROJECT).o okno.o
all: $(PROJECT)
$: - Ta makrodefinicja rozwija sie˛ w ścieżk˛e dostepu
˛
do zbioru, ale
bez jego nazwy. Jeśli wystepuje
˛
w regułach jawnych, to uzyskana
zostanie ścieżka zbioru docelowego, w niejawnych zaś ścieżka
zbioru przetwarzanego.
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c -o $@ $<
$(PROJECT): $(OBJS)
$(CXX) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
clean:
-rm -rf *.o
realclean: clean
-rm -rf $(PROJECT)
Wykład 1
Wykład 1 – p. 9/24
Make - reguły standardowe
Make - automatyczne generowanie zależności
Kompilator gcc posiada opcje -M, -MM, które generuja˛ zależności od
plików nagłówkowych dla przetwarzanego pliku źródłowego.
Istnieje zbiór reguł, których stosowanie powoduje, że pliki makefile sa˛
znacznie prostsze do zrozumienia i stosowania:
Przykład:
all
depend:
$(CXX) -MM $(CXXFLAGS) *.cpp > depend.mk
test
clean
...
dist
include depend.mk
distclean
Przykładowe wygenerowane zależności:
realclean
domain.o: src/domain.cpp include/domain.h include/fxdrstream.h \
include/except.h
fxdrstream.o: src/fxdrstream.cpp include/fxdrstream.h
mpi_wrapper.o: src/mpi_wrapper.cpp include/mpi_wrapper.h
install
uninstal
Wykład 1 – p. 11/24
Wykład 1
Narzedzia
˛
wspierajace
˛ program make
makedepend - służy do automatycznego generowania zależności
pomiedzy
˛
plikami w projekcie. Dostarczany razem z systemem X
Window.
Imake - służy do mechanicznego generowania plików makefile dla
systemu X. Opiera sie˛ na wywołaniu programu makedepend
autoconf - generuje skrypt powłoki configure dopasowany do
projektu.
automake - narz˛edzie podobny do autoconf - umożliwia
generowanie plików makefile, posiadajacy
˛ jednak wbudowane
mechanizmy badania zależności (podobna˛ do programu Imake).
tmake - narz˛edzie firmy TrollTech pierwotnie utworzone dla biblioteki
Qt, ale może być wykorzystywane również w innych projektach.
GNU Autoconf (I)
Autoconf jest narz˛edziem (zestawem makr M4) służacym
˛
do
generownia skryptów powłoki, które pozwalaja˛ na automatyczne
dostosowanie pakietów oprogramowania (w postaci kodu
źródłowego) do specyfiki wielu różnych systemów operacyjnych.
Wygenerowane skrypt konfiguracyjny (configure) jest niezależny
od narz˛edzia Autoconf i podczas kompilacji pakietu nie jest ono
wymagane.
Skrypt configure wykonuje szereg testów majacych
˛
na celu
sprawdzenie, czy i ewentualnie gdzie w systemie znajduja˛ sie˛
narz˛edzia, biblioteki, pliki nagłówkowe niezbedne
˛
do poprawnego
utworzenia programu. Po określeniu środowiska w którym
kompilowany jest program skrypt ten powinien wygenerować
odpowiednie definicje i opcje kompilacji.
Cz˛esto narz˛edzie Autoconf jest stosowany w połaczeniu
˛
z
programami Automake i Autoheader.
Wykład 1
Wykład 1 – p. 13/24
Tworzenie skryptu configure
GNU Autoconf (II)
Szczególnie ważna˛ kwestia˛ przy tworzeniu plików wejściowych dla
programu Autoconf jest określenie, co należy sprawdzać przy
kompilacji programu na różnych platformach systemowych.
W celu wygenerowania skryptu configure należy utworzyć plik
konfiguracyjny dla programu Autoconf: configure.ac (lub
configure.in).
Plik konfiguracyjny tworzy sie˛ w oparciu o makra sprawdzajace:
˛
Przykładowa struktura pliku configure.ac:
Autoconf zawiera zbiór makr sprawdzajacych
˛
dla teypowych
elementów,
w przypadku braku gotowego testu dla danego elementu (pliku
nagłówkowego, bibilioteki, funkcji) można wykorzystać test
ogólny (np. na obecność pliku w systemie plików),
w ostateczności należy utworzyć fragment testujacy
˛ w jezyku
˛
Bourne shella.
Uworzenie pliku configure nastapi
˛ po uruchomieniu programu
autoconf.
Wykład 1 – p. 15/24
Wykład 1
Autoconf - przykład (I)
Autoconf - przykład (II)
AC_INIT(sample,0.1)
AC_PROG_CXX
# Checks for performing tests
CPPUNIT="no"
AC_ARG_ENABLE(test, [--enable-test enable test suite [default=yes]],
,enable_test="yes")
if test ! "x$enable_test" = "xno"; then
AC_PATH_PROG(CPPUNIT_CONFIG,cppunit-config,no)
if test "x$CPPUNIT_CONFIG" = "xno"; then
AC_MSG_ERROR([cppunit is needed but not found.])
fi
CPPUNIT="yes"
CPPUNIT_CFLAGS=‘$CPPUNIT_CONFIG --cflags‘
CPPUNIT_LIBS=‘$CPPUNIT_CONFIG --libs‘
AC_SUBST(CPPUNIT_CFLAGS)
AC_SUBST(CPPUNIT_LIBS)
fi
AC_SUBST(CPPUNIT)
AC_CONFIG_FILES(Makefile)
AC_OUTPUT
Plik Makefile.in:
...
# CppUnit flags
ifeq ($(CPPUNIT), yes)
CXXFLAGS += @CPPUNIT_CFLAGS@
LDFLAGS += @CPPUNIT_LIBS@
endif
$(OBJ)/%.o: $(SRC)/%.cpp
$(CXX) -c $(CXXFLAGS) -o $@ $<
$(PROGRAM): $(OBJS)
$(CXX) -o $(PROGRAM) $(LDFLAGS) $(OBJ)
Wykład 1 – p. 17/24
Wykład 1
Jam
Jam kontra Make
Jednym z ciekawszych projektów, które w przyszłości moga˛ zastapić
˛
program make jest Jam.
Zalety:
Plik konfiguracyjny dla programu Make:
progam: data.o main.o io.o
gcc data.o main.o io.o -o progam
Zwiekszenie
˛
projektu nie prowadzi do tak drastycznego zwiekszania
˛
sie˛ pliku
data.o: data.c
gcc -c data.c
konfiguracyjnego jak ma to miejsce w przypadku programu make.
Automatycznie generowane sa˛ zależności od plików nagłówkowych.
Jam buduje duże projekty rozmieszczone w wielu katalogach za jednym podejściem,
bez rekursywnego nawracania jak to robi make, śledzac
˛ wszystkie pliki jednocześnie.
main.o: main.c
gcc -c main.c
Może pracować na wielu procesorach.
Jam jest mały (np. 92 kB), praktycznie nie obciaża
˛ procesora, i nie tworzy dodatkowych
plików (jak np. nmake, SunOS make).
io.o: io.c
gcc -c io.c
Może być dowolnie konfigurowany poprzez tzw. reguły (Jamrules).
io.o: io.h
main.o: io.h data.h
data.o: data.h io.h
Plik konfiguracyjny dla programu Jam:
Main progam : data.c main.c io.c ;
Wykład 1 – p. 19/24
Wykład 1
Apache Ant (I)
Apache Ant (II)
Apache Ant jest cz˛eścia˛ projektu Apache Jakarta.
Opiera sie˛ na podobnym założeniu co make jeżeli chodzi o
zależności i reguły, ale nie zakłada że sa˛ to pliki i że głównym celem
reguł jest uaktualnienie zadań.
Używa jezyka
˛
XML.
Jest w pełni niezależny od platformy.
Został napisany z myśla˛ o Javie, ale posiada również wsparcie do
tworzenia projektu w innych jezykach
˛
programowania (również w
C++).
Plik konfiguracyjny dla programu Ant jest plikiem w formacie XML.
Zazwyczaj nosi nazw˛e build.xml.
Składa sie˛ on z różnej ilości różnych tagów, zwanych <target> (cel).
Może to być np. kompilacja, utworzenie archiwum, utworzenie
dokumentacji czy też wysłanie poczty elektronicznej.
Każdy cel składa sie˛ z dowolnej ilości wykonywanych zadań <task>.
Jest to prosta czynność, która bedzie
˛
wykonywana, np. tworzenie
katalogu, kopiowanie pliku, kompilacja kodu źródłowego. Każde
zadanie może posiadać parametry i być zależne od innych zadań.
Ant jest napisany całkowicie w Javie.
Wykład 1
Wykład 1 – p. 21/24
Apache Ant - przykładowy plik build.xml
<?xml version="1.0" encoding="iso-8859-2"?>
<project name="first" basedir="." default="compile">
<path id="log4jclasspath">
<pathelement location="${basedir}"/>
<pathelement location="/../wspolne.jar"/>
</path>
Kontrola wersji
Kod ewoluuje. W czasie gdy projekt zmienia sie˛ z prototypu w wersje˛
ostateczna˛ przechodzi przez wiele cykli, w których programiści
badaja˛ nowe trendy, usuwaja˛ błedy
˛ i stabilizuja˛ swoje osiagni
˛ ecia.
˛
Ewolucja kodu powoduje wiele problemów, które moga˛ być źródłem
konfliktów i dodatkowej pracy, zmniejszajac
˛ w ten sposób
efektywność.
<target name="compile">
<javac srcdir="."
classpathref="classpath"
/>
</target>
Jednym z ważniejszych problemów jest możliwość powrotu do starej
wersji.
Równie ważna jest możliwość rejestracji zmian.
Kolejnym problemem jest śledzenie błedów.
˛
Cz˛esto otrzymywany
jest raport o błedzie
˛
w konkretnej wersji programu, podczas
<target name="run">
<java
classpathref=""
classname="org.gridwise.Simple"
/>
</target>
</project>
Wykład 1 – p. 23/24
Wykład 1