it-swarm.com.de

Was ist eine dynamische Sprache und warum ist C # nicht geeignet?

Beim Anhören eines Podcasts habe ich gehört, dass C # keine dynamische Sprache ist, während es Ruby ist.

Was ist eine "dynamische Sprache"? Bedeutet die Existenz dynamischer Sprachen, dass es statische Sprachen gibt?

Warum ist C # eine dynamische Sprache und welche anderen Sprachen sind dynamisch? Wenn C # nicht dynamisch ist, warum drängt Microsoft es stark auf den Markt?

Und warum sind die meisten .NET-Programmierer verrückt danach und verlassen andere Sprachen und wechseln zu C #?

Warum ist Ruby "die Sprache der Zukunft"?

31
egyamado

Was ist eine dynamische Sprache?

Ob eine Sprache dynamisch ist oder nicht, bezieht sich normalerweise auf die Art der Bindung, die der Compiler ausführt: statische oder späte Bindung. 

Statisches Binden bedeutet einfach, dass die Methode (oder Methodenhierarchie für virtuelle Methoden) zur Kompilierzeit gebunden ist. Möglicherweise ist zur Laufzeit ein virtueller Versand vorhanden, das Methodentoken ist jedoch zur Kompilierungszeit gebunden. Wenn zum Kompilierzeitpunkt keine geeignete Methode vorhanden ist, erhalten Sie eine Fehlermeldung. 

Dynamische Sprachen sind das Gegenteil. Sie machen ihre Arbeit zur Laufzeit. Sie überprüfen die Existenz von Methoden zur Kompilierzeit wenig oder gar nicht, stattdessen zur Laufzeit. 

Warum ist C # keine dynamische Sprache?

C # vor 4.0 ist eine statisch gebundene Sprache und daher keine dynamische Sprache. 

Warum ist Ruby die Sprache der Zukunft?

Diese Frage basiert auf einer falschen Prämisse, nämlich dass es eine Sprache gibt, die die Zukunft des Programmierens darstellt. Es gibt heutzutage keine solche Sprache, da keine einzige Sprache das Beste ist, um alle verschiedenen Arten von Programmierung auszuführen, die durchgeführt werden müssen. 

Zum Beispiel ist Ruby eine großartige Sprache für viele verschiedene Anwendungen: Webentwicklung ist eine beliebte Sprache. Ich würde jedoch kein Betriebssystem darin schreiben.

68
JaredPar

In einer dynamischen Sprache können Sie Folgendes tun:

var something = 1;
something = "Foo";
something = {"Something", 5.5};

Der Typ ist also nicht statisch. In einer statisch typisierten Sprache würde dies zu einem Compiler-Fehler führen.

Sprachen wie C, C++, C # und Java sind statisch typisiert.

Sprachen wie Ruby, Python und Javascript werden dynamisch eingegeben.

Dies ist auch nicht das Gleiche wie "stark oder schwach". Das ist etwas ganz anderes.

26
Brian Genisio

Ich bin verblüffend auf die Art und Weise, dass es eine grundlegende Menge von Programmierparadigmen umfasst.

Wir können sagen, dass c # eine reichhaltige objektorientierte Programmierung ermöglicht, Eine reichhaltige komponentenorientierte Programmierung, Eine gut integrierte funktionale Programmierung, Einen vollständigen Satz von Abfrageoperationen über verschiedene Datentypen quellen (linq), ein eleganter Ansatz der Gleichstromprogrammierung durch pLinq und parallele Erweiterungen, in der nächsten Version (c # 4.0) wird mächtige dynamische Fähigkeiten haben, und es ist fast sicher das in c # 5.0 wird eine solide Menge von Meta-Programmierfunktionen haben.

Mit nur kann ich sagen, dass c # es sehr gut macht, all diese leistungsstarken - Sachen in nur eine Toolbox zu integrieren. Meiner Meinung nach muss es so sein, , Weil das Überspringen von einer Programmiersprache in eine andere fast immer sehr schmerzhaft ist.

6
Alberto

