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.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

LanX hat geschrieben:Ah stimmt, jetzt sind es drei. Danke!
Soll ich jetzt Erbsen zählen? Ab wieviel Sprachen ist es genug Mainstream dass ich deswegen JS kritisieren darf?

Du hast bis jetzt BASIC und Perl angeboten. Ich lege gnädiger Weise nochmal Lua drauf, also haben wir bis jetzt Gleichstand. ;)
Also, meine Aussage war dass das JS einen sehr flexiblen Kern bildet mit dem beliebig komplexe Pattern abgebildet werden können.
Hat ja niemand bestritten. Kann man aber mit jeder anderen Turing-vollständigen Sprache auch machen.
Die Tatsache dass so viele XYZ to JS Projekte (XYZ=Python hab ich bereits gelistet) spricht m.E. für diese These.
M.E. spricht das maximal dafür, dass JS nicht so toll ist und man das deswegen nicht anfassen möchte. ;) Der eigentliche Grund wird aber sein, dass man seine Anwendung nicht in mehreren Sprachen entwickeln möchte etc., siehe auch GWT.
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

Darii hat geschrieben:Zitat:
Lanx hat geschrieben:Also, meine Aussage war dass das JS einen sehr flexiblen Kern bildet mit dem beliebig komplexe Pattern abgebildet werden können.
Hat ja niemand bestritten. Kann man aber mit jeder anderen Turing-vollständigen Sprache auch machen.
doch leider ich

Soweit ich das im Kopf habe ist JS klassenlos.
http://de.wikipedia.org/wiki/JavaScript hat geschrieben:Der als ECMAScript (ECMA 262) standardisierte Sprachkern von JavaScript beschreibt eine moderne, schlanke, dynamisch typisierte, objektorientierte, aber klassenlose Skriptsprache
Nach meiner Auffassung brauche ich für die meisten Patterns jedoch Klassen.
z.B. Visitor, Factory, Proxy - Pattern.

[ironie]Aber wahrscheinlich kann man die ohnehin ohne Klassen viel schöner abbilden [/ironie]

Grüße
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

rads hat geschrieben:Soweit ich das im Kopf habe ist JS klassenlos.
Dafür hat Javascript Prototypen. Damit lassen sich Klassen trivial abbilden. Klassen sind bei prototyp-basierten Sprache nur ein Name für eine spezielle Gruppe von Objekten (sofern man das Wort Klasse überhaupt benutzt). Nämlich eben solchen, die als Vorlage für weitere Objekte dienen. Und genau das sind Klassen. Vorlagen.

Siehe auch den angehänger Screenshot von Self:

Bild

Uploaded with ImageShack.us

Oben ist die „Klasse“ dictionary zu erkennen, unten die durch Senden einer copy-Nachricht erzeugte Kopie(„Instanz“) von „dictionary“. Das Verhalten erhalten beide über das gemeinsame trait dictionary (durch die Verbindungslinien zu erkennen). Auch wenn man jetzt über die genaue Definition der Begriffe streiten kann, sieht doch irgendwie sehr nach Klassen und Instanzen aus oder?
Nach meiner Auffassung brauche ich für die meisten Patterns jedoch Klassen.
z.B. Visitor, Factory, Proxy - Pattern.
Nein. Braucht man nicht. Klassen sind einfach nur ein (zugegebener Maßen oft sinnvolles) Strukturierungselement, kein Selbstzweck.
Zuletzt geändert von Darii am Montag 26. Juli 2010, 13:20, insgesamt 1-mal geändert.
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

rads hat geschrieben:
http://de.wikipedia.org/wiki/JavaScript hat geschrieben:Der als ECMAScript (ECMA 262) standardisierte Sprachkern von JavaScript beschreibt eine moderne, schlanke, dynamisch typisierte, objektorientierte, aber klassenlose Skriptsprache
Nach meiner Auffassung brauche ich für die meisten Patterns jedoch Klassen.
z.B. Visitor, Factory, Proxy - Pattern.

[ironie]Aber wahrscheinlich kann man die ohnehin ohne Klassen viel schöner abbilden [/ironie]

Grüße
Die Terminologie Klassenlos bzw. classless bezieht sich auf die prototypische Vererbung die kein explizites Klassenpattern als Sprachkonstrukt hat. (JS2 will das einführen)

Man hat aber sehr wohl "Konstruktoren", mit denen Instanzobjekte generiert werden. Und diese Instanzen gehören dann einer Menge (oder richtigerweise Klasse) abgeleiteter Objekte an. (Sprachlich ist das leider verwirrend, auch weil noch eine dritte Bedeutung von "klassisch", im Sinne von traditionell in den Texten vorkommt)

