Programmieren




Websites / Networking

Der grössere Teil meiner Programmieraktivitäten ist weborientiert. In den Sprachen HTML / CSS / JS / PHP / SQL entwickle ich Websites und Skripts.


>>>

Hier geht's zu meiner Web-App Bibliothek.




Windows Desktop

Um lokale Datenverarbeitung und höhere Rechenleistungen zu erzielen, programmiere ich Anwendungen für Windows, in der Sprache C++.


Console Tic Tac Toe

Ein Klassiker, programmiert in ASCII text-art für die Windows Kommandozeile. Mein erstes zeitaufwändigeres Projekt in C++ für Win7 (2013). Spiel gegen Computer oder Zweitspieler mit Punktezähler über mehrere Runden.

Serial Host

Serielle Schnittstelle zur primitiven Kommunikation mit Arduino Mikroprozessoren, USB-Eingabegeräten und mehr. Auslesen von Statusmeldungen, Messdaten, Senden von beliebigen Zeichenketten an experimentelle Geräte. Mit ausführlichem Konfigurationsmenu und speicherbaren Verbindungsprofilen.



Arduino Mikroprozessoren

Ich verwende die Experimentierboards von Arduino, um zum Beispiel Servomotoren anzusteuern, LEDs zu schalten oder Sensoren auszulesen.


Gamecontroller

Ein Gamecontroller mit 25 Inputs, gebaut nach einer Video-Anleitung.



"Wie funktioniert ein Computer?"
- Ein kleiner Einblick ...


Daten

Der Grossteil der Menschen rechnet mit dem Dezimalsystem auf der Basis 10, das heisst jede Stelle hat 10 verschiedene mögliche Werte (arabische Ziffern: 0-9) und der Wert angrenzender Stellen unterscheidet sich um den Faktor 10 (rechne mal 10 indem du alle Ziffern um eine Stelle nach links schiebst und rechts eine Null einfügst). Die Faktoren 10, 100, 1000 usw. sind Potenzen der Basis 10 und werden meist intuitiv verwendet.

Ein elektronischer Computer rechnet dagegen auf der Basis 2 (Dualsystem oder bi = 2 -> Binärsystem). Die zwei möglichen Werte werden häufig mit den arabischen Ziffern 0 und 1 benannt und drücken sich in der Hardware zum Beispiel durch den Ladungszustand in einer Speicherzelle aus, oder dadurch, ob die Spannung an einem Signalleiter hoch oder tief ist (high / low). Wie im Dezimalsystem lassen sich mehrere Stellen (Bits) zu Zahlen mit grösseren Wertebereichen kombinieren. Ein Byte besteht aus 8 Bits. Faktoren und Grössen wie 4, 8, 16, 32, 64 sind wiederum Potenzen der Basis, hier 2, und sind häufig massgebend für Computerarchitekturen und Softwaredesigns.

Datensätze lassen sich jedoch nicht nur als Zahlen interpretieren. Das Speichern von einzelnen Buchstaben oder Texten (Zeichenketten, engl. strings) wird durch die Verwendung genormter Zeichensätze ermöglicht. Dies sind Codierungstabellen, welche jedem unterstützten Zeichen einen Zahlwert einheitlicher Länge zuordnen. Beim Interpretieren eines Datensatzes als Zeichenkette wird also eine Reihe von Zahlen einzeln zu Buchstaben dekodiert. Als Beispiel: bei ASCII benötigt jedes Zeichen ein Byte Speicherplatz. Abzüglich eines Bits, welches anderweitig genutzt wird, enthält der Zeichensatz somit 2^7 = 128 verschiedene Positionen. Unter den 95 druckbaren Zeichen sind die lateinischen Klein- und Grossbuchstaben, die arabischen Ziffern, diverse Interpunktionszeichen und andere Sonderzeichen.

Grafikformate teilen ein Bild in einzelne Pixel ein und ordnen jedem Pixel verschiedene Farbwerte zu. Bei Tonspuren werden Amplitude, Frequenz, Lautstärke oder andere Grössen je Zeitintervall festgehalten. Bei Videoformaten sind diese Daten synchron zusammengeführt.

