Wird Julia dynamisch getippt?

73

Viele Blogs und das Handbuch selbst sagen, dass Julia dynamisch getippt ist . Aber nach dem Lesen des Handbuchs klingt es für mich eher so, als wäre es statisch mit Typinferenz wie F # typisiert .

  • Ist Julia statisch mit Typinferenz typisiert?
  • Ist es dynamisch getippt?
  • Ich gehe davon aus, dass es dynamisch getippt ist. Es ist unwahrscheinlich, dass das Handbuch falsch ist.
  • Ist die Typinferenz überhaupt an Julia beteiligt?
Lyndon White
quelle

Antworten:

118

Die Antwort von Tim Holy ist ganz richtig, aber ich werde ein wenig näher darauf eingehen. Lassen Sie uns zunächst einige Begriffe definieren - Sie können meinen Definitionen nicht zustimmen, aber zumindest wissen Sie, was ich sage. Der Hauptunterschied zwischen statischen und dynamischen Sprachen besteht meiner Ansicht nach darin, dass Ausdrücke in statischen Sprachen Typen haben; In dynamischen Sprachen haben Werte Typen.

In einer statischen Sprache gibt es Regeln zum Bestimmen des Typs jedes Ausdrucks in einem Programm. Die Arten von Ausdrücken bestimmen das Verhalten des Programms. Ein Programm, das nicht zulässt, dass für jeden Ausdruck ein konsistenter Typ ermittelt wird, wird als falsch angesehen und nicht kompiliert. Bei Vorhandensein von Polymorphismus ist der Typ eines Ausdrucks möglicherweise kein einzelner konkreter Typ: Parametrischer Polymorphismus kann als eine Möglichkeit angesehen werden, denselben Code eine ganze Familie konkret typisierter Algorithmen beschreiben zu lassen, die durch die Parameter der Typen indiziert werden. Subtyp-Polymorphismus kann als Einführung einer begrenzten Menge an dynamischem Verhalten in eine ansonsten statische Sprache angesehen werden.

Dynamische Sprachen hingegen haben keine Regeln für die Zuweisung von Typen zu Ausdrücken: Typen werden durch die Art und Weise impliziert, wie Daten während der Ausführung durch das Programm fließen . Im Allgemeinen können Ausdrücke möglicherweise Werte jeglichen Typs erzeugen. Aus diesem Grund beschreiben Typentheoretiker dynamische Sprachen manchmal als "Unityped" - dh aus statischer Sicht, wenn ein "Typ" von Natur aus eine Eigenschaft eines Ausdrucks ist, haben alle Ausdrücke in einer dynamischen Sprache den Typ Any. Dies bedeutet natürlich, dass der statische Typbegriff - der nur für Ausdrücke von Bedeutung ist - auf eine Sprache angewendet wird, in der der Typbegriff nur für Werte von Bedeutung ist.

Julia ist genau im dynamischen Lager: Typen sind eine Eigenschaft von Werten, keine Ausdrücke. Der Ergebnistyp des Codes wird dadurch bestimmt, wie Werte bei der Ausführung durch ihn fließen. Die Sprache enthält keine Regeln zum Zuweisen von Typen zu Ausdrücken, bevor diese ausgeführt werden. Im Gegensatz zu vielen dynamischen Sprachen verfügt Julia jedoch über eine ziemlich ausgefeilte Sprache, um über Typen zu sprechen, und Sie können Ausdrücke mit Typen versehen. Zum Beispiel x::Tist eine Behauptung xein Wert vom Typ T; Wenn dies zutrifft, wird x::Tder Wert von ausgewertetxAndernfalls wird ein Fehler ausgelöst und der Ausdruck gibt keinen Wert zurück. Typanmerkungen in Methodensignaturen haben eine etwas andere Bedeutung: Anstatt den Typ eines vorhandenen Werts zu bestätigen, geben sie an, dass die Methode nur angewendet wird, wenn das entsprechende Argument vom angegebenen Typ ist. In beiden Fällen kann der folgende Code sicher annehmen, dass der Wert von xvom Typ ist T.

