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

问题描述 投票:-2回答:3

来自编程语言的设计概念] >>>

尽管某些动态类型化语言具有简单的类型标记(例如,Perl变量名称以指示值类型的字符开头:$ for标量值,@用于数组值,%用于哈希值(键/值对),动态类型化的语言通常具有没有明确的类型注释。

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

问题1:对于“没有显式类型注释”的动态类型语言,它们是否需要通过使用某些类型/类重构或类型/类推论技术来静态地推断/重构类型/类。打字的语言吗?

问题2:

上面的引语是静态或动态类型,显式或无类型注释可以混合和匹配。
  • 静态和动态类型之间的选择是否仅在编程语言的实现内部进行,而对于语言的程序员而言是不可见的?

  • 编程语言的程序员是否只注意到语言是否使用显式类型/类注释,而不是语言使用静态或动态类型?特别是,无论程序员是静态类型还是动态类型,带有显式类型/类注释的语言对程序员来说看起来都一样吗?没有显式类型/类注释的语言对程序员来说看起来是一样的,而不管它们是静态类型还是动态类型?

谢谢。

[来自Turbak的《编程语言的设计概念》,尽管某些动态类型化的语言具有简单的类型标记(例如,Perl变量名以指示类型的字符开头...

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

在静态类型语言中,事物的类型必须是静态已知的。这就是为什么在没有显式类型注释时他们需要类型推断的原因。动态类型的语言直到运行时才需要(通常不知道)类型,因此不需要类型推断。

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

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

var x = 4.2;
print("hello");
print("foo" / 4.2);

如果尝试(编译并)运行该程序的结果是,您仅收到有关无法将字符串除以数字的错误,则该语言是静态键入的。

如果结果是打印出“ hello”,并且然后

出现错误,则该语言是动态键入的。

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

通常来说,动态类型的语言和静态类型的语言之间的区别是它们的执行方式不同。静态类型的语言通常会编译为非常高效的机器代码(或与其类似的东西)。这意味着需要一段这样的代码:

foo = bar + baz

需要生成实际上执行此代码所表达内容的较低级代码。该代码确切表示的内容取决于细节。用这种假设的语言说+既可以用来加数字,也可以用来连接字符串。这是两个非常不同的操作,必须为它们生成不同的机器代码,因此静态类型的语言需要知道此处涉及的类型以及必须生成的代码。

使用动态类型的语言,所有这些都将在运行时而不是在编译时解决。在运行时,程序将检查barbaz是什么类型,然后选择要运行的适当操作。每次运行此代码行时,barbaz可能是不同的类型,并且每次都可能产生不同的结果。

因此,动态类型化的语言在编译时不需要知道variables的类型,它们将在运行时根据values

的类型起作用。一般来说,在静态语言中,variables(名称为bar)具有在运行时仅保存该类型的值的类型,而在动态语言中,变量只是名称,分配给它们的值可以具有任何类型。 。

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

  • 静态类型的语言可以在编译时捕获某些类型的错误(例如,“ +操作对于变量barbaz无效,您将其声明为intstr”),仅在运行时以动态语言显示]
  • 因此,动态语言通常比静态类型的语言更多地依赖于单元测试套件
  • 如上所述,bar + baz每次以动态语言执行时可能会产生完全不同的结果,而在静态语言中它总是会产生相同的类型;仅此一项就可以实现完全不同的编程样式
  • “泛型”是许多动态程序员甚至都不知道如何拼写的东西,尽管它在静态类型的语言中是一个巨大的帮助(简而言之,泛型允许bar + baz之类的东西即使在静态语言中也可以返回不同的类型,但是与动态语言相比,它仍然需要进行某种类型的定位)
  • 静态语言仍然需要类型注释(并且无论推理机制有多好,您will
  • 迟早都会遇到它们,因此静态语言看上去确实不同于动态语言)

    这里可能还会列出更多内容,但总而言之:程序员会注意到其中的区别。

    请注意,随着时间的流逝,线条趋于模糊:动态语言趋于随着时间而增长,因为注释所带来的错误检查对于任何复杂的项目都至关重要。静态语言OTOH倾向于随着时间的推移以越来越好的推论来尽量减少必要的注释,以节省程序员多余的击键次数。

    我将尝试窥视未来...

    问题1:对于“没有显式类型注释”的动态类型语言,它们是否需要推断/重构类型/类

    不,他们不需要从经典意义上进行推断,但是无论如何,迟早他们都会这么做:当访问变量并参与某些计算/操作时。

    也不要忘记常量。如果我写:

    avar = "Goofy"
    

    已经存在某种类型的推断,以了解avar应该包含五个字符的字符串。稍后,例如执行时

    avar = avar + " blah"   // append some char
    

    变量avar有一些标记,表示“这是一个字符串”;通过推断(什么是“ blah”?),解释器确定必须串联两个字符串。我在这里看到推理和重构...

    展望未来:编译器(即使是解释型语言的编译器-例如,可以将Python编译为.pyc)在正确地推断一些事情方面会具有很大的优势。上面的指令“ avar = avar +'blah'”可以编译为已经知道我们正在链接两个字符串的东西,因此速度更快。

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

    这是硬币的两个面;对一个人有益的东西可能对另一个人不利。静态类型的语言大概总是更快,但是编写起来比较冗长(需要更多的类型-双关语)。动态键入很方便,但是比较慢,并且可能在运行时导致错误。我认为可以通过选择语言的最终用户来进行选择,因此我认为不可以:静态和动态之间的选择对用户来说非常明显!

    但:有一个中途,即“鸭子打字”,它可以(应该)是静态打字,但是写起来更聪明,也不太冗长。它不能解决(硬币总是有两个方面),但可以提供帮助。

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

    从理论上讲,答案可能是肯定的:程序员应该只知道该语言向用户公开的显式键入或自动键入。但是实际上,程序员很聪明,经常运行他们编写的程序,有时甚至进行调试。在运行时,甚至在调试时,静态类型和动态类型之间会出现差异。这是因为程序员是聪明的,计算机是愚蠢的(有例外,但不是正常情况)。

    再次,是对未来的展望:可能会出现内部静态键入的语言,但能够将自己呈现为准动态键入的语言。好。相反不应该发生:谁想要一种冗长的,静态类型的语言,最终它实际上是动态的?

    仅是我的两分钱。

    types programming-languages static-typing dynamic-typing
    3个回答
    1
    投票

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


    1
    投票

    通常来说,动态类型的语言和静态类型的语言之间的区别是它们的执行方式不同。静态类型的语言通常会编译为非常高效的机器代码(或与其类似的东西)。这意味着需要一段这样的代码:

    foo = bar + baz
    

    1
    投票

    我将尝试窥视未来...

    问题1:对于“没有显式类型注释”的动态类型语言,它们是否需要推断/重构类型/类

    © www.soinside.com 2019 - 2024. All rights reserved.