Übersetze algorithmisches C nach Python

9

Ich möchte etwas C-Code in Python-Code oder Bytecode übersetzen. Der C-Code in Frage ist, was ich algorithmisch nennen würde: Plattform-unabhängig, keine I / O, nur Algorithmen und In-Memory-Datenstrukturen.

Ein Beispiel wäre eine Bibliothek für reguläre Ausdrücke. Das Übersetzungstool würde den Bibliotheksquellcode verarbeiten und ein funktional äquivalentes Python-Modul erzeugen, das in einer sandboxed Umgebung ausgeführt werden kann.

Welche spezifischen Ansätze, Werkzeuge und Techniken können Sie empfehlen?

Hinweis: Python C-Erweiterung oder Ctypes ist keine Option , da die Umgebung sandboxed ist.

Noch eine Anmerkung : Es sieht so aus, als gäbe es einen C-to-Java-Bytecode-Compiler kompiliert libjpeg nach Java. Ist Java Bytecode + VM zu verschieden von CPython Bytecode + VM?

    
Constantin 25.09.2008, 09:56
quelle

9 Antworten

12

Es gibt ehrlich gesagt keinen Weg, C mechanisch und bedeutungsvoll zu Python zu übersetzen, ohne eine wahnsinnige Leistungseinbuße zu erleiden. Wie wir alle wissen, ist Python nicht annähernd C-Geschwindigkeit (mit aktuellen Compilern und Interpretern), aber schlimmer als das ist, was C gut ist (Bit-Fiddling, Integer-Mathematik, Tricks mit Speicherblöcken) Python ist sehr langsam bei, und was Python gut ist, kann man nicht direkt in C ausdrücken. Eine direkte Übersetzung wäre daher bis zur Absurdität besonders ineffizient.

Der viel, viel bessere Ansatz im Allgemeinen ist in der Tat, das C das C zu behalten und es in ein Python-Erweiterungsmodul einzubinden (mit SWIG , Pyrex , Cython oder einen Wrapper manuell schreiben ) oder die C-Bibliothek direkt aufrufen mit Dateien . Alle Vorteile (und Nachteile) von C für das, was bereits C ist oder das du später hinzufügst, und all die Bequemlichkeit (und Nachteile) von Python für jeden Code in Python.

Das wird Ihre Sandboxing-Anforderungen nicht befriedigen, aber Sie sollten erkennen, dass Sie Python sowieso nicht besonders gut packen können; Es braucht viel Aufwand und Modifikation von CPython, und wenn Sie ein kleines Loch irgendwo vergessen, ist Ihr Gefängnis kaputt. Wenn Sie Python sandboxen möchten, sollten Sie mit dem Sandboxing des gesamten Prozesses beginnen, und dann können C-Erweiterungen auch Sandboxing erhalten.

    
Thomas Wouters 25.09.2008 10:12
quelle
4

verwenden Sie Einzug (1) und ctopy (1) ... für zusätzliche Kredit-Test-Geschwindigkeiten auf Pypy ... für Bonus-Kredit-Nutzung Pyastra, um Assembly-Code zu generieren.

Unabhängig von der Sprache müssen Sie immer Speicherausgaben verschiedener Konstrukte und Funktionen zwischen Laufzeitbereich (CPU) oder Speicherbereich (RAM) opfern.

Sieh dir das tolle Sprach-Shootout an, wenn du sehen willst, worüber ich rede, so ist das zu viel comp sci snobbery ...

Hier ist ein Beispiel, möchten Sie Fließkomma-Mathematik ohne Gleitkommazahlen verwenden?

%Vor%

Bleib nicht hängen, werde primal, benutze Höhlenmenschen, wenn du musst.

    
John S 28.07.2011 11:09
quelle
3

Der schnellste Weg (in Bezug auf Programmiereraufwand, nicht Effizienz) würde wahrscheinlich beinhalten, einen existierenden Compiler zu verwenden, um C zu etwas Einfachem (zum Beispiel LLVM) und entweder:

zu kompilieren
  • interpretiere das in Python (exorbitante Leistungsstrafe)
  • übersetze das in Python (große Leistungsstrafe)
  • übersetze das in Python-Bytecode (große Leistungseinbuße)

Das direkte Umwandeln von C in Python ist möglich (und führt wahrscheinlich zu schnellerem Code als die obigen Ansätze), aber Sie würden im Wesentlichen ein C-Compiler-Backend schreiben, was eine große Aufgabe ist.

Edit, nachträglicher Einfall: Ein vielleicht noch schnellerer Weg ist, den Syntaxbaum für den C-Code zu verwenden, diesen in eine Python-Datenstruktur umzuwandeln und diese in Python zu interpretieren.

    
Rafał Dowgird 25.09.2008 10:25
quelle
1

Schreiben Sie einen C-Interpreter in reinem Python? ; -)

    
theller 23.04.2009 17:51
quelle
0

Warum nicht den C-Code beibehalten und ein Python C-Modul erstellen , das in eine laufende Version importiert werden kann? Python-Umgebung?

    
jk. 25.09.2008 10:00
quelle
0

Zuerst würde ich in Erwägung ziehen, die vorhandene C-Bibliothek mit Pythonic-Güte zu umhüllen, um eine API in Form eines Python-Moduls bereitzustellen. Ich würde mir Swig, Ctypes, Pyrex und was auch immer dort draußen ist ansehen. Die C-Bibliothek selbst würde dort unverändert bleiben. Spart Arbeit.

Aber wenn ich wirklich den originalen Python-Code basierend auf dem C schreiben müsste, würde ich kein Tool verwenden, nur mein Gehirn. C erlaubt zu viele lustige Tricks mit Zeigern, cleveren Dingen mit Makros usw., dass ich einem automatisierten Werkzeug niemals trauen würde, selbst wenn jemand es mir gezeigt hätte.

Ich habe Pyrex erwähnt - das ist eine Sprache, die ähnlich wie C aber auch Python orientiert ist. Ich habe nicht viel damit gemacht, aber es könnte einfacher sein, als reines Python zu schreiben, vorausgesetzt, Sie beginnen mit C als Leitfaden.

Die Konvertierung von engeren, zahmeren Sprachen wie IDL (die Datensprachen, die Wissenschaftler gerne benutzen, nicht die andere IDL) ist schwierig und erfordert manuelle und mentale Anstrengungen. C? Vergiss es, bis die UFO-Leute uns ihre schicken Software-Tools geben, die unserem Stand der Technik tausend Jahre voraus sind!

    
DarenW 25.09.2008 10:07
quelle
0

Jede automatische Übersetzung wird leiden, wenn Sie nicht die Macht von Python nutzen. C-type prozeduraler Code würde sehr langsam laufen, wenn er direkt in Python übersetzt würde, müssten Sie ganze Abschnitte profilieren und durch mehr Python-optimierten Code ersetzen.

    
paxdiablo 25.09.2008 10:16
quelle
0

Ich würde persönlich ein Tool verwenden, um ein Uml-Sheme aus dem C-Code zu extrahieren, und es dann verwenden, um Python-Code zu generieren.

Von diesem Squeleton fange ich an, die unvergänglichen C-Stil-Strukturen loszuwerden und dann fülle ich die Methoden mit Python-Code.

Ich denke, es wäre der sicherere und gleichzeitig effizienteste Weg.

    
e-satis 25.09.2008 20:29
quelle
-1

Sie können den C-Code immer kompilieren und die Bibliotheken mit Ctypes in Python laden.

    
Sridhar Iyer 25.09.2008 18:52
quelle