【发布时间】:2017-04-01 12:46:58
【问题描述】:
我意识到“强类型”和“软类型”的定义是松散的并且可以解释,但我还没有找到关于非类型球拍(根据我的理解意味着动态类型)和类型球拍的明确定义关于这个。
再一次,我确信它不会那么枯燥,但至少我想了解更多关于哪个方向倾斜的信息。我对此进行的研究越多,我就越困惑,所以提前感谢您的帮助!
【问题讨论】:
标签: racket
我意识到“强类型”和“软类型”的定义是松散的并且可以解释,但我还没有找到关于非类型球拍(根据我的理解意味着动态类型)和类型球拍的明确定义关于这个。
再一次,我确信它不会那么枯燥,但至少我想了解更多关于哪个方向倾斜的信息。我对此进行的研究越多,我就越困惑,所以提前感谢您的帮助!
【问题讨论】:
标签: racket
回答此类问题的一个问题是,人们对几乎所有这些术语的含义都有不同的看法。所以...以下是我的观点(虽然这是一个相当有见识的观点,如果我自己这么说的话)。
所有语言都对一组值进行操作,并具有一些运行时行为。在几乎所有语言中,尝试向函数添加数字都会失败。您可以将其称为“类型系统”,但它可能不是正确的术语。
那么什么是类型系统?这些天来,我声称该术语通常是指检查程序并静态地[*]推断程序属性的系统。通常,如果它被称为类型系统,这意味着将“类型”附加到每个表达式,以限制表达式可以评估的值的集合/类。请注意,此定义基本上使“动态类型”一词毫无意义。
注意这个巨大的漏洞:有一个“普通类型系统”,它只是将包含所有程序值的“类型”分配给每个表达式。因此,如果您愿意,您可以将任何语言视为静态类型。或者,如果您愿意, “unityped”(注意其中的“i”)。
好的,说到底。p>
没有输入球拍。或者,如果您愿意,可以选择“动态类型”或“单一类型”,甚至是“无类型”。
Typed Racket 是类型的。它有一个静态类型系统,为每个表达式分配一个类型。它的类型系统是“健全的”,这意味着评估 该程序将符合类型系统提出的声明:如果 Typed Racket (以下简称 TR)类型检查您的程序并将类型“自然”分配给 表达式,那么它肯定会计算为自然数(假设没有错误 在 TR 类型检查器或 Racket 运行时系统中)。
Typed Racket 有许多不同寻常的特性,允许用 TR 编写的代码与用 Racket 编写的代码互操作。其中最著名的是“出现类型”,它允许 TR 程序处理诸如 (U Number String) 之类的类型(即, 是数字或字符串的值)而不会爆炸,就像早期的类似类型系统所做的那样。
不过,这有点离题:您的问题是关于 Racket 和 TR,简单的答案是基本的 Racket 语言没有静态类型系统,而 TR 有。
[*] 定义术语“静态”超出了本文的范围:)。
【讨论】:
强类型和弱类型与静态或动态类型无关。您可以将它们组合在一起,以便有 4 种变体。 (强/静态、弱/静态、强/动态、弱/动态)。
Scheme(因此#lang racket)是动态和强类型的。
> (string-append "test" 5)
string-append: contract violation
expected: string?
given: 5
argument position: 2nd
other arguments...:
它的所有值都有一个类型,函数可以要求一个类型。如果要将字符串附加到数字,则会出现类型错误。您需要使用number->string 将数字显式转换为字符串,以满足所有参数为字符串的约定。对于弱类型语言,如 JavaScript,它只会将数字转换为字符串以满足函数的要求。更少的代码,但可能更多的运行时错误。
既然 Scheme 是强类型的,#lang typed/racket 肯定也是。
虽然 Scheme/#lang racket 是动态类型的,但我不完全确定 #lang typed/racket 是否完全静态。 The Guide 称其为渐进式语言。
【讨论】:
“弱类型”的定义之一是,当操作数之间存在类型不匹配而不是给出错误时,语言将尽力继续,通过将操作数从一种类型强制转换为另一种类型或给出默认值结果。
例如,在 Perl 中,如果在算术运算中使用包含数字的字符串,则会将其强制转换为数字:
# This Perl program prints 6.
print 3 * "2a"
根据这个定义,Racket 将被归类为动态类型(类型错误发生在运行时)和强类型(它不会自动将值从一种类型转换为另一种类型)。
由于 Typed Racket 不会改变 Racket 的运行时语义(除了引入一些额外的合同检查),因此它与常规 Racket 一样是强类型的。
顺便说一下,人们常用的词是弱类型和强类型。软打字可能指的是 90 年代创建的one specific kind of type system。结果并不是那么好,这也是人们提出渐进式打字系统的原因之一,该系统用于 Typed Racket 和 Typescript 等语言。
【讨论】:
弱类型语言允许合法的实现使计算机“着火”,相比之下,强类型语言限制了更多有错误的程序。
尽管 Racket 是动态类型的,但它是强类型的。
【讨论】: