Der Wikipedia-Artikel über prototypbasierte Sprachen enthält den folgenden Absatz:
Fast alle prototypbasierten Systeme basieren auf interpretierten und dynamisch typisierten Sprachen. Systeme, die auf statisch typisierten Sprachen basieren, sind jedoch technisch machbar.
Inwiefern unterwirft ein statisches Typensystem Einschränkungen oder führt zu Komplexität in der prototypbasierten Sprache, und warum gibt es dynamischere Prototypensprachen?
Antworten:
Die Grenze zwischen einem Grundtyp und einem Objekt ist verschwommen und oft künstlich eingeführt. In C ist eine Struktur beispielsweise nur eine Reihe von Datensätzen, nur ein abgeleiteter Nicht-Objekttyp. In C ++ ist eine Struktur eine Klasse mit allen öffentlichen Feldern, ein Objekt. Trotzdem ist C ++ fast vollständig abwärtskompatibel mit C ... der Rand ist hier wirklich weich.
Für die prototypbasierte Programmierung müssen Objekte zur Laufzeit veränderbar sein. Sie MÜSSEN weich geschrieben sein, da sich jede Änderung zur Laufzeit ändert, eine Klasse einer Art in eine andere - ihr Typ ändert sich.
Sie können jedoch grundlegende und abgeleitete Nicht-Objekttypen als statisch beibehalten. Dies führt jedoch zu einer merkwürdigen Ungleichheit, Objekte sind weich, Nicht-Objekte sind statisch, und es muss eine harte Grenze zwischen den beiden festgelegt werden. Solltest du in der Lage sein, eine Struktur zu verändern? Ein Faden? Sollte Number eine Klasse oder ein Fundamentaltyp oder eine Menge von Fundamentaltypen sein, int / float / bignum / etc?
Es ist nur natürlicher und einfacher, diese Uniform zu erlernen, zu verwenden und zu schreiben. Alle Typen sind zur Laufzeit veränderbar oder es sind keine Typen veränderbar. Wenn Sie nur einen Typ (Objekt) für veränderlich erklären, bekommen Sie Kopfschmerzen und Probleme beider Welten.
Statisch eingegeben ist:
Dynamisch eingegeben ist:
Indem Sie die zwei mischen, opfern Sie viel.
quelle
Die Schwierigkeit ist ziemlich einfach zu erkennen: Wenn Sie die Ansicht von Objekten als Wörterbücher von Methoden oder als Dinge, die auf Nachrichten reagieren, betrachten, beachten Sie Folgendes in Bezug auf häufig verwendete statisch typisierte OO-Sprachen:
Alle Wörterbuchschlüssel / -nachrichten werden in der Regel im Voraus mit statisch deklarierten Bezeichnern deklariert.
Bestimmte Nachrichtensätze werden im Voraus deklariert, und diesen Sätzen werden Objekte zugeordnet, um zu bestimmen, auf welche Nachrichten sie antworten.
Einschlussbeziehungen einer Gruppe von Nachrichten, die eine Teilmenge einer anderen Gruppe sind, werden statisch und explizit deklariert. nicht deklariert, aber logische Teilmengen sind nicht gültig.
Bei der Typprüfung wird versucht, sicherzustellen, dass alle Nachrichten nur an Objekte gesendet werden, die darauf antworten.
Jeder dieser Punkte steht in gewissem Maße in Konflikt mit einem prototypbasierten System:
Die Nachrichtennamen könnten im Voraus in Form von "Atomen" oder internen Zeichenfolgen oder so weiter deklariert werden, aber sonst nichts. Die Plastizität von Objekten macht es schwierig, Methoden Typen zuzuweisen.
Es ist wohl das wesentliche Merkmal eines prototypbasierten Systems, dass Nachrichtensätze durch die Antwort eines Objekts definiert werden und nicht umgekehrt. Es wäre sinnvoll, Aliase zur Kompilierungszeit bestimmten Kombinationen zuzuweisen, aber zur Laufzeit ermittelte Nachrichtensätze müssen möglich sein.
Die tatsächlichen Auswirkungen der beiden oben genannten Treffer sind auf Einbeziehungsbeziehungen zurückzuführen, bei denen explizite Deklarationen völlig unbrauchbar sind. Vererbung im statischen, nominalen Subtypisierungssinn ist einem prototypbasierten System entgegengesetzt.
Das bringt uns zu dem letzten Punkt, den wir nicht wirklich ändern möchten. Wir möchten weiterhin sicherstellen, dass Nachrichten nur an Objekte gesendet werden, die darauf antworten. Jedoch:
Wie kann das nun umgangen werden? Begrenzen Sie entweder die vollständige Allgemeinheit (was unangenehm ist und schnell alle Vorteile der Verwendung eines prototypbasierten Systems zunichte macht) oder machen Sie das Typsystem viel flüssiger und drücken Sie Einschränkungen aus, anstatt exakte Typen .
Das auf Bedingungen basierende Typsystem führt schnell zu dem Begriff der strukturellen Untertypisierung , die in einem sehr losen Sinne als das statische Äquivalent der "Ententypisierung" angesehen werden kann. Die größten Hindernisse dabei sind, dass solche Systeme bei der Typüberprüfung viel komplizierter und weniger bekannt sind (was bedeutet, dass nur wenig Vorarbeit geleistet werden muss).
Zusammenfassend lässt sich sagen: Es ist möglich, dass es nur schwieriger ist als ein nominales statisches System oder ein dynamisches System, das auf Laufzeit-Metadaten basiert, und daher stören sich nur wenige Menschen.
quelle
Ich glaube, ein Weg, eine statisch typisierte, prototypbasierte Sprache zu erreichen, besteht darin, die Sprache auf Vorlagen und Konzepte zu stützen.
Konzepte waren einst ein geplantes Feature für C ++ 0x. Generischer Code in C ++ - Vorlagen ist de facto bereits "statisch ententypisiert". Die Idee von Concepts ist, in der Lage zu sein, einige Dinge über erforderliche Elemente und Merkmale von Typen zu sagen, ohne ein Klassenvererbungsmodell zu erfordern oder zu implizieren, das dieser Beziehung zugrunde liegt (weil es mit vorhandenem Vorlagencode funktionieren musste, der bereits "statisch getippt" war. ).
In einer Sprache, die von Grund auf auf Vorlagen und Konzepten basiert, wären es die Konzepte, die auf Prototypen basieren, und Vorlagen würden Sie davon befreien, sich um Klassenmodelle zu kümmern, die zur Implementierung der Wertetypen verwendet werden können oder nicht.
Abgesehen von Tricks bei der Verwendung von Staged-Compilation, damit die Sprache ihre eigene Metasprache sein kann, wären diese prototypischen Ableitungen von Concepts nach ihrer Erstellung notwendigerweise unveränderlich. Der Einwand, dass dies kein Prototyp ist, ist jedoch ein roter Hering. Es wäre einfach eine funktionale Sprache. Zumindest wurde versucht, eine dynamische Prototyp-Basissprache zu entwickeln, die auch funktionsfähig ist .
quelle