Deine erwähnten Java-OOP-Pattern der klassischen Klassenbasierte Vererbung (ich sprach nicht nur von OOP Mustern) zur Erzeugung von Instanzklassen lassen sich aber ziemlich problemlos in JS simulieren, wenn man zusätzlich Closures nutzt.

Diesbzgl. Link wird gleich nachgereicht.

et voila!
http://www.crockford.com/javascript/inheritance.html
Zuletzt geändert von LanX am Montag 26. Juli 2010, 13:15, insgesamt 1-mal geändert.
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

Darii hat geschrieben:
Also, meine Aussage war dass das JS einen sehr flexiblen Kern bildet mit dem beliebig komplexe Pattern abgebildet werden können.
Hat ja niemand bestritten. Kann man aber mit jeder anderen Turing-vollständigen Sprache auch machen.
Ich denke es ist ein Unterschied ob man eine andere Sprache mit geringer Performance emuliert - wie das Turing-vollständigen Sprachen können - oder nahe am Sprachkern abbilden kann ohne zuviele Abstraktionslayer drüberlegen zu müssen.

(Zugegeben mit FORTH kenne ich mich nicht aus, ob das auch ginge weiß ich nicht)
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

http://www.crockford.com/javascript/inheritance.html hat geschrieben:I have been writing JavaScript for 8 years now, and I have never once found need to use an uber function. The super idea is fairly important in the classical pattern, but it appears to be unnecessary in the prototypal and functional patterns. I now see my early attempts to support the classical model in JavaScript as a mistake.
Danke Lanx, ich denke ich habs verstanden. Und wieder was gelernt.

Ganz klar ist mir aber jetzt nicht mehr, worüber diskutiert wird.
So wie ich den guten Herrn verstehe, kann man alles mit JS abbilden, auch gesteht er ein,
das es nicht zwangsweise Sinn macht bekannte Muster zu portieren.
Das spricht für die Aussage von BlackJack, dass Sprachen ihre Eigenheiten und individuellen
Vorteile haben.

wie gesagt, danke für die Anregung.

Grüße
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

rads hat geschrieben: Danke Lanx, ich denke ich habs verstanden. Und wieder was gelernt.

Ganz klar ist mir aber jetzt nicht mehr, worüber diskutiert wird.
OK aus der Vogelsperspektive:

Es ging um Performancesteigerung bei dynamischen Scriptsprachen. Der OP wollte nach C compilieren (wohl vorwiegend zwecks portierung auf einen Microcontroller), ich habe als alternative JIT ins Feld geführt und JS als leuchtendes Beispiel genannt.

Daraus entbrannte eine Diskussion ob man mit JS vernünftig programmieren könne:

Mein Standpunkt ist dass JS einerseits mächtig genug dafür ist beliebige Pattern und damit vorhandene Bibliotheken zu migrieren, andererseits schlank genug ist um einfach JIT optimiert und universell portiert zu werden.

Ich glaube sma ging da mir mir konform.

rads hat geschrieben: So wie ich den guten Herrn verstehe, kann man alles mit JS abbilden, auch gesteht er ein,
das es nicht zwangsweise Sinn macht bekannte Muster zu portieren.
Das spricht für die Aussage von BlackJack, dass Sprachen ihre Eigenheiten und individuellen
Vorteile haben.
Wenn Brendan Eich der Schöpfer von JS ist, dann ist Crockford sein Prophet. ;-)

Ich denke es ist illusorisch das Erbe umfangreicher Muster und darauf basierender Bibliotheken in anderen Sprachen zu ignorieren, deswegen gehe ich nicht ganz konform wenn Crockford etwas schlecht redet. Allerdings sind seine Tips Gold wert, auch weil er recht hat, die meisten JS-Bücher sind müll. (Leider ist an ihm/seinem Ghostwriter auch kein Literat verloren gegangen)

Bei Brendan Eich bin ich mir nicht ganz sicher, ob er seine Designentscheidungen bewußt tat. Manches was sich trivial lösen ließe wurde IMHO ziemlich verschusselt¹.
Ich glaube er hat vorwiegend versucht für seinen Arbeitgeber Self-Semantik auf Java-Syntax abzubilden, damit erkläre sich der Murks und sein jetziger Versuch für JS2.0 klassenbasierte Vererbung einzuführen.

Es gibt sicher besser designte (RISC-artige ;-) Minimalsprachen (Self?,Lua?,...) aber kaum so universell verbreitet.

¹) Aber hier kommen Crockfords schicke Workarounds ins Spiel...
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

LanX hat geschrieben:Daraus entbrannte eine Diskussion ob man mit JS vernünftig programmieren könne:

Mein Standpunkt ist dass JS einerseits mächtig genug dafür ist beliebige Pattern und damit vorhandene Bibliotheken zu migrieren, andererseits schlank genug ist um einfach JIT optimiert und universell portiert zu werden.

