Einführung in die Programmierung mit Go

Ähnliche Dokumente
Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

THE GO PROGRAMMING LANGUAGE. Michael Karnutsch & Marko Sulejic

Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen. Programmieren I. Martin Schultheiß. Hochschule Darmstadt Wintersemester 2010/2011

Werkzeuge zur Programmentwicklung

Übungen zur Vorlesung Wissenschaftliches Rechnen I. Grundelemente von Java. Eine Anweisung. wird mit dem Wertzuweisungsoperator = geschrieben.

Hello World. Javakurs 2014, 1. Vorlesung. Sebastian Schuck. basierend auf der Vorlage von Arne Kappen. wiki.freitagsrunde.org. 3.

Algorithmen & Programmierung. Ausdrücke & Operatoren (1)

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens

Welche Informatik-Kenntnisse bringen Sie mit?

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 2

Präzedenz von Operatoren

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

C.3 Funktionen und Prozeduren

2. Programmierung in C

Primitive Datentypen

RO-Tutorien 3 / 6 / 12

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Vorlesung Programmieren

Einstieg in die Informatik mit Java

1 Bedingungen und der Typ bool. Informatik I: Einführung in die Programmierung 5. Bedingungen, bedingte Ausführung und Schleifen. Vergleichsoperatoren

Javaprogrammierung mit NetBeans. Variablen, Datentypen, Methoden

Übung zur Vorlesung Multimedia im Netz

JAVA-Datentypen und deren Wertebereich

Kapitel 3: Variablen

Die Programmiersprache C Eine Einführung

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Blöcke. Beispiel: Variablen in Blöcken

Methoden (fortgeschritten) in C# - 1

Computergrundlagen Programmieren in C

16. März 2016 artb5-v1.1

Informatik I Übung, Woche 40

4. Einfache Programmstrukturen in C Einfache Programmstrukturen in C

Java Einführung Methoden. Kapitel 6

JAVA - Methoden - Rekursion

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

Programmieren in C / C++ Grundlagen C 2

Grundlagen der Programmierung

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

ModProg 15-16, Vorl. 5

ALP I Einführung in Haskell

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Kontrollstrukturen, Pseudocode und Modulo-Rechnung

Grundlagen der Programmierung

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

6. Iteration (Schleifenanweisungen)

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Elementare Datentypen in C++

Multimedia im Netz Wintersemester 2011/12

Grundlagen von C. Ausarbeitung von Jonas Gresens

Einführung in die Informatik für Hörer aller Fakultäten II. Andreas Podelski Stephan Diehl Uwe Waldmann

Operatoren und Ausdrücke

Algorithmische Kernsprache. Zuweisung, einfache und bedingte Anweisung, Blöcke, Schleifen, return, debugging.

Dr. Monika Meiler. Inhalt

JAVA - Methoden

Herzlich Willkommen. Über mich Termine Literatur Über PHP

Programmieren in C. C Syntax Datentypen, Operatoren und Kontrollstrukturen. Prof. Dr. Nikolaus Wulff

Informatik 1 ( ) D-MAVT F2010. Logik, Schleifen. Yves Brise Übungsstunde 4

Java Einführung Operatoren Kapitel 2 und 3

Korn-Shell: Einführung in Shellscripte 1. Übersicht: Einführung - 2. Die Kornshell im Detail - 3.Grundlagen der Programmierung

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Operatoren und Ausdrücke

Vorlesung Unix-Praktikum

Kompaktkurs Einführung in die Programmierung. 3. Fundamentale Datentypen, Ausdrücke

Hochschule Niederrhein Einführung in die Programmierung Prof. Dr. Nitsche. Bachelor Informatik WS 2015/16 Blatt 3 Beispiellösung.

Programmierung I Basics (in Python)

Grundkurs Software- Entwicklung mit C++

Programmiervorkurs. Organisation: Steffen Gebert, Alexander Wolff. Tutoren: Jürgen Zöller, Jonathan Stoll. Wintersemester 2012/2013

Java - Zahlen, Wahrheitswerte und Zeichen. Leibniz Universität IT Services Anja Aue

Repetitorium Informatik (Java)

Vorlesung Programmieren

2.5 Primitive Datentypen

C für Java-Programmierer

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Themen. Statische Methoden inline Methoden const Methoden this Zeiger Destruktor Kopierkonstruktor Überladen von Operatoren

Einstieg in die Informatik mit Java

Einführung in die Programmierung Laborübung bei Korcan Y. Kirkici. 6.Übung bis

Einführung in die Programmierung 1

Deklarationen in C. Prof. Dr. Margarita Esponda