C # ist eine statisch typisierte Sprache, da der Typ jedes Objekts, mit dem Sie arbeiten, zur Kompilierzeit bekannt sein muss. In einer dynamischen Sprache müssen Sie nicht wissen, um welche Art ein Objekt sich beim Kompilieren handelt. Vielleicht importieren Sie einige Klassen, die Sie vorher nicht kennen, wie alle Klassen in einem Ordner wie Plugins oder ähnliches. Oder vielleicht hängt sogar der Typ eines Objekts von der Benutzerinteraktion ab.

Sie können einen ähnlichen Effekt erzielen, indem Sie Schnittstellen oder Basisklassen verwenden. Dies ist jedoch nicht völlig derselbe, da Sie auf Klassen beschränkt sind, die explizit von dieser Schnittstelle erben oder diese implementieren.

In dynamisch typisierten Sprachen ist es egal, um welchen Typ es sich handelt, wenn Sie ihn kompilieren. Es wird versucht, die von Ihnen angegebene Methode über den Namen aufzurufen. Wenn diese Methode für das Objekt nicht vorhanden ist, wird eine Laufzeitausnahme ausgelöst Es liegt also am Programmierer, sicherzustellen, dass dies nicht der Fall ist, oder dass er nicht entsprechend behandelt wird. Sie gewinnen an Flexibilität, verlieren jedoch bei der Fehlerüberprüfung zur Kompilierzeit ein wenig.

3
Davy8

Wenn Sie den Wikipedia-Eintrag betrachten, sehen Sie, dass eine dynamische Sprache eine Sprache ist, die Dinge macht, die die meisten zur Kompilierzeit erledigen. Typischerweise kann eine Variable in einer dynamischen Sprache schnell und einfach den Typ ändern, und normalerweise gibt es keinen separaten Kompilierungsschritt (sondern entweder interpretierte Ausführung oder wirklich schnelles Kompilieren). C # ist eine konventionellere Sprache, die Variablendeklarationen verwendet und kompiliert wird.

Der Wikipedia-Eintrag listet zahlreiche dynamische Sprachen auf.

"X ist das Y der Zukunft" bedeutet andererseits, dass jemand versucht, Ihnen etwas zu verkaufen. (Nicht unbedingt wörtlich, aber versuchen, Ihren Glauben auf eine für den Redner günstige Weise zu beeinflussen.)

3
David Thornley

Wussten Sie, dass VB6 sowohl statisch als auch dynamisch ist?

Wenn Sie Variablen mit einem bestimmten Typ deklarieren, wird statisches Verhalten angezeigt:

Dim name as Label

Sie können jetzt nur auf Mitglieder von name zugreifen, die Labels sind, und Intellisense weiß das.

Wenn Sie über eine Klasse verfügen und das Schlüsselwort implements hinzufügen, kann Ihre Klasse Methoden einer anderen Klasse implementieren. Dies ist die Vererbung der Schnittstelle, die VB6 erlaubt. Sie können einen Laufzeitpolymorphismus erhalten.

Sie können auch Variablen wie folgt deklarieren:

Dim proxy As Object

Jetzt hilft dir intellisense nicht und VB6 erlaubt dir, mit proxy alles zu tun, was du willst:

proxy.foo()

Diese Zeile kann sich in einem kompilierten und laufenden Programm befinden und keine Beleidigung verursachen, insbesondere wenn sie nicht selbst ausgeführt wird. Nur wenn die Zeile ausgeführt wird, findet die Suche statt.

Sie können auch ausführen:

set proxy = <any instance>

und das wird laufen. Es spielt keine Rolle, ob <any instance> eine foo-Methode hat oder nicht. 

Und dann kann any - Instanz jeder Klasse zugewiesen werden, die foo implementiert, und die Methode kann aufgerufen werden, und VB6 ist zufrieden.

Beachten Sie, dass es mit der Zeit zu Leistungseinbußen kommt, wenn Sie immer dynamischer werden.

3
quamrana

Die Wörter static und dynamic sind nicht eindeutig definiert.

Was jedoch am häufigsten gemeint ist, sind zwei Punkte:

