Klausurfragen Flashcards

1
Q

3 Arten von Programmierparadigmen

A
  • Objektorientiertes Programmierung

- Funktionale Programmierung

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Älteste Programmiersprache?

A

Shell (sh), ist von 1971.
Bash folgte 1979.
Ist ein Command Line User Interface für UNIX.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Was ist statische Typisierung?

A

Typ einer Variable wird deklariert

Typprüfung erfolgt zur Compile-Zeit

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Dynamische Typisierung

A

Variablen haben keine Typen. Die gespeicherten Werte haben Typen.

Die Typprüfung erfolgt zur Laufzeit.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Strong vs. weak Typing

A

Strong und Weak sind nicht fix definiert, sondern werden zum Vergleich zwischen Sprachen verwendet. Es geht dabei um die Fragen: Wie streng unterscheidet die Sprache die Typen? Welche Datentypen können ineinander umgewandelt werden? Erlaubt sie implizite Typumwandlungen? Erlaubt sie unsichere Typumwandlungen, bei denen z. B. Werte verloren gehen können?

In einer schwach typisierten Sprache hängt der Typ eines Wertes davon ab, wie er verwendet wird. Ich kann z. B. eine Zeichenkette an den Additionsoperator übergeben und sie wird automatisch als Zahl interpretiert oder einen Fehler verursachen, wenn der Inhalt der Zeichenkette nicht in eine Zahl übersetzt werden kann.

In einer stark typisierten Sprache ist ein Wert einem Typ zugewiesen und dieser Typ kann sich nicht ändern.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Was ist Typinferenz?

A

Programmierer gibt (fast) keine explizite Typisierung von Objekten an.

Compiler leitet gewünschten Operandentyp aus Operatoren und Inferenzregeln ab, meldet ggf. Typfehler

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Was ist lexikalisches / statisches Scoping?

A

Der umgebende Quelltext bestimmt die Bindung.

Im Fall einer lexikalischen Bindung sind die Bindungen für einen ganzen Block immer die gleichen, weil sie allein durch die Blockstruktur vorgegeben sind. Man kann daher allein durch Analyse des Quelltextes einer Funktion verstehen, wie sich die Funktion verhält. Dieses Konzept unterstützt daher modulare Programmierung.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Was ist dynamisches Scoping?

A

Die Ausführungsschicht zur Laufzeit des Programms bestimmt die Bindung.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Was kann ein Endlicher Automat?

A

Können Sprachen erkennen mit unendlich vielen Wörtern

  • Has some number of states
  • Has a start state and at least one end state
  • Accepts input that advances it through its states
  • Can be Deterministic (DFA) or Non-Deterministic (NFA)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Was kann ein Endlicher Automat nicht?

A

→ Erkennen ob die Klammerung passt
→ Alphabet ist { Klammerauf, Klammerzu }
→ Korrekter string ( ( ) ) ( ) )
→ Falscher string ( ( )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Erkläre den regulären Ausdruck ab(a+b)*

A

Das Alphabet sei { a, b }

soll alle Strings akzeptieren, die mit ab beginnen.

ab heißt a gefolgt von b

b(a+b) heißt, b ist gefolgt von einem a oder einem b

(a + b) heißt entweder a oder b

(a + b)* heißt beliebig viele a’s und beliebig viele b’s am Ende (also zb abbbbaaaba oder abbbbbbbbaaaa oder aaaaaaaaaaa oder bbbbbbbbbbb)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Kann man mit einem regulären Ausdruck HTML parsen?

A

Nein, HTML kann nicht von Regex geparsed werden
→ zu schwach bei Verschachtelungen
→ endlicher Automat oder Regex reicht nicht aus
→ Parser wird benötigt

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Was ist ein „Abstract Syntax Tree“?

A

Hierarchische Struktur / Baumstruktur der abstrakten syntaktischen Struktur von Quellcode, der in einer Programmiersprache geschrieben wurde.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Wer erzeugt den AST?

A

Parser während des Kompilierens

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Wo wird Parsing verwendet? Nenne drei Anwendungsfälle

A

CSS-Browser

XML-Parser

URI-Parser

Logdatei Parser

Compilieren

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Was macht ein Parser? Was ist sein Input, was sein Output?

A

Ein Parser dazu nimmt einen Text und einen Regelsatz (=Grammatik) als Input, und analysiert den Text nach der Grammatik. Wenn das klappt ist das Ergebnis ein Syntaxbaum (AST), welcher die Hierarchie zwischen den Elementen ausdrückt. Wenn es nicht klappt ist der Output eine Fehlermeldung.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Was macht ein Transpiler? Was ist sein Input, was sein Output?

A

Dabei handelt es sich um einen speziellen Compiler, der Quellcode einer Programmiersprache in den Quellcode einer anderen Programmiersprache übersetzt („Code-Transformation“)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Was macht ein Linter? Was ist sein Input, was sein Output?

A

Ein Linter ist ein statisches Code-Analyse-Tool, das Programmierfehler, Bugs, stilistische Fehler und verdächtige Konstrukte markiert. Input: Code, Output: Errors (?)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Welche zentralen Funktionen einer Programmiersprache sind bis heute nicht direkt in Elm implementiert, sondern werden über Libraries gelöst?

A

Fangfrage, Elm beinhaltet direkt alles was man so braucht

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Was sind die Besonderheiten von Elm?

A

Keine Laufzeitfehler

Freundliche Fehlermeldungen

Zuverlässiges Refactoring

Automatische semantische Versionierung von Elm Paketen

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Was ist die Architektur von Elm?

A

init:Model
=> view: Model -> Html Msg
=> update: Msg -> Model -> Model

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Erkläre asynchrone Konzepte (2) am Beispiel von Dart.

A

1) Futures: ähnlich zu JS Promises.
Future = Ereignis, das nicht sofort abgeschlossen wird.
Wo eine normale Funktion das Ergebnis zurückgeben würde, gibt eine asynchrone Funktion ein Future zurück.

