Wie Kann eine Programmiersprache, die sowohl Statisch Typisierte und Dynamisch Typisiert?
Statisch-typisierten Sprachen und dynamisch typisierte Sprachen, die im Prinzip scheinen mag, entgegengesetzte Konzepte. Aber wie kann sich eine Sprache wie Objective-C für das Beispiel werden diese beiden Dinge auf einmal? Es scheint mir, dass Objective-C ist mehr statisch als dynamisch. Kann jemand erklären, wie das möglich ist?
- Wie? Auf Kosten der beiden Paradigmen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, Sie sind verwirrend statische Eingabe und dynamische Methode Auflösung. Objective-C ist definitiv zu stark, statisch typisiert. Wie C müssen alle Variablen deklariert werden und bei der Eingabe (es ist auch gar nicht der Typ-Inferenz wie in anderen modernen, statisch typisierte Sprachen). Der compiler generiert code basierend auf dem Typ der Variablen und dieser Typ kann zur Laufzeit geändert werden.
Jedoch, Objective-C-Methode aufruft, verwenden Sie einen message-passing-Paradigma, wo die Meldung "name und Ziel" codiert zur compile-Zeit, aber die Adresse der code ausgeführt werden soll, wird gesucht zur Laufzeit von der Objective-C-Laufzeit-Bibliotheken.
id
(astruct objc_object*
). Statische Typisierung ist nicht optional in C, noch in Objective-C.Objective-C ist wirklich (begrifflich) nur eine Ebene, auf der Sprache C selbst, und als solche können sowohl statische und dynamische Typen. Statische, wenn Sie die Basis-C stuff, dynamic, wenn Sie mit dem Objective-C-Erweiterungen.
Aber C auch Art bietet dieses feature. Wenn Sie denken über die void * - Typ in C, sehen Sie, dass es kann keinen geben, daher geben Sie eine (sehr grobe) dynamisch-typisierte Sprache.
Beispiel:
Bei all jenen Aufgaben zu
p
oben, wird es auf eine andere Art. Wenn Sie Ihren code geschickt genug ist, kann man auch emulieren, RTTI und Polymorphismus in C.Ich würde überlegen, eine Sprache in Erster Linie statisch oder dynamisch typisierte, basierend auf dem, was es war die meisten verwendet.
Wenn Sie Fragen über die technischen Möglichkeiten zur Unterstützung sowohl Idiome, das ist nicht eine besonders interessante Frage. Schauen Sie sich nur den meisten modernen Sprachen und zu sehen, wie Sie es tun. In der Regel ist es über eine Art von catch-all-dynamischen Typ (
Object
im VB -dynamic
in C#void*
in C, und so weiter).Auf die metaphysischen/ontologischen Ebene, diese Frage ist viel interessanter...
Einer Theorie in der Physik könnte darauf hindeuten, Verhalten, entzieht sich der intuition, führt ein zu Fragen, "Wie kann das sein?" Zum Beispiel der Welle-Teilchen-Dualität geht über alle einleuchtend Vorstellung, wie die Wirklichkeit ist oder sein sollte, und so lässt er uns nachdenken unwägbaren.
Programmiersprachen, jedoch sind keine Modelle der Wirklichkeit. Sie sind Erfindungen des Geistes, Sie dienen unseren Zwecken. Es ist also sinnlos, darüber nachzudenken, wie eine Programmiersprache sein kann, wie es ist. Es ist so, weil wir wollten, dass es so sein; denn es passt für unsere Zwecke. Nicht aus anderen Gründen notwendig oder geboten ist.
Bitte haben Sie daher Verständnis, dass ich nicht leichtfertig oder respektlos, wenn ich Antworte, dass eine Sprache kann sowohl dynamische als auch statische, nur weil Sie es können, und weil dies nützlich ist. Es ist hoffnungslos zu versuchen, um die Sonde auch nicht weiter.
C ist eine statisch typisierte Sprache, aber es hat die Flexibilität, um re-cast Arten zu anderen Arten, und die Verwendung von generischen Zeiger (void* - Typ). Die void* - Typ bedeutet "einen Zeiger auf eine unspezifische Art von Daten". Objective-C setzt Ihre dynamische Typen, die durch die Nutzung dieser void* Arten, obwohl in der Regel ist dies abstrahiert von mehreren Ebenen definiert, typedefs, etc.
Objective-C ist eine Mischung aus statischer und dynamischer Typisierung. Das einfache C-Objekte sind statisch typisiert, aber die Objective-C-Objekte sind dynamisch typisiert. Die Objective-C-Laufzeit egal ist, welchen Typ ein Objekt ist, solange die Nachrichten, die Sie senden, um Ihre Objekte erkannt werden, die durch das Objekt.
Statisch-typisierten Sprachen und dynamisch typisierte Sprachen sind in der Tat Gegensätze - zumindest in der Art, wie diese Begriffe werden in der Regel verwendet.
Eine statisch typisierte Sprache ist eine, die enthält eine Typ-überprüfung (und Berichterstattung) phase während der Kompilierung (oder zumindest vor der Ausführung von code). Objective-C hat sicherlich diese, so ist statisch typisiert.
Ist eine dynamisch typisierte Sprache ist man ohne solch ein Typ-überprüfung phase. Daher Objective-C ist nicht dynamisch typisierte durch diese definition und ich denke, dies ist die standard-definition.
Jedoch, Objective C wird manchmal auch als dynamisch typisierte (zusätzlich zu den statisch typisierten), weil es ermöglicht dem Programmierer zu spezifizieren, reduzierte statische Typ-Prüfung, die in teilen Ihres Codes - insbesondere für Objekte, die über spezielle statische Typ
id
. Ich persönlich denke, es wäre weniger verwirrend zu sagen, dass es eine statisch typisierte Sprache mit guter Unterstützung für dynamisch typisierte Objekte.Beachten Sie, dass fast alle statisch-typisierten Sprachen auch einige Unterstützung für dynamische Typisierung, da zB, verwenden Sie run-time checks zu fangen division durch null-Fehler-array-bounds-Fehler, niedergeschlagen Fehler, etc. Solche Dinge gibt es nicht rechtfertigen, den Aufruf einer Sprache dynamisch typisiert ist, sonst fast alle Sprachen, die hätten genannt werden dynamisch typisiert.