Python to C Converter

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

Darii hat geschrieben:
LanX hat geschrieben:ich kenne das Thema aus Perl boards, das Hauptproblem ist die dynamische Typisierung von Scriptsprachen.
Die dynamische Typisierung an sich ist da eher das kleinere Problem. Problematisch ist eher Python selbst. Das ist selbst einfach zu dynamisch, so dass ein Attributzugriff zwangsläufig immer ziemlich teuer ist.
yup aber hier müsste man klar definieren was man umsetzen will und zu welchen Kosten.

Das man das komplette Python mitschleppen muss um alle Fälle abzudecken ist ja logisch, ginge es mit weniger wär ja auch der Interpreter schlanker(!).
Auch braucht man höhere Features wie Speicherverwaltung und Garbage Collection. Das sind jetzt aber primär Speicherkosten.

Die Typisierung schlägt sich aber in Laufzeitkosten nieder, und die 100%ige automatische Vorweg-Bestimmung des statischen Typs ist nicht trivial, da bräuchte man Heuristiken einer erschreckenden KI um ansatzweise zufrieden zu sein.

Heutzutage löst man sowas mit JIT compilern - also während der Laufzeit - JS ist da schon sehr weit, siehe chrome.

Nun zum WAS... also wann will man aber sinnvollerweise ein Script schreiben dass zu C konvertiert wird?

Ich denke da eher an rechenintensive Algorithmen wie z.B. Mandelbrotmengen zu berechnen, wo man vielleicht nur wenige Py-Core-funktionen für Ein und Ausgabe mitzuschleppen.

Der Vorteil wäre hier, dass man nicht in C umdenken muss und in Py seine Algos prototypen und testen könnte.

Generell muss man aber sagen, dass es sinnvoller ist gleich den ganzen Interpreter (Python,Perl,Ruby,...) mitzuschleppen (Speicher ist selten ein problem) und zeitintensive Routinen gleich als C-Extensions zu realisieren. Und dafür ist Cython als Brückensprache gedacht.
Zuletzt geändert von LanX am Freitag 23. Juli 2010, 13:42, insgesamt 1-mal geändert.
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

burli hat geschrieben:
Darii hat geschrieben: @burli: Wenn dann musst du schon das statisch typisierte Cython nehmen, das ist nur C mit anderer Syntax.
Ich hätte es eher mit Pascal verglichen
Du musst Semantik von Syntax trennen, Semantisch ist es C aber mit Python Syntax die wiederum natürlich bei Modula (und Pascal) angelehnt ist.

deswegen "C mit anderer Syntax".
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

LanX hat geschrieben:Heutzutage löst man sowas mit JIT compilern - also während der Laufzeit - JS ist da schon sehr weit, siehe chrome.
Jit ist ja nichts neues und wie ich schon schrieb, es gibt ja PyPy. JS find ich persönlich eher abstoßend. Der Sprache fehlt der rote Faden.
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

Darii hat geschrieben:
LanX hat geschrieben:Heutzutage löst man sowas mit JIT compilern - also während der Laufzeit - JS ist da schon sehr weit, siehe chrome.
Jit ist ja nichts neues und wie ich schon schrieb, es gibt ja PyPy.
Ja aber JS ist extrem kompact und erweiterbar, dass macht die Implementierung und Optimierung auch so einfach.

Laut WP ist PyPy nicht wirklich schneller als CPython, während V8 abgeht wie ein geöltes Zäpfchen.
Darii hat geschrieben:JS find ich persönlich eher abstoßend.
Geschmacksache, ich sattle mir immer drauf was mir fehlt. Prototypische Vererbung machts möglich...

Das einzige was ich aktiv kenne, was JS in Bezug auf Kompaktheit und Erweiterbarkeit schlägt ist LISP...
Darii hat geschrieben: Der Sprache fehlt der rote Faden.
Roter Faden = "There is only Guido's way to do it" ??? ;-)
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Ich denke, die einzig sinnvolle Möglichkeit für mich ist Python on a Chip
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

burli hat geschrieben:Ich denke, die einzig sinnvolle Möglichkeit für mich ist Python on a Chip
und übergangsweise BASIC on a Chip? Gibt's schon seit 20 Jahren...

SCNR xD
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

