Cpython? Unglaublich?!!

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
BlackJack

Mittwoch 26. November 2008, 21:18

@Leonidas: Phobos, die Bibliothek vom D-Erfinder, fühlt sich eher wie C an, also mehr Funktionen als Klassen, während Tango mehr in Richtung C++ geht und mehr über Klassen löst. Allerdings nicht alles, also nicht so extrem wie bei Java. :-)

Das Problem ist, dass Phobos und Tango nicht so ganz kompatibel sind, weil in Phobos auch die Laufzeitbibliothek der Sprache steckt. Also kann man sich nur entscheiden eine der beiden Bibliotheken zu verwenden. Bei D 2.0 wird die Laufzeitbibliothek in eine eigene Bibliothek rausgezogen.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Mittwoch 26. November 2008, 21:22

BlackJack hat geschrieben:@Leonidas: Phobos, die Bibliothek vom D-Erfinder, fühlt sich eher wie C an, also mehr Funktionen als Klassen, während Tango mehr in Richtung C++ geht und mehr über Klassen löst. Allerdings nicht alles, also nicht so extrem wie bei Java. :-)
Phobos is auch viel besser, finde ich. Tango wirkt ein wenig... kompliziert des kompliziert seins wegen.... So wie C++-Programmierer manchmal sind.

Naja, mit D 2.0 kann man beide Bibltiotheken quasi parallel nutzen, wegen dem eben genannten.
OverNord
User
Beiträge: 72
Registriert: Donnerstag 24. Januar 2008, 11:59
Kontaktdaten:

Mittwoch 26. November 2008, 21:32

Leonidas hat geschrieben:
BlackVivi hat geschrieben:Unausgereift o_o? Wieso ._.
Also ich habe durchaus Leute über die Compiler meckern hören, weiß aber nicht ob es DMD oder GDC war.
Ich hab mal irgendwo gelesen das GDC noch recht unausgereift sei. Über DMD kann ich mich persönlich nicht beschweren.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 26. November 2008, 21:49

Ob A, B, C oder D. Egal. Wie helfen diese Sprachen konkret, einen Python-Interpreter im Vergleich zum Original zu schreiben? Ich habe kurz auf die Seite von D geschaut und keine detaillierten Informationen zum D-GC gefunden. Ist dieser "state of the art" und vergleichbar zu dem, was in der JVM steckt? Ist es ein konservativer oder ein exakter GC? Welche Algorithmen benutzt er? Ist er threadsafe? Die Güte des GC wäre aber IMHO ein wesentlicher Faktor. Bei Java weiß ich, dass er gut ist. Bei Squeak als Basis wäre er auch okay. Ebenso bei C#.

Klammern wir einmal das Problem, Python-Quelltext zu lesen, zu parsen und in einen abstrakten Syntaxbaum umzuwandeln aus. Wie sähe die Repräsentation der Python-Objekte im Laufzeitsystem aus? Wie sähe der Bytecode-Interpreter aus? Könnte man einen JIT der implementierenden Sprache nutzen? Was kostet Laufzeit? Was spart sie? Welchen Overhead hätte man - wenn überhaupt - gegenüber der C-Version?

In Java könnte ein Ausschnitt so aussehen:

Code: Alles auswählen

abstract class PyValue {
    public PyStr __str__(PyRuntime rt) {
        throw UnsupportedOperationException();
    }
}

class PyInt extends PyValue {
    private int value;
    
    public PyStr __str__(PyRuntime rt) {
        new PyStr(String.valueOf(value));
    }
}

class PyStr extends PyValue {
    private String value;
    
    public PyStr __str__(PyRuntime rt) {
        return this;
    }
}

class PyInstance extends PyValue {
    private PyClass __class__;
    private PyDict __dict__;
    
    public PyStr __str__(PyRuntime rt) {
        PyValue v = __class__.__str__method;
        if (v != null) {
            return v.__call__(rt);
        }
        return __repr__(rt);
    }
}
Ich nutze Unterklassen einer abstrakten Oberklasse PyValue, um alle Objekte zu repräsentieren. PyValue kennt alle wesentlichen Methoden - ein Workaround, damit ich bei Java nicht laufend casten muss. Mein Ansatz ist übrigens zu naiv für Python > 1.5. Dort muss man auch noch die Metaebene modellieren. Jede Funktion wie __str__ wird da zu einer Klasse. Dafür könnte man in Java aus dem AST direkt Java-Bytecode erzeugen und von dem JIT der JVM profitieren.

Nachteil ist, dass man überall und in wirklich jeder Methode eine Referenz auf das Laufzeitsystem mitschleppen muss, wo Frame-Objekte verwaltet werden, damit man auf globals() und locals() zugreifen kann. Diese Frames kosten extrem Zeit und hier wäre eine Unterstützung durch das Java-Laufzeitsystem hilfreich - geht natürlich nicht, weil man an deren Stackframes nicht heran kommt.

