steffenmüthing - conan.iwr.uni-heidelberg.de · organisation termine vorlesungfreitag,14-16ct...

Post on 14-Aug-2021

2 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Programmierkurs

Steffen Müthing

Interdisciplinary Center for Scientific Computing, Heidelberg University

October 15, 2018

Organisation

Bestandsaufnahme

Unix-EinführungWichtige BefehleGrundlegendes zu Ein- und Ausgabe

Inhalte

I Praktisches Programmieren mit C++I Umgang mit Unix-Kommandozeile (Linux, macOS)I Vorstellung von wichtigen Themen und Werkzeugen rund ums

ProgrammierenI VersionsverwaltungI BuildsystemeI Umgang mit DokumentationI Fehlersuche (Debugging)

Organisation

Termine

Vorlesung Freitag, 14-16 ctINF 252 Hörsaal Ost

Übungen Montag, 11-13 und 14-16 ctINF 205 Computer Pool 3. Stock

Klausur TBA

Informationen, Übungsblätter etc.conan.iwr.uni-heidelberg.de/teaching/ips_ws2018/

Bei FragenEmail: ipk-ws2018@conan.iwr.uni-heidelberg.de

Übungen

I Um Programmieren zu lernen, muss man programmieren!I Übungszettel bestehen ausschliesslich aus

ProgrammieraufgabenI Neue Übungszettel freitags auf HomepageI Nächster Montag: Bearbeiten des Zettels, Fragen an Tutoren

/ Dozent zum neuen BlattI Darauffolgender Montag: Vorstellung der LösungenI Votiersystem statt Abgabe der LösungenI Anmeldung über MUESLI, Link auf Homepage wird nach der

Vorlesung freigeschaltet

Votiersystem

I Am Anfang der Übung tragen Sie auf einem Zettel ein, welcheAufgaben Sie vorstellen möchten

I Die Tutoren kommen zu Ihnen an den Computer und lassensich Ihre Lösung zeigen

I Ihr Programm muss nicht perfekt sein, aber der Tutor musszumindest einen Lösungsansatz erkennen

I Falls Sie ein Programm ankreuzen und keine Lösung haben⇒ Aberkennung aller Punkte für das Blatt

I Falls Sie das Programm vom einem Freund kopiert haben unddem Tutor nicht erklären können⇒ Aberkennung aller Punkte für das Blatt

I Für die Klausurzulassung sind 50% der Punkte erforderlich

BestandsaufnahmeI Wer hat schon einmal Linux / macOS verwendet?

I Wer hat schon einmal die Kommandozeile verwendet?I Wer hat schon einmal programmiert?

Javascript? Java? C#? C? C++? Python?I Wer versteht folgendes Shell-Kommando?

g++ -Wall -O3 test.cc | grep "error:|warning:" > log.txt

I Wer versteht folgenden C++-Code?auto v = std::array<int>{1,2,3,4};for (auto& x : v)

x *= x;std::cout << std::accumulate(v.begin(),v.end(),0)

<< std::endl;

BestandsaufnahmeI Wer hat schon einmal Linux / macOS verwendet?I Wer hat schon einmal die Kommandozeile verwendet?

I Wer hat schon einmal programmiert?Javascript? Java? C#? C? C++? Python?

I Wer versteht folgendes Shell-Kommando?g++ -Wall -O3 test.cc | grep "error:|warning:" > log.txt

I Wer versteht folgenden C++-Code?auto v = std::array<int>{1,2,3,4};for (auto& x : v)

x *= x;std::cout << std::accumulate(v.begin(),v.end(),0)

<< std::endl;

BestandsaufnahmeI Wer hat schon einmal Linux / macOS verwendet?I Wer hat schon einmal die Kommandozeile verwendet?I Wer hat schon einmal programmiert?

Javascript? Java? C#? C? C++? Python?I Wer versteht folgendes Shell-Kommando?

g++ -Wall -O3 test.cc | grep "error:|warning:" > log.txt

I Wer versteht folgenden C++-Code?auto v = std::array<int>{1,2,3,4};for (auto& x : v)

x *= x;std::cout << std::accumulate(v.begin(),v.end(),0)

<< std::endl;

BestandsaufnahmeI Wer hat schon einmal Linux / macOS verwendet?I Wer hat schon einmal die Kommandozeile verwendet?I Wer hat schon einmal programmiert?

