DE102009004276A1 - Byte Coat: Nativer Bytcode Compiler für die Programmiersprache Python - Google Patents

Byte Coat: Nativer Bytcode Compiler für die Programmiersprache Python Download PDF

Info

Publication number
DE102009004276A1
DE102009004276A1 DE200910004276 DE102009004276A DE102009004276A1 DE 102009004276 A1 DE102009004276 A1 DE 102009004276A1 DE 200910004276 DE200910004276 DE 200910004276 DE 102009004276 A DE102009004276 A DE 102009004276A DE 102009004276 A1 DE102009004276 A1 DE 102009004276A1
Authority
DE
Germany
Prior art keywords
python
compilation
source code
resulted
byte code
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Withdrawn
Application number
DE200910004276
Other languages
English (en)
Inventor
Jan Langer
Andreas Löscher
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
CORE MOUNTAINS GmbH
Original Assignee
CORE MOUNTAINS GmbH
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by CORE MOUNTAINS GmbH filed Critical CORE MOUNTAINS GmbH
Priority to DE200910004276 priority Critical patent/DE102009004276A1/de
Publication of DE102009004276A1 publication Critical patent/DE102009004276A1/de
Withdrawn legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/52Binary to binary

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

Verfahren zur Erzeugung von Kompilaten aus plattformunabhängigem Python Bytecode, dadurch gekennzeichnet, daß nativ kompilierte, d. h. plattformabhängige, dynamische Bibliotheken entstehen.

