当前位置: 首页 > 知识库问答 >
问题:

朱莉娅是动态打字的吗?

贺自明
2023-03-14

许多博客和手册本身都说朱莉娅是动态键入的。但是从我对手册的阅读来看,我觉得它更像是静态键入的类型推断,就像F#。

  • Julia是静态类型化的吗
  • 它是动态类型的吗
  • 我假设它是动态输入的,看来手册不太可能是错的
  • 朱莉娅是否涉及类型推断

共有3个答案

慕容成文
2023-03-14

它是动态类型的,但是如果您指定variable::type这样的类型,您可以将该变量视为静态类型(在编译器无法自动推断类型的情况下,这将提高性能)

万俟招
2023-03-14

两者都是真的。Julia是动态类型的,但在编写良好的Julia代码中,通常可以推断出类型。在可能的情况下,您通常会获得重大的性能提升。

在常见问题中对此有一些讨论。

刘凡
2023-03-14

蒂姆·霍利的回答非常正确,但我会详细说明一下。首先,让我们定义一些术语——

在静态语言中,有一些规则来确定程序中每个表达式的类型。表达式的类型决定了程序的行为。不允许为每个表达式确定一致类型的程序被认为是不正确的,并且不会编译。在多态性存在的情况下,表达式的类型可能不是单一的具体类型:参数多态性可以被认为是让相同的代码描述一整套具体类型算法的一种方式,这些算法由类型的参数索引;子类型多态性可以被认为是在静态语言中引入有限数量的动态行为。

另一方面,动态语言没有为表达式指定类型的规则:

Julia完全属于动态阵营:类型是值而不是表达式的属性。代码的结果类型取决于执行时值如何流过它;该语言不包括任何在执行表达式之前为表达式分配类型的规则。然而,与许多动态语言不同,Julia有一种相当复杂的语言来讨论类型,您可以用类型注释表达式。例如,x::T是一个断言,即x是类型T的值;如果这是真的,x::T的值为x,否则将引发错误,表达式将不返回值。方法签名中的类型注释具有稍微不同的含义:它们指示方法仅在相应的参数具有指定类型时才适用,而不是断言现有值的类型。在任何一种情况下,下面的代码都可以安全地假设x的值类型为T

[旁白:在某些语言中,带有“渐进”或“可选”类型注释将语言从动态模式切换到静态模式:没有类型注释的方法是动态的;带有类型注释的方法是静态的。在静态代码中,有为所有表达式分配类型的规则,代码必须满足这些规则。Julia不是这样工作的——带有类型注释的代码仍然是动态的,并且与没有类型注释的代码具有相同的语义。]

在F#、OCaml或Haskell等语言中,类型推断是确定表达式类型的一部分。如果编译器无法推断任何表达式的类型,则程序已损坏,无法编译。这些语言都使用某种形式的Hindley-Milner类型推断,这是一种非常聪明的方法,可以从代码结构中导出表达式类型,而不必写出显式类型(与动态语言相比,在动态语言中,类型是通过执行代码隐含的)。大多数情况下根本不需要类型注释,这与C、C#和Java等语言中可能需要的冗长类型声明相比是非常令人愉快的。然而,这与Julia和Python这样的动态语言截然不同,后者不需要类型注释,因为表达式没有预先确定的类型是完全可以接受的。在Hindley-Milner语言中,您可能不需要像在C或Java中那样编写多个类型,但每个表达式都必须具有编译器可以计算的预定类型。

朱莉娅的编译器进行类型推断,但它非常不同:并不需要每个表达式都有不可理解的类型。编译器分析代码,试图预测表达式的类型,并利用这些信息生成更高效的机器代码。但是如果它不能确定表达式的类型,那也没什么大不了的:编译器只是使用运行时类型信息发出无论如何都可以工作的通用代码。在朱莉娅的大部分时间里,类型推断只是一种优化——不管有没有它,你的代码都会以同样的方式工作——但是如果类型推断成功,它会运行得更快。

 类似资料:
  • null 我的两个问题仍然存在。

  • 在中,函数在结构上允许您取两个向量和的外积,同时为应用于每个组合的实际函数提供了许多选项。例如,创建和之间元素差异的“外部积”矩阵。朱莉娅也有类似的吗?

  • Jump是否支持在模型中直接使用数学逻辑? 我知道它支持条件指示符,但是这些条件指示符怎么样? 例如: 1-一个是一个二进制变量,它与当前解决方案的约束的满意度和非满意度状态相关联。

  • 我确信julia已经启用,并且linter也启用了(在vs代码设置中:julia>lint:Run),我在xxx.jl脚本上得到了语法高亮显示,但根本没有linter。 我在最新的vs代码+最新的Julia1.07扩展+最新的MacOSX上。我对vs代码进行了干净的安装,在安装之前清除了所有旧的相关文件夹(https://stackoverflow.com/a/53839847/11608725)

  • 我写了一个mandelbrot集,我读过关于julia集的文章,它非常相似,但到底是什么关系呢?我能用mandelbrot公式画一个julia集吗?起始参数是什么?请阅读我的mandelbrot集合代码: 我不确定mandelbrot集对于z是迭代的,julia集对于c是迭代的,这意味着什么?我需要更改代码吗? 更新:我更改了代码,但它不起作用。我的想法是从$re和$im开始,而不是从0开始: 更