静态类型和动态类型、强类型和弱类型,还有Python 的泛型

2024-9-8|2024-9-8
FollyCoolly
FollyCoolly
type
status
date
slug
summary
tags
category
icon
password
前段时间了解到了 Python 中也有泛型,而在我对 Python 浅薄的印象中它似乎不强调类型的概念,是什么需求使它引入了泛型呢?
于此同时我脑海中隐隐约约出现了一个词:“弱类型”。Python 的类型好像挺”弱“的,但简单调研后可以得知,Python 是个强类型动态类型的语言。与强类型、动态类型对应的有弱类型静态类型。以下是对相关资料的一些整理:

什么是类型

摘自维基百科:
在计算机科学中,类型系统(英语:type system)用于定义如何将编程语言中的数值和表达式归类为许多不同的类型,如何操作这些类型,这些类型如何互相作用。类型可以确认一个值或者一组值具有特定的意义和目的(虽然某些类型,如抽象类型和函数类型,在程序运行中,可能不表示为值)。类型系统在各种语言之间有非常大的不同,也许,最主要的差异存在于编译时期的语法,以及运行时期的操作实现方式
在计算机中,任何数值都是以一串0和1表示的。机器本身并不感知什么类型。就个人理解而言,类型是编译器提供的一种抽象(就像操作系统提供了虚拟内存的抽象)(另外想想汇编语言是不是没有啥类型概念)。类型便可以告知程序和程序设计者该如何对待那些0和1。

类型系统提供的主要功能

  • 安全性:使用类型可允许编译器侦测无意义的,或者是可能无效的代码
  • 优化:静态类型检查可提供有用的信息给编译器。例如,如果一个类型指明某个值必须以4的倍数对齐,编译器就有可以使用更有效率的机器指令
  • 可读性:某种程度上可以阐明程序设计者的意图(想想枚举类型)
  • 抽象化:类型允许程序设计者对程序以较高层次的方式思考,而不是烦人的低层次实现

静态类型和动态类型

  • 动态类型
    • 动态类型语言是指在运行期间才去做数据类型检查的语言。
    • 动态类型语言编程时,永远不用给任何变量指定数据类型,该语言会在第一次赋值给变量时,在内部将数据类型记录下来。
    • Python 和 Ruby 就是典型的动态类型语言(Python3.5 引入了 type hint,但正如其名,只是个 hint,运行时变量并不会被强制要求与 hint 一致)。
  • 静态类型
    • 静态类型语言与动态类则刚好相反,它的数据类型在编译期间检查。
    • 写程序时要声明所有变量的数据类型。
    • C/C++ 是静态类型语言的典型代表,其他静态语言还有 C#、Java 等。
总而言之,静态类型语言中验证和强制执行类型约束的过程(即类型检查)主要发生在编译时,动态类型语言的这一过程都发生在运行时。
一些有用且常见的编程语言特性(如向下转型)无法通过静态检查。因此,许多语言同时具有静态和动态类型检查;静态类型检查器验证它能处理的部分,而动态检查则验证其余部分。包含动态类型检查但不包含静态类型检查的编程语言通常被称为“动态类型编程语言”。

强类型和弱类型

  • 强类型
    • 强制类型定义的语言,即一旦某一个变量被定义类型,如果不经强制转换,那么它永远就死该数据类型。
    • 强类型的语言禁止错误类型的参数继续运算,遇到函数参数类型和实际调用类型不符合的情况经常会直接出错或者编译失败。
    • 强类型语言包括:Java、.Net、Python、C++ 等语言。其中 Python 是动态语言,是强类型定义语言,是类型安全的语言,Java是静态语言,是强类型定义语言,也是类型安全的语言。
  • 弱类型
    • 弱类型定义的语言,某一个变量被定义类型,该变量可以根据环境变化自动。
    • 弱类型的语言常常会实行隐式转换,或者产生难以意料的结果。
    • 弱类型语言包括:VB,PHP,JavaScript 等语言
    • C语言的类型转换即为缺乏强类型的证例;如果编写者用C语言对一个值转换类型,不仅令编译器允许这个代码,而且在运行时期中也同样允许。这使得C代码可更为紧密和快速,不过也使调试变的更为困难。

关于这几种类型的总结

The process of verifying and enforcing the constraints of types—type checking—may occur at compile time (a static check) or at run-time (a dynamic check).
If a language specification requires its typing rules strongly, more or less allowing only those automatic type conversions that do not lose information, one can refer to the process as strongly typed; if not, as weakly typed.
实际上对于静态类型和动态类型、强类型和弱类型并没有公认的正确定义,前文的描述也不过是本人翻阅不同资料后总结出的自身最认可的分类方法。

为什么Python要引入泛型?

使得 Python 中的 type hint 更加易用(代替了之前的GenericTypeVarTypeVarTuple, and ParamSpec,我没用过,但反正看着就挺烦人的)。使用 type hint 乃至泛型提升了代码的可读性和健壮性。此外,可以对泛型类型增加约束,帮助开发工具提供自动补全、类型检查等功能,提升开发效率和代码质量。

Refers

移动光猫获取超级用户,开启 IPV6Bazel 学习记录
Loading...