显式、隐式类型,Python为隐式类型

作者: 编程  发布:2019-10-03

简介

类型指一个编程语言中的数值、表达式、函数和模块等等属性内容。类型系统包括如何定义这些不同类型,如何操作这些类型,这些类型如何相互作用等方面内容。类型系统最主要的作用是通过检查每个值的类型和这些值得流动的规则来减少类型错误的发生。检查可以是静态的(at compile time), 也可以是动态的(at run time),或者是两者的结合。类型系统也有些其他的作用,比如编译器优化等。

类型系统是编程语言的一部分,经常被嵌入到解释器和编译器中。它也被一些静态检查工具所使用。

 

 

编程语言相关概念,编程语言概念

 

编译、解释型语言:编译型语言需要首先由编译器将源代码编译为机器代码,再由机器执行,即运行前有一个编译过程,C++是典型的编译语言,GCC是C++的最流行的编译器;解释型语言不需要编译,运行时直接由解释器解释执行,典型代表如shell、Python;也有语言是这两种类型的混合,即既需要编译,又需要解释执行,典型代表如Java,Java代码首先由编译器编译为Java字节码,后由JVM(Java虚拟机)解释执行;需要说明的是编译、解释的界限并不绝对,例如Python代码解释执行前也可以被编译或者说优化为内部代码(.pyc格式文件)。

可移植性:指可以在多种环境(平台)下运行,C++具有可移植性,其可移植性由编译器可以将符合标准的C++代码编译为不同的目标平台而得到。

静态、动态类型:若类型是在编译时确定,则为静态,如C++,若类型是在运行时确定则为动态,如Python,一般来说,静态类型中变量类型确定之后就不能改变,动态类型中变量类型(在运行时)可以改变。

强、弱类型:强类型偏向于更严格的类型检查,更不容易进行隐式类型转换,弱类型则相反,C++、Python都可被认为是强类型。

显式、隐式类型:若类型是语法的一部分(例如,变量的带类型的声明、定义)则为显示,若类型是推导出来,非显示指定,则为隐式,C++为显示类型,Python为隐式类型。

类型安全、不安全:类型安全语言能正确解释内存区域的类型,即总能以和构建时相同(或兼容)的类型访问内存区域,由于指针的存在,一般认为C++是类型不安全的,Python是类型安全的。

C++是静态、强、显示、不安全类型语言,当然以上关于类型概念并没有严格定义,只是通俗的、大致的分类,参考文献2。

内省、反射:内省(Introspection)是指程序运行时检查对象类型的能力,反射(Reflection)更进一步,指程序运行时可访问、检测、修改自身状态或行为的能力,参考文献3,C++通过dynamic_cast和typeid可实现内省。

闭包:又称词法闭包(Lexical Closure)或函数闭包(Function closures),由函数和与其相关的引用环境(变量)组合而成的实体(集合),是实现函数式编程的关键,参考文献3。

编程范型(模型):过程、结构化、面向对象、泛型、函数式、并发、分布式等,参考文献4,C++可以实现过程、结构化、对象、泛型(通过模板)、函数式(通过operator()模拟)编程。

编程语言排行榜:TIOBE发布的编程语言热度指数给出了最热门的编程语言以及它们的份额。

 

参考文献:

编译、解释型语言 :编译型语言需要首先由编译器将源代码编译为机器代码,再由机器执行,即运行前...

类型错误产生原因

计算机的硬件层面是无法区分内存地址、指令码、字符、整数、浮点数的,在硬件层面这些都是bit。类型化就是赋予这些bit意义,哪些是内存中的值,哪些是一些变量等等。这样能让编程者在更高层次思考,而不用关心比特和字节。但每种类型所占用的bit数,和作用都是不同的,如果互相之间赋值移动不当,就会造成类型错误。

编译、解释型语言:编译型语言需要首先由编译器将源代码编译为机器代码,再由机器执行,即运行前有一个编译过程,C++是典型的编译语言,GCC是C++的最流行的编译器;解释型语言不需要编译,运行时直接由解释器解释执行,典型代表如shell、Python;也有语言是这两种类型的混合,即既需要编译,又需要解释执行,典型代表如Java,Java代码首先由编译器编译为Java字节码,后由JVM(Java虚拟机)解释执行;需要说明的是编译、解释的界限并不绝对,例如Python代码解释执行前也可以被编译或者说优化为内部代码(.pyc格式文件)。

