99
Häufig gibt es bei dieser Übersetzung einen Zwischenschritt, bei dem der Source Code zunächst in eine Art Zwischencode – den oben erwähnten Object Code (siehe Rn. 82) – umgewandelt wird. Dieser Zwischencode hat den Vorteil, dass er häufig auf verschiedenen Plattformen läuft und auch von Interpretern verwendet werden kann. Diesen so entstandenen Object Code übersetzt der Compiler dann weiter in den Maschinencode, der vom jeweiligen Zielsystem verstanden werden kann. Der Linker – ebenfalls ein gesondertes Computerprogramm – setzt dann die kompilierten Programmbestandteile und -module, die mittels des Compilers erzeugt wurden, zu einer ausführbaren Datei zusammen, um auf diese Weise das fertige Programm zu erhalten. Bei dieser Zusammensetzung der Programmteile gibt es unterschiedliche Arten, die als statische und dynamische Verlinkung bezeichnet werden (siehe Rn. 106f.).
100
Neben den Compilern, die direkt Binärcode erzeugen, gibt es auch noch sog. Interpreter. Dabei handelt es sich um Programme, die Source Code direkt zur Laufzeit verarbeiten. Die Anweisung im Source Code wird dabei eingelesen, analysiert und dann ausgeführt. Anders als beim Compiler wird dadurch keine Datei erzeugt, die mehrmals ausgeführt werden kann, und es entsteht auch keine dauerhafte Übersetzung des Source Code. Der Interpreter stellt eher eine Zwischenschicht zwischen Programmiersprache und Maschine dar, die die Anweisungen des Source Code analysiert und dann die gewünschte Aktion im Zielsystem aufruft und ausführt. Man erhält durch den Einsatz eines Interpreters also kein unabhängiges Executable, sondern benötigt weiterhin den Source Code des auszuführenden Programms.13
101
Eine weitere Form von Hilfsprogrammen, mit denen man bei der Umwandlung von Code häufig zu tun hat, sind Parser. Mit einem Parser kann der Quelltext entsprechend aufbereitet werden, indem dieses Programm die Zeichenketten analysiert und in eine Repräsentation umwandelt, mit der ein anderes Programm arbeiten kann. Die meisten Programmiersprachen sind so gestaltet, dass sie für den Entwickler übersichtlich und komfortabel sind. Die oben bereits erwähnten Compiler können aber mit zusätzlich im Source Code enthaltenen Informationen, wie z.B. Kommentaren der Entwickler, nichts anfangen und diese nicht sinnvoll in Maschinensprache übersetzen. Hier hilft der Parser dabei, den Quelltext zu analysieren und zu bereinigen, so dass der Compiler im Anschluss den überarbeiteten Code verwenden und umwandeln kann.14 Ein weiteres Beispiel für ein solches Programm wäre der in einem Webbrowser enthaltene Parser, der den rein als Text vorliegenden HTML Code so aufbereitet, dass damit die entsprechende Webseite angezeigt werden kann.
102
Backup: Gängige FOSS Parser
Auch bei den Parsern gibt es zahlreiche Programme unter FOSS Lizenzen. Einige gängige FOSS Parser sind z.B. GNU Bison15, ANTLR16, JavaCC17, OpenL18, runcc19 oder SJPT20.
Wie bei den Compilern sollte auch bei den Parsern auf die Lizenzierung geachtet werden. Zwar stehen einige der Programme unter liberalen Lizenzen, für viele sind aber ebenfalls strenge Copyleft Lizenzen einschlägig. Parser dienen zwar eher zur Analyse und Aufbereitung des Code als zu dessen eigentlicher Erstellung; es ist jedoch trotzdem möglich, dass Teile des Parsers in den damit analysierten und bearbeiteten Programmcode eingefügt werden. Auch hier ist das Programm der FSF, der GNU Bison Parser, wieder ein gutes Beispiel. Um es Entwickler zu ermöglichen, auch mit einem unter der GPL lizenzierten Parser kommerzielle Programme zu erstellen, hat die FSF hier wiederum eine Ausnahme zur GPL speziell für ihren Bison Parser geschaffen. Diese sog. Bison Exception ermöglicht es, das Ergebnis aus dem Parser trotz ggf. enthaltenem GPL Code unter eine eigene Lizenz zu stellen.21
5 https://de.wikipedia.org/wiki/Systemumgebung. 6 https://de.wikipedia.org/wiki/Integrierte_Entwicklungsumgebung. 7 Augsten, https://www.dev-insider.de/was-ist-ein-sdk-a-730921/. 8 https://www.it-talents.de/blog/it-talents/alles-ueber-den-build-prozess#-ides-und-build-tools. 9 https://de.wikipedia.org/wiki/Toolchain. 10 Augsten, https://www.dev-insider.de/was-ist-eine-software-paketverwaltung-a-847919/. 11 https://www.onlinesolutionsgroup.de/blog/glossar/n/npm-node-package-manager/. 12 FSF, Using the GNU Compiler Collection (GCC), Ziff. 6.59, https://gcc.gnu.org/onlinedocs/gcc-9.2.0/gcc.pdf. 13 Augsten, https://www.dev-insider.de/der-unterschied-von-compiler-und-interpreter-a-742282/. 14 Augsten, https://www.dev-insider.de/was-ist-ein-parser-a-756662/. 15 https://www.gnu.org/software/bison/manual/. 16 https://www.antlr.org/. 17 https://cs.lmu.edu/~ray/notes/javacc/. 18 http://openl.org/. 19 https://java-source.net/open-source/parser-generators/runcc. 20 http://sjpt.sourceforge.net/. 21 https://www.gnu.org/software/bison/.
3. Juristen müssen diese Verlinkung verstehen
103
– Für das Auslösen eines Copyleft kommt es auf die Verbindungen des FOSS Code mit eigenen Programmbestandteilen an.
– Daher sollte die konkrete Art der Verlinkung (statisch, dynamisch oder andere Formen der Interaktion von Code) ermittelt und korrekt anhand der Lizenzvorgaben eingeordnet werden.
– Die Art der Verlinkung von FOSS mit eigenen Programmbestandteilen ist abhängig von der verwendeten Programmiersprache, da nicht alle Programmiersprachen alle Arten der Verlinkung zulassen.
104
Zahlreiche FOSS Lizenzen – insbesondere solche mit einem beschränkten Copyleft – knüpfen unterschiedliche Anforderungen und Konsequenzen an den Einsatz der jeweiligen FOSS Komponente, je nachdem wie diese mit dem übrigen, meist proprietären Code der Software interagiert. Es kommt dabei in der Regel darauf an, wie stark die FOSS Komponente in die eigene Software eingebunden wird. Wir sprechen hier von statischer oder dynamischer Verlinkung, um zu beschreiben, wie eng die FOSS Komponente mit proprietärem Code verbunden ist. Um diese Differenzierung besser nachvollziehen zu können, möchten wir an dieser Stelle zum einen erklären, wie wir die Begriffe der statischen und dynamischen Verlinkung grundsätzlich verstehen und in diesem Buch Bezug darauf nehmen. Zum anderen soll kurz dargestellt werden, wie sich die unterschiedlichen Arten der Verlinkung in diversen Programmiersprachen manifestieren können. Denn je nachdem, in welcher Programmiersprache die jeweilige Software geschrieben wurde, kommen bereits nur bestimmte Arten der Verlinkung überhaupt in Frage bzw. wird der Begriff der Verlinkung möglicherweise anders genutzt und kann so zu Missverständnissen führen.
a) Statische vs. dynamische Verlinkung
105
Zunächst betrachten wir einmal grundsätzlich die Verlinkung von Software-Bestandteilen. Bei einer Verlinkung handelt es sich um eine Verbindung zweier Software-Bestandteile, so dass diese – ggf. noch mit mehreren