LanX hat geschrieben:und übergangsweise BASIC on a Chip? Gibt's schon seit 20 Jahren...

:-P
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

LanX hat geschrieben:Laut WP ist PyPy nicht wirklich schneller als CPython, während V8 abgeht wie ein geöltes Zäpfchen.
PyPy ist bis zu 12x schneller als CPython, "nicht wirklich schneller" sieht anders aus.
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

DasIch hat geschrieben:
LanX hat geschrieben:Laut WP ist PyPy nicht wirklich schneller als CPython, während V8 abgeht wie ein geöltes Zäpfchen.
PyPy ist bis zu 12x schneller als CPython, "nicht wirklich schneller" sieht anders aus.
Nun ich schrieb "laut WP"... vielleicht solltest du die Seite anpassen und mit Referenzen anreichern?
Es ist jedoch anzumerken, dass die Benchmarks so ausgewählt wurden, dass man ein gutes Abschneiden PyPys erwarten konnte. Im Allgemeinen ist PyPy nach wie vor langsamer als CPython (Stand März 2008).
BlackJack

@LanX: Fehlender roter Faden bei JavaScript wäre zum Beispiel die Vererbung. Das was da von der Sprache "vorgesehen" ist und die 1000 verschiedenen Arten mit jeweils ihren eigenen Macken wie da jeder dann drumherum programmiert finde ich erschreckend. Benutze in einem Projekt 3 grössere Bibliotheken und Du hast drei verschiedene Vererbungsmodelle im Programm. Plus dem Eigenen vielleicht noch.
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

@BlackJack: Kann ich nachvollziehen, JS hat ein paar Designfehler ¹ aber Crockford listed m.E. ein paar sehr gute Workarounds auf. (wobei ich sein Buch nicht mag)

LISP Macros wären dafür schön.... Aber zugegeben letztendlich braucht man eine Metasprache die in JS umgesetzt wird.

Minimalismus hat halt seine Nachteile, aber der Vorteil ist, dass es jetzt wohl die Plattformmäßig die meistverbreitete Sprache ist und sowas wie ein JIT-Compiler wie es scheint viel einfacher umzusetzen ist.

Ich brauch mir z.B. für kleine Anwendungen auch keinen Kopp zu machen ob mein Smartphone Android oder IPhone OS hat, DHTML kann ich heutzutage fast überall fahren.

OTOH gibts Sachen die in JS konsequenter umgesetzt sind als in Python, z.B. keine eingeschränkten Lambdas oder richtige Closures.

Das dich die "Flexibilität" des OO-Models nervt erklärt sich wohl auch aus deiner Python Herkunft, wenn man von Perl kommt, wie ich ist man TIMTOWTDI gewöhnt...roter Faden ist dann halt Guido's World.

1) konkret es fehlen einfach noch 2-3 Kommandos/Flags, z.B. damit man einfach durch ein Hash iterieren kann OHNE die gerbten Methoden aufzulisten.
Zuletzt geändert von LanX am Freitag 23. Juli 2010, 16:25, insgesamt 1-mal geändert.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

BlackJack hat geschrieben:Benutze in einem Projekt 3 grössere Bibliotheken und Du hast drei verschiedene Vererbungsmodelle im Programm. Plus dem Eigenen vielleicht noch.
Deswegen nutzt man ein Framework wie jQuery und wenn man mehr braucht nutzt man Plugins.
lunar

@LanX: "Flexibilität" ist auch in Programmen kein Selbstzweck, sondern nur gut, wenn sie einem Zweck dient. Bei einem Vererbungsmechanismus ist das nicht unbedingt sinnvoll.

@DasIch: Das funktioniert nur, wenn man absolute Kontrolle über Umgebung und Projekt hat. Und wie oft ist das in der Realität schon der Fall?
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

lunar hat geschrieben:@LanX: "Flexibilität" ist auch in Programmen kein Selbstzweck, sondern nur gut, wenn sie einem Zweck dient. Bei einem Vererbungsmechanismus ist das nicht unbedingt sinnvoll.
@lunar: Prototypische Vererbung ist ziemlich simpel und klar definiert, alles anderen Vererbungsmechanismen sind von Modulautoren draufgesattelt, die es gerne wie zu Hause haben wollen (meistens ist Java=Daheim)