2) Streams: sind wie Futures, nur ist es nicht 1 Wert oder Error der zurückgegeben wird, sondern eine Sequenz davon.
Streams sind also eine Reihe von asynchronen Events / asynchrone Sequenz von Daten.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

Was ist der Unterschied zwischen Single Subscription Streams und Broadcast Streams?

A

Single subscription Stream hält die Daten, bis einmal darauf subscribed wird.
Wird versucht, ein 2. Mal darauf zu subsciben, wird eine exception geworfen.

Broadcast Streams funktionieren gleich wie Single Subscipion Streams, können aber mehrere listeners haben.

24
Q

Welche Funktion erfüllen Mixins in Dart?

A

Wiederverwendung in mehreren Klassenhierarchien

25
Q

Inwiefern erweitert Flutter das Dart Ökosystem?

A

UI Toolkit z.B. E2E Testing, Widget Library

26
Q

Warum wurde Swift entwickelt?

A

Weiterentwicklung von Objective-C (wurde früher von Apple verwendet). Objective-C ist seit Anfang der 1980er Jahre weitgehend unverändert geblieben und es mangelt an modernen Sprachfunktionen.

27
Q

Welche Eigenschaften hat Swift?

A

strongly typed

korrekter Typ immer notwendig

statically typed

zur Compile-Zeit Typen checken

Typen werden implizit bestimmt, wenn ein Variablentyp nicht explizit angegeben wird

Funktionen sind “first class citizens”

Semicolons nicht nötig

Objekt-orientierte und funktionale Programmiersprache

28
Q

Was ist ein Optional und welches Problem behebt es?

A

Optionals bieten die Möglichkeit Variablen oder Konstanten zu deklarieren, ohne sie mit einem Wert zu initialisieren. Variable kann Wert haben, muss sie aber nicht. “Nicht muss” ist hier entscheidend, da wir genau diesen Zustand überprüfen. Wenn Wert nicht existiert können wir entsprechend reagieren.

29
Q

Was ist ein Protocol in Swift?

A

Mit einem Protocol kann in Swift ein Schnittstellenkontrakt definiert werden. Das Protocol gibt dabei an, welche Methoden vorhanden sein müssen.

Auch Eigenschaften können dabei gefordert werden – dabei besteht die Möglichkeit anzugeben, ob diese nur gelesen oder verändert werden können.

30
Q

Was macht die folgende Terminal Eingabe und was gibt sie ggf. aus?

ls –l | grep .txt

A

ls –l gibt die Dateien im aktuellen Verzeichnis in einer Liste aus

Die Pipe überführt den Standard Output von ls zum Standard Input von grep

grep durchsucht die Liste anhand der Regex “.txt” nach Zeilen in denen “.txt” vorkommt und gibt nur diese aus

31
Q

Was sind “Pure Functions” in Haskell?

A

Funktionen sind immutable, das heißt bei gleichen Input-Werten liefern sie immer gleiche Output Werte

Sie haben daher kaum Side Effects und machen das Testen in Haskell einfach, da dadurch die Wartbarkeit des Codes erhöht wird.

32
Q

Wieso werden in Haskell so viele Rekursionen eingesetzt?

A

