Praxishandbuch Open Source. Christian Galetzka
getestet werden kann, und einer Produktivumgebung, auf der die Software letztendlich betrieben und zu Geschäftszwecken genutzt wird. Die Entwicklungsumgebung der Systemumgebung beschreibt dabei kein eigentliches Entwicklungswerkzeug, sondern lediglich den Ort, an dem neue Software entwickelt wird.5
91
Eine integrierte Entwicklungsumgebung oder auch IDE (kurz für Integrated Development Environment), stellt eine Sammlung verschiedener aufeinander abgestimmter Computerprogramme dar, die der Entwicklung von Software dienen. Solche IDEs gibt es für nahezu alle Programmiersprachen und Plattformen, wobei eine IDE in der Regel jeweils nur eine Programmiersprache unterstützt. Statt eine IDE zu verwenden, kann ein Entwickler sich die zur Software-Entwicklung benötigten Einzelwerkzeuge wie Texteditor, Compiler, Linker, etc. (mehr dazu siehe Rn. 97ff.) auch einzeln besorgen und zusammenstellen. Der Vorteil der IDE besteht jedoch darin, dass die einzelnen Werkzeuge bereits gut aufeinander abgestimmt sind und Software-Entwicklung in der Regel ohne Medienbrüche stattfinden kann.6 Beispiele für solche IDEs sind u.a. Eclipse oder die NetBeans IDE.
92
Neben den IDEs gibt es auch noch die Software Development Kits (kurz: SDKs). Diese stellen ebenfalls eine Sammlung von verschiedenen Werkzeugen und Hilfsmitteln zur Erstellung von Software dar und beziehen sich meist auf ein konkretes Produkt, wie z.B. Android, oder eine Programmiersprache und stellen dafür dann neben den Entwicklungstools auch entsprechende Schnittstellen und Dokumentationen, diverse Bibliotheken und manchmal auch Testprojekte zur Verfügung. Viele SDKs beinhalten bereits eine entsprechende IDE, mit der die anderen vom SDK bereitgestellten Komponenten genutzt werden können. Jedoch ist es auch möglich, die durch ein SDK bereitgestellten Funktionen in einer selbstgewählten IDE zu nutzen.7 Beispiele für SDKs wären das Android SDK oder das Java Development Kit (JDK).
93
Weitere wichtige Werkzeuge sind die Build-Tools. Hierbei handelt es sich ebenfalls wieder um Computerprogramme. Diese dienen aber nicht der grundsätzlichen Erstellung von Code, sondern vielmehr dazu, den bereits geschriebenen Source Code in ausführbaren Code umzuwandeln. Zwar sind auch IDEs mit ihren integrierten Compilern in der Lage dazu, aus dem dort geschriebenen Source Code ein ausführbares Programm zu erzeugen. Allerdings muss dies hier händisch durch den Entwickler angestoßen werden. Die Build-Tools bieten die Möglichkeit, den Build-Prozess – also die Kompilierung des Source Code in ein ausführbares Programm (siehe ausführlich Rn. 97ff.) – zu automatisieren und so z.B. zu ermöglichen, den Build immer zu einem festgelegten Zeitpunkt mit dem bis dahin neu hinzugefügten Code automatisch durchzuführen.8 Bekannte Build-Tools sind z.B. Maven, Gradle oder Ant.
94
Gelegentlich stößt man auch auf den Begriff Toolchain. Auch diese bezeichnet eine systematische Sammlung von verschiedenen Werkzeugen zur Erstellung und Bearbeitung von Code und beschreibt damit im Grunde etwas Ähnliches wie die bereits oben erwähnten Entwicklungsumgebungen. Der Begriff der Toolchain stammt daher, dass die unterschiedlichen Werkzeuge nacheinander in Form einer Kette eingesetzt werden. Hier sind regelmäßig ebenfalls Texteditoren zur Erstellung des Code sowie Compiler und Linker zur Umwandlung in ein ausführbares Programm enthalten.9 Ein bekanntes Beispiel für eine Toolchain ist die GNU Toolchain, die alle vom GNU Projekt entwickelten Programmierwerkzeuge enthält.
95
Ein ebenfalls wesentlicher Teil bei der Erstellung und Verwaltung von Code sind die sog. Paketverwaltungen oder Package Manager. Diese stellen ebenfalls eine Sammlung von Werkzeugen dar, die diesmal aber nicht zur Erstellung, sondern lediglich zur Verwaltung von Code dienen. Die Hauptfunktionen der Package Manager sind die Installation, Aktualisierung und Deinstallation von Software. Wichtigster Bestandteil ist die Paketdatenbank, die alle Informationen über installierte bzw. zur Verfügung stehende Software-Pakete beinhaltet. Grundsätzlich stammt diese Art der Software-Verwaltung aus dem Umfeld von Betriebssystemen und ermöglicht die einfache Verwaltung der auf und mit dem Betriebssystem betriebenen Software.10
96
Der Begriff des Package Manager wird aber auch für Plattformen verwendet, auf denen Entwickler Software-Pakete zur Lösung diverser Problemstellungen finden und die zudem die Möglichkeit bieten, die entsprechenden Pakete zu verwalten oder diese direkt in eigene Software oder eigene Software-Paketen zu integrieren. Ein Beispiel für eine solche Plattform ist der Node Package Manager oder kurz npm. npm ist ein Package Manager für node.js, die Laufzeitumgebung von JavaScript. Er bietet eine große Datenbank an bereits fertigen Paketen, die Möglichkeit, diese Pakete zu bearbeiten und an eigene Bedürfnisse anzupassen sowie die Pakete zu verwalten und mit anderen zu teilen.11 Auch wenn die Package Manager eher als Werkzeuge zur Verwaltung gedacht sind, kann damit, durch Einbeziehung diverser bereitgestellter Pakete in die eigene Software, natürlich auch Software bearbeitet werden.
b) Werkzeugkoffer zum Coden – Compiler, Parser, Linker und Interpreter
97
Wie bereits erwähnt, bedarf es spezieller Programme und Zwischenschritte, um zwischen den unterschiedlichen Formen des Code zu wechseln. Code, der in einer der gängigen Programmiersprachen geschrieben wurde, liegt zunächst im menschenlesbaren Source Code vor. Soll dieser Code dann zu einer ausführbaren Datei werden, muss er in eine maschinenlesbare Form übersetzt werden. Dazu werden spezielle Programme verwendet, die Compiler genannt werden. Compiler wandeln also Source Code in Maschinensprache um und übersetzen dabei das gesamte Programm und erzeugen dadurch zusammen mit einem Linker ein Executable, das auch separat – also ohne den Source Code – weitergegeben werden kann.
98
Backup: Kurze Übersicht zu gängigen Compilern
Es existieren zahlreiche Compiler und Linker für jede Programmiersprache. Nicht jeder Compiler und/oder Linker ist dabei gleich gut für jedes Vorhaben geeignet, da die unterschiedlichen Programme unterschiedliche Stärken und Schwächen aufweisen. Allerdings haben sich einige gängige Programme durchgesetzt, zu denen wir hier einen kurzen Überblick geben wollen.
Compiler für C und C++:
GNU GCC Compiler, Clang, Intel C++ Compiler, Microsoft Visual C++, Oracle C Compiler, Wind River (Diab) Compiler
Compiler für Java:
GNU Compiler for Java, javac, Eclipse Compiler for Java (JDT Core), Iodine
Compiler für Python:
Psyco, Cython, PyPy, Shed Skin
Viele der gängigen und oben genannten Compiler stehen unter FOSS Lizenzen und können daher in der Praxis Probleme mit sich bringen. Während einige Compiler, wie z.B. PyPy, unter liberalen Lizenzen stehen, stehen viele der gängigen Compiler, wie z.B. der GCC Compiler, der Java Compiler von Eclipse oder auch Shed Skin, unter strengen FOSS Lizenzen mit Copyleft. Gerade der GCC Compiler unter der GPL ist ein gutes Beispiel für Probleme, die mit FOSS Compilern auftreten können. Denn der GCC Compiler fügt während des Kompilierprozesses Teile seines eigenen (unter der GPL lizenzierten) Code – insbesondere einige GCC Header Dateien oder Runtime Libraries – in das kompilierte Programm ein.12 Diese GPL lizenzierten Code Bestandteile können dann ein Copyleft auslösen und so die kompilierte Software infizieren. Da die FSF dieses Problem aber erkannt hat und nicht grundsätzlich verhindern will, dass auch kommerzielle Programme mit dem GCC Compiler erstellt werden können, wurde hier eine Ausnahme, die sog. GCC Runtime Library Exception, geschaffen. Diese besagt, dass das Ergebnis eines Kompilierprozesses mit dem GCC Compiler nicht zwingend unter der GPL lizenziert werden muss, auch wenn in dem Ergebnis Code Bestandteile unter der GPL enthalten sind.
Bei dem Einsatz von FOSS Compilern sollte also immer darauf geachtet werden, ob der Compiler FOSS lizenzierten Code in das kompilierte Programm einfügt und ob bei Copyleft Lizenzen ggf. entsprechende