Für jeden, der lange Zeit programmiert hat, haben Sie höchstwahrscheinlich verschiedene Programmiersprachen verwendet. Angesichts der heutigen Software-Landschaft ist es wahrscheinlich, dass Sie sowohl mit stark typisierten als auch mit schwach typisierten Sprachen gearbeitet haben.
Das heißt, Sie haben in Programmiersprachen gearbeitet, in denen Sie den Datentyp Ihrer Variablen angeben müssen, was Ihre Funktionen zurückgeben werden, und so weiter, und Sie haben in Programmiersprachen gearbeitet Sie müssen diese Informationen nicht explizit festlegen.
Wenn Sie genau wissen, wovon ich spreche, sind diese Artikel wahrscheinlich nicht für Sie; Wenn Sie jedoch gerade erst mit dem Programmieren beginnen oder gerade eine neue Sprache verwenden, die dynamisch (oder schwach) geschrieben wird, gibt es einige Dinge, die es zu beachten gilt, wenn es um die Arbeit mit Datentypen geht.
In dieser Serie werfen wir einen ersten Blick auf dynamische Sprachen, wie Variablen definiert werden, wie ihre Datentypen abgeleitet werden und sich von ihren statischen Gegenstücken unterscheiden, und wie einige der größten Probleme vermieden werden können, die mit der Arbeit verbunden sind diese Sprachen.
Bevor wir uns die Fallstricke von Typ-Nötigung ansehen, und wir sind sehr wahrscheinlich deren Fallstricke, ist es wichtig zu verstehen, was Datentypen sind und wie sie sich von stark typisierten Sprachen und dynamisch typisierten Sprachen unterscheiden.
Im Allgemeinen finden Sie in der Familie der zusammengestellten Programmiersprachen am ehesten stark typisierte Sprachen. Dazu gehören Sprachen wie C und C++.
Aber dort sind Ausnahmen.
Es gibt einige Sprachen, die zu einer Form von Bytecode oder einer Art Zwischensprache kompiliert werden und dann von einem Interpreter verarbeitet werden. Java ist eine solche Sprache. Diese Sprachen sind stark typisiert. Sie werden auch zusammengestellt. Sie sind jedoch nicht notwendigerweise in binäre ausführbare Dateien kompiliert, sondern Bytecode, der von einer Drittanbieter-Software interpretiert wird.
Ich weiß, es klingt ein bisschen verwirrend. Vielleicht hilft ein bisschen Code, um dies zu verdeutlichen. In stark typisierten Sprachen geben Sie immer den Datentyp an, den eine Variable darstellen soll.
Zum Beispiel:
string example = "Der schnelle braune Fuchs springt über den faulen Hund."; int Zahl = 42; doppeltes Geld = 99,99; boolean exists = true;
Obwohl der Code einfach genug sein sollte, um selbsterklärend zu sein, sollten Sie beachten, dass er Variablen zeigt, die Zeichenfolgen, numerische Typen und boolesche Werte enthalten.
In stark typisierten Sprachen müssen Sie auch die Art der Informationen angeben, die eine Funktion zurückgibt. Nehmen Sie die folgenden Beispiele:
public string getGreeting () return "Hallo Welt!"; public boolean isAlive () return true; public void doSomething () für (int i = 0; i < 10; i++ ) // Perform something
Beachten Sie, dass die letzte Funktion im obigen Beispiel einen Rückgabetyp von hat Leere
. Dies bedeutet, dass die Funktion nicht zurückkehrt etwas. Wenn wir uns mit dynamischen Sprachen beschäftigen, werden wir sehen, wie sich das unterscheidet.
Offensichtlich sind diese sehr einfach, aber das ist in Ordnung, da sie einen Punkt hervorheben müssen: Diese stark typisierten Sprachen haben Variablen und Funktionen, deren Datentyp explizit festgelegt ist.
Bei dynamisch typisierten Sprachen gibt es eine Reihe von Annehmlichkeiten, die es ermöglichen, Variablen zu definieren und Funktionen zu erstellen.
In den vorherigen Beispielen die Variable Beispiel
kann nur ein halten Schnur
. Das bedeutet, dass es keine Fließkommazahl oder einen booleschen Wert enthalten kann Muss halte eine Schnur In dynamisch getippten Sprachen ist das nicht der Fall.
Stattdessen können sich Variablen an einer Stelle während der Laufzeit des Programms auf einen String beziehen, an einem anderen Punkt auf eine Ganzzahl und an einem anderen Punkt auf einen booleschen Wert. Dies kann natürlich verwirrend sein, wenn bestimmte Codierungsstandards nicht übernommen werden. Dies würde jedoch den Rahmen dieses Punktes sprengen.
Der Punkt ist, dass in dynamisch typisierten Sprachen definierte Variablen durch die Ausführung eines Programms auf verschiedene Datentypen verweisen können.
Zum Beispiel:
var Beispiel; example = "Der schnelle braune Fuchs springt über den faulen Hund."; Beispiel = 42; Beispiel = 99,99; Beispiel = wahr;
Beachten Sie, dass diese Variablen keinen Datentyp haben. Sie werden einfach als Typ var deklariert und dann nach Bedarf festgelegt. Einige Sprachen definieren Variablen anders als oben beschrieben, aber es geht nicht darum zu zeigen, wie eine Sprache die andere überführt. Es soll gezeigt werden, wie sich Variablen einfach nicht auf einen bestimmten Datentyp beziehen.
Funktionen arbeiten auf ähnliche Weise. Das heißt, anstatt den Rückgabetyp der Daten zu definieren, definieren Sie einfach die Funktion und lassen einen Wert zurückgeben.
function getGreeting () return "Hallo Welt!"; function isAlive () return true; function doSomething () für (var i = 0; i < 10; i++ ) // Perform something
Auch für andere Sprachen müssen Funktionen auf unterschiedliche Weise definiert werden (z. B. verwenden einige Sprachen die Funktion
Verwenden Sie stattdessen das Schlüsselwort def
Schlüsselwort), aber der Kernpunkt ist, dass Sie den Datentyp, der von der Funktion zurückgegeben wird, nicht explizit angeben müssen.
Dies kann ein wirklich mächtiges Werkzeug sein. Es kann jedoch auch schwierig sein, den Code zu lesen, zu verstehen, was die Funktion zurückgibt, und / oder es ist schwierig zu wissen, wie ein externer Code zum Aufrufen der Funktionen eingerichtet wird (z. B. bei Vergleichen, Bedingungen usw.) auf).
Deshalb sind Kodierungsstandards und klare Namenskonventionen wichtig. Dies ist jedoch ein Thema, das außerhalb des Umfangs dieser Serie liegt.
Nun, da wir uns einen flüchtigen Blick auf die Frage gemacht haben, wie stark typisierte Sprachen und dynamisch typisierte Sprachen Variablen, Funktionen und Datentypen im Allgemeinen verwalten, können wir uns darauf konzentrieren, wie Typenzwang innerhalb des größeren Kontextes von Anwendungen funktioniert, die dynamisch geschrieben werden typisierte Sprachen.
Insbesondere schauen wir uns an, wie wir die Leistung zu unserem Vorteil nutzen können, und wir können prüfen, wie wir letztendlich Fehler einführen können, wenn wir nicht ausdrücklich in unserem Code klar sind. Ab dem nächsten Artikel werden wir genau das tun.
Fügen Sie in der Zwischenzeit alle Kommentare, Fragen und allgemeines Feedback zum untenstehenden Feed hinzu!