Javascript?

Java? C#? C? C++? Python?I Wer versteht folgendes Shell-Kommando?

g++ -Wall -O3 test.cc | grep "error:|warning:" > log.txt

I Wer versteht folgenden C++-Code?auto v = std::array<int>{1,2,3,4};for (auto& x : v)

x *= x;std::cout << std::accumulate(v.begin(),v.end(),0)

<< std::endl;

BestandsaufnahmeI Wer hat schon einmal Linux / macOS verwendet?I Wer hat schon einmal die Kommandozeile verwendet?I Wer hat schon einmal programmiert?

Javascript? Java?

C#? C? C++? Python?I Wer versteht folgendes Shell-Kommando?

g++ -Wall -O3 test.cc | grep "error:|warning:" > log.txt

I Wer versteht folgenden C++-Code?auto v = std::array<int>{1,2,3,4};for (auto& x : v)

x *= x;std::cout << std::accumulate(v.begin(),v.end(),0)

<< std::endl;

BestandsaufnahmeI Wer hat schon einmal Linux / macOS verwendet?I Wer hat schon einmal die Kommandozeile verwendet?I Wer hat schon einmal programmiert?

Javascript? Java? C#?

C? C++? Python?I Wer versteht folgendes Shell-Kommando?

g++ -Wall -O3 test.cc | grep "error:|warning:" > log.txt

I Wer versteht folgenden C++-Code?auto v = std::array<int>{1,2,3,4};for (auto& x : v)

x *= x;std::cout << std::accumulate(v.begin(),v.end(),0)

<< std::endl;

BestandsaufnahmeI Wer hat schon einmal Linux / macOS verwendet?I Wer hat schon einmal die Kommandozeile verwendet?I Wer hat schon einmal programmiert?

Javascript? Java? C#? C?

C++? Python?I Wer versteht folgendes Shell-Kommando?

g++ -Wall -O3 test.cc | grep "error:|warning:" > log.txt

I Wer versteht folgenden C++-Code?auto v = std::array<int>{1,2,3,4};for (auto& x : v)

x *= x;std::cout << std::accumulate(v.begin(),v.end(),0)

<< std::endl;

BestandsaufnahmeI Wer hat schon einmal Linux / macOS verwendet?I Wer hat schon einmal die Kommandozeile verwendet?I Wer hat schon einmal programmiert?

Javascript? Java? C#? C? C++?

Python?I Wer versteht folgendes Shell-Kommando?

g++ -Wall -O3 test.cc | grep "error:|warning:" > log.txt

I Wer versteht folgenden C++-Code?auto v = std::array<int>{1,2,3,4};for (auto& x : v)

x *= x;std::cout << std::accumulate(v.begin(),v.end(),0)

<< std::endl;

BestandsaufnahmeI Wer hat schon einmal Linux / macOS verwendet?I Wer hat schon einmal die Kommandozeile verwendet?I Wer hat schon einmal programmiert?

Javascript? Java? C#? C? C++? Python?

I Wer versteht folgendes Shell-Kommando?g++ -Wall -O3 test.cc | grep "error:|warning:" > log.txt

I Wer versteht folgenden C++-Code?auto v = std::array<int>{1,2,3,4};for (auto& x : v)

x *= x;std::cout << std::accumulate(v.begin(),v.end(),0)

<< std::endl;

BestandsaufnahmeI Wer hat schon einmal Linux / macOS verwendet?I Wer hat schon einmal die Kommandozeile verwendet?I Wer hat schon einmal programmiert?

Javascript? Java? C#? C? C++? Python?I Wer versteht folgendes Shell-Kommando?

g++ -Wall -O3 test.cc | grep "error:|warning:" > log.txt

I Wer versteht folgenden C++-Code?auto v = std::array<int>{1,2,3,4};for (auto& x : v)

x *= x;std::cout << std::accumulate(v.begin(),v.end(),0)

<< std::endl;

BestandsaufnahmeI Wer hat schon einmal Linux / macOS verwendet?I Wer hat schon einmal die Kommandozeile verwendet?I Wer hat schon einmal programmiert?

Javascript? Java? C#? C? C++? Python?I Wer versteht folgendes Shell-Kommando?

g++ -Wall -O3 test.cc | grep "error:|warning:" > log.txt

I Wer versteht folgenden C++-Code?auto v = std::array<int>{1,2,3,4};for (auto& x : v)

