Wenn Sie das Design für ein neues System ausarbeiten, ist es besser, mit einer statisch typisierten Sprache (wie Haskell) oder einer dynamisch typisierten Sprache (wie Ruby) zu beginnen?
Argumente, an die ich denken kann:
Mit einer statischen Sprache können Sie schnell eine Spezifikation und einen Bereich für die Funktionsweise des Programms erstellen. Mit einer dynamischen Sprache können Sie schnell eine funktionierende Demo erstellen, die dem Kunden zur Überprüfung vorgelegt wird.
Mit einer dynamischen Sprache vermeiden Sie häufig, dass Sie Datenstrukturen neu ordnen und Code umgestalten müssen, wenn Sie Ihr Design ändern. Mit einer statischen Sprache können Sie Typen vor der Implementierung definieren, wobei der Code sehr klein bleibt.
Bei einer statischen Sprache müssen Sie im Voraus herausfinden, was Ihr Programm tun wird. Mit einer dynamischen Sprache können Sie mit dem Schreiben von Code beginnen und das Design organisch wachsen lassen. Wie Paul Graham in Hackers and Painters sagt :
Eine Programmiersprache dient zum Nachdenken über Programme, nicht zum Ausdrücken von Programmen, an die Sie bereits gedacht haben.
Mit einer statischen Sprache kann der Compiler dabei helfen, viele Arten von Fehlern zu identifizieren. Mit einer dynamischen Sprache können Sie früher mit dem Testen und Auffinden von Fehlern beginnen.
Statische und dynamische Typisierung haben sowohl Vor- als auch Nachteile beim Prototyping. Beide scheinen mir jedoch gleichermaßen gültige Ansätze zu sein. Welches ist aufgrund Ihrer Erfahrungen letztendlich besser?
Anmerkungen
Prototyping in natürlicher Sprache
Eine dritte Art von Sprache zu berücksichtigen: natürliche Sprache. Anstatt Prototypen in Code zu erstellen, kann man Prototypen schriftlich erstellen. Der Kunde kann dann Ihre Dokumentation lesen und Ihr Design frühzeitig kritisieren, aber nicht mit einer funktionierenden Demo herumspielen. Wenn die Dokumentation gut geschrieben ist, kann sie problemlos in jeder Sprache implementiert werden. Vorsichtsmaßnahmen:
Die Dokumentation ist möglicherweise mühsam zu lesen und schwer zu verdauen, ohne sie sehen zu können. Ich spekuliere, dass ein Kunde lieber mit etwas experimentieren möchte, das funktioniert, als eine Wand aus Text (und Bildern) zu lesen.
Das Prototyping einer Anwendung in Englisch und nicht in Typdefinitionen ist ausführlicher und weniger konkret.
Haskell-Typen sind beschreibend
Beachten Sie, dass Typen in Haskell besonders aussagekräftig sind, mehr als in vielen statischen Sprachen wie C ++ und Java. Angenommen, ich habe eine Funktion mit dieser Typensignatur in Haskell:
foo :: forall a. [a] -> a
Eine Funktion, die für jeden Typ a
eine Liste von Typelementen verwendet a
und einen Wert vom Typ zurückgibt a
.
Auch ohne den Namen der Funktion zu kennen, weiß ich, dass:
Es führt keine Eingabe / Ausgabe durch oder ändert keine Werte ( naja , es sei denn, es verwendet unsafePerformIO falsch), da Haskell rein funktional ist.
Es kann die Elemente nicht als Ganzzahlen behandeln, da es jeden Typ unterstützen muss.
Es muss die Eingabeliste verwenden (das, oder eine Ausnahme auslösen oder in eine Endlosschleife gehen). Woher würde es sonst einen Wert vom Typ bekommen
a
?
Daher kann diese Funktion möglicherweise nur ein Element aus der Eingabeliste extrahieren und zurückgeben. Obwohl ich immer noch nicht weiß, welchen Gegenstand es verwenden wird, [a] -> a
sagt es mir fast alles andere.