Das Interpretieren und Konvertieren (Übersetzen) folgt bei komplexeren Formaten spezifischen Protokollen. Das Betriebssystem erkennt das Format jeder Datei (sichtbar an der Endung des Namens) und übergibt sie für die Verarbeitung einem dem Format zugeordneten Treiber oder einer passenden Anwendung.


Logik

Menschen treffen Entscheidungen durch Logik, das heisst sie verknüpfen mehrere Informationen durch einfachste Regeln, um eine Antwort zu erhalten, die dem Zusammenhang der Situation gerecht ist. Zum Beispiel soll ein Auto erst abfahren, wenn alle Türen geschlossen sind, oder das Licht in einer Werkstatt soll erst gelöscht werden, wenn keiner der Arbeiter mehr drin ist. Ähnlich verhält es sich mit einem sogenannten logischen Gatter (engl. logic gate). Diese verarbeiten jeweils ein Bit aufs Mal pro Eingang. Durch das Verknüpfen mehrerer Gatter können Zahlen mit mehreren Bits (Ziffern) verarbeitet werden. Bei einem Und-Gatter ist das Ausgabesignal erst positiv, wenn alle Eingangssignale positiv sind. Bei einem Oder-Gatter ist das Ausgangssignal positiv, sobald auch nur eines der Eingangssignale positiv ist. Weitere Beispiele sind Xor (exklusives Oder), Not (Umkehrung) und die Kombinationen Not-And und Not-Or.

Logische Gatter funktionieren im Einzelnen überraschend einfach, ermöglichen in Kombination jedoch hoch komplexe Strukturen. Sowohl Eingabe- wie auch Ausgabedaten können von beliebiger Grösse sein. Eine logische Struktur kann aus einem grossen Datensatz einen einzigen Wahrheitswert bestimmen (sind zwei Bilder identisch?), sie kann aber auch eine kleine Datenmenge auf ein Vielfaches erweitern (Dekomprimieren von ZIP-Archiven).


Softwareentwicklung

Beliebig komplexe Abfolgen von Befehlen lassen sich als Programmdateien speichern, sodass sie sich vervielfachen und wiederholt ausführen lassen. Eine solche .exe- (Windows) oder .dmg-Datei (Mac) enthält codierte Prozessorbefehle, welche in der Laufzeit nacheinander ausgeführt werden. Das Addieren von zwei Zahlen erfordert beispielsweise, die beiden Summanden in die Eingangsregister der Arithmetischen Logischen Einheit (ALU) zu kopieren, die Addition durchzuführen und das Resultat vom Ausgangsregister in eine Speicherzelle zu kopieren. Um solche Programme für Menschen besser lesbar zu machen, wurde die Programmiersprache Assembly definiert, welche jedem Befehlscode ein Kürzel aus Buchstaben zuordnet. Das Programm wird somit als Textdatei geschrieben und mit einem sogenannten Compiler (ein weiteres Programm) zur ausführbaren Abfolge von Prozessorcodes konvertiert.

Das direkte Ansteuern der Hardware ist jedoch sehr zeitaufwändig, anspruchsvoll und unnötig penibel. Meistens lassen sich mehrere Prozessorbefehle mit einem Wort beschreiben oder wiederkehrende, grössere Strukturen anhand weniger Merkmale und Schlüsselworte abkürzen. Deshalb wurden mit der Zeit viele verschiedene Programmiersprachen entwickelt, die sich mathematischen Schreibweisen oder der menschlichen Umgangssprache annähern. Damit wird das menschliche Abstraktionsvermögen und der natürlichere Umgang mit Zusammenhängen genutzt.

In der Sprache C++ lässt sich zum Beispiel eine Klasse "Auto" definieren. Dies ist dann eine Beschreibung eines Typs von Objekten (Autos) mit spezifischen Eigenschaften (z.B. Modell, Farbe, Km-Stand) und übergreifenden Funktionen (Gruppen von Befehlen, z.B. um den Verkaufswert zu berechnen oder ein Inserat zu generieren). Man könnte dann eine Liste von Tausenden von Autos einlesen, diese alle als Instanzen der Klasse "Auto" interpretieren und Funktionen dieser Klasse für jedes beliebige Auto ausführen lassen.