1) In statischen Sprachen kann sich der Typ einer Variablen (dh der Wertetyp, den die Variable enthalten kann oder auf den sie zeigen kann) im Verlauf eines Programms nicht ändern. In C # zum Beispiel deklarieren Sie den Typ einer Variablen, wenn Sie sie definieren, beispielsweise:

int a;

Jetzt kann a immer nur einen int-Wert enthalten. Wenn Sie versuchen, diesem eine Zeichenfolge zuzuweisen oder eine Methode aufzurufen, wird ein Fehler beim Kompilierungstyp angezeigt. 

2) In statischer Sprache kann der Typ eines Objekts nicht geändert werden. In dynamischen Sprachen kann sich ein Objekt dahingehend ändern, dass Methoden und Eigenschaften angehängt oder entfernt werden können, wodurch das Objekt grundsätzlich in ein völlig anderes Objekt umgewandelt wird.

2
JacquesB

In C # 3.0 müssen die Typen von allem zur Kompilierzeit bekannt sein. Es ist eine statische Sprache. Eine dynamische Sprache verwendet den dynamischen Dispatch zur Laufzeit, um die Art der Dinge und die Methoden zu bestimmen, die für diese Dinge aufgerufen werden sollen. Beide Arten von Sprachen haben ihre Vor- und Nachteile. C # 4.0 fügt dynamische Funktionen hinzu. Anders Hejlsberg hielt einen großartigen Vortrag über statische Vs. dynamische Sprachen und C # 4.0 bei PDC.

2
JP Alioto

c # ist statisch typisiert, dh int i = 0; Versuchen Sie, i als String festzulegen. der Compiler wird sich beschweren,

wo als Python eine Variable, die eine ganze Zahl enthielt, eine Zeichenfolge enthalten kann,

Statisch: Typen sind endgültig, Dynamisch: Typen können geändert werden.

c # versucht, dynamischere Features hinzuzufügen, beispielsweise var 

1
Fusspawn

Es gibt keine wahre "Sprache der Zukunft". Unterschiedliche Sprachen haben unterschiedliche Zwecke. Man könnte sagen, Ruby ist höchstens eine - eine Zukunftssprache.

Laut Wikipedia:

Dynamische Programmiersprache ist ein Begriff , Der in der Informatik allgemein verwendet wird, um Eine Klasse von höheren Programmiersprachen zu beschreiben, die zur Laufzeit Viele gebräuchliche Verhaltensweisen ausführen, die andere Sprachen könnten, wenn überhaupt, während der Kompilierung von auftreten. Diese Verhaltensweisen Könnten die Erweiterung von Des Programms umfassen, indem neuer Code hinzugefügt wird, Objekte und Definitionen erweitert werden, oder Durch Modifizieren des Typsystems, alle während der Programmausführung. Diese - Verhaltensweisen können in nahezu Jeder Sprache mit ausreichender Komplexität nachgebildet werden, , Dynamische Sprachen stellen jedoch direkte Werkzeuge zur Verfügung, um sie zu nutzen. Die meisten dynamischen Sprachen werden dynamisch geschrieben, aber nicht alle.

Ruby ist eine dynamische Sprache und C # nicht, da Ruby interpretiert und C # kompiliert wird. C # enthält jedoch einige Funktionen, die es dynamisch machen.

1
luiscubal

Eine dynamische Sprache wird im Allgemeinen als eine Sprache betrachtet, die zur Laufzeit Code dynamisch interpretieren und generieren kann. C # kann das nicht. 

Es gibt auch dynamisch typisierte und statisch typisierte Sprachen. Dynamisch geschrieben bedeutet, dass der Typ einer Variablen nicht festgelegt ist und sich während der Programmausführung ändern kann.

1
Steven

Eine Sprache ist dynamisch typisiert, dh eine Variable, die für alles verwendet werden kann. Variablen werden nicht typisiert, Werte sind. Eine Variable kann den Wert eines beliebigen Grundtyps haben oder auf ein beliebiges Objekt verweisen. 

0
user9045232