Ich glaube sma ging da mir mir konform.
sma wird nicht widersprechen, was das vernünftige Programmieren mit JS angeht und auch nicht, dass ein JIT die bessere Lösung für ein embedded-System mit beschränktem Speicher sein kann als denn alles in C oder Maschinencode zu übersetzen (was da häufig größer ist als JIT + Bytecode), wies aber noch darauf hin, dass z.B. Python im Vergleich zu JS schlechter ge-JIT-et werden kann. Er erwähnte daher noch Lua als eine fertige und bewährte Alternative (inklusive JIT).

Python *vollständig* in JavaScript abzubilden - ich habe das mal beispielhaft probiert - funktioniert nicht gut (im Sinne von effizient), weil Python zu dynamisch ist. Bereits jedes "+" müsste in eine komplexe Folge von Operationen übersetzt werden, bei denen man nach __add__, __radd__, __coerce__ und so weiter sucht und diese anwendet. Es geht besser, wenn die Sprache, die man in JS übersetzen will, weniger mächtig (im Sinne von ausdrucksstark) ist, also z.B. Java. Was ich mir immer noch mal angucken wollte ist der Versuch, Smalltalk in JS zu übersetzen. Das müsste eigentlich recht gut funktionieren. Lua in JS sollte auch funktionieren, wenn man nicht über die Metatabellen stolpert, für die man vielleicht eine Catch-All-Operation braucht. Gleiches gilt natürlich für Python, wodurch man für eine Simulation von __getattr__ und Freunde nicht einfach die Attribute und die Vererbung von JS benutzen könnte, sondern das alles selbst simulieren müsste.

Übrigens, steht in der Wikipedia ernsthaft, JS ist eine "moderne" Sprache? ECMA-262 ist von 1999, also 11 Jahre alt und alle verwendeten Konzepte haben locker noch mal ein Jahrzehnt mehr auf dem Buckel. Okay, Python ist bald 30 und Smalltalk bald 40, dagegen ist JS natürlich noch jung. Aber modern? Nee...
LanX hat geschrieben:Wenn Brendan Eich der Schöpfer von JS ist, dann ist Crockford sein Prophet. ;-)
Meines Wissens (jedenfalls vermitteln sie mir diesen Eindruck durch ihre Talks) mögen die beiden sich aber jetzt nicht so. Ich denke schon, dass sie sich gegenseitig sehr respektieren, doch Crockford hat komplett andere Ziele als Eich. Eich hätte gerne EcmaScript 4 gemacht und seine Sprache wesentlich erweitert. Crockford wollte möglichst wenig Änderungen. Und nun spricht er sich erneut gegen den aktuellen Trend aus und möchte HTML 5 stoppen, um erst einmal grundsätzlich eine sichere Browser-Architektur zu entwickeln während Eich als Mozilla-Mann für HTML 5 und die bunte neue Welt der Webentwicklung ist und ASAP die nächste JS-Version raushauen möchte, die ein paar mehr von den Features enthält, die Rhino und die ganzen Monkeys jetzt schon können: Yield und Generatoren, List-Comprehension, Mehrfachzuweisungen, Let, usw.

Ich möchte eigentlich, dass er damit Erfolg hat, denn Apple (d.h. Webkit) wird nur implementieren, was der Standard erfordert und Google (d.h. V8) machen nur, was Apple macht, weil sie 100% kompatibel bleiben wollen. Und da V8 den Standard für die Geschwindigkeit setzt, hätte ich gerne auch bei dieser Implementierung die schicken Features - z.B. für Node.js.
LanX hat geschrieben:Bei Brendan Eich bin ich mir nicht ganz sicher, ob er seine Designentscheidungen bewußt tat. Manches was sich trivial lösen ließe wurde IMHO ziemlich verschusselt¹.
Ich glaube er hat vorwiegend versucht für seinen Arbeitgeber Self-Semantik auf Java-Syntax abzubilden, damit erkläre sich der Murks und sein jetziger Versuch für JS2.0 klassenbasierte Vererbung einzuführen.

Er wollte ja Scheme mit dem Objektmodell von Self (ich glaube ja auch, er hat sich von NewtonScript beeinflussen lassen) haben. Und dann sollte er es schnell auf Java-Syntax umbauen. Ich glaube daher, das meiste war Zufall kombiniert mit Erfahrung (also Intuition) und weniger eine bewusst herbei geführte und getroffene Design-Entscheidung.

Stefan
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

