动态语言、静态语言、强类型语言、弱类型语言的区别 您所在的位置:网站首页 python语音属于哪一种类型的语言 动态语言、静态语言、强类型语言、弱类型语言的区别

动态语言、静态语言、强类型语言、弱类型语言的区别

2023-04-28 08:53| 来源: 网络整理| 查看: 265

首页 教程 VIP会员 一对一答疑 辅导班 公众号 首页 C语言教程 C++教程 Python教程 Java教程 Linux入门 更多>> 首页 > 推荐阅读 动态语言、静态语言、强类型语言、弱类型语言的区别 我们在学习编程语言的类型系统时,经常听说“静态语言”“动态语言”“强类型语言”和“弱类型语言”这些概念,它们究竟是什么意思呢?各个概念之间又有什么区别呢? 如果你阅读互联网上的博客,你也可能会发现一些矛盾的观点,有的作者糊涂地认为静态语言=强类型语言,或者动态语言=弱类型语言,但它们其实不是一回事。 静态/动态语言应该放在一起提及,它们是从同一种维度来评价类型系统;而强类型/弱类型语言应该放在一起提及,它们是从另外一种不同的维度来评价类型系统。 静态语言并不意味着强类型,动态语言也不意味着弱类型,一种编程语言的类型系统可以是静态/动态和强/弱的任意组合,例如: C/C++/Java 是静态语言 + 强类型; JavaScript/PHP 是动态语言 + 弱类型; Python 是动态语言 + 强类型。 创作本文花费了我将近一周的时间,我查阅了大量中英文资料,并反复确认,确认不会出错。本文信息量丰富,观点鲜明,通过阅读本文,您不但会解开以上疑惑,还将对类型系统有更加深刻的认知。 什么是数据类型? 如果你是一名程序员,那你一定使用过变量、函数参数或者函数返回值,它们都用来表示数据,在编程语言中无处不在;但是,你是否知道它们的真正含义呢?又是否知道它们在后台如何控制计算机的呢? 在很多编程语言(比如 C/C++、Java、C# 等)中,定义变量时除了需要指明变量的名字,还需要告诉计算机它是什么类型,比如简单的整数、浮点数、字符串,还有复杂的类、结构体、数组。 编程语言中的数据最终都要放到内存中,在内存中存取数据要明确三件事情:数据存储地址、数据的长度以及数据的处理方式。 数据存储地址决定了数据放在哪里; 数据长度决定了当前数据使用了多少个字节的内存; 数据处理方式不仅让计算机能够正确转换数据的内容,不至于导致“乱码”,还让计算机知道如何处理基于该数据的各种运算,比如加减乘除。 变量名不仅仅是为数据起了一个好记的名字,还告诉我们数据的存储地址,使用数据时,只要提供变量名即可,变量名会自送转换成数据在内存中的地址。而数据类型则指明了数据的长度和处理方式,它确定了除地址以外的其它所有信息。 诸如int n;、char c;、float money;这样的变量定义形式就确定了数据在内存中的所有要素。 每种编程语言都有一个数据类型系统,没有它的话,计算机将不知道如何处理我们程序中的数据,这包括: 计算机不知道数据的长度,不知道该操作多少个字节; 计算机不知道如何将值存储到内存,不知道如何解析内存中的值; 计算机不知道如何运算数据。 我们可以在不了解底层类型系统的情况下开始编程,这就是高级语言的美妙之处。但是,了解我们程序中的数据将给编程带来巨大的优势,如下所示: 1) 可以更少地使用内存资源 当数据量比较大时,采用长度较小且够用的数据类型,将节省成百上千个字节的内存空间。 2) 可以读懂报错信息 比如将两份数据相加时可能报错,因为其中一个是数字类型,一个是字符串类型,虽然人类眼睛看起来都是数字,但是计算机不允许对字符串类型执行相加操作,这告诉我们,不能使用引号来包围数字。 3) 改变规则 一旦你知道数据类型是如何工作的,你就可以像电影《黑客帝国》中的 Neo 一样,知道如何改变规则。比如将一个字符和一个整数相加,就可以得到另一个字符。 静态类型语言和动态类型语言 静态类型和动态类型应该放在一起提及,它们从「如何得到数据的类型」这一维度来评价类型系统。 1) 静态类型语言 静态类型指的是在创建一份数据(变量、参数、返回值等)时需要显式指明该数据的类型。通常情况下,这些数据的类型一旦被定义,在程序的整个生命周期也不再改变。 请看下面的一个例子: int myNumber = 42; //整数类型 string name = "Rocky Balboa"; //字符串类型 final double PI = 3.141592; //双精度浮点类型 // add() 函数包含两个整数类型的参数,返回值也是整数类型 public int add(int a, int b) { return a + b; } 这是一段 Java 代码,它定义了几个变量,以及一个求和函数。如您所见,我们已经明确地指明了要处理的数据类型,包括整数、双精度浮点数、字符串。如果没有给编译器这些提示,编译器将不知道如何处理 myNumber,它只是一个对我们有意义的名称,但是计算机不理解它。 静态类型的编程语言有很多,常见的有 C/C++、Java、C#、Go 等。 2) 动态类型语言 让我们再对比一下动态类型的语言,请看下面的例子: $myNumber = 42; //整数类型 $name = "Rocky Balboa"; //字符串类型 $PI = 3.141592; //单精度浮点类型 // add() 包含两个参数和一个返回值 function add($a, $b) { return $a + $b; } 这是一段 PHP 代码,如您所见,我们并没有使用任何明确的数据类型,这就是一种典型的动态类型语言。 动态类型的编程语言在创建数据时往往不需要指明该数据的类型,而且数据的类型也会随着值的改变而改变,给数据赋予不同的值,数据将得到不同的类型。 有的读者可能会问,不给数据指明类型,编程语言是如何知道它的类型的呢?编程语言会根据赋予数据的值进行猜测或者推断。对于上面的第一行代码,PHP 知道 42 是一个整数,将 42 赋值给变量 $myNumber,PHP 也会推断出 $myNumber 是一个整数类型。 add() 函数包含的参数类型,会根据调用 add() 时传递的值进行推断;add() 函数包含的返回值类型,会根据$a + $b的运算结果进行推断。这意味着,add() 可以接受两个整数并返回一个整数,或者接受两个浮点数并返回一个浮点数。 对动态类型语言,类型是推断出来的,甚至可以在程序运行期间更改。我们可以给上面的程序中增加一行代码,把"c.biancheng.net"赋值给 $myNumber 变量,这样 PHP 将把 $myNumber 变量切换为字符串类型。 常见的动态类型语言有 JavaScript、PHP、Python、Ruby 等。 静态类型和动态类型各有什么优势? 对于静态类型语言,我们需要预先明确地告诉编译器要处理的数据的类型,这样在程序部署之前就能发现代码中的错误或者疏忽。比如我们将一个变量定义为整数,将另一个变量定义为字符串,如果我们尝试将两个变量相加,那么编译器在编译期间可能就会捕获这种语法错误,并且不会让我们完成程序的构建。 这很好,因为越早发现错误,您的代码就越强大,您将来修复它的成本就越低。在部署之前修复问题,要比部署之后修复问题容易得多。 那么,使用静态类型是不是就一定正确呢?好吧,使用静态类型的负担就是,在使用数据之前你必须明确地将它定义好。你必须输入更多的代码,你必须事先知道正在使用的数据的类型,你必须知道你的操作过程中会发生什么。 然而由于我们的疏忽或者知识缺陷,这有时候是比较困难的。例如在 C/C++ 中,你必须知道1/3得到的是整数 0,而不是浮点数 0.3333...,这对初学者来说是一个坑。 在这方面,动态类型语言就为我们提供了更多灵活性,程序员经常称动态语言“更具表现力”。例如在 PHP 中,1/3将会得到 0.3333...,这在很多时候都是我们期望的结果。 然而问题在于,解释器有时候会对数据类型做出错误的猜测,你必须知道这种情况,否则这将成为一个潜在的危险,因为解释器不会给出错误提示。 由于我们不能捕获所有的潜在危险,因此使用动态语言编写的代码往往更加脆弱,也更容易出错。 动态语言中的数据类型通常在程序运行期间才能确定,这使得程序在被部署到生产环境之前很难捕获太多错误。程序可能在你的本地机器上正常工作,但是生产环境可能略有不同,解释器就会产生一些不同的猜测,这将导致潜在的风险。 JavaScript 被认为是一种典型的动态语言。随着 TypeScript(JavaScript 的超集)的诞生,程序员也想在定义变量时能够声明它的类型,以使 JavaScript 变得更加静态。 JavaScript 臭名昭著的地方之一就是在处理数据及其类型时会做一些糟糕的猜测。随着 JavaScript 越来越流行,人们已经不限于在浏览器上使用它了,大名鼎鼎的 Node.js 使得人们可以在脱离浏览器,直接在机器上运行 JavaScript。此时程序员意识到为 JavaScript 增加静态类型的好处,这样能够消除 JavaScript 在处理数据类型时所做的一些错误猜测。 将动态语言 JavaScript 变得更像静态语言,可以及时发现错误,并生成更加健壮的代码。在 Node.js 的帮助下,JavaScript 越来越多地渗透到服务器端编程,让 JavaScript 变得静态就显得尤为重要。 总结 静态语言为我们提供了一个更加严格的编程环境,并且通常会生成更加健壮的代码。动态语言为编写代码带来了灵活性,同时也提高了编写代码的效率,但是如果你不注意数据的类型,可能就会导致代码更容易出错。 强类型语言和弱类型语言 正如前面提到的,人们经常混淆静态/动态类型和强/弱类型的概念,倾向于将静态类型等同于强类型,将动态类型等同于弱类型,实际上这是不对的。 强/弱类型指的是编程语言如何处理运算过程中的值。当值的类型不符合运算规则时,编程语言究竟是做出一些猜测,临时转换值的类型以帮助人们解决问题,还是停止运行,提醒人们不应该这样做? 1) 强类型语言 让我们从一个例子入手解释一下: int main() { int a = 5; std::string b = "5"; // 编译器会报错 std::cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有