Подтвердить что ты не робот

Является ли Джулия динамически типизированной?

Много блогов и руководство, говорят, что Julia динамически набирается. Но из моего чтения руководства это звучит для меня скорее как это статически напечатано с типом , например F #.

  • Является ли Джулиа статически типизирована с типом вывода?
  • Это динамически типизировано?
  • Я предполагаю, что это динамически типизировано, кажется маловероятным, что руководство неверно.
  • Является ли вообще вывод типа в Джулии?
4b9b3361

Ответ 1

Тим Святый ответ вполне корректен, но я кое-что уточню. Во-первых, пусть определит некоторые термины - вы можете не согласиться с моими определениями, но, по крайней мере, вы будете знать, что я говорю. На мой взгляд, основное отличие между статическим и динамическим языками заключается в следующем: в статических языках выражения имеют типы; в динамических языках значения имеют типы.

В статическом языке существуют правила для определения типа каждого выражения в программе. Типы выражений диктуют поведение программы. Программа, которая не допускает согласованный тип, который будет определен для каждого выражения, считается некорректным и не будет компилироваться. При наличии полиморфизма тип выражения может быть не единственным конкретным типом: параметрический полиморфизм можно рассматривать как способ позволить одному и тому же коду описать целое семейство конкретно типизированных алгоритмов, индексированных по параметрам типов; подтиповый полиморфизм можно рассматривать как введение ограниченного количества динамического поведения в статический язык, который в противном случае.

Динамические языки, с другой стороны, не имеют правил для присваивания типов выражениям: типы подразумеваются способом передачи данных через программу по мере ее выполнения. В общем случае выражения могут потенциально производить значения любого типа вообще. Из-за этого теоретики типа иногда описывают динамические языки как "унифицированные", т.е. Со статической точки зрения, где "тип" по своей сути является свойством выражения, все выражения в динамическом языке имеют тип Any. Разумеется, применение статического понятия типа - что имеет смысл только для выражений - к языку, где понятие типа имеет смысл только для значений.

Юлия находится прямо в динамическом лагере: типы - это свойство значений, а не выражений. Тип результата кода определяется тем, как значения передаются через него при его выполнении; язык не содержит правил для назначения типов выражениям перед их исполнением. Однако, в отличие от многих динамических языков, у Джулии довольно сложный язык для разговоров о типах, и вы можете комментировать выражения с типами. Например, x::T является утверждением, что x является значением типа T; если это правда, x::T оценивает значение x, в противном случае возникает ошибка, и выражение не возвращает значения. Аннотации типов в сигнатурах метода имеют несколько иное значение: вместо утверждения типа существующего значения они указывают, что метод применяется только в том случае, если соответствующий аргумент имеет указанный тип. В любом случае следующий код может с уверенностью предположить, что значение x имеет тип T.

[Кроме того: на некоторых языках с "постепенным" или "необязательным" типом введите аннотации, переключая язык из динамического в статический: методы без аннотаций типов являются динамическими; методы с аннотациями типа являются статическими. В статическом коде есть правила для назначения типов всем выражениям, и код должен их удовлетворять. Это не так, как работает Джулия - код с аннотациями типа по-прежнему динамичен и имеет ту же семантику, что и код без аннотаций типа.]

Вывод типа в таких языках, как F #, OCaml или Haskell, является частью определения типов выражений. Если компилятор не может вывести тип выражения, ваша программа будет разбита и не будет компилироваться. Эти языки используют некоторую форму вывода типа Хиндли-Милнера, что является очень умным способом получения типов выражений из структуры кода без необходимости выписывать явные типы (сравните это с динамическими языками, где типы подразумеваются выполнение кода). В большинстве случаев аннотации типа не требуются вообще, что довольно приятно по сравнению с объявлениями подробного типа, которые могут быть необходимы на таких языках, как С++, С# и Java. Однако это очень отличается от динамических языков, таких как Julia и Python, где аннотации типа не требуются просто потому, что это вполне приемлемо для выражений, которые не имеют заданный тип. В языках Hindley-Milner вам, возможно, не нужно писать столько типов, как на С++ или Java, но каждое выражение имеет предопределенный тип, который компилятор может вычислить.

Компилятор Julia делает вывод типа, но он очень различен: для каждого выражения не обязательно иметь выводный тип. Компилятор анализирует код, чтобы попытаться предсказать типы выражений и использует эту информацию для создания более эффективного машинного кода. Но если он не может определить тип выражения, это не имеет большого значения: компилятор просто испускает общий код, который будет работать в любом случае, используя информацию типа времени выполнения. По большей части в Julia, вывод типа - это просто оптимизация - ваш код будет работать одинаково с ним или без него, но с успешным типом вывода он будет работать намного быстрее.

Ответ 2

Оба являются истинными. Джулия динамически типизирована, но в хорошо написанном julia-коде типы обычно можно вывести. Когда это возможно, вы часто получаете значительное повышение производительности.

В этом разделе обсуждается это в ЧаВо.

Ответ 3

Он динамически печатается, хотя если вы укажете тип типа типа: type, вы можете считать эту переменную статически типизированной (и это повысит производительность в тех случаях, когда компилятор не может автоматически вывести тип)

Ответ 4

Вот выдержка из Начало работы с книгой языков программирования Джулии:

Также полезно указать типы аргументов, чтобы ограничить вид параметров, переданных при вызове. Наш заголовок функции для числа с плавающей запятой затем будут выглядеть как функция mult (x:: Float64, у:: Float64). Когда мы вызываем эту функцию с mult (5, 6), получаем error, ERROR: "mult" не имеет метода, соответствующего mult (:: Int64,:: Int64), доказывая, что Джулия действительно является строго типизированным языком. Это не принимать целочисленные параметры для аргументов с плавающей запятой.

Это пример функции в книге:

function mult(x::Float64, y::Float64)
  x * y
end
mult(5, 6) # raises an error
mult(5.0, 6.0) # => 30.0

Я не уверен, что книга правильная, но она противоречит всем остальным.