Architektonische Unterschiede zwischen dynamischen und statischen Sprachen


22

Gibt es wesentliche architektonische Unterschiede beim Entwerfen von Anwendungen, die auf statischen Sprachen (wie C # oder Java) und dynamischen Sprachen (wie Ruby oder Python) basieren?

Welche Gestaltungsmöglichkeiten bieten sich für einen Typ an, der für den anderen schlecht ist? Gibt es nützliche Funktionen, die mit einem Typ erzielt werden können, der nicht mit dem anderen übereinstimmt (natürlich in Bezug auf Design und Architektur)?

Gibt es auch dynamikspezifische Entwurfsmuster?


1
Unabhängig von diesen architektonischen Unterschieden können die dynamischen Sprachen IronRuby und IronPython die statischen Sprachen von .Net problemlos ergänzen.
IAbstrakter

3
Ich bin mir nicht sicher, aber wenn die Metaprogrammierung in den dynamischen Sprachen einfacher ist (in Ruby schien dies beim letzten Mal einfacher zu sein als in Java), könnte dies einen Einfluss auf die Architekturentscheidungen haben. Ich bin mir nicht sicher, welchen Einfluss das hat, weil ich in diesen dynamischen Sprachen noch nie wirklich an etwas so Großem gearbeitet habe.
FrustratedWithFormsDesigner

Antworten:


14

Lassen Sie uns ein paar Dinge klarstellen:

  1. Interaktives Scripting und statische Sprachen schließen sich nicht gegenseitig aus. F # und Haskell haben beide REPL-Schnittstellen.
  2. Dynamische Sprachen und hohe Leistung schließen sich nicht aus, obwohl einige Optimierungen vorgenommen wurden. JavaScript läuft heutzutage auf den meisten Browsern verdammt schnell.
  3. Sogar in dynamischen Sprachen müssen Sie immer noch die Typen dokumentieren, sich merken und darüber nachdenken.
  4. Aufgrund der zunehmenden Popularität von Typinferenz müssen viele statische Sprachen Typen nicht mehr sehr oft notieren. In statischen Sprachen mit starken Typinferenzen ermittelt der Compiler in den meisten Fällen, welche Typen aus Ihrem Code stammen, und teilt Ihnen mit, ob Sie jemals etwas tun, das gegen die Typdefinitionen verstößt. In Bezug auf die Syntax bietet dies das Beste aus beiden Welten.
  5. OOP und dynamische Sprachen schließen sich nicht gegenseitig aus. PHP unterstützt jetzt Klassen und sogar Vererbung.

Abgesehen von all diesen überraschenden Ähnlichkeiten gibt es einige praktische Unterschiede, die den Entwicklungsprozess beeinflussen:

  1. Dynamische Sprachen ermöglichen interessante Möglichkeiten, Daten im Kleinen weiterzugeben .
  2. Mit statischen Sprachen können Sie den Testaufwand reduzieren, indem Sie viele Arten von Fehlern unmöglich machen.
  3. In diesem Sinne ermöglichen statische Sprachen interessante Validierungs- und automatische Konvertierungsfunktionen wie Maßeinheiten in F # .
  4. Die extremen statischen Sprachen ermöglichen Codeverträge und formale Überprüfungen, die dokumentieren und verhindern , dass potenzielle Teiler, Endlosschleifen, Nullreferenzen, ungültige Listengrößen oder -indizes, Bereichsfehler und andere logisch ungültige Zustände auftreten das könnten Sie definieren.
  5. Wenn Sie dieses Extrem noch weiter ausbauen, können Sie auf der Grundlage dieser statischen Einschränkungen CPU-Optimierungen vornehmen, die zu einer noch besseren Leistung führen.

Es gibt auch eine Art von Programm , das könnte nie ohne statische Typisierung vorgenommen wurde: Singularity , ein Betriebssystem ohne Hardware Prozessgrenzen. Es ist in einer kleinen Menge von C, etwas C # und einem Dialekt von C # namens Spec # geschrieben, der Codeverträge unterstützt.

Obwohl die Multitasking- und Interprozesskommunikationsleistung auf diesem Betriebssystem in einer müllsammelbaren Sprache geschrieben ist , ist sie aufgrund der Tatsache, dass alle Prozesse in einem Speicherbereich ausgeführt werden, und der formalen Überprüfungsoptimierungen I besser als alles andere auf dem Markt oben erwähnt. Ohne statische Typisierung wäre dies nicht möglich, da die Kommunikationsobjekte statisch verifizierbar sein müssen, damit Programme den Rest des Systems nicht gefährden können.

Meistens sollten Architekturen jedoch sehr ähnlich aussehen. Statische Sprachen können es in vielen Fällen einfacher machen, über Programme nachzudenken, da die Typen gut definiert sind. Ein gut geschriebenes dynamisches Sprachprogramm würde jedoch auch Typen enthalten, die in den Köpfen der Entwickler zumindest gut definiert sind.


Kann Singularity eine echtzeitbewusste Garantie für maximale Latenz bieten?
Eonil

@Eonil Nicht wirklich mein Fachgebiet, aber ich denke, Sie fragen sich, ob es in Echtzeit schwierig ist. Ich glaube nicht, da überall Müll gesammelt wird. Soweit ich weiß, wurde Singularity schon eine Weile nicht mehr aktualisiert, aber vielleicht hat jemand etwas Ähnliches mit einem Echtzeit-Müllsammler gemacht.
Rei Miyasaka

Vielen Dank. Ich wollte nur nachsehen. Ich habe gehört, dass es einige Echtzeit-GC-Implementierungen gibt, aber ich habe nicht gehört, wie sie in der Industrie praktisch eingesetzt werden…
Eonil,

2

Es gibt einen signifikanten architektonischen Unterschied. Performance.

Abhängig von Ihrem Hardwarebudget, der erwarteten Auslastung und den Vereinbarungen zum Servicelevel ist es möglicherweise nicht möglich, die Anforderungen mit einer dynamischen Sprache zu erfüllen.

Am häufigsten gleichen die Geschwindigkeit der Entwicklung und die Flexibilität, die dynamische Sprachen bieten, die langsameren Antwortzeiten sowie den höheren CPU- und Speicherverbrauch aus. Bei größeren Systemen mit Budget- oder Leistungsbeschränkungen kann der Aufwand für eine dynamische Sprache jedoch hoch sein.


1

Ich habe nie in diese Richtung gedacht. Peter Norvigs Blog war also einer der Top-Hits, als er ein Google- Konto eröffnete . Es heißt, dass einige Entwurfsmuster in dynamischen Sprachen einfacher zu implementieren sind als in traditionellen objektorientierten Sprachen wie C ++. Ich denke, es sollte auch Unterschiede bei Design / Architektur geben, da er feststellt, dass die Implementierung in dynamischen Sprachen einfacher ist. Ich werde versuchen, mehr zur Antwort hinzuzufügen, wenn ich weiter studiere.


1

Gibt es wesentliche architektonische Unterschiede beim Entwerfen von Anwendungen, die auf statischen Sprachen (wie C # oder Java) und dynamischen Sprachen (wie Ruby oder Python) basieren?

Nein.

Es ist etwas einfacher, ausgefallene Frameworks für dynamische Sprachen zu schreiben. Aber das ist keine Anwendungssache.

Welche Gestaltungsmöglichkeiten bieten sich für einen Typ an, der für den anderen schlecht ist?

Wirklich keine.

Sie können gute Dinge in jeder freundlichen Sprache schreiben.

Gibt es nützliche Funktionen, die mit einem Typ erzielt werden können, der nicht mit dem anderen übereinstimmt (natürlich in Bezug auf Design und Architektur)?

Nein.

Der Unterschied besteht darin, dass dynamische Sprachen "Schreiben, Ausführen, Reparieren" sind. Sie können schnell experimentieren und reparieren.

Statische Sprachen sind "Schreiben, Kompilieren, Erstellen, Ausführen, Reparieren". Sie können nicht so einfach experimentieren.

Davon abgesehen sind sie in ihren Fähigkeiten nahezu identisch.

Gibt es dynamikspezifische Entwurfsmuster?

Vielleicht. Python eval()und execfile()Funktionen weisen auf eine dynamische Sprachfunktion hin, die in einer statischen Sprache nur schwer (aber keineswegs unmöglich) zu handhaben ist. Es wären viel mehr Codezeilen, um Code im selben Prozessraum zu kompilieren und auszuführen.

Es ist nicht sprachdynamisch. Es ist einfach einfacher.


2
"Sie können nicht so einfach experimentieren." - Das Problem ist, dass der Compiler Sie beim Auffinden von Fehlern unterstützt, wohingegen Sie bei interpretierten Sprachen möglicherweise erst dann einen Fehler finden, wenn ein Benutzer diese Codezeile ausführt.
Doug T.

4
@Doug T .: "Compiler hilft bei der Fehlersuche". Manchmal. Nicht oft genug Die interessanten Fehler können von einem Compiler überhaupt nicht gefunden werden. Dafür ist Unit Testing gedacht.
S.Lott

2
@ S.Lott Ich finde, dass in dynamischen Sprachen geschriebene APIs etwas mehr Dokumentation erfordern. In einer statischen Sprache gibt die Methodensignatur Auskunft darüber, welche Arten von Argumenten erforderlich sind. In einer dynamischen Sprache kann man es nicht so einfach sagen - die API-Dokumentation muss Ihnen sagen, welche Objekte erwartet werden.
Quanticle

1
@quanticle: Das ist nicht wirklich architektonisch, oder?
S.Lott

2
"Sie können nicht so einfach experimentieren." - F # und Haskell sind beide statische Sprachen, und sie haben vollwertige REPLs und fragen Sie selten nach einem Bezeichner oder Ausdruckstyp.
Rei Miyasaka
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.