编译、解释型语言:编译型语言需要首先由编译器将源代码编译为机器代码,再由机器执行,即运行前有一个编译过程,C++是典型的编译语言,GCC是C++的最流行的编译器;解释型语言不需要编译,运行时直接由解释器解释执行,典型代表如shell、Python;也有语言是这两种类型的混合,即既需要编译,又需要解释执行,典型代表如Java,Java代码首先由编译器编译为Java字节码,后由JVM(Java虚拟机)解释执行;需要说明的是编译、解释的界限并不绝对,例如Python代码解释执行前也可以被编译或者说优化为内部代码(.pyc格式文件)。

类型检查

如果一个语言的编译器引入越多的类型检查的限制,就可以称这个语言的类型检查越强。反之越弱。举个例子,A语言的编译器可能在编译时会认为 3 / "Hello, World"是无效的,而B语言不会,等到运行到这块代码时发现无法执行才会认为此处无效。那明显A语言比B语言更强。强/弱类型语言目前业界没有统一的定义,只能说哪种语言更强或者更弱一些。

静态类型检查是基于编译器来分析源码本身来确保类型安全,比如不会出现上面的整形除以字符串的情况。静态类型检查能让很多bug在开发早起被捕捉到,并且它也能优化运行。因为如果编译器在编译时已经证明程序是类型安全的,就不用在运行时进行动态的类型检查,编译过后的代码会更优化,运行更快。

但对于一个图灵完备的语言,静态检查有时可能偏于保守。比如:

if <test> then <do something> else <error code>

即使test永远为true,对于很多静态检查的语言也会认为以上代码有问题,因为静态分析很难判断else的部分是否可以拿掉。不但如此,有些编程技术也是无法通过静态方式检查出来的,比如Java中的向下转型(downcasting,父类对象向下转为具体的子类对象,一种不安全操作)。

所以很多语言会同时使用静态检查和动态检查,静态证明可以,动态确定其他部分。有些语言还会让开发者选择用静态或者动态类型安全检查,如C#就却别了静态类型和动态类型变量。而有些语言运行开发者写一些非类型安全的代码,比如C语言允许开发者把值在任意两个长度一样的类型间强制转换。

静态类型如:Java、C、Swift、Pascal等。更多

动态类型检查是在程序运行时进行的。很多类型安全的语言也都包括一些动态类型检查。动态检查可能会导致一些运行时错误,有些语言会从错误中恢复,有些会导致fatal error。

编程语言中,把只有动态类型检查没有静态类型检查的语言称为“动态类型语言”。

例如:Ruby、PHP、Objective-C、Perl、Python、JavaScript、Lisp等。更多

可移植性:指可以在多种环境(平台)下运行,C++具有可移植性,其可移植性由编译器可以将符合标准的C++代码编译为不同的目标平台而得到。

可移植性:指可以在多种环境(平台)下运行,C++具有可移植性,其可移植性由编译器可以将符合标准的C++代码编译为不同的目标平台而得到。

类型安全和内存安全

这两者是另一种区别语言种类的方法。计算机科学家将不允许操作和转化违反类型系统规则的语言称为类型安全语言;将不允许访问未被分配内存的语言称为内存安全语言,比如,一个内存安全语言会检查数组越界问题。

C语言既不是类型安全也不是内存安全的语言,如下代码:

int x = 5;char y[] = "37";char* z = x + y;

这样让z指向了y地址加5的地址,可能包含了垃圾数据,既访问了未分配的内存,也产生不同类型间的不安全转换。

参考文献:

静态、动态类型:若类型是在编译时确定,则为静态,如C++,若类型是在运行时确定则为动态,如Python,一般来说,静态类型中变量类型确定之后就不能改变,动态类型中变量类型(在运行时)可以改变。

静态、动态类型:若类型是在编译时确定,则为静态,如C++,若类型是在运行时确定则为动态,如Python,一般来说,静态类型中变量类型确定之后就不能改变,动态类型中变量类型(在运行时)可以改变。