Grundlagen der Programmierung Prof. H. Mössenböck. 6. Methoden

Coding Standards Brandbox

Grundlagen der Programmiersprache C für Studierende der Naturwissenschaften

4 Kontrollfluss-Diagramme

Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe

Java - Zahlen, Wahrheitswerte und Zeichen. Leibniz Universität IT Services Anja Aue

Informatik. Studiengang Chemische Technologie. Michael Roth WS 2012/2013. Hochschule Darmstadt -Fachbereich Informatik-

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

C++ Teil 1. Sven Groß. 9. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil 1 9. Apr / 19

Schleifenanweisungen

Autor: Michael Spahn Version: 1.0 1/10 Vertraulichkeit: öffentlich Status: Final Metaways Infosystems GmbH

Hello world. Sebastian Dyroff. 21. September 2009

Programmierung in C. Grundlagen. Stefan Kallerhoff

Vorlesung Programmieren

Tutorium für Fortgeschrittene

Vom Problem zum Programm

Arbeiten mit JavaKara

Einführung in die C++ Programmierung für Ingenieure

5. Elementare Befehle und Struktogramme

Grundlagen der Programmierung in C++ Kontrollstrukturen

Transkript:

Einführung in die Programmierung mit Go Teil 1: Grundlegende Konzepte Prof. Dr. Christoph Reichenbach Fachbereich 12 / Institut für Informatik 8. März 2015

Übersicht der Veranstaltung Sonderveranstaltung: 5 Tage 1h Vorlesung 1h Übung Projekt Notwendig zum Bestehen der Veranstaltung 2 / 33

Projekte Selbstständig oder in Zweier-Team in go entwickelt Vorstellung: Datum: Freitag, der 27 März, ab 09:00 Ort: in Seminarraum 11 15 Minuten Demonstration mit Code-Vorstellung oder Vortrag Einsenden des Codes Projektinhalt: Vorschläge ab Mittwoch verfügbar Präferenzen bis Donnerstag 18:00 einsenden Zuweisung erfolgt Donnerstag auf Freitag Eigene Ideen willkommen 3 / 33

Steckbrief: Go Go Version: 1.4.2 Datum: 2015-02-18 Quelle: http://golang.org Laufzeitsystem Ausführungsmodus: Übersetzt Speicherverwaltung: Automatisch Sprache Sprachtyp: Imperativ Starke Typisierung: größtenteils (statisch und dynamisch) Sprachkonstrukte: CSP-Kanäle, Threads, Funktionen-als- Werte, Reflektion 4 / 33

Hintergründe zu Go Sprache zur Systemprogrammierung (Relativ) nah an Hardware Kontrolle wichtiger als Bequemlichkeit Praktische Sprache Schnell zu übersetzen Erzwingt gute Programmierpraxis Beinhaltet Software-Werkzeuge Vermeidet Speicherfehler durch automatische Speicherverwaltung Gegenentwurf zu C++ 5 / 33

Go und seine Verwandtschaft ALGOL60 (1960) CPL BCPL (1966) B K&R C (1972) 6 / 33

Go und seine Verwandtschaft ALGOL60 (1960) CPL BCPL (1966) B K&R C (1972) ANSI-C89 ANSI-C99 Go 6 / 33

Go und seine Verwandtschaft ALGOL60 (1960) CPL BCPL (1966) B K&R C (1972) C++ ANSI-C89 Objective-C PHP Java ANSI-C99 C# Go ANSI-C11 6 / 33

Systemprogrammierung Anwendung Bibliotheken Laufzeitsystem Systemprogramm Systembibliotheken Betriebssystem Rechnerarchitektur Integrierte Schaltkreise 7 / 33

Systemprogrammierung Anwendung Bibliotheken Laufzeitsystem Systembibliotheken Betriebssystem Rechnerarchitektur Java, Python, Haskell, Scala, SML, PHP, C#, awk, Scheme, ADA, OCaml,... Systemprogramm Integrierte Schaltkreise 7 / 33

Systemprogrammierung Anwendung Bibliotheken Laufzeitsystem Systemprogramm Systembibliotheken Betriebssystem Rechnerarchitektur Integrierte Schaltkreise 7 / 33

Systemprogrammierung Anwendung Bibliotheken Laufzeitsystem Systemprogramm Systembibliotheken Betriebssystem Rechnerarchitektur Integrierte Schaltkreise 7 / 33