x *= x;std::cout << std::accumulate(v.begin(),v.end(),0)

<< std::endl;

Warum UNIX / Linux?Die meisten Arbeitsgruppen in Mathematik, Physik und Informatikverwenden zumindest in Teilen Linux. Daher werden sich diemeisten von Ihnen früher oder später damit auseinandersetzenmüssen.

Linux ist mit Abstand das am häufigsten genutzte Unix. Über mitLinux betriebene Webserver werden nicht nur große Teile desInternet zur Verfügung gestellt, grob 95% der 500 schnellstenRechner der Welt basieren auf Linux, und alle unter den zehnschnellsten. Wer mit Rechnern wissenschaftlich arbeiten will,kommt an Unix nicht vorbei.

Darüber hinaus ist Linux durch seine offene Natur und die vielenOpen-Source-Komponenten eine hervorragende Spielwiese fürangehende Informatiker. Für jedes Programm, das auf einemnormalen Linux-Desktop installiert ist, können Sie den Quellcodeherunterladen und lernen, wie es programmiert wurde!

Was ist UNIX?Im engeren Sinne Unix (1969), ein Betriebssystem, das vieleFunktionen einführte, die in heutigen Betriebssystemenselbstverständlich sind.Im weiteren Sinne jedes Betriebssystem, das sich an dieUNIX-Interfaces und -Spezifikation hält:I Free,Net,OpenBSD, basierend auf einer Unix-Variante von der

UC BerkeleyI macOS, das auf Teilen von FreeBSD und NetBSD basiertI iOS, aus macOS hervorgegangenI illumos/OpenIndiana, basierend auf Solaris und System VI Linux (1991), streng genommen kein UNIX, aber

weitestgehend kompatibelI Android, von Google stark modifiziertes LinuxI Viele embedded systems, oft auf Basis von BSD oder Linux, in

Netzwerkroutern, Fernsehern, Robotern, Autos, Raketen, . . .

Dateisystem II Dateien liegen in VerzeichnissenI Verzeichnistrenner unter Unix:

home/user statt C:\Users\NameI Gross- und Kleinschreibung unter Linux relevant:

test.txt 6= Test.txtI Linux kennt keine Laufwerksbuchstaben, alle Verzeichnisse

haben eine gemeinsame Wurzel /

/etchome

ipkmedia

cdrom...

usrbin

...

Dateisystem III Jeder Benutzer hat ein home directory für eigene Dateien,

normalerweise in /home/<username>I Normale Benutzer haben keine Schreibrechte ausserhalb ihres

home directoriesI Der Administrator (heisst unter UNIX root) darf überall lesen

und schreibenI Jedes Programm hat ein Arbeitsverzeichnis (working directory)I Dateizugriffe immer relativ zu diesem VerzeichnisI Arbeitsverzeichnis kann gewechselt werdenI Spezielle Verzeichnis-Namen

. Das aktuelle Verzeichnis.. Das übergeordnete Verzeichnis/ Das Wurzel-Verzeichnis~ Das Home Directory des aktuellen Benutzers

(funktioniert nicht überall)

Shell I

Linux lässt sich im Alltag heutzutage problemlos graphischbedienen und verhält sich dann in weiten Teilen wie die bekanntenDesktops von Windows und macOS. Dabei hat man die Wahlzwischen verschiedenen Oberflächen, die Windows nachahmen,Mac OS nachahmen oder gänzlich neue Wege gehen.Für fortgeschrittene Aufgaben wie Programmieren ist es jedochweiterhin sinnvoll, sich mit dem schwarz-weissen Terminal-Fensterund der darin laufenden Shell zu befassen:I Automatisierung von monotonen und repetitiven ArbeitenI Mit etwas Übung ist man bei vielen Aufgaben schneller als in

der GUII Viele UNIX-Programme haben keine graphische Oberfläche

(GUI) und können direkt nur über die Shell aufgerufenwerden, z.B. der C++-Compiler, den wir zum Programmierenin diesem Kurs brauchen

Shell II

[ipk@vm ~] _

I Wichtige Informationen am Anfang der Zeile (prompt)I BenutzernameI RechnernameI aktuelles Verzeichnis

I Ausgabe des vollen Pfades mit pwd:[ipk@vm ~] pwd/home/ipk/ipk-files

