1. ホーム
  2. types

[解決済み] Juliaは動的型付けができますか?

2023-03-09 16:20:07

質問

多くのブログ、そして マニュアル自体 には、ジュリアは 動的型付け . しかし、マニュアルを読む限りでは、どちらかというと 静的型付け 型推論 のように F# .

  • Juliaは型推論を用いた静的型付けが可能ですか?
  • 動的に型付けされますか?
  • 動的型付けと仮定すると、マニュアルが間違っている可能性は低いと思われます。
  • Juliaでは型推論は全く関係ないのですか?

どのように解決するのですか?

Tim Holy の回答は非常に正しいのですが、少し詳しく説明します。まず、いくつかの用語を定義しましょう。私の定義に同意しないかもしれませんが、少なくとも私が何を言っているかはわかるでしょう。静的言語と動的言語の主な違いは、静的言語では式が型を持ち、動的言語では値が型を持つことだと私は考えています。

静的言語では、プログラム内のすべての式の型を決定するためのルールがあります。式の型はプログラムの動作を決定する。すべての式に対して一貫した型の決定を認めないプログラムは不正確とみなされ、コンパイルされない。パラメトリックポリモーフィズムは、型のパラメータを指標とした具体的な型付けアルゴリズムの全ファミリーを同じコードで記述する方法と考えることができ、サブタイプポリモーフィズムは、それ以外の静的言語に限られた量の動的動作を導入すると考えることができる。

一方、動的言語には式に型を割り当てるルールがありません。型はプログラム中をデータが流れる方法によって暗示されます。 実行時に . 一般に、式はあらゆる型の値を生成する可能性がある。このため、型理論家は動的言語をquot;unityped;と表現することがあります。つまり、quot;型が本質的に式のプロパティである静的な観点から、動的言語におけるすべての式は Any . もちろん、これは式に対してのみ意味を持つ静的な型の概念を、型の概念が値に対してのみ意味を持つ言語に適用することになります。

Juliaは正真正銘、動的な陣営に属します:型は式ではなく、値の特性です。コードの結果の型は、それが実行されたときに値がどのように流れるかによって決定されます。しかし、多くの動的言語とは異なり、Juliaは型について語るためのかなり洗練された言語を持っており、式に型を注釈することができます。例えば x::T は次のようなアサーションです x は型 T が真であれば;。 x::T の値として評価されます。 x の値として評価され、そうでない場合はエラーが発生し、式は値を返しません。メソッド署名の型アノテーションは少し異なる意味を持ちます。既存の値の型を主張する代わりに、対応する引数が示された型の場合のみ、そのメソッドが適用されることを表します。どちらの場合でも、以下のコードでは安全に x が型であると仮定できます。 T .

[余談:gradual" や optional" を持ついくつかの言語では、型注釈が言語の動的モードから静的モードへの切り替えを行います:型注釈のないメソッドは動的、型注釈のあるメソッドは静的です。静的なコードでは、すべての式に型を割り当てるための規則があり、コードはそれを満たさなければなりません。これはJuliaの動作とは異なります。タイプアノテーションがあるコードはまだ動的で、タイプアノテーションがないコードと同じセマンティクスを持っています]。

F#、OCaml、Haskellなどの言語における型推論は、式の型が決定される方法の一部である。コンパイラーが式の型を推論できない場合、プログラムは壊れており、コンパイルできません。これは、明示的に型を記述することなく、コードの構造から式の型を導き出す非常に賢い方法である(コードの実行によって型が推測される動的言語と比較してほしい)。C++、C#、Javaなどの言語で必要とされる冗長な型宣言と比較すると、非常に快適で、多くの場合、型注釈は全く必要ない。しかし、JuliaやPythonのような動的言語では、式があらかじめ決められた型を持っていなくても全く問題ないため、型注釈を必要としないのとは大きく異なる。ヒンドレーミルナー言語では、C++やJavaほど多くの型を書く必要はないかもしれないが、すべての式はコンパイラが計算できる所定の型を持っていなければならない。

Juliaのコンパイラは型推論を行いますが、それは非常に異なっています:すべての式が推論可能な型を持っている必要はありません。コンパイラはコードを解析して式の型を予測しようとし、その情報を使ってより効率的な機械語コードを生成します。しかし、もし式の型を決定できなくても、コンパイラは実行時の型情報を使って、とにかく動作する汎用的なコードを出力するだけなので、大した問題ではありません。Juliaでは、ほとんどの場合、型推論は単なる最適化であり、型推論があってもなくてもコードは同じように動きますが、型推論がうまくいけば、より速く実行できるようになります。