Auch kann man auch mit Closures in JS viel weiter kommen, wo man in Python zu umständlicherer OOP gezwungen wird.

Ist das dann noch ein NPOV? Ich meine, weil nicht py-mäßig ist, ist es nicht unbedingt schlechter...

Aber hier prallen IMHO auch die unterschiedlichen Paradigmen von Perlern und Pythonistas aufeinander...TIMTOWTDI.
problembär

LanX hat geschrieben:ich kenne das Thema aus Perl boards, das Hauptproblem ist die dynamische Typisierung von Scriptsprachen.
Ja:

http://www.perl.com/pub/2001/06/27/ctoperl.html

Dürfte für Python entsprechend gelten.
BlackJack

@LanX: Das JavaScript die meistverbreitete Sprache ist, halte ich für ein Gerücht -- jedenfalls wenn man da nicht noch Einschränkungen bei dieser Annahme macht. Überleg einfach mal wieviel mehr Embedded-Systeme in allen möglichen "intelligenten" Geräten -- von der Waschmaschine bis zum Auto stecken -- im Gegensatz zu den "paar" Rechnern mit Web-Browsern. ;-)

Python hat richtige Closures. Seit ``nonlocal`` auch welche, die semantisch wie bei JavaScript benutzt werden können, aber auch ohne sind das richtige Closures.

Die "Flexibilität" des OO-Models nervt mich nicht wegen der Python-"Vorbelastung" sondern weil ich sowohl bei Scheme als auch bei JavaScript schon die "Freuden" von mehreren Modellen in einem Projekt "geniessen" durfte. Das macht keinen Spass. Zumal das was man so im allgemeinen als den "vorgesehenen" Weg präsentiert bekommt 1. syntaktisch ziemlich blöd aussieht und 2. mit dem "leeren" Exemplar der Basisklasse als Prototyp IMHO ziemlich hässlich ist, weil man den Konstruktor ja so schreiben muss, dass man ihn auch komplett ohne Argumente aufrufen kann.

Schöne und einfache prototypische Vererbung hat zum Beispiel Io. Dagegen sieht der JavaScript-Krampf hässlich wie die Nacht aus.

JavaScript hat ein paar nette Grundgedanken, aber wenn ich das nächste mal damit etwas machen muss, werde ich das wohl über CoffeeScript in Angriff nehmen. Und das nicht nur weil die Sprache ein Vererbungssystem vorgibt (mit denen von Bibliotheken muss man sich im Ernstfall ja trotzdem rumschlagen).
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

LanX hat geschrieben:Ja aber JS ist extrem kompact und erweiterbar, dass macht die Implementierung und Optimierung auch so einfach.

Laut WP ist PyPy nicht wirklich schneller als CPython, während V8 abgeht wie ein geöltes Zäpfchen.
Wie schon erwähnt, funktioniert der JIT inzwischen soweit, dass PyPy fast immer deutlich schneller als CPython ist. Aktuelle Zahlen: http://speed.pypy.org/
Darii hat geschrieben:JS find ich persönlich eher abstoßend.
Geschmacksache, ich sattle mir immer drauf was mir fehlt. Prototypische Vererbung machts möglich...
Das ist das Problem. Jede umfangreichere Bibliothek implementiert eigene Vererbungsmechanismen. D.h. man darf die Sprache für jede Bibliothek neu lernen. Und wenn schon prototypenbasiert dann bitte Self.
Darii hat geschrieben: Der Sprache fehlt der rote Faden.
Roter Faden = "There is only Guido's way to do it" ??? ;-)
Würde nicht schaden.

Was ich hauptsächlich störend finde sind die seltsame Syntax zur Definition von Objekten, die dieses eigentlich völlig überflüssige new-Schlüsselwort erfordert. Das seltsame this, auf das man sich nicht verlassen kann (var self = this *hust*). Und die umständliche Scoping-Regel, der man zu verdanken hat, dass man vor praktisch jede Variable var schreiben muss. Die Zahl der Prototypen ist natürlich auch nur auf einen beschränkt. Und die Möglichkeit ein Programm gescheit in mehrere Dateien aufzuteilen und somit etwas zu strukturieren fehlt auch völlig. Da braucht man dann wieder zusätzliche Software (sprich: Präprozessoren).
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

