Kurze Antwort: Nein, weil Turing Äquivalenz.
Lange Antwort: Dieser Typ ist ein Troll. Während es stimmt, dass Typsysteme "Sie auf eine Teilmenge beschränken", sind die Dinge außerhalb dieser Teilmenge per Definition Dinge, die nicht funktionieren.
Alles, was Sie in einer Turing-vollständigen Programmiersprache tun können (eine Sprache, die für die allgemeine Programmierung entwickelt wurde, plus viele, die nicht vorhanden sind). Es ist ein ziemlich niedriger Balken, der zu übersehen ist, und es gibt mehrere Beispiele dafür, wie ein System zu Turing wird. komplettieren Sie unbeabsichtigt), die Sie in jeder anderen Programmiersprache von Turing-complete ausführen können. Dies wird "Turing-Äquivalenz" genannt und bedeutet nur genau das, was es sagt. Wichtig ist, dass Sie das andere nicht genauso einfach in der anderen Sprache tun können - einige würden argumentieren, dass dies der springende Punkt bei der Erstellung einer neuen Programmiersprache ist: Ihnen eine bessere Möglichkeit zu geben, bestimmte Dinge zu tun Dinge, an denen existierende Sprachen scheißen.
Ein dynamisches Typsystem kann beispielsweise über ein statisches OO-Typsystem emuliert werden, indem einfach alle Variablen, Parameter und Rückgabewerte als Basistyp deklariert werden Object
und dann mithilfe von Reflection auf die spezifischen Daten in diesem System zugegriffen wird Sie sehen, dass Sie in einer dynamischen Sprache buchstäblich nichts tun können, was Sie in einer statischen Sprache nicht tun können. Aber das wäre natürlich ein großes Durcheinander.
Der Typ aus dem Zitat ist richtig, dass statische Typen Ihre Möglichkeiten einschränken, aber das ist ein wichtiges Merkmal, kein Problem. Die Linien auf der Straße beschränken, was Sie in Ihrem Auto tun können, aber finden Sie sie einschränkend oder hilfreich? (Ich weiß, dass ich nicht auf einer viel befahrenen, komplexen Straße fahren möchte, auf der die Autos nicht in die entgegengesetzte Richtung fahren müssen, um auf ihrer Seite zu bleiben und nicht dahin zu kommen, wo ich fahre!) Indem Sie Regeln aufstellen, die klar definieren, was ist Sie werden als ungültiges Verhalten eingestuft und stellen sicher, dass dies nicht passiert. Dadurch verringern Sie die Wahrscheinlichkeit eines bösen Absturzes erheblich.
Außerdem charakterisiert er die andere Seite falsch. Es ist nicht so, dass "alle interessanten Programme, die Sie schreiben möchten, als Typen funktionieren", sondern dass "alle interessanten Programme, die Sie schreiben möchten, Typen erfordern ". Sobald Sie ein bestimmtes Maß an Komplexität überschritten haben, wird es aus zwei Gründen sehr schwierig, die Codebasis ohne ein Typsystem aufrechtzuerhalten, das Sie auf dem Laufenden hält.
Erstens, weil Code ohne Typanmerkungen schwer zu lesen ist. Betrachten Sie das folgende Python:
def sendData(self, value):
self.connection.send(serialize(value.someProperty))
Wie sehen die Daten aus, die das System am anderen Ende der Verbindung empfängt? Und wenn es etwas empfängt, das völlig falsch aussieht, wie finden Sie heraus, was los ist?
Auf die Struktur von kommt es an value.someProperty
. Aber wie sieht es aus? Gute Frage! Was ruft an sendData()
? Was vergeht? Wie sieht diese Variable aus? Wo ist es hergekommen? Wenn es nicht lokal ist, müssen Sie die gesamte Historie nachverfolgen, value
um herauszufinden, was los ist. Möglicherweise übergeben Sie etwas anderes, das ebenfalls eine someProperty
Eigenschaft hat, aber nicht das tut, was Sie denken, dass dies der Fall ist?
Schauen wir uns das jetzt mit Typanmerkungen an, wie Sie vielleicht in der Boo-Sprache sehen, die eine sehr ähnliche Syntax verwendet, aber statisch geschrieben ist:
def SendData(value as MyDataType):
self.Connection.Send(Serialize(value.SomeProperty))
Wenn etwas schief geht, ist Ihre Debug-Aufgabe plötzlich um eine Größenordnung einfacher geworden: Sehen Sie sich die Definition von MyDataType
! Außerdem wird die Wahrscheinlichkeit, dass Sie sich schlecht verhalten, weil Sie einen inkompatiblen Typ übergeben haben, der auch eine Eigenschaft mit demselben Namen hat, plötzlich auf Null gesetzt, weil das Typensystem Sie nicht dazu veranlasst, diesen Fehler zu machen.
Der zweite Grund baut auf dem ersten auf: In einem großen und komplexen Projekt haben Sie höchstwahrscheinlich mehrere Mitwirkende. (Und wenn nicht, bauen Sie es über einen langen Zeitraum selbst, was im Wesentlichen dasselbe ist. Versuchen Sie, Code zu lesen, den Sie vor 3 Jahren geschrieben haben, wenn Sie mir nicht glauben!) Dies bedeutet, dass Sie nicht wissen, was war Ich gehe den Kopf der Person durch, die fast jeden Teil des Codes zu dem Zeitpunkt geschrieben hat, als sie ihn geschrieben hat, weil Sie nicht da waren, oder ich erinnere mich nicht, ob es vor langer Zeit Ihr eigener Code war. Wenn Sie Typdeklarationen haben, können Sie die Absicht des Codes besser verstehen!
Leute wie der Typ im Zitat bezeichnen die Vorteile des statischen Tippens häufig als "Hilfe für den Compiler" oder "Alles über Effizienz" in einer Welt, in der nahezu unbegrenzte Hardwareressourcen dies mit jedem Jahr weniger relevant machen. Aber wie ich gezeigt habe, gibt es diese Vorteile sicherlich, aber der Hauptvorteil liegt in den menschlichen Faktoren, insbesondere der Lesbarkeit und Wartbarkeit des Codes. (Die gesteigerte Effizienz ist aber sicherlich ein schöner Bonus!)