Es gibt in Haskell keine Loops, stattdessen muss man Rekursionen einsetzen

Allerdings können manche Rekursionen, die in einer speziellen Syntax (mit Accumulators) verfasst wurden, vom Compiler “under the hood” optimiert werden, sodass diese Rekursionen in einer while(true)-Schleife ausgeführt werden

33
Q

Was zeichnet Currying aus?

A

Beim Currying hat jede Funktion genau 1 Argument

Beim Currying gibt jede Funktion entweder eine neue Funktion oder das Ergebnis zurück

Beispiel: Wenn wir eine Funktion mit 3 Argumenten (a, b, c) und 1 Return Value (d) haben könnten wir das auch umschreiben in

eine Funktion mit einem Argument a, die eine neue Funktion zurückgibt, 

diese Funktion hat wiederum nur 1 Argument b und gibt eine neue Funktion zurück und 

diese Funktion besitzt wiederum nur 1 Argument c und diese gibt das Result zurück 

Vorteil von Currying: Man kann das Behavior einer Funktion ändern und dadurch neue Funktionen auf Basis einer älteren Funktion generieren → das nennt man auch “Partial Function Application” und dieses Prinzip wird in der funktionalen Programmierung die GANZE ZEIT eingesetzt

34
Q

Nenne 3 Key Concepts, die Haskell auszeichnen

A

Purely functional

Statically typed

Typen sind eine implizite Eigenschaft einer jeden Haskell-Expression 

Typklassen sind ähnlich zu den Interfaces in der objektorientierten Programmierung 

Lazy function evaluation

Concurrent

Recursive functions

Currying

35
Q

Wie erreicht man Nebenläufigkeit in Go?

A

Mit Goroutinen, mit dem Keyword go

36
Q

Was sind Eigenschaften von Goroutinen?

A

Sind keine echten Threads

Eine unabhängig ausgeführte Funktion => wie das “&” in Bash

Wird von Go-Runtime verwaltet; auf mehrere “richtige” OS Threads gemappt

Sehr leichtgewichtig, man kann viele Hunderttausend Goroutinen gleichzeitig starten

37
Q

Wie können Goroutinen miteinander kommunizieren?

A

Über sogenannte Channels. Channels sind typisierte “Straßen”, auf denen in beide Richtungen kommuniziert werden kann. Channels blockieren, bis auf einer Seite gelesen und auf der anderen Seite geschrieben werden kann. Das erlaubt es Go Code zu synchronisieren, ohne dafür explizit Locking-Mechanismen (wie man es aus anderen Sprachen kennt) verwenden zu müssen.

38
Q

Wie wird Elixir ausgeführt? Interpretiert? Compiliert?

A

Elixir-Code wird (wie Erlang-Code) vom Compiler zu Bytecode kompiliert und dann von BEAM (der VM für Erlang, vergleichbar mit der JVM) ausgeführt
.ex-Files werden compiliert
.exs-Files werden interpretiert

39
Q

Welche Art von Concurrency untersützt Elixir?

A

Dank der Erlang VM ist concurrency in Elixir einfacher als erwartet. Die concurrency basiert auf dem Actor Model, bei dem ein abgeschlossener Prozess mit anderen Prozessen durch message passing kommuniziert.

40
Q

Beschreibe das Verhältnis von WebAssembly & JavaScript wenn beide im Browser ausgeführt werden

A

WebAssembly kann Javascript Programme entlasten indem teure Operationen auf WebAssembly ausgelagert werden, JavaScript und WebAssembly können dabei interagieren. Man sollte allerdings beachten, dass die Kosten der Initialisierung von WebAssembly nicht den Nutzen wirkungslos werden lassen.

Man braucht JS immer noch z.B. um auf dem DOM zuzugreifen.

Deswegen sind die Schnittstellen zwischen WebAssembly und JS so wichtig.

41
Q

Vergleiche WebAssembly & JavaScript wenn beide im Browser ausgeführt werden

A

WebAssembly = virtuelle Maschine innerhalb von JS VM

Kompilierziel für viele Programmiersprachen 

ermöglicht Wiederverwendung von Code 

Datenaustausch [mit wem?] ist mühsam (umständlich) 

entfernen nur den Coding-Overhead, aber nicht die Laufzeitkosten ???? 

Funktionsaufruf in WebAssembly hat gewissen Overhead:

In die Funktion springen, 

Speicher allokieren, 

Interpretieren & Compilierantwort. [wird WebAssembly nun interpretiert? Compiliert? Beides?] 

WASM erkennt immer gleichen Input --> es wird nicht mehr interpretiert sondern nur zu 
Maschinencode kompiliert 