Description

  • Die Erfindung betrifft ein Verfahren entsprechend dem Oberbegriff des Anspruchs 1.
  • Die Programmiersprache Python erfreut sich zunehmender Beliebtheit. Dabei kommen ihr vor allem ihre dynamische Typisierung, übersichtlicher Aufbau und umfassende Standard-Bibliothek zu Gute. Ein wiederkehrendes Problem ist die Weitergabe von Python Software. In vielen Fällen ist die Weitergabe des Quellcodes möglich und bei Open Source Projekten sogar beabsichtigt. Für kommerzielle Software kommt dies jedoch nicht in Frage. Die Weitergabe des kompilierten Bytecodes erscheint hier als eine ideale Lösung, da die .pyc Dateien für den Interpreter völlig transparent zum Quellcode-Modul verwendet werden können. Mit Hilfe kommerzieller Dienste wie decompyle kann jedoch aus Python Bytecode wieder der originale Quellcode hergestellt werden.
  • Da die Weitergabe von Python Quell- oder Bytecode die fertige Installation eines Python Interpreters auf der Zielplattform voraussetzt, wurden Tools entwickelt, die den Interpreter zusammen mit allen benötigten Modulen zusammen in eine einzelne ausführbare Datei packen. Für den Nutzer erscheint die Software dann wie gewünscht als eine „anzuklickende” Applikation. Da jedoch der Bytecode weiterhin in der ausführbaren Applikation enthalten ist, kann ebenso wie im vorangegangenen Abschnitt beschrieben der Quellcode extrahiert werden.
  • Eine weitere Möglichkeit, den Quellcode vor dem Nutzer zu verbergen, ist die direkte Übersetzung in eine nicht dekompilierbare Sprache wie C oder C++. Verschiedene Projekte wie PyPy oder Pyrex erreichen mit diesem Ansatz unter anderem deutliche Geschwindigkeitsverbesserungen gegenüber der Interpretation von Python Quellcode. Jedoch lassen sich dabei nicht alle Möglichkeiten, die die Sprache Python bietet, ausschöpfen. Der Umfang der erlaubten Konstrukte ist auf diejenigen beschränkt, die sich auch in einer statischen Programmiersprache abbilden lassen.
  • Vor dem Hintergrund dieser Probleme, haben wir eine Methodik entwickelt, die Python Bytecode Module automatisch in die Programmiersprache C Module übersetzt. Diese können dann jeweils in dynamisch gelinkte Bibliotheken kompiliert werden. Deren spezieller Aufbau versetzt den Python Interpreter in die Lage, sie transparent beim Importieren eines Moduls zu verwenden.
  • Die Vorteile dieses Verfahrens sind eine ähnlich hohe Sicherheit der Module vor einer möglichen Quellcode Rückgewinnung, wie direkt in C geschriebene Module. Zum anderen besteht eine nahezu vollständige Kompatibilität zwischen originalem und übersetztem Modul. Einige wenige Einschränkungen sind jedoch vorhanden. So ist es beispielsweise nicht möglich, für übersetzte Python Funktionen den Bytecode zu extrahieren (import dis), worin allerdings auch die Absicht unserer Software besteht.
  • Python Quellcode Module (Endung .py) werden vom Interpreter in ein Bytecode-Format kompiliert, welches dann Anweisung für Anweisung interpretiert wird. Zur späteren Benutzung wird der Bytecode eines Moduls in einer gleichnamigen .pyc Datei gespeichert (siehe 1).
  • Bei Weitergabe des kompilierten Bytecodes (Endung .pyc) kann der Interpreter diesen völlig transparent zum Quellcode Modul verwendet. Mit Hilfe kommerzieller Dienste wie decompyle kann jedoch aus Python Bytecode wieder der originale Quellcode hergestellt werden.
  • Dieses Problem der faktischen Offenlegung des Quellcodes bei Weitergabe des Bytecodes durch das neuartige Verfahren eliminiert, ohne die Nachteile der weiter oben genannten Verfahren aufzuweisen.
  • Üblicherweise werden Python Module vom CPython Interpreter in .pyc Bytecode Module übersetzt und danach von einem Bytecode Evaluator ausgeführt. Dieser ist auch in der CPython-Implementierung enthalten. Bei diesem Schritt werden viele der weiterführenden Konzepte von Python wie beispielsweise Klassen, Dekoratoren usw. auf ein einfacheres Stack Modell zurückgeführt.
  • Das folgende Code-Beispiel soll dies illustrieren:
    Figure 00020001
  • Eine Funktion a wird mittels des Moduls dis in seine Bytecode-Elemente zerlegt und entsprechend dargestellt. Dabei werden die beiden Argumente der Funktion mit dem Kommando LORD FAST auf den Stack gelegt. Der Befehl BINARY_ADD wiederum nimmt sich die beiden obersten Elemente des Stacks, addiert beide und legt das Ergebnis wieder auf den Stack. RETURN VALUE gibt den obersten Wert des Stack als Rückgabewert der gesamten Funktion zurück.
  • Die Erfindung besteht in einer speziellen Kompilierung des Python Codes in eine andere Sprache wie beispielsweise C. Dieser Ansatz bietet die gleiche Sicherheit wie die direkte Erstellung von kompilierten C Objekt Dateien.
  • Das Ausführen des Bytecode erfolgt in der Funktion PyEval_EvalFrameEx, welche in einer großen Case Anweisung für jeden Bytecode-Operator einige Zeilen C Code ausführt. Im gezeigten Beispiel sieht der Quellcode wie folgt aus:
    Figure 00020002
    Figure 00030001
  • Der tatsächliche Code in der Datei ceval.c sieht natürlich um einiges komplizierter aus, was auf vielfältige Optimierungen und Verwaltungscode zurückzuführen ist. Grundsätzlich wird in der Erfindung die Funktion a mit Hilfe eines Python Extension Moduls durch die folgende C-Funktion ersetzt:
    Figure 00030002
  • Die aufeinander folgenden sich gegenseitig aufhebenden Stack Operationen können dabei entfernt werden, was eine deutliche Optimierung gegenüber regulär ausgeführtem Bytecode darstellt. Der eigentliche Vorteil dieser Methode liegt allerdings in der Tatsache, dass eine solchermaßen kompilierte C Funktion wenig Angriffsfläche für eine Rückgewinnung des ursprünglichen Python Quellcodes bietet. Es können jedoch alle Features der Python Sprache komplett und sehr flexibel unterstützt werden. Eine weitere Stärke liegt darin, dass der C Kompiler beim Übersetzen einer solchen Funktion große Freiheit in der Anwendung von Optimierungen hat. Dies Optimierungen bieten dann nicht nur einen Geschwindigkeitsvorteil, sondern auch weitere Sicherheit gegenüber einer Dekompilation.
  • Das Verfahren entsprechend dieser Erfindung liest ein Python Modul im Bytecode ein und erstellt ein entsprechendes C Extension Modul, das genau dieselbe Funktionalität bietet, aber jedoch transparent gegen das ursprüngliche Python Modul austauschbar ist (siehe 2).

Claims (6)

  1. Verfahren zur Erzeugung von Kompilaten aus plattformunabhängigem Python Bytecode, dadurch gekennzeichnet, daß nativ kompilierte, d. h. plattformabhängige, dynamische Bibliotheken entstehen.
  2. Verfahren nach Anspruch 1, dadurch gekennzeichnet, daß die resultierenden Kompilate ohne den zugehörigen Quellcode ausgeliefert werden können.
  3. Verfahren nach Anspruch 1 oder 2, dadurch gekennzeichnet, daß die resultierenden Kompilate ohne den zugehörigen Bytecode ausgeliefert werden können.
  4. Verfahren nach einem der vorherigen Ansprüche, dadurch gekennzeichnet, daß die resultierenden Kompilate transparent in die bestehende Python Ausführungsumgebung eingebunden werden können, indem das zu schützende Python Modul durch die zugehörige dynamische Bibliothek ersetzt wird.
  5. Verfahren nach einem der vorherigen Ansprüche, dadurch gekennzeichnet, daß die resultierenden Kompilate die Rückgewinnung des zugrunde liegenden Python Quellcodes erschweren.
  6. Verfahren nach einem der vorherigen Ansprüche, dadurch gekennzeichnet, daß auf beliebige Plattformen, für die eine Python Implementierung existiert, übertragbar ist.
DE200910004276 2009-01-05 2009-01-05 Byte Coat: Nativer Bytcode Compiler für die Programmiersprache Python Withdrawn DE102009004276A1 (de)

