Verwendet für dynamische Sprachen

8

Meine Hauptsprache ist jetzt D, und ich bin gerade dabei, Python zu lernen, weil es für einen Kurs erforderlich ist, den ich mache. Während ich verstehe, warum dynamische Sprachen ein frischer Wind für Leute sind, die in statischen Sprachen ohne Typinterferenzen oder Templates programmieren (IMHO-Templates sind zu einem großen Teil Kompilierzeit-Entlein-Typisierung), bin ich neugierig, was die Vorteile dynamischer Sprachen sind selbst wenn du solche hast.

Die Quintessenz ist, dass ich, wenn ich Python lernen will, es auf eine Weise lernen muss, die mein Denken über die Programmierung wirklich verändert, anstatt nur D in Python zu schreiben. Ich habe keine dynamischen Sprachen benutzt, seit ich ein Anfänger war und nicht in der Lage war, die Flexibilität zu schätzen, die sie angeblich bieten, und ich möchte jetzt lernen, sie voll auszunutzen. Was kann einfach / elegant in einer dynamisch typisierten, interpretierten Sprache getan werden, die in einer statischen Sprache schwierig oder unmöglich ist, sogar mit Templates, Polymorphie, statischen Typrückschlüssen und möglicherweise Laufzeitreflexion?

    
dsimcha 29.01.2009, 23:42
quelle

13 Antworten

15

Theoretisch gibt es nichts, was dynamische Sprachen können und statische Sprachen nicht. Kluge Köpfe arbeiten viel daran, sehr gute dynamische Sprachen zu schaffen, was zu der Wahrnehmung führt, dass dynamische Sprachen voraus sind, während statische Sprachen aufholen müssen.

Mit der Zeit wird dies in die andere Richtung gehen. Bereits verschiedene statische Sprachen haben:

  • Generika, die statische Typen weniger dumm machen, indem sie den richtigen Typ auswählen, wenn Objekte herumgereicht werden, so dass der Programmierer sie nicht selbst umsetzen muss

  • Tippe auf Inferenz, was Zeitverschwendung beim Schreiben der Dinge, die offensichtlich sein sollten, verschwendet.

  • Verschlüsse, die unter vielen anderen Dingen helfen, den Mechanismus von der Intention zu trennen, indem Sie komplizierte Algorithmen aus den meisten vorhandenen Zutaten zusammenziehen.

  • Implizite Conversions, mit denen Sie "Affepatching" ohne die damit verbundenen Risiken simulieren können.

  • Code-Laden und einfacher programmatischer Zugriff auf den Compiler, damit Benutzer und Dritte Ihr Programm skripten können. Verwenden Sie mit Vorsicht!

  • Syntaxen, die der Erstellung von domänenspezifischen Sprachen in ihnen dienlicher sind.

... und ohne Zweifel mehr zu kommen. Die dynamische Bewegung hat einige interessante Entwicklungen im statischen Sprachdesign hervorgebracht, und wir alle profitieren von der Konkurrenz. Ich hoffe nur, dass mehr dieser Features es zum Mainstream machen.

Es gibt einen Ort, wo ich nicht die dominante dynamische Sprache ersetze, und das ist Javascript im Browser. Es ist einfach zu viel von einem bestehenden Markt zu ersetzen, so dass der Schwerpunkt darauf liegt, stattdessen Javascript selbst besser zu machen.

    
Marcus Downing 30.01.2009, 00:23
quelle
3

Hier ist Steve Yegge zu diesem Thema.

Guido van Rossum hat auch mit diesem Vortrag in seine Einstellung von Scala in Verbindung gebracht.

    
Nikhil Chelliah 29.01.2009 23:54
quelle
2
  

"Ich bin gespannt, was die Vorteile sind   dynamische Sprachen, auch wenn Sie haben   diese. "

Im Vergleich zur D-Programmiersprache:

  • Python ist eine kompaktere Sprache. Es erlaubt Ihnen, so viel wie D auszudrücken, aber es verwendet viel weniger verschiedene Konzepte, um es zu erreichen - weniger ist mehr .

  • Python hat eine leistungsstarke Standardbibliothek - Batterien enthalten .