Wegen diesem Overhead zahlt es sich nicht aus, kleine Teilaufgaben in WebAssembly auszulagern

  • -> bei größeren Aufgaben und einer großen Anzahl an Wiederholungen aber durchaus
  • -> in diesen Fällen kann WASM schneller sein als JS

JS ist schnell, allerdings Runtime Behavior weniger vorhersehbar

  • -> in regelmäßigen Abständen gibt Garbage Collector Memory frei
  • -> belasted Main Thread
42
Q

„WebAssembly is a compilation target for many programming languages” – was bedeutet das? Nenne Beispiele von Sprachen

A

WebAssembly ist binärer Code der von modernen Browsern ausgeführt werden kann. Die Sprache ist nahe an Assemblersprache und kann in fast nativer Geschwindigkeit ausgeführt werden. Verschiedenen Sprachen wie C/C++, C# und Rust können zu WebAssembly kompiliert werden.

Meistens schreibt man WebAssembly nicht per Hand, sondern implementiert den Code in einer höheren Programmiersprache und kompiliert ihn dann nach WebAssembly.

Rust => wasmpack

C/C++ => Emscripten

43
Q

Was bedeutet „pattern matching“ in JavaScript? .b. in “Hello World”.match(/a/)

A

Pattern matching in Javascript funktioniert anhand von regulären Ausdrücken. Reguläre Ausdrücke sind Muster, die eingesetzt werden, um Text auf bestimmte Zeichenkombinationen zu überprüfen. Reguläre Ausdrücke sind Objekte in JavaScript. Reguläre Ausdrücke können anhand von einigen Methoden (e.g. match, exec) angewendet werden.

44
Q

Was bedeutet „pattern matching“ in Erlang, Elixir und Haskell?

A

Pattern-Matching besteht darin, Muster anzugeben, denen einige Daten entsprechen sollen, und dann zu prüfen, ob dies der Fall ist, und die Daten gemäß diesen Mustern zu dekonstruieren.

z.B. wenn man Funktionen definiert, kann man unterschiedliche Patterns mit unterschiedlichen Function Bodies definieren. Dies führt zu wirklich sauberem Code, der einfach und lesbar ist.

Man kann Pattern Matching für jeden Datentyp durchführen - Zahlen, Zeichen, Listen, Tupel usw.

45
Q

Was bedeutet „currying“ in den funktionalen Programmiersprachen Elm, Erlang, Elixir und Haskell?

A

Currying ist der Prozess der Umwandlung einer Funktion, die mehrere Argumente (in einem Tupel) als Argument annimmt, in eine Funktion, die nur ein einziges Argument annimmt. Die Funktion die dabei entsteht gibt entweder eine weitere Funktion oder das Endresultat zurück.

Durch Currying ist Partial Function Application möglich –> man kann Funktionen einfacher wiederverwenden oder leichter auf andere Kontext anwenden

46
Q

Ähnliches Concurrency-Konzept wie Elixir?

A

Haskell!

Go!

47
Q

Nenne Beispiele für Sprachen die mit immutable Daten arbeiten

A

Rust, Elixir, Haskell, Elm

48
Q

Imperativ vs. Deklarativ

A

Imperativ sind Sprachen in denen Befehle Schritt für Schritt ausgefürht werden. (fast alle Programmiersprachen)

Deklarativ sind Sprachen in denen nur das Was beschreiben wird, aber nicht das wie. Z.B. SQL. Funktional Sprachen werden hier oft dazu gezählt

49
Q

Was ist Objektorientierung?

A

Unter Objektorientierung(kurz OO) versteht manin der Entwicklung von Software eine Sichtweise bei der ein System durch das Zusammenspiel kooperierender Objektebeschrieben wird. Der Begriff Objektist dabei unscharf gefasst; wichtig an einem Objekt ist nur,

  1. dass ihm bestimmte Attribute(Eigenschaften) und Methodenzugeordnet sind
  2. dass es in der Lage ist, von anderen Objekten Nachrichten zu empfangen beziehungsweise an diese zu senden.
50
Q

Was ist funktionale Programmierung?

A

Functional programming is a programming paradigm where programs are constructed by applying and composing functions.

In functional programming, functions are treated as first-class citizens, meaning that they can be bound to names, passed as arguments, and returned from other functions, just as any other data type can. This allows programs to be written in a declarative and composable style, where small functions are combined.

Functional programming is sometimes treated as synonymous with purely functional programming, a subset of functional programming whichtreats all functions as deterministic mathematical functions, or pure functions. When a pure function is called with some given
arguments, it will always return the same result, and cannot be affected by any mutable state or other side effects.

