Types 静态和动态类型的选择对于语言的程序员来说是不可见的吗?

Types 静态和动态类型的选择对于语言的程序员来说是不可见的吗?,types,programming-languages,static-typing,dynamic-typing,Types,Programming Languages,Static Typing,Dynamic Typing,来自Turbak编程语言中的设计概念 尽管有些动态类型语言具有简单的类型标记(例如,Perl变量名以一个字符开头,表示值的类型:$for 标量值,@表示数组值,%表示散列值(键/值对)),动态类型语言通常具有 没有显式类型注释 在静态类型语言中,反之亦然, 其中,显式类型注释是规范。大多数语言起源于 Algol 68,如艾达、C/C++、java和Pascal,需要类型为 为所有变量、所有数据结构组件以及所有函数/过程/方法参数和返回值显式声明。然而,有些语言 (例如,ML、Haskell、FX

来自Turbak编程语言中的设计概念

尽管有些动态类型语言具有简单的类型标记(例如,Perl变量名以一个字符开头,表示值的类型:$for 标量值,@表示数组值,%表示散列值(键/值对)),动态类型语言通常具有 没有显式类型注释

在静态类型语言中,反之亦然, 其中,显式类型注释是规范。大多数语言起源于 Algol 68,如艾达、C/C++、java和Pascal,需要类型为 为所有变量、所有数据结构组件以及所有函数/过程/方法参数和返回值显式声明。然而,有些语言 (例如,ML、Haskell、FX、Miranda)实现无显式类型的静态类型 通过称为类型重构或类型推断的技术进行声明

问题1:对于“没有显式类型注释”的动态类型语言,它们是否需要像静态类型语言那样,使用一些类型/类重构或类型/类推理技术来推断/重构类型/类

问题2:上面的引文说静态或动态类型以及显式或无类型注释可以混合匹配

  • 静态类型和动态类型之间的选择是否仅在编程语言的实现内部进行,而编程语言的程序员不可见

  • 编程语言中的程序员是否只注意语言是否使用显式类型/类注释,而不注意语言是否使用静态或动态类型?具体地说,对于程序员来说,具有显式类型/类注释的语言看起来是否相同,而不管它们是静态类型还是动态类型?对于程序员来说,没有显式类型/类注释的语言看起来是一样的,不管它们是静态类型还是动态类型

谢谢

对于“没有显式类型注释”的动态类型语言,它们是否需要像静态类型语言那样,使用一些类型/类重构或类型/类推理技术来推断/重构类型/类

在静态类型语言中,事物的类型必须是静态的。这就是为什么当没有显式类型注释时,它们需要类型推断。动态类型语言在运行时之前不需要(通常也不能)知道类型,因此不需要类型推断

编程语言中的程序员是否只注意语言是否使用显式类型/类注释,而不注意语言是否使用静态或动态类型

程序员将通过观察类型错误是静态检测还是在运行时检测来注意语言是动态类型还是静态类型。以以下程序为例(当然,根据特定语言的语法进行了调整):

如果尝试(编译并)运行该程序的结果是,您只会得到一个关于不能将字符串除以数字的错误,那么该语言是静态类型的

如果结果是打印了“hello”,然后出现错误,则该语言是动态键入的


如果结果是“hello”,后跟NaN,则语言是JavaScript。

通常来说,动态类型语言和静态类型语言之间的区别在于它们的执行方式不同。静态类型语言通常被编译成非常高效的机器代码(或类似的代码)。这意味着对于这样一段代码:

foo = bar + baz
需要生成实际执行此代码所表达内容的较低级别代码。这段代码到底表达了什么取决于细节;在这个假设的语言中,say可以用来添加数字和连接字符串。这是两个非常不同的操作,必须为其生成不同的机器代码,因此静态类型语言需要知道这里涉及哪些类型以及必须生成哪些代码

在动态类型语言中,所有这些都将在运行时而不是编译时解析。在运行时,程序将检查
bar
baz
是什么类型,并选择要运行的适当操作<代码>条形图和
baz
每次运行这行代码时都可能是不同的类型,每次都可能产生不同的结果

所以,动态类型语言不需要在编译时知道变量的类型,它们将在运行时根据值的类型进行操作。一般来说,在静态语言中,变量(名称
bar
)的类型在运行时只保存该类型的值,而在动态语言中,变量只是名称,分配给它们的值可以有任何类型

静态类型和动态类型之间的选择是否仅在编程语言的实现内部进行,而编程语言的程序员不可见?[……]

  • 静态类型语言可以在编译时捕获某些类的错误(例如“
    +
    操作对变量
    bar
    baz
    没有意义,您将其声明为
    int
    str
    ”),这在运行时只会在动态语言中出现
  • 因此,动态语言通常比静态类型语言更依赖于单元测试套件
  • 如上所述,
    bar+baz
    每次在动态语言中执行时可能会产生完全不同的结果,而在静态语言中总是会产生相同的类型;仅此一点就可以实现非常不同的编程风格
  • “泛型”是许多动态程序员甚至不知道如何拼写的东西,而它是一种语言
    foo = bar + baz
    
    avar = "Goofy"
    
    avar = avar + " blah"   // append some char