[Nebenbei: In einigen Sprachen mit "schrittweiser" oder "optionaler" Eingabe wechseln Typanmerkungen die Sprache vom dynamischen in den statischen Modus: Methoden ohne Typanmerkungen sind dynamisch; Methoden mit Typanmerkungen sind statisch. Im statischen Code gibt es Regeln für die Zuweisung von Typen zu allen Ausdrücken, und der Code muss diese erfüllen. So funktioniert Julia nicht - Code mit Typanmerkungen ist immer noch dynamisch und hat dieselbe Semantik wie Code ohne Typanmerkungen.]

Die Typinferenz in Sprachen wie F #, OCaml oder Haskell ist Teil der Bestimmung der Ausdruckstypen. Wenn der Compiler den Typ eines Ausdrucks nicht ableiten kann, ist Ihr Programm fehlerhaft und wird nicht kompiliert. Diese Sprachen verwenden alle eine Form der Hindley-Milner-Typinferenz. Dies ist eine sehr clevere Methode, um die Ausdruckstypen aus der Struktur des Codes abzuleiten, ohne explizite Typen ausschreiben zu müssen (vergleichen Sie dies mit dynamischen Sprachen, in denen die Typen impliziert sind Ausführung des Codes). In den meisten Fällen sind überhaupt keine Typanmerkungen erforderlich, was im Vergleich zu den ausführlichen Typdeklarationen, die in Sprachen wie C ++, C # und Java erforderlich sein können, sehr angenehm ist. Dies ist jedoch sehr unterschiedlich aus dynamischen Sprachen wie Julia und Python, in denen keine Typanmerkungen erforderlich sind, nur weil es durchaus akzeptabel ist, dass Ausdrücke keinen vorgegebenen Typ haben. In Hindley-Milner-Sprachen müssen Sie möglicherweise nicht so viele Typen schreiben wie in C ++ oder Java, aber jeder Ausdruck hat einen vorgegebenen Typ, den der Compiler berechnen kann.

Julias Compiler macht Typinferenz, aber es ist sehr unterschiedlich: Es ist nicht erforderlich, dass jeder Ausdruck einen inferrierbaren Typ hat. Der Compiler analysiert Code, um die Arten von Ausdrücken vorherzusagen, und verwendet diese Informationen, um effizienteren Maschinencode zu generieren. Wenn es jedoch den Typ eines Ausdrucks nicht bestimmen kann, ist es keine große Sache: Der Compiler gibt nur generischen Code aus, der ohnehin funktioniert, und verwendet Laufzeittypinformationen. In Julia ist die Typinferenz größtenteils nur eine Optimierung - Ihr Code funktioniert mit oder ohne sie auf die gleiche Weise -, aber mit einer erfolgreichen Typinferenz wird sie viel schneller ausgeführt.

StefanKarpinski
quelle
2
Es ist sicherlich nicht wahr, dass das Entfernen von Typanmerkungen die Bedeutung eines Julia-Programms nicht ändert. Natürlich, weil Julias Methodenversand funktioniert.
Steven Obua
1
@Steven_Obua, ich glaube nicht, dass meine Antwort sagt oder impliziert, dass Typanmerkungen keine semantische Bedeutung haben, oder?
StefanKarpinski
1
Tolle und informative Antwort, aber Sie sagen irgendwann: "So funktioniert Julia nicht - Code mit Typanmerkungen ist immer noch dynamisch und verhält sich genauso wie Code ohne Typanmerkungen."
Steven Obua
2
Mit "verhält sich gleich" meinte ich "hat die gleiche Semantik", aber ja, ich könnte diese Unterscheidung klarstellen.
StefanKarpinski
28

Beides ist wahr. Julia ist dynamisch typisiert, aber in gut geschriebenem Julia-Code können die Typen normalerweise abgeleitet werden. Wenn dies möglich ist, erhalten Sie häufig eine erhebliche Leistungssteigerung.

Es gibt einige Diskussionen darüber in den FAQ .

tholy
quelle
2

Es wird dynamisch typisiert. Wenn Sie jedoch einen Typ wie variable :: type angeben, können Sie sich diese Variable als statisch typisiert vorstellen (und dies verbessert die Leistung in Fällen, in denen der Compiler den Typ nicht automatisch ableiten konnte).

Chris Rackauckas
quelle