sma hat geschrieben: Er erwähnte daher noch Lua als eine fertige und bewährte Alternative (inklusive JIT).
da kennt Lanx sich nicht aus, und muss Larry Wall zu zitieren: Sadly, I must confess I never looked closely at Lua or AppleScript, probably because I'm not a game designer with a Mac.
;)
sma hat geschrieben:Python *vollständig* in JavaScript abzubilden - ich habe das mal beispielhaft probiert - funktioniert nicht gut (im Sinne von effizient), weil Python zu dynamisch ist. ...
Klar für eine vollständige Abbildung müsstest du das Objektmodel komplett emulieren! Ich vermute die bereits verlinkten py->js projekte versuchen dass auch, indem das erzeugte JS immer explizit getter und setter aufruft.

Die unterschiedlichen Typkonversionen sind sicher auch eine Bremse, schlimstenfalls müsste man in zeitkritischen Passagen den Weg gehen den Cython bereits vormacht, und statische Typen angeben.

Meine Vorstellung wäre eher erstmal eine Schnittmengensprache des größten gemeinsammen Nenners zu haben, die auf beiden Engines problemlos läuft.
Übrigens, steht in der Wikipedia ernsthaft, JS ist eine "moderne" Sprache?
naja modern und etabliert schließen sich doch wohl aus... :wink:
LanX hat geschrieben:Wenn Brendan Eich der Schöpfer von JS ist, dann ist Crockford sein Prophet. ;-)
Meines Wissens (jedenfalls vermitteln sie mir diesen Eindruck durch ihre Talks) mögen die beiden sich aber jetzt nicht so.
kenne die Talks nicht kann ich mir gut vorstellen.

während Eich als Mozilla-Mann für HTML 5 und die bunte neue Welt der Webentwicklung ist und ASAP die nächste JS-Version raushauen möchte, die ein paar mehr von den Features enthält, die Rhino und die ganzen Monkeys jetzt schon können: Yield und Generatoren, List-Comprehension, Mehrfachzuweisungen, Let, usw.
hmm ich muss mir endlich mal Rhino antun

Crockford hat bestimmt nichts gegen let, wenn man bedenkt wie sehr er mit var hadert und polemisiert.

Mozillas MDC zu JS1.5++ versucht IMHO doch meistens bei neuen Sprachkonstrukten Code anzubieten, der es in anderen Umgebungen Rückwärtskompatibel macht.

(BTW: danke auch für den Hinweis auf let, das stopft tendenziell mein momentan größtes Problem Perls my auf JS' var abbilden zu können. xD

Man sieht auch, JS entwickelt sich weiter, sodass fremde Pattern künftig einfacher integriert werden können. Da ist eine Koevolution im Gange.)

Zum Thema kein Blockscoping mit var: Es ist schon anstrengend, wenn man ständig eine anonyme Funktion erzeugen muss, die in-place aufgerufen wird, nur um einen geschlossenen Blockcope zu haben.

Code: Alles auswählen

// Make a function that assigns event handler functions to an array of nodes  the right way. 
// When you click on a node, an alert box will display the ordinal of the node. 
var add_the_handlers = function (nodes) { 
    var i; 
    for (i = 0; i < nodes.length; i += 1) { 
        nodes[i].onclick = function (i) { 
            return function (e) { 
                alert(i);                                      // jeweils andere Instanz von i
            }; 
        }(i);                                                   // Workaround für Blockscopes
    } 
};
(BTW: wie würde man das in Python lösen? Mit nem Lambda, oder?)

(Bei Brendan Eich ...) Ich glaube daher, das meiste war Zufall kombiniert mit Erfahrung (also Intuition) und weniger eine bewusst herbei geführte und getroffene Design-Entscheidung.
yup! Und Crockfords Verdienst ist dass er viele Konstrukte klarer beschreibt. Aber man muss nicht wirklich jeder seiner "Exkommunikationen" folgen, z.B. hat with durchaus auch Vorteile.
BlackJack

@LanX: entweder ``lambda`` oder `functools.partial()`:

Code: Alles auswählen

def add_the_handlers(nodes):
    for i, node in enumerate(nodes):
        node.onclick = lambda i=i: alert(i)

# oder

def add_the_handlers(nodes):
    for i, node in enumerate(nodes):
        node.onclick = functools.partial(alert, i)
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

sma hat geschrieben:Gleiches gilt natürlich für Python, wodurch man für eine Simulation von __getattr__ und Freunde nicht einfach die Attribute und die Vererbung von JS benutzen könnte, sondern das alles selbst simulieren müsste.
__getattr__ ist ungefähr der Mechanismus der in Perl mit tie erreicht wird, oder?

Zur Info: Das MDC dokumentiert
# __defineGetter__
# __defineSetter__

für JS!

ob und wann dass für andere JS-Flavors übernommen wird kann ich nicht beurteilen.

http://mdn.beonex.com/en/Core_JavaScrip ... nd_Setters

UPDATE: link korrigiert.
Antworten