I Shell beenden mit exit:[ipk@vm ~] exit<Fenster schliesst sich>

Kommandos in der Shell

[ipk@vm ~] cmd -sv --opt --op2 arg1 arg2 ...

I Die meisten Kommandos haben ein einheitliches InterfaceI Am Anfang steht der Name des Kommandos (der Dateiname

des Programms)I Danach folgen Optionen (beginnen mit "-")I Am Ende stehen die Argumente ohne "-"

I Argumente bestimmen, worauf das Kommando angewendetwird

I Optionen verändern, wie das Kommando arbeitet. WichtigeOptionen haben oft einen langen Namen und eine Abkürzungaus einem BuchstabenI Lange Optionen beginnen mit "---"I Kurze Optionen beginnen mit "--" und können gruppiert

werden, z.B. "--rf"

Hilfe zu Kommandos

I Die meisten Kommandos geben eine kurze Übersicht dererlaubten Optionen und Argumente aus, wenn man sie falschbenutzt:

[ipk@vm ~] rmusage: rm [-f | -i] [-dPRrvW] file ...

unlink file

I Fast alle Kommandos geben mit der Option "--help" einenHilfetext aufs Terminal aus

I Für genauere Informationen gibt es die man pages, die manmit dem Befehl man aufruft

[ipk@vm ~] man gcc

I In der man page bewegt man sich mit den Pfeiltasten undverlässt sie mit der Taste "q"

Verzeichnis wechseln I

I Verzeichnis wechseln mit cd <name> (change directory):[ipk@vm ~] cd Documents[ipk@vm Documents]

I Neues Verzeichnis wird im prompt angezeigtI cd erzeugt UNIX-typisch nur bei Fehlern eine Ausgabe

[ipk@vm Documents] cd nonesuch-bash: cd: nonesuch: No such file or directory[ipk@vm Documents]

I cd .. kehrt ins übergeordnete Verzeichnis zurück[ipk@vm Documents] cd ..[ipk@vm ~]

Verzeichnis wechseln II

I cd unterstützt auch zusammengesetzte Pfade[ipk@vm ~] cd Documents/c++[ipk@vm c++]

I Man kann auch absolute Pfade verwenden, die mit / beginnenund unabhängig vom aktuellen Verzeichnis sind:

[ipk@vm c++] cd /etc/sysconfig[ipk@vm sysconfig]

I cd ohne Argumente wechselt immer ins home directory[ipk@vm sysconfig] cd[ipk@vm ~]

Dateien auflistenI ls (list) zeigt die Dateien im aktuellen Verzeichnis an

[ipk@vm c++] lshelloworld helloworld.cc

I Dateien, die mit einem Punkt beginnen, werden normalerweisenicht angezeigt. Dies kann man mit der Option -a ändern:

[ipk@vm c++] ls -a. .. .versteckthelloworld helloworld.cc

I Auch ls akzeptiert einen Pfad als Argument[ipk@vm c++] ls ~/Documentsc++

I ls -l (long) zeigt zusätzliche Informationen wie Besitzer,Zugriffsrechte, Dateigrösse etc. an

Dateien kopieren und verschiebenI cp (copy) kopiert, mv (move) verschiebt Dateien

[ipk@vm c++] cp original copy[ipk@vm c++] lscopy original

I Man kann auch mehrere Dateien gleichzeitig kopieren. Indiesem Fall muss das Ziel ein Verzeichnis sein

[ipk@vm c++] mkdir subdir[ipk@vm c++] mv original copy subdir[ipk@vm c++] lssubdir[ipk@vm c++] ls subdircopy original

I Mit der Option -r (recursive) kopiert man Unterverzeichnissesamt Inhalt, beim Verschieben ist diese Option nichterforderlich.

Dateien löschen

I rm (remove) löscht Dateien und Verzeichnisse[ipk@vm c++] rm subdir/copy[ipk@vm c++] ls subdiroriginal

I Mit der Option -r (recursive) löscht rm ein Verzeichnis mitallen Inhalten

[ipk@vm c++] rm -r subdir[ipk@vm c++] ls

Warnung

rm fragt nicht nach, bevor die Dateien gelöscht werden, undin der Shell gibt es keinen Papierkorb! Gelöschte Dateienkönnen nicht wiederhergestellt werden!

Dateien bearbeiten

