编程语言的静态类型、动态类型、编译型以及解释型的区别

2023-11-02

1. 静态类型和动态类型的区别
个人理解这种区别主要是类型检查(Type Check)发生的时机不同,即可以通过判断语言是在什么时候检查类型错误来判断其所属的类型。

静态类型: 编译时即知道每一个变量的类型,因此,若存在类型错误编译是无法通过的。

动态类型: 编译时不知道每一个变量的类型,因此,若存在类型错误会在运行时发生错误。

Go语言的类型检查发生在编译时,因此它是静态类型的。

2. 编译型和解释性的区别
个人理解无论是编译型还是解释性,其本质都是将高级语言(Java,C, Python等)翻译成机器能理解和运行的语言 。这种区别主要是翻译发生的时机不同。

编译型: 翻译发生在程序运行之前,将高级语言翻译成机器语言。再次运行时,可直接使用上一次翻译好的机器码,不需要重新编译。

解释型: 翻译发生在程序运行时,即边翻译边运行。再次运行时,需要重新进行翻译。

Go语言可以直接编译成可执行文件 , 如Window系统下,可以直接编译成.exe文件。因此是编译型语言。

3. Java语言是静态类型还是动态类型? 是编译型还是解释型?
Java语言的类型检查发生在编译时,因此个人认为 Java语言是一种静态类型。 
Java语言首先通过编译器,得到.class文件,然后其虚拟机对.class文件进行逐条解释执行。因此我我认为Java本质上一种解释型的语言, 但是需要先经过编译器生成.class,为什么要这样做,个人认为是为了Java的跨平台特性。与Java不同的是,有些语言是直接翻译成机器码的(比如C#),这种是典型的编译型。
--------------------- 
作者:藏红 
来源:CSDN 
原文:https://blog.csdn.net/ch717828/article/details/68951965 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

      静态类型语言中,变量具有类型,而且在编译期确定,具有某一类型的变量只能持有相同类型的数据。动态类型语言中,变量没有类型,只有数据有类型,变量可以持有任意类型的数据。例如,C是静态类型语言,一个int型变量只能作为int来处理。Python是动态语言,变量可以持有整数、字符串、列表、闭包等任何数据。

       Java通常被认为是静态语言,然而准确来说并非如此。Java的变量有类型,但是变量可以持有子类型的数据,例如Animal变量可以持有Cat或者Dog,具体是什么类型,是由运行时的数据决定的。这显然是动态语言的特性。极端的情况,Java中Object类型的变量,可以持有任意数据,因为任意类型都是Object的子类。如果所有的变量和函数参数都声明为Object类型,恐怕Java就可以作为动态语言使用了。所以,Java并非纯粹的静态类型语言,它打破了两者的界限。

之所以这样做,是为了在静态语言中增加动态特性。静态语言严谨,容易检查和优化,但是灵活性不足,尤其是在大型软件、需求多变的情况下,一个很小的改变往往需要修改多处代码。动态语言灵活,但是由于缺少类型信息,前期不容易差错,也不容易优化。Java的这种融合是一个很好的做法,它给出了部分类型信息,可以用于编译期的检查和优化;而剩下的类型信息则推迟到执行期决定,提供了动态性。

推广到一般情况,静态语言和动态语言之间并不是非此即彼,而是一个过渡带。如果代码中没有给出变量的任何类型信息,那么这是纯粹的动态语言。这种情况下,可以认为所有的变量都是Object类型。如果代码中能够给出变量的一些类型信息(这些类型显然都是Object的派生类),那么语言就具有了静态性。代码中给出的类型越抽象,信息越少(抽象到极点就是Object);类型越具体,信息越多,编译器就能够对代码进行更详细的检查和更好的优化。如果代码中完全给出了变量的类型信息,这就是纯粹的静态语言。设想有一种语言,不局限于动态或者静态类型,而是能够根据代码中给出的类型的抽象或者具体程度,进行编译和执行。这样的语言应当能够更好的结合动态语言的灵活性和静态语言的严谨性,并且能够根据具体的代码适应性的在二者之间进行调整。

 

强类型,弱类型,静态类型,动态类型的区别

类型系统的一些概念,众说纷纭,使用上也比较乱。有些东西,甚至不好严格定义。以下算学术界的一种相对“严格”的说法。

 

首先了解一下基本概念

Program Errors

  • trapped errors。导致程序终止执行,如除0,Java中数组越界访问
  • untrapped errors。 出错后继续执行,但可能出现任意行为。如C里的缓冲区溢出、Jump到错误地址

Forbidden Behaviours

语言设计时,可以定义一组forbidden behaviors. 它必须包括所有untrapped errors, 但可能包含trapped errors.

 

Well behaved、ill behaved

  • well behaved: 如果程序执行不可能出现forbidden behaviors, 则为well behaved
  • ill behaved: 否则为ill behaved...

有了上面的概念,再讨论强、弱类型,静态、动态类型

强、弱类型

  • 强类型strongly typed: 如果一种语言的所有程序都是well behaved——即不可能出现forbidden behaviors,则该语言为strongly typed。
  • 弱类型weakly typed: 否则为weakly typed。比如C语言的缓冲区溢出,属于trapped errors,即属于forbidden behaviors..故C是弱类型

偏向于不容忍隐式类型转换,弱类型相对于强类型来说类型检查更不严格,比如说允许变量类型的隐式转换,允许强制类型转换等等。强类型语言一般不允许这么做。

弱类型

1

2

"1"+2

'12'

强类型

1

2

3

4

>>> "1"+2

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: cannot concatenate 'str' and 'int' objects

  

动态、静态类型

  • 静态类型 statically: 如果在编译时拒绝ill behaved程序,则是statically typed;
  • 动态类型dynamiclly: 如果在运行时拒绝ill behaviors, 则是dynamiclly typed。

其中静态类型可以分为两种:

  • 如果类型是语言语法的一部分,在是explicitly typed显式类型,比如java和c;
  • 如果类型通过编译时推导,是implicity typed隐式类型, 比如ML和Haskell

简单地说,就是在声明了一个变量之后,不能改变它的类型的语言,是静态语言;能够随时改变它的类型的语言,是动态语言。因为动态语言的特性,一般需要运行时虚拟机支持。

动态类型

1

2

3

4

5

6

>>> a = 1

>>> type(a)

<type 'int'>

>>> a = "s"

>>> type(a)

<type 'str'>

静态类型

1

2

3

4

5

6

Prelude> let a = "123" :: Int

 

<interactive>:2:9:

    Couldn't match expected type `Int' with actual type `[Char]'

    In the expression: "123" :: Int

    In an equation for `a': a = "123" :: Int

 

下面是些例子

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编程语言的静态类型、动态类型、编译型以及解释型的区别 的相关文章

  • 数字化转型需要解决的五大问题

    更多专业文档请访问 www itilzj com 数字化 数字中国被列为十四五规划的核心之一 数字经济席卷各行各业 新一轮的商业马拉松枪声已经响起 无形的革新重塑着商业大环境 也赋予了我们丰富的想象空间 数字化转型需要解决的问题包括 1 解
  • 微服务实践--微服务方法论00

    思想 在接收到一个新的新项目时 架构师的职责是建立项目的业务与技术实现之间的桥梁 在翻译业务到技术实现的过程中需要进行业务建模 技术设计等方面的工作 业务建模和技术设计过程中都有各自领域的知识体系 基本上每个知识体系都是由上层的理论 概念和
  • 解决k8s集群环境内存不足导致容器被kill问题

    背景 最近线上环境上出现了一个问题 k8s集群环境Pod中的tomcat容器运行一段时间后直接被killd 但有时一切看起来正常 不能准确判断在什么时机出现被Killd问题 本文就此问题介绍了Linux内存不足原因以及为什么特定进程会被杀死
  • “大三在读生”都四面成功拿到字节跳动Offer了,你还有什么理由去摸鱼?

    博主大三在读 投的是字节 Data 的后端开发实习生 base 杭州 时间线 4 12 投递 4 13 安排简历筛选 4 14 安排面试 4 19 16 00 一面 4 22 16 00 二面 4 23 8 00 三面 4 23 16 00
  • Python打印输出数组中全部元素的方法

    学习Python的人都知道数组是最常用的的数据类型 为了保证程序的正确性 需要调试程序 因此 需要在程序中控制台中打印数组的全部元素 如果数组的容量较小 例如 只含有10个元素 采用print命令或print函数可以答应出数组中的每个元素
  • Python实现“鸟脸识别”系统,看看什么鸟最贪吃~ 初学者也能学会

    梦晨 发自 凹非寺 量子位 报道 公众号 QbitAI 网友cldud1245是一个鸟类爱好者 以下简称喂鸟哥 最近打算自学Python 拥有其他语言编程经验的他 可不打算按部就班从Hello World做起 一上来就挑战图像识别 他用一个
  • 量化涌现:信息论方法识别多变量数据中的因果涌现

    来源 集智俱乐部 作者 Fernando E Rosas Pedro A M Mediano Henrik J Jensen等 译者 潘佳栋 审校 梁金 编辑 邓一雪 导语 大量个体聚集起来 常常涌现出新的复杂结构 鸟儿聚集起来形成兼具灵活
  • 利用hbase api在本地访问并操作服务器的hbase数据库

    最近因为实验室项目需要 开始研究了hbase 然后想一次性往集群服务器上写入大量的数据 并存到hbase中 考虑到在hbase shell下只能单个数据put 这样对于批量插入数据的要求完全不合适 于是就研究起hbase的java api
  • 如何写一篇简洁易懂的测试报告?

    一 什么是测试报告 测试报告是指把测试的过程和结果写成文档 对发现的问题和缺陷进行分析 为纠正软件的存在的质量问题提供依据 同时为软件验收和交付打下基础 二 测试报告的内容 测试报告的内容可以总结为以下目录 首页 引言 目的 背景 缩略语
  • 基于DS18B20和HS1101的仓库自动报警系统

    基于DS18B20和HS1101的仓库自动报警系统 背景介绍 效果展示 完整版的项目代码 仿真文件 下面是项目原理图 具体管脚定义如下图 18B20温度原理 HS1101湿度传感器 红外测距报警模块我用到的是GP2D12 通过数模转化器AD
  • 408还是自主命题?计算机考研应该怎么选

    计算机考研一共考4科 政治 英语 数学 和专业课 专业课有两类选择 联考408和自主命题 联考408 408是教育部命题 不同的学校考试科目只要是408 就是相同的题目 历年真题在网络上都是公开的 公众号回复408即可获取408真题 学校也
  • ​第一本 Compose 图书上市,联想大咖教你学会 Android 全新 UI 编程

    朱江 现任联想 北京 有限公司 Android 开发工程师 从事 Android 开发工作多年 有丰富的项目经验 负责和参与开发过多款移动应用程序 同时还是多个开源项目的作者 2017 年开始在 CSDN 发表 Android 技术相关博文
  • 关于python传参引发的一些思考

    人总有不会的 遇到一些问题深究下去必定有所收获 这个问题是在我写python爬虫项目的时候的疑问 可能是我太菜了 以前没学透彻 也可能是上学期学Java的时候按值传递的特点给搞混了 因为当时在用多线程的生产者消费者问题处理资源队列 参考别人
  • n行Python代码系列:两行代码去除抖音快手短视频尾部Logo

    老猿Python博文目录 https blog csdn net LaoYuanPython 一 引言 最近看到好几篇类似 n行Python代码 的博文 看起来还挺不错 简洁 实用 传播了知识 带来了阅读量 撩动了老猿的心 决定跟风一把 推
  • 野外偷拍_野外紧急设计

    关于本系列 本系列文章旨在为人们经常讨论但难以捉摸的软件体系结构和设计概念提供新的视角 通过具体的示例 尼尔 福特为您提供了进化架构和紧急设计的敏捷实践的坚实基础 通过将重要的架构和设计决策推迟到最后一个负责任的时刻 可以防止不必要的复杂性
  • 前端趋势 2022

    大家好 我是若川 持续组织了近一年的源码共读活动 感兴趣的可以 加我微信lxchuan12 参与 每周大家一起学习200行左右的源码 共同进步 同时极力推荐订阅我写的 学习源码整体架构系列 包含20余篇源码文章 历史面试系列 另外 目前建有
  • Python编程中的for循环语句学习教程

    本文来源于公众号 csdn2299 喜欢可以关注公众号 程序员学府 这篇文章主要介绍了Python编程中的for循环语句学习教程 是Python入门学习中的基础知识 需要的朋友可以参考下 Python for循环可以遍历任何序列的项目 如一
  • 朋友问我,程序员和非程序员的思维模式有什么区别?

    英文 https javascript plainenglish io what is the difference in thinking model between programmers and normal persons 8ff8
  • C++ 智能指针详解

    点击蓝字 关注我们 参考资料 C Primer中文版 第五版 我们知道除了静态内存和栈内存外 每个程序还有一个内存池 这部分内存被称为自由空间或者堆 程序用堆来存储动态分配的对象即那些在程序运行时分配的对象 当动态对象不再使用时 我们的代码
  • Go 语言运算符详解:加法、算术、赋值、比较、逻辑和位运算符全面解析

    运算符用于对变量和值执行操作 加号运算符 将两个值相加 如下面的示例所示 示例代码 package main import fmt func main var a 15 25 fmt Println a 尽管加号运算符通常用于将两个值相加

随机推荐

  • 【充电站】_世俗智慧_哲学智慧_.

    世俗智慧 哲学智慧 世俗智慧是对既存价值体系的准确认识和有效利用 哲学智慧是对既存价值体系的全面反思和对根本人生问题的深刻洞见 太追求世俗智慧 你会发现自己是社会的 是公司的 是他人的 唯独不是自己的 渐渐会活得跟千千万万的别人一样 从世俗
  • 大数据基础知识——数仓的搭建(维度建模)

    数据仓库 文章目录 数据仓库 数据仓库的介绍 数据仓库的概念 OLTP和OLAP区别 数据仓库的特点 面向主题 数据集成 非易失 时变 数据仓库系统架构 系统结构图 源数据 ETL 数据仓库与数据集市 应用系统 用户层 纬度分析 维度分析介
  • zookeeper常用命令行操作

    常见的zookeeper命令行操作 在3台机器分别部署了zookeeper 3 4 5 集群 本文操作是在此基础上进行的 部署详情参见上一篇文章 客户端登录与帮助查看 由于是集群模式 所以可以在3台机器的其中任意一台进行登录 操作结果和数据
  • 公司的组成

    集团公司 group company 1 董事 board 董事长相当于国家主席 董事 Member of the Board Director 又称执行董事 是指由公司股东会选举产生的具有实际权力和权威的管理公司事务的人员 是公司内部治理
  • 一文搞懂Elastic-Job(内附源码解析)

    前言 Elastic Job是当当基于Zookepper Quartz开发并且开源的Java分布式定时任务 解决Quartz不支持分布式的弊端 它由两个相互独立的子项目Elastic Job Lite和Elastic Job Cloud组成
  • JS 浅拷贝与深拷贝

    JS 浅拷贝与深拷贝 关于深拷贝与浅拷贝的概念在此不在赘述 本篇只讲述如何实现深拷贝 针对数组与对象 1 切实可行的深拷贝 1 1 自定义拷贝函数 const cloneDeep value gt 非数组和非对象直接返回值即可 if val
  • 四开关管BUCK_BOOT三种工作模式切换基本介绍(个人学习心得)

  • 【蓝桥杯】-- 竞赛规则及说明(Python程序设计)

    蓝桥杯 竞赛规则及说明 Python程序设计 本文来自蓝桥杯官网 官网地址 http dasai lanqiao cn 组别 本次竞赛拟不分组别 所有研究生 重点本科 普通本科和高职高专院校均可报名该组 统一评奖 竞赛赛程 全国选拔赛时长
  • java运算符(++运算和+=运算)

    package sort public class Qperator public static void main String args int a 5 int b 10 int c a b int d a b a b System o
  • Quartus II 18.1的下载安装和注册

    前言 本文章主要教学Quartus II 18 1安装教学以及使用方法的介绍说明 一 Quartus的下载 进入Quartus官网 点击下载Windows版 选择所需要的软件版本 推荐使用18 1版本的 下载Quartus软件包和Model
  • verdi学习总结

    verdi学习总结 本篇文章关于Verdi的使用 并长期进行补充与更新 verdi简介 verdi用来查看fsdb波形进行代码的debug 使用流程 1 在tb文件中dump相应的要调试的信号 fsdbDumpvars 0 test top
  • 12V转5V2A电源模块的电路集合

    目前工作上所用到的电源模块都整理出来 以便之后的不时之需 建议在稳定的12V左右的电源下应用该模块 1 TPS54331DR 该芯片目前在TB中大概为1 1 RMB 价格也还能接收 主要的特点就是体积小 但是电路比较复杂 在放置PCB的过程
  • 【C++】模板特化

    模板特化的必要性 使用模板可以实现一些与类型无关的代码 但对于一些特殊类型的可能会得到一些错误的结果 比如 template
  • 机器人编程是用计算机编吗,机器人编程与电脑编程有何区别?官方专家为你详细解说!...

    近年来 无论是国外还是国内都掀起了一股编程热潮 许多编程课程纷纷涌现 很多家长为了孩子不输在起跑线上 报名各种机器人编程 电脑编程等课程 一些家长也许存在这样的疑问 我们想要报名学习编程 但是应该报机器人编程呢 还是电脑编程呢 1 机器人和
  • 如何捕获micropython 报错的详细信息 行数 具体错误内容等

    电脑端 可以用traceback来找 mpy没有这个模块 咋办 自己搞啊 翻WIKI 有个sys print exception函数 然后简单包装一下 完事儿 从不废话 都是干货 import io import sys class ERR
  • JAVA中StringBuffer和数组的区别

    共同点 两者都可以看作是一种容器 都可以存放其他的数据 不同点 StringBuffer最终会是一个字符串类型 数组可以存放多种类型的数据 每个数组的类型必须是一样的
  • NLP领域最近比较火的Prompt,能否借鉴到多模态领域?一文跟进最新进展

    PaperWeekly 原创 作者 杨浩 研究方向 自然语言处理 01 VL T5 论文标题 Unifying Vision and Language Tasks via Text Generation 收录会议 ICML 2021 论文链
  • 强制React组件重新渲染

    The beauty of React components is that they automagically render and update based on a change in state or props simply u
  • CGI程序的HTTP头

    在CGI程序的所有输出前面必须有一个MIME类型头 即http头 对浏览器指明接收内容的类型 比如我们用python写的cgi usr bin python print Content type text html n n print He
  • 编程语言的静态类型、动态类型、编译型以及解释型的区别

    1 静态类型和动态类型的区别 个人理解这种区别主要是类型检查 Type Check 发生的时机不同 即可以通过判断语言是在什么时候检查类型错误来判断其所属的类型 静态类型 编译时即知道每一个变量的类型 因此 若存在类型错误编译是无法通过的