Ich weiß nicht, ob D interaktive Prompts hat, aber in Python ist eine interaktive Shell wie ipython ein integrierter Teil des Entwicklungsprozesses.

    
jfs 30.01.2009 01:00
quelle
2

Beispiel in Python:

%Vor%

Wie lange, glaubst du, hat mich das zum Schreiben gebraucht und wie viele Compile-Run-Debug-Zyklen?

Wenn Sie meinen, dass mein Beispiel trivial ist, kann ich antworten, dass dynamische Sprachen trivial viele Programmieraufgaben machen.

    
tzot 30.01.2009 19:45
quelle
1

In dynamischen Sprachen können Sie Werte auf eine Weise verwenden, von der Sie wissen, dass sie korrekt ist. In einer statisch typisierten Sprache können Sie Werte nur so verwenden, wie der Compiler weiß, dass sie korrekt sind. Du brauchst all die Dinge, die du erwähnt hast, um die Flexibilität wiederzuerlangen, die durch das Typsystem weggenommen wurde (ich stach nicht auf statische Systeme, die Flexibilität wird oft aus guten Gründen weggenommen). Dies ist eine Menge Komplexität, mit der Sie sich in einer dynamischen Sprache nicht auseinandersetzen müssen, wenn Sie Werte verwenden möchten, die der Sprachen-Designer nicht vorausgesehen hat (z. B. Werte verschiedener Typen in eine Hash-Tabelle einfügen) / p>

Es ist also nicht so, dass Sie diese Dinge nicht in einer statisch getippten Sprache machen können (wenn Sie eine Laufzeit-Reflektion haben), ist es nur komplizierter.

    
Jules 29.01.2009 23:59
quelle
1

Ich habe tatsächlich einen Blogbeitrag dazu geschrieben: linky . Aber dieser Beitrag kann im Grunde so zusammengefasst werden:

Sie wären überrascht, wie viel Aufwand Sie brauchen, wenn Sie nicht zur Kompilierzeit angeben müssen, welcher Typ Ihre Variable ist. Daher ist Python eine sehr produktive Sprache.

Auf der anderen Seite, selbst mit guten Unit-Tests, würden Sie auch überrascht sein, welche Arten von dummen Fehlern Sie sich erlauben, zu machen.

    
Jason Baker 30.01.2009 00:27
quelle
1

Ein großer Vorteil von dynamic typing bei der Verwendung von Objekten ist, dass Sie keine Klassenhierarchien mehr verwenden müssen, wenn mehrere Klassen die gleiche Schnittstelle haben sollen - das ist mehr oder weniger das, was man Ente nennt tippen. Schlechte Vererbung ist danach sehr schwer zu beheben - dies macht das Refactoring oft schwieriger als in einer Sprache wie Python.

    
David Cournapeau 30.01.2009 03:49
quelle
1

Der Punkt ist, dass Sie in einer dynamischen Sprache die gleiche Funktionalität viel schneller implementieren können als in einer statisch getippten. Daher ist die Produktivität typischerweise viel höher.

Dinge wie Vorlagen oder Polymorphie im Prinzip geben Ihnen viel Flexibilität, aber Sie müssen eine große Menge an Code schreiben, damit es funktioniert. In einer dynamischen Sprache kommt diese Flexibilität fast umsonst.

Ich denke, Sie sehen sich den Unterschied auf die falsche Art an, Produktivität ist hier der Hauptpunkt (genauso wie die Garbage-Collection die Produktivität erhöht, aber Sie nicht wirklich neue Sachen machen kann).

    
nikow 30.01.2009 12:02
quelle
0

Mit einer dynamischen Sprache ist es viel einfacher, einen Befehlszeilen-Interpreter zu haben, so dass Sie Dinge in der Befehlszeile testen können und sich nicht um einen Kompilierungsschritt kümmern müssen, um zu sehen, ob sie funktionieren.

    
David Locke 29.01.2009 23:52
quelle
0