强、弱类型:强类型偏向于更严格的类型检查,更不容易进行隐式类型转换,弱类型则相反,C++、Python都可被认为是强类型。

强、弱类型:强类型偏向于更严格的类型检查,更不容易进行隐式类型转换,弱类型则相反,C++、Python都可被认为是强类型。

显式、隐式类型:若类型是语法的一部分(例如,变量的带类型的声明、定义)则为显式,若类型是推导出来,非显式指定,则为隐式,C++为显式类型,Python为隐式类型。

显式、隐式类型:若类型是语法的一部分(例如,变量的带类型的声明、定义)则为显式,若类型是推导出来,非显式指定,则为隐式,C++为显式类型,Python为隐式类型。

类型安全、不安全:类型安全语言能正确解释内存区域的类型,即总能以和构建时相同(或兼容)的类型访问内存区域,由于指针的存在,一般认为C++是类型不安全的,Python是类型安全的。

类型安全、不安全:类型安全语言能正确解释内存区域的类型,即总能以和构建时相同(或兼容)的类型访问内存区域,由于指针的存在,一般认为C++是类型不安全的,Python是类型安全的。

C++是静态、强、显式、不安全类型语言,当然以上关于类型概念并没有严格定义,只是通俗的、大致的分类,参考文献2。

C++是静态、强、显式、不安全类型语言,当然以上关于类型概念并没有严格定义,只是通俗的、大致的分类,参考文献2。

内省、反射:内省(Introspection)是指程序运行时检查对象类型的能力,反射(Reflection)更进一步,指程序运行时可访问、检测、修改自身状态或行为的能力,参考文献3,C++通过dynamic_cast和typeid可实现内省。

内省、反射:内省(Introspection)是指程序运行时检查对象类型的能力,反射(Reflection)更进一步,指程序运行时可访问、检测、修改自身状态或行为的能力,参考文献3,C++通过dynamic_cast和typeid可实现内省。

闭包:又称词法闭包(Lexical Closure)或函数闭包(Function closures),由函数和与其相关的引用环境(变量)组合而成的实体(集合),是实现函数式编程的关键,参考文献3。

闭包:又称词法闭包(Lexical Closure)或函数闭包(Function closures),由函数和与其相关的引用环境(变量)组合而成的实体(集合),是实现函数式编程的关键,参考文献3。

编程范型(模型):过程、结构化、面向对象、泛型、函数式、并发、分布式等,参考文献4,C++可以实现过程、结构化、对象、泛型(通过模板)、函数式(通过operator()模拟)编程。

编程范型(模型):过程、结构化、面向对象、泛型、函数式、并发、分布式等,参考文献4,C++可以实现过程、结构化、对象、泛型(通过模板)、函数式(通过operator()模拟)编程。

编程语言排行榜:TIOBE发布的编程语言热度指数9159.com ,给出了最热门的编程语言以及它们的份额。

编程语言排行榜:TIOBE发布的编程语言热度指数给出了最热门的编程语言以及它们的份额。

 

 

参考文献:

参考文献:

  1. C++面向对象程序设计,龚晓庆等著,2011年;
  2. 弱类型、强类型、动态类型、静态类型语言的区别是什么?——知乎,另几篇:类型系统、重要性;
  3. Wikipedia条目:内省、反射)、闭包);
  4. The principal programming paradigms, Peter Van Roy, 更多关于:编程范型、编程语言概念;
  5. Obscure C++ Features,中文翻译:C++语言的15个晦涩特性;
  1. C++面向对象程序设计,龚晓庆等著,2011年;
  2. 弱类型、强类型、动态类型、静态类型语言的区别是什么?——知乎,另几篇:类型系统、重要性;
  3. Wikipedia条目:内省、反射)、闭包);
  4. The principal programming paradigms, Peter Van Roy, 更多关于:编程范型、编程语言概念;
  5. Obscure C++ Features,中文翻译:C++语言的15个晦涩特性;

本文由9159.com发布于编程,转载请注明出处:显式、隐式类型,Python为隐式类型

关键词:

上一篇:没有了
下一篇:没有了