Hallo, Welt Go: hallo.go package main import "fmt" func main() { fmt.println("hallo, Welt!") 8 / 33

Hallo, Welt Go: hallo.go package main // Paketname import "fmt" func main() { fmt.println("hallo, Welt!") 8 / 33

Hallo, Welt Go: hallo.go package main import "fmt" // Paketname // Importiertes Modul func main() { fmt.println("hallo, Welt!") 8 / 33

Hallo, Welt Go: hallo.go package main import "fmt" // Paketname // Importiertes Modul func main() { // Einsprungpunkt fmt.println("hallo, Welt!") 8 / 33

Hallo, Welt Go: hallo.go package main import "fmt" // Paketname // Importiertes Modul func main() { // Einsprungpunkt fmt.println("hallo, Welt!") user@host:~/projects$ go run hallo.go Hallo, Welt! 8 / 33

Die main -Funktion (1/2) FunctionDecl ::= func id Signature { StatementList Schlüsselwort func definiert Funktion Funktion main in allen main-paketen kann von außen aufgerufen werden (Einsprungpunkt) Go: hallo.go func main() { fmt.println("hallo, Welt!") 9 / 33

Die main -Funktion (2/2) FunctionDecl ::= func id Signature { StatementList Go: hallo.go func main() { fmt.println("hallo, Welt!") Signature ist hier () (keine Parameter, keine Rückgabewerte) StatementList ist hier die alleinige Anweisung fmt.println("hallo, Welt!") 10 / 33

Die main -Funktion (2/2) FunctionDecl ::= func id Signature { StatementList Go: hallo.go func main() { fmt.println("hallo, Welt!") Signature ist hier () (keine Parameter, keine Rückgabewerte) StatementList ist hier die alleinige Anweisung fmt.println("hallo, Welt!") fmt.println : Funktion aus dem fmt-paket (Textausgabe an Konsole) 10 / 33

Die main -Funktion (2/2) FunctionDecl ::= func id Signature { StatementList Go: hallo.go func main() { fmt.println("hallo, Welt!") Signature ist hier () (keine Parameter, keine Rückgabewerte) StatementList ist hier die alleinige Anweisung fmt.println("hallo, Welt!") fmt.println : Funktion aus dem fmt-paket (Textausgabe an Konsole) "Hallo, Welt!" : Zeichenkette (string) 10 / 33

Die main -Funktion (2/2) fmt.println("hallo, Welt!") : Funktionsaufruf 10 / 33 FunctionDecl ::= func id Signature { StatementList Go: hallo.go func main() { fmt.println("hallo, Welt!") Signature ist hier () (keine Parameter, keine Rückgabewerte) StatementList ist hier die alleinige Anweisung fmt.println("hallo, Welt!") fmt.println : Funktion aus dem fmt-paket (Textausgabe an Konsole) "Hallo, Welt!" : Zeichenkette (string)

Variablen Go: i.go package main import "fmt" func main() { var i int = 23 fmt.println("i=", i) 11 / 33

Variablen Go: i.go package main import "fmt" func main() { var i int = 23 fmt.println("i=", i) user@host:~/projects$ go run i.go i= 23 11 / 33

Variablen Go: i.go package main import "fmt" func main() { var i int = 23 fmt.println("i=", i) user@host:~/projects$ go run i.go i= 23 Variablen in Go sind statisch getypt 11 / 33

Deklaration von Variablen VarDecl ::= var IdList Type = ExpressionList IdList ::= id [, IdList ] Deklaration mehrerer Variablen gleichzeitig: var vorname, nachname string = "Hans","Wurst" 12 / 33

Deklaration von Variablen VarDecl ::= var IdList [ Type ] = ExpressionList IdList ::= id [, IdList ] Deklaration mehrerer Variablen gleichzeitig: var vorname, nachname string = "Hans","Wurst" Lokale Typinferenz (Übersetzer erkennt Typ automatisch): var pi = 3.14159265357989 12 / 33

Deklaration von Variablen VarDecl ::= var IdList [ Type ] = ExpressionList var IdList Type IdList ::= id [, IdList ] Deklaration mehrerer Variablen gleichzeitig: var vorname, nachname string = "Hans","Wurst" Lokale Typinferenz (Übersetzer erkennt Typ automatisch): var pi = 3.14159265357989 Deklaration ohne Initialisierung (Auf Nullwert gesetzt): var x string 12 / 33

Deklaration von Variablen VarDecl ::= var IdList [ Type ] = ExpressionList var IdList Type ShortVarDecl ::= IdList := ExpressionList IdList ::= id [, IdList ] Deklaration mehrerer Variablen gleichzeitig: var vorname, nachname string = "Hans","Wurst" Lokale Typinferenz (Übersetzer erkennt Typ automatisch): var pi = 3.14159265357989 Deklaration ohne Initialisierung (Auf Nullwert gesetzt): var x string Kurzform mit lokaler Typinferenz: x, y := 42, 23 12 / 33

Statische Typisierung Jede Variable hat einen statischen Typ Muß zur Übersetzungszeit bekannt sein Vorteile: Effizientere Ausführung Schnellere Übersetzung Frühe Fehlererkennung Nachteile: Frühe Fehlererkennung In einigen Fällen mehr Notation nötig 13 / 33

Einige Basistypen Typ Reichweite Beispiel Nullwert int8 2 7... 2 7 1-1, 0x2a 0 uint8 0... 2 8 1 1, 0xa0 0............ int64 2 63... 2 63 1-1234567890 0 uint64 0... 2 64 1 0x102030405060cafe 0 float32 32-Bit Fließkomma 1e+7, 13.7 0.0 float64 64-Bit Fließkomma 1.2e+200, 13.7 0.0 string Zeichenketten "Unĩcøδe", xy "" bool Wahrheitswerte true, false false Fließkommazahlen nach IEEE-754 byte = uint8 int entspricht entweder int32 oder int64 uint analog 14 / 33

Einige Basistypen Numerische Typen Typ Reichweite Beispiel Nullwert int8 2 7... 2 7 1-1, 0x2a 0 uint8 0... 2 8 1 1, 0xa0 0............ int64 2 63... 2 63 1-1234567890 0 uint64 0... 2 64 1 0x102030405060cafe 0 float32 32-Bit Fließkomma 1e+7, 13.7 0.0 float64 64-Bit Fließkomma 1.2e+200, 13.7 0.0 string Zeichenketten "Unĩcøδe", xy "" bool Wahrheitswerte true, false false Fließkommazahlen nach IEEE-754 byte = uint8 int entspricht entweder int32 oder int64 uint analog 14 / 33

Arithmetische Operatoren Arithmetische Operatoren für numerische Typen -, *, /, + %: Modulo (Divisionsrest) 15 / 33

Arithmetische Operatoren Arithmetische Operatoren für numerische Typen -, *, /, + %: Modulo (Divisionsrest) +: Auch für string: "Zeichen" + "kette" 15 / 33

Vergleiche Ergebnis ist bool: true (wahr) oder false (falsch) Vergleiche über beliebige Typen: Gleichheit: a == b Ungleichheit: a!= b Arithmetische Vergleiche (numerische Typen): Kleiner-als: a < b Kleiner-oder-gleich: a <= b Analog >, >= 16 / 33

Beisipiel mit for-schleife Go: schleife.go package main import "fmt" func main() { for i := 0; i <= 3; i = i + 1 { fmt.println(i) 17 / 33

Beisipiel mit for-schleife Go: schleife.go package main import "fmt" func main() { for i := 0; i <= 3; i = i + 1 { fmt.println(i) user@host:~/projects$ go run schleife.go 0 1 2 3 17 / 33

Einfache for-schleifen for Initialisierung; Bedingung; Inkrement { Schleifenkörper Hinter der Schleife Initialisierung Falls nicht Bedindung: Sprung Schleifenkörper Inkrement Sprung Hinter der Schleife 18 / 33

Alternativen zur Addition Go: schleife.go package main import "fmt" func main() { for i := 0; i <= 3; i = i + 1 { fmt.println(i) user@host:~/projects$ go run schleife.go 0 1 2 3 19 / 33

Alternativen zur Addition Go: schleife.go package main import "fmt" func main() { for i := 0; i <= 3; i += 1 { fmt.println(i) user@host:~/projects$ go run schleife.go 0 1 2 3 19 / 33

Alternativen zur Addition Go: schleife.go package main import "fmt" func main() { for i := 0; i <= 3; i++ { fmt.println(i) user@host:~/projects$ go run schleife.go 0 1 2 3 19 / 33

Arithmetik und Zuweisungen Go: Arithmetik var i int i = 13 // Zuweisung: i wird überschrieben i = i * 2-6 / 3 * 2 k := 10 k += i Sei ein Operator: ist (fast) äquivalent zu v = e v = v e 20 / 33

Arithmetik und Zuweisungen Go: Arithmetik var i int i = 13 // Zuweisung: i wird überschrieben i = i * 2-6 / 3 * 2 k := 10 k += i Sei ein Operator: ist (fast) äquivalent zu v = e v++ entspricht v += 1 v-- entspricht v -= 1 v = v e 20 / 33

Bedingte Ausführung mit if Go: Bedingungen if i > 0 { fmt.println("größer als Null") 21 / 33

Bedingte Ausführung mit if Go: Bedingungen if i > 0 { fmt.println("größer als Null") else { fmt.println("kleiner oder gleich Null") 21 / 33

Bedingte Ausführung mit if Go: Bedingungen if i > 0 { fmt.println("größer als Null") else { fmt.println("kleiner oder gleich Null") Go: if mit Initialisierung if x := a*b; x < 0 { fmt.println("ungleiche Vorzeichen: ", x) 21 / 33

Logische Operatoren Logische Konnektive Logisches UND: a && b Logisches ODER: a b 22 / 33

Zusammenfassung: Operatoren Binäre Operatoren 5 * / % << >> & &ˆ 4 + - ˆ 3 ==!= < <= > >= 2 && 1 Höhere Präzedenz bindet stärker, sonst links-assoziativ: i * 2-6 / 3 * 2 = (i * 2) - ((6 / 3) * 2) Unäre Operatoren +x: 0 + x -x: 0 x ˆx: Bitweise Komplement!x: Logisches Komplement &x <-x 23 / 33

Logisch Gesteuerte Schleifen Go: GCD for a!= b { if a > b { a -= b else { b -= a fmt.println(a); Alternativform von for: Wiederhole, solange Bedingung wahr ist Bedingung muß bool-wert (Wahrheitswert) berechnen Entspricht while-schleife in anderen Sprachen 24 / 33

Blöcke Block ::= { StatementList StatementList ::= ε Statement ; StatementList Statement ist eine beliebige Anweisung (Zuweisung, Schleife, Block,... ) Ein Block führt alle inneren Anweisungen in Folge durch 25 / 33

Zusammenfassung: Kontrollstrukturen Block ::= { StatementList For ::= for [ SimpleStmt ] ; Expression ; [ SimpleStmt ] Block for Expression Block for Block IfStmt ::= if [ SimpleStmt ; ] Expression Block [ else Block ] if [ SimpleStmt ; ] Expression Block [ else IfStmt ] Block: Folge von Anweisungen if: Bedingte Ausführung else: Alternative (entweder Block oder Folge-if) for: Wiederholung for { A : Wiederhole A for e { A : Wiederhole A bis e = false for Init ; Test ; Post { A for und if sind hier leicht vereinfacht 26 / 33

Funktionen: Beispiel Go: funktion.go package main import "fmt" func f(a int, b int) int { return a + b func main() { fmt.println(f(1, 2), f(2, 3)) 27 / 33

Funktionen: Beispiel Go: funktion.go package main import "fmt" func f(a int, b int) int { return a + b func main() { fmt.println(f(1, 2), f(2, 3)) user@host:~/projects$ go run funktion.go 3 5 27 / 33

Funktionen mit mehreren Rückgabewerten Go: swap1 func swap1(x, y int) (int, int) { return y, x 28 / 33

Funktionen mit mehreren Rückgabewerten Äquivalent: Go: swap1 func swap1(x, y int) (int, int) { return y, x Go: swap2 func swap2(x, y int) (rx, ry int) { rx = y ry = x return 28 / 33

Funktionen FunctionDecl ::= func id Signature Block Signature ::= Parameters [ Return ] Parameters ::= ( [ ParameterList ] ) ParameterList ::= ParameterDecl [, ParameterList ] ParameterDecl ::= [ IdList ] Type Return ::= Type Parameters Funktionen können Rückgabetyp haben: func f (x, y int) string {... Mehrere Rückgabewerte möglich: func swap (x, y int) (int, int) {... return beendet Funktion return x 1,..., x n liefert x 1,...,x n als Funktionsergebnisse 29 / 33

Kommentare Go: kommentar.go // Kommentar bis Ende der Zeile var x /* eingebetteter Kommentar */ int 30 / 33

Semikolon Go: semikolon.go f(); g(); h() ist gleichwertig zu: Go: kein-semikolon.go f() g() h() Die Sprache führt bei Zeilenumbrüchen an geeigneten Stellen automatisch ein Semikolon ein 31 / 33

Zusammenfassung: Grundlagen von Go Sprache für systemnahe Programmierung Automatische Speicherverwaltung Wir haben betrachtet: Variablen Arithmetik Vergleichsoperatoren, logische Operatoren Kontrollstrukturen: Blöcke, if, for Funktionen: func, return 32 / 33

Ausblick 1. Einführung 2. Datenstrukturen und Module 3. Typsystem 4. Nebenläufige Ausführung 5. Bibliotheken und Fehlerbehandlung 33 / 33