另外,两者之间是否存在关联?


当前回答

强类型意味着类型之间的转换之间存在限制。

静态类型意味着类型不是动态的——一旦创建了变量,就不能更改变量的类型。

其他回答

强类型意味着类型之间的转换之间存在限制。

静态类型意味着类型不是动态的——一旦创建了变量,就不能更改变量的类型。

两者都是两个不同轴上的极点:

强类型与弱类型 静态类型vs.动态类型

强类型意味着变量不会自动从一种类型转换为另一种类型。弱类型则相反:Perl可以在数值上下文中使用“123”这样的字符串,方法是自动将其转换为int型123。像python这样的强类型语言不会这样做。

静态类型意味着,编译器在编译时计算出每个变量的类型。动态类型语言只在运行时确定变量的类型。

数据强制并不一定意味着弱类型,因为有时它的语法糖:

上面Java的例子是弱类型的,因为

String s = "abc" + 123;

不是弱类型的例子,因为它真正做的是:

String s = "abc" + new Integer(123).toString()

如果您正在构造一个新对象,数据强制也不是弱类型的。 Java是弱类型的一个非常糟糕的例子(任何具有良好反射的语言都很可能不是弱类型的)。因为语言的运行时总是知道类型是什么(异常可能是本机类型)。

这与C不同。C是弱类型的最佳示例之一。运行时不知道4字节是整数、结构体、指针还是4个字符。

语言的运行时真正定义了它是否弱类型,否则它只是意见。

编辑: 经过进一步思考,这并不一定是正确的,因为运行时不必在运行时系统中具体化所有类型才能成为强类型系统。 Haskell和ML有这样完整的静态分析,它们可以潜在地从运行时提交类型信息。

恕我直言,最好完全避免这些定义,不仅没有一致的术语定义,确实存在的定义倾向于关注技术方面,例如,混合类型上的操作是否允许,如果不允许,是否存在绕过限制的漏洞,例如使用指针工作。

相反,再次强调这是一种观点,人们应该关注这个问题:类型系统是否使我的应用程序更可靠?一个特定于应用程序的问题。

例如:如果我的应用程序有一个名为加速度的变量,那么显然,如果变量的声明和使用方式允许将值“星期一”分配给加速度,这是一个问题,因为显然加速度不能是工作日(和字符串)。

Another example: In Ada one can define: subtype Month_Day is Integer range 1..31;, The type Month_Day is weak in the sense that it is not a separate type from Integer (because it is a subtype), however it is restricted to the range 1..31. In contrast: type Month_Day is new Integer; will create a distinct type, which is strong in the sense that that it cannot be mixed with integers without explicit casting - but it is not restricted and can receive the value -17 which is senseless. So technically it is stronger, but is less reliable. Of course, one can declare type Month_Day is new Integer range 1..31; to create a type which is distinct and restricted.

强类型可能意味着变量具有定义良好的类型,并且对于在表达式中组合不同类型的变量有严格的规则。例如,如果A是一个整数,B是一个浮点数,那么关于A+B的严格规则可能是A被强制转换为浮点数,并且结果作为浮点数返回。如果A是一个整数,B是一个字符串,那么严格的规则可能是A+B无效。

静态类型可能意味着类型是在编译时分配的(或非编译语言的等效类型),并且在程序执行期间不能更改。

请注意,这些分类并不相互排斥,实际上我希望它们经常一起出现。许多强类型语言也是静态类型的。

请注意,当我使用“可能”这个词时,是因为这些术语没有普遍接受的定义。到目前为止,你已经从答案中看到了。