BlackJack hat geschrieben: 2. mit dem "leeren" Exemplar der Basisklasse als Prototyp IMHO ziemlich hässlich ist, weil man den Konstruktor ja so schreiben muss, dass man ihn auch komplett ohne Argumente aufrufen kann.
Musst du in Python bei Mehrfachvererbung eigentlich auch machen, sonst knallt u.U. super irgendwo.
BlackJack

@Darii: Ich verwende weder Mehrfachvererbung noch `super()`. Höchstens mal "Mixin"-Klassen, aber das auch sehr selten.
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

BlackJack hat geschrieben: Überleg einfach mal wieviel mehr Embedded-Systeme in allen möglichen "intelligenten" Geräten -- von der Waschmaschine bis zum Auto stecken -- im Gegensatz zu den "paar" Rechnern mit Web-Browsern. ;-)
Tatsächlich! Nächstes mal wenn ich mich auf meiner Waschmaschine oder Auto einlogge werde ich besser drauf achten in welcher Sprache ich progge... ;-)
BlackJack hat geschrieben:Python hat richtige Closures. Seit ``nonlocal`` auch welche, die semantisch wie bei JavaScript benutzt werden können, aber auch ohne sind das richtige Closures.
Soso, und mit nonlocal werdens dann "richtigere" Closures ... :-P
BlackJack hat geschrieben:Die "Flexibilität" des OO-Models nervt mich nicht wegen der Python-"Vorbelastung" sondern weil ich sowohl bei Scheme als auch bei JavaScript schon die "Freuden" von mehreren Modellen in einem Projekt "geniessen" durfte.

Es hat sich leider (noch) kein einheitliches Best Practice durchgesetzt, das hat viele Gründe, siehe The World's Most Misunderstood Programming Language

Meine Aussage war aber dass JS trotzdem einfach zu erweitern ist und gleichzeitig der Kern trotzdem wg seiner Kompaktheit einfach zu implementieren und zu tunen ist.
BlackJack hat geschrieben: Das macht keinen Spass.
Also die Notwendigkeit eines Hash-Objektes in Prototype.js finde ich in der Tat verwirrend. Es ist halt leider Designfehler dass man bei vererbten Methoden keine Spezialflags setzen kann - wie z.B. mit "isEnumerable" vorhanden - setzen kann.

Aber, hei ...andere Sprachen verzichten dafür darauf rechtzeitig "nonlocal" einzuführen, und vertrösten auf die nächste Hauptversion... shit happens :)

BlackJack hat geschrieben: Zumal das was man so im allgemeinen als den "vorgesehenen" Weg präsentiert bekommt 1. syntaktisch ziemlich blöd aussieht und 2. mit dem "leeren" Exemplar der Basisklasse als Prototyp IMHO ziemlich hässlich ist, weil man den Konstruktor ja so schreiben muss, dass man ihn auch komplett ohne Argumente aufrufen kann.

Schöne und einfache prototypische Vererbung hat zum Beispiel Io. Dagegen sieht der JavaScript-Krampf hässlich wie die Nacht aus.
Auch hier verweise ich gerne auf Crockford http://javascript.crockford.com/prototypal.html.

Io kenne ich nicht aktiv... Aber Interessant, eine Sprache die trotz M-Expressions Macros beherrscht hört sich tatsächlich faszinierend an.

Allerdings wo komme ich damit in Berührung? Etwa in meiner Waschmaschine... ;-)
BlackJack hat geschrieben:JavaScript hat ein paar nette Grundgedanken, aber wenn ich das nächste mal damit etwas machen muss, werde ich das wohl über CoffeeScript in Angriff nehmen.
Interessant http://jashkenas.github.com/coffee-script/ ....

Meine Vision geht aber eher dahin ein zurechtgestutztes Perl einzusetzen, >95% der JS Semantik (inkl Objektmodell) ließe sich bereits heute 1:1 abbilden.

Die restlichen 5% sind das -ähm - unorthodoxe scopingverhalten von var und Details bei der Typkonversionen...

In Perl hätte ich dann dank expliziten concat operators auch explizit die Möglichkeit zwischen 1+0 und "1"+"0" zu unterscheiden.

PS: Kann man in diesem PHP Board eigentlich den Teilthread über JS absplitten, mit C hats ja nur noch bedingt zu tun...
Antworten