Stefan
BlackJack

Donnerstag 27. November 2008, 12:07

@sma: Ich denke nicht, dass sich BlackVivi so tiefgreifende Gedanken darüber gemacht hat. Der Gedankengang ist eher: D ist fast wie C, dass heisst es sollte nicht sooo schwer sein, den aktuellen C-Quelltext nach D zu portieren. Wie schwer das wirklich ist, wage ich nicht abzuschätzen, denn der Teufel steckt da sicher im Detail.

Und dann könnte man theoretisch anfangen den "fast C"-D-Quelltext einfacher zu gestalten, in dem man die Spracheigenschaften von D ausnutzt, wie zum Beispiel Objektorentierung, dass "Dictionaries" in der Sprache schon vorhanden sind usw.

Der GC ist implementierungsabhängig, AFAIK benutzt der `gdc` den Boehm-GC.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Donnerstag 27. November 2008, 14:56

@BlackJack: Genau. Und wenn man dann irgendwo'n Flaschenhalt hat, braucht man nicht im... eher schwer wirkenden (zumindest für mich) C den zu schreiben, sondern man kann ihn einfach in D schreiben und dabei sogar objektorientiert bleiben, Dicts verwenden usw...
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 27. November 2008, 18:16

BlackVivi hat geschrieben:Und wenn man dann irgendwo'n Flaschenhalt hat, braucht man nicht im... eher schwer wirkenden (zumindest für mich) C den zu schreiben,
...sondern kann wie jeder vernünfigte Programmierer gleich auf Assembler zurückgreifen. Ja, genau :twisted:

SCNR
My god, it's full of CARs! | Leonidasvoice vs Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Donnerstag 27. November 2008, 19:51

BlackJack hat geschrieben:@sma: Ich denke nicht, dass sich BlackVivi so tiefgreifende Gedanken darüber gemacht hat.

Ich dachte, es geht darum, welche Sprache besser geeignet wäre, einen Python-Interpreter zu bauen. Da muss man sich doch überlegen, was man wie am besten realisiert.
BlackJack hat geschrieben:Der Gedankengang ist eher: D ist fast wie C, dass heisst es sollte nicht sooo schwer sein, den aktuellen C-Quelltext nach D zu portieren.
Wenn sich die Sprachen so ähnlich sind, scheint es mir wenig nützlich. Daher nochmal die Frage: Was würde man gewinnen? Mehr ein ein bisschen syntaktischen Zucker?

Wenn D den böhm-gc benutzt, der AFAIK ein konservativer mark&sweep GC ist, dann ist das nix dolles. Da hätte ich mit anderen Sprachen wie Squeak, Java und bestimmt den meisten Lisp/Scheme-Systemen etwas moderneres.
BlackJack hat geschrieben:dass "Dictionaries" in der Sprache schon vorhanden sind usw.
Das könnte sich nicht unbedingt lohnen. Die dict-Version von C-Python ist sehr gut. Mein naiver Python 1.5-Interpreter in Java nutzt einfach Javas HashMap und das Ding ist langsamer. War aber zu faul, den dict-Algorithmus von Python zu verstehen oder auch nur anzuschauen.

Stefan
Lufia
User
Beiträge: 83
Registriert: Samstag 13. Mai 2006, 10:04
Wohnort: Berlin

Freitag 28. November 2008, 09:36

Erstmal vielen Dank für die zahlreiche Informationen! Ich persönlich habe das problem das ich etwas python verwöhnt bin.

Leider sind die Programme die wir hier an der Uni nutzen und weiterentwickeln in C/C++ geschrieben. Das liegt zum einen an der Historie und zum anderen an der Performance. Ich finde das immer einen Graus sich in C reinzudenken, vor allem weil python dagegen so schön einfach ist. Daher fand ich es so unglaublich das man mit soetwas wie C so was tolles wie python machen kann :wink:

Ich hoffe einfach das python immer schneller wird und im Vergleich zu C/C++ noch etwas aufholt. Klar kann man Code auch in andere Sprachen wie C auslagern. Aber ich habe dabei immer etwas das Gefühl das man leicht dazu übergeht vorhandenen Bibliotheken, etc. einfach zu nutzen und die Wartung des Codes dann ziemlich problematisch ist. Zum einen ist der Mensch faul und macht lieber alles in python, zum anderen kann der einfache Nutzer wie ich zum Besipiel nicht ohne weiters den C Code verbessern und passend neu übersetzen falls Erweiterungen/Verbesserungen notwendig sind. Klar mit Ctypes schaffe ich es dank des tollen Forums hier auch noch eine C-Funktion anzusprechen, aber ein komplexes C++ Programm/Klassen etc. von Python aus zu nutzen scheint mir viel zu kompliziert, vor allem als C++ newbie.
Antworten