Ich finde dynamische Sprachen wie Perl und in geringerem Maße Python erlauben mir, schnell und schmutzig Skripte für Dinge zu schreiben, die ich tun muss. Der Laufzyklus ist in dynamischen Sprachen viel kürzer und oft muss weniger Code geschrieben werden als in einer statisch typisierten Sprache, was meine Produktivität erhöht. Dies geht leider auf Kosten der Wartbarkeit, aber das ist ein Fehler der Art, wie ich Programme in dynamischen Sprachen schreibe, nicht in den Sprachen selbst.

    
Jared 30.01.2009 01:01
quelle
0

Ich wollte Closures sagen, aber ​​diesen Thread finden . .. (nicht dass ich verstehe, wie es in einer "statischen" Sprache funktionieren würde)

Zugehörige Konzepte sind Funktionen als Erste-Klasse-Objekte und höhere Bestellverfahren . (z. B. eine Funktion, die eine Funktion als Eingabe akzeptiert und / oder eine Funktion als Ausgabe zurückgibt)

edit: (für die Nitpicker hier) Ich werde einen Kommentar wiederholen, den ich auf @David Lockes Post gemacht habe. Dynamisch interpretierte Sprachen ermöglichen die Verwendung eines vorhandenen Softwareprogramms / -projekts in Verbindung mit einer kleinen Funktion oder Klasse, die spontan erstellt wird, um etwas interaktiv zu erkunden. Das wahrscheinlich beste Beispiel ist die Funktionsgraphik. Wenn ich ein Funktionsgrafikobjekt mit einer Funktion graph(f,xmin,xmax) schreiben würde, könnte ich damit Funktionen wie x 2 oder sin (x) oder was auch immer untersuchen. Ich mache das in MATLAB die ganze Zeit; Es ist interpretiert und hat anonyme Funktionen ( @(x) x^2 ), die an der Interpreter-Eingabeaufforderung konstruiert werden können, um in Funktionen höherer Ordnung (Graphenfunktionen, abgeleitete Operatoren, Wurzelfinder usw.) überzugehen.

    
Jason S 29.01.2009 23:51
quelle
0

Sehen Sie sich dieses e4x Beispiel in JavaScript an:

%Vor%

Sehen Sie sich vor allem die Zeile an:

%Vor%

In typischen statischen Sprachen können Sie nicht sales.item schreiben, da Sie nicht wissen können, dass dieser Artikel die Eigenschaft des Verkaufs bis zur Laufzeit ist. Dies ist nicht auf e4x beschränkt. Sie können in ähnlicher Weise programmieren, wenn Sie eine Verbindung herstellen, wenn Sie SOAP-Clients oder einen anderen zugrunde liegenden Typ schreiben, den Sie bis zur Laufzeit nicht kennen. In einer statischen Sprache müssten Sie normalerweise ein Tool ausführen, das Stub-Klassen oder Programm auf sehr ausführliche Weise generiert. Wenn sich dann in einem Webdienst etwas ändert, müssen Sie die Stubs erneut generieren. Werfen Sie einen Blick auf Java-DOM-Code:

%Vor%

Definitiv viel ausführlicher als Ihr dynamischer Code. Und natürlich ist es nicht statisch getippt. Es gibt keine Möglichkeit zu überprüfen, dass Sie "Autor" bis zur Laufzeit als "Autor" falsch geschrieben haben. All diese Ausführlichkeit ist im Wesentlichen da, um etwas zu erfassen, das in statischer Art dynamisch ist.

Ich denke, das ist eine der Stärken dynamischer Sprachen.

    
Dan 20.03.2009 17:59
quelle
-2

Kompilierte Sprachen werden häufig verwendet, wenn Effizienz und Typensicherheit die Prioritäten sind. Ansonsten kann ich mir keinen Grund vorstellen, warum jemand Ruby nicht benutzen würde:)

    
klyde 30.01.2009 01:01
quelle