Priority Applications (1)

Application Number Priority Date Filing Date Title
DE200910004276 DE102009004276A1 (de) 2009-01-05 2009-01-05 Byte Coat: Nativer Bytcode Compiler für die Programmiersprache Python

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
DE200910004276 DE102009004276A1 (de) 2009-01-05 2009-01-05 Byte Coat: Nativer Bytcode Compiler für die Programmiersprache Python

Publications (1)

Publication Number Publication Date
DE102009004276A1 true DE102009004276A1 (de) 2010-07-08

Family

ID=42234729

Family Applications (1)

Application Number Title Priority Date Filing Date
DE200910004276 Withdrawn DE102009004276A1 (de) 2009-01-05 2009-01-05 Byte Coat: Nativer Bytcode Compiler für die Programmiersprache Python

Country Status (1)

Country Link
DE (1) DE102009004276A1 (de)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105574368A (zh) * 2015-12-10 2016-05-11 华青融天(北京)技术股份有限公司 一种Python程序模块的安全调用方法和装置
CN106548046A (zh) * 2016-10-25 2017-03-29 北京深思数盾科技股份有限公司 一种保护代码的装置和方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
Anonymous: Code Morphing. Wikipedia 19.12.2008. www.wikipedia.org /w/index. php?title=Code_morphing&oldid=259017467, rech.a.14.08. 09 *

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105574368A (zh) * 2015-12-10 2016-05-11 华青融天(北京)技术股份有限公司 一种Python程序模块的安全调用方法和装置
CN105574368B (zh) * 2015-12-10 2018-05-04 华青融天(北京)技术股份有限公司 一种Python程序模块的安全调用方法和装置
CN106548046A (zh) * 2016-10-25 2017-03-29 北京深思数盾科技股份有限公司 一种保护代码的装置和方法
CN106548046B (zh) * 2016-10-25 2020-11-20 北京纬百科技有限公司 一种保护代码的装置和方法

Similar Documents

Publication Publication Date Title
DE69819188T2 (de) Programmschnittstellenumsetzer für rechner mit mehreren umgebungen
DE69735343T2 (de) System, Verfahren und Vorrichtung zum direkten Ausführen eines architekturunabhängigen binären Programms
DE69924857T2 (de) Programm-kode-umwandlung
DE69926602T2 (de) Hybrider Rechtzeitkompiler der minimale Betriebsmittel verwendet
EP3032408B1 (de) Verfahren zur erzeugung von lauffähigen applikationen mit dynamischen skalierbaren vektorgrafiken
DE4109258A1 (de) Verfahren zum umwandeln der hardwarekonfiguration einer programmierbaren verknuepfungssteuerung und des entsprechenden steuerprogramms zur verwendung bei einer zweiten programmierbaren verknuepfungssteuerung
EP2332042A1 (de) Verfahren und vorrichtung zum austauschen einer komponente eines computersystems
CN103942086A (zh) 基于aadl的创建、分析和仿真混成系统模型的方法
DE102009004276A1 (de) Byte Coat: Nativer Bytcode Compiler für die Programmiersprache Python
WO2007025557A1 (de) Migration und transformation von datenstrukturen
EP1197848A2 (de) Verfahren zur automatischen Erzeugung von Programmcode
EP2965199A1 (de) Verfahren zur überprüfung und/oder transformation eines computerprogramms mit statischen funktionen erster klasse
EP1010070B1 (de) Verfahren zum umsetzen eines objektcodes in einen programmcode
WO2017186469A1 (de) Sprachgesteuertes system
DE102009041098A1 (de) Verfahren zur Kennzeichnung eines in einem Computerspeichersystem enthaltenden Computerprogrammabschnitts
EP0990203B1 (de) Verfahren zum steuern einer datenverarbeitungsanlage
EP2757466B1 (de) Computerimplementiertes Verfahren zum Generieren von Computerprogrammcode
DE102019214273A1 (de) System und Verfahren zum Bereitstellen einer digitalen Nachbildung einer Anlage und entsprechendes Computerprogrammprodukt
Zundorf et al. Explaining business process software with fulib-scenarios
DE102018129354A1 (de) Verfahren zum Bearbeiten von Anwendungsprogrammen auf einem verteilten Automatisierungssystem
Almonaies et al. A framework for migrating web applications to web services
Hřivnáčová Integration of g4tools in Geant4
EP1959430A2 (de) Verfahren zur automatischen Generierung von VoiceXML-sprachapplicationen aus Sprachdialogmodellen
DE19617719A1 (de) Verfahren zur Programmübersetzung eines in der Programmiersprache C++ geschriebenen Programms
Kaegi Risk analysis of information systems by agent-based modeling of business processes

Legal Events

Date Code Title Description
OM8 Search report available as to paragraph 43 lit. 1 sentence 1 patent law
R119 Application deemed withdrawn, or ip right lapsed, due to non-payment of renewal fee

Effective date: 20110802