I Es gibt Editoren, die im Textmodus im Terminal arbeiten(vim, nano, emacs,. . . ), aber wir werden in dieser VorlesungEditoren mit GUI verwenden

I Im Pool sind die Editoren gedit und kate installiert, in derVM geany und qtcreator

I Sie können den Editor entweder wie gewohnt per Doppelklickauf eine Datei im Dateimanager starten oder direkt über dieShell

[ipk@vm c++] geany helloworld.cc &[ipk@vm c++]

I Beim Starten von GUI-Programmen in der Shell ist es sinnvoll,ein "&" ans Ende des Befehls zu setzen. Ansonsten ist dieShell blockiert, bis Sie das gestartete Programm wiederbeenden

Dateien anzeigen

I cat zeigt den Inhalt von Dateien im Terminal an[ipk@vm c++] lsfile1 file2[ipk@vm c++] cat file2 file1line in file2line in file1another line in file1

I cat kann bei langen Dateien unübersichtlich werden. lessöffnet die Dateien in einem Viewer ähnlich zu dem für dieman pages

[ipk@vm c++] less file1

I Navigieren mit Pfeiltasten und "q" zum BeendenI Leertaste, um einen Bildschirm weiter zu springenI "/" + Suchwort + Enter, um zu suchenI "n", um zum nächsten Vorkommen des Suchworts zu springen

Dateien durchsuchen

I grep <pattern> <datei>... durchsucht Dateien nacheinem Pattern

[ipk@vm c++] grep -n root /etc/passwd1:root:x:0:0:root:/root:/bin/bash10:operator:x:11:0:operator:/root:/sbin/nologin

I Das Pattern kann ein einfaches Wort sein, man kann aberauch nach komplizierte Ausdrücke mit Hilfe sogenannterRegular Expressions konstruieren

I/O Streams

I UNIX-Programme kommunizieren mit dem OS übersogenannte I/O (Input/Output) streams

I Streams sind eine Einbahnstrasse - man kann aus ihnenentweder lesen oder Daten in sie schreiben

I Beim Start hat jedes Programm drei offene Streamsstdin Die Standardeingabe liest User-Eingaben von der

Konsole, ist verbunden mit file descriptor 0stdout An die Standardausgabe werden normale

Ergebnisse des Programms ausgegeben, istverbunden mit file descriptor 1

stderr An die Standardfehlerausgabe werdendiagnostische Meldungen wie Fehler ausgegeben,ist verbunden mit file descriptor 2

Umleiten von I/O Streams II Normalerweise sind alle Standardstreams mit dem Terminal

verbundenI Manchmal kann es sinnvoll sein, diese Streams in Dateien

umzuleitenI stdout wird mit "> datei" in einer Datei gespeichert

[ipk@vm ~] ls > files[ipk@vm ~] cat filesfile1file2files

Die Ausgabedatei wird angelegt, bevor der Befehl ausgeführtwird

I Fehlermeldungen werden weiterhin im Terminal angezeigt[ipk@vm ~] ls missingdir > filesls: missingdir: No such file or directory[ipk@vm ~] cat files[ipk@vm ~]

Umleiten von I/O Streams II

I stdin wird mit "< datei" aus einer Datei gelesen[ipk@vm ~] cat # ohne Argument gibt cat stdin nach stdout ausEingabe am Terminal^D # (CTRL+D) beendet die EingabeEingabe am Terminal[ipk@vm ~] cat < filesfile1file2files

I stderr wird mit "2> datei" in einer Datei gespeichert[ipk@vm ~] ls missingdir 2> error[ipk@vm ~] cat errorls: missingdir: No such file or directory

Kompilieren von C++-Programmen

I C++-Programme müssen vor dem Ausführen kompiliertwerden

I Der Standard-C++-Compiler unter Linux heisst g++I Wir verwenden in diesem Kurs stattdessen den Compiler

clang++ aus dem LLVM-Projekt, da dieser verständlichereFehlermeldungen generiert

I Auf den Pool-Rechnern und in der VM rufen Sie den Compilerbitte als ipkc++ auf. Dadurch werden einige sinnvolleStandardoptionen gesetzt

I Auf Ihrem eigenen Rechner sollten Sie immer die Option-Wall verwenden, damit der Compiler Sie bei Problemenwarnt, die zwar legales C++ sind, aber wahrscheinlich vonIhnen so nicht gewollt sind

top related