51
Q

Was ist scoping?

A

Unter dem Sichtbarkeitsbereich (engl. scope) einer Variablen versteht man den Programmabschnitt, in dem die Variable nutzbar und sichtbar ist. Da eine lokale Variable in den meisten Programmiersprachen den gleichen Namen tragen darf wie eine globale Variable, sind Sichtbarkeitsbereiche nicht notwendig zusammenhängend: Durch die Deklaration einer lokalen Variable wird die gleichnamige globale Variable für einen bestimmten Block „verdeckt“, das heißt, sie ist in diesem Block nicht sichtbar.

52
Q

Was macht ein Lexer / Lexical Analyzer? Was ist sein Input, was sein Output?

A

Ein Lexernimmt einen Text und Reguläre Ausdrücke als Input, und produziert eine Folge von Tokens als Output.

53
Q

Was macht ein Compiler?

A

Nimmt einen Text (=Sourcecode), schickt ihn durch Lexter und Parser. Falls das nicht klappt -> Ende, Syntax Error

Wenn es geklappt hat wird aus dem AST (über mehrer Schitte, mit Optimierung) ein Programm in Maschinen Code erzeugt.

Diese Programm wird als Datei abgespeichert. Eventuell werden mehrere socleh Dateien zusammen „gelinkt“(z.B. mein C# Code und eine DLL)

Das fertige ausführbare Programm in Maschinencode kann nun auf allen Computer mit der gleichen CPU laufen, braucht keinen „Interpreter“und keine „Virtual Machine“mehr.

54
Q

Was macht ein Interpreter?

A

Nimmt einen Text (=Sourcecode), schickt ihn durch Lexter und Parser. Falls das nicht klappt -> Ende, Syntax Error

Wenn es geklappt hatkommt die eigentliche Arbeit des Interpreters: den der ASTSchritt für Schritt abgarbeiten unddie Befehle ausführen.

55
Q

Erkläre Ownership.

A

Alle Programme müssen die Art und Weise verwalten, wie sie den Speicher eines Computers nutzen,
während sie laufen. Rust verwendet hier Ownership, die vom Compiler geprüft wird.

Für das Ownership gibt es Regeln:

1) Jeder Wert in Rust hat eine Variable die als “Owner” bezeichnet wird
2) Zu jedem Zeitpunkt kann es nur einen Owner geben
3) Wenn der Owner den Scope verlässt, wird der Wert verworfen = Speicher freigeben (gibt keinen Garbage Collector der das macht)

s1 ist ab der Zuweisung der Owner in diesem Scope.

Die Fehlermeldung soll verhindern, dass für den Fall wenn s1 und s2 den Scope verlassen, beide probieren denselben Speicher freizugeben, auf den sie zeigen.

Ich möchte String öfter verwenden als nur 1x.

Behebung der Fehlermeldung: let s2 = s1.clone()

56
Q

Erkläre die Unterschiedliche Behandlung von Daten am Stack und Daten am Heap.

A

Sowohl der Stack als auch der Heap sind Teile des Speichers, die Ihrem Code zur Laufzeit zur Verfügung stehen, aber sie sind auf unterschiedliche Weise strukturiert. Der Stack speichert Werte in der Reihenfolge, in der er sie bekommt, und entfernt die Werte in der umgekehrten Reihenfolge.

Dies wird als “last in, first out” bezeichnet –> Vergleiche mit Stapel Teller, man nimmt nur das oberste, nicht das unterste oder ein Teller aus der Mitte
Alle Daten, die auf dem Stack gespeichert werden, müssen eine bekannte, feste Größe haben.
Daten, deren Größe zur Kompilierzeit unbekannt ist oder die sich ändern könnten, müssen stattdessen auf dem Heap gespeichert werden. Der Heap ist weniger organisiert: Wenn Sie Daten auf dem Heap ablegen, fordern Sie eine bestimmte Menge an Speicherplatz an. Der Speicherallokator findet eine leere Stelle im Heap, die groß genug ist, markiert sie als in Gebrauch und gibt einen Pointer zurück, der die Adresse dieser Stelle ist.

Daten in den Stack zu pushen geht schneller, weil nicht zuerst Speicherplatz allokiert werden muss (verfügbarer Platz ist immer ganz oben im Stack)
Der Zugriff auf Daten im Heap ist langsamer als der Zugriff auf Daten auf dem Stack, weil man einem Pointer folgen muss, um dorthin zu gelangen.
Die Verwaltung von Heap-Daten der Grund für die Existenz von Ownership