编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别

2023-11-11

最近在研究Python和Erlang。反复提到动态类型语言、动态语言、解释型语言这些概念。这些概念很生涩,在这里做一个总结。

 

编译型语言和解释型语言

1、编译型语言

需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。

优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。

缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。

代表语言:C、C++、Pascal、Object-C以及最近很火的苹果新语言swift

2、解释型语言

解释性语言的程序不需要编译,相比编译型语言省了道工序,解释性语言在运行程序的时候才逐行翻译。

优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。

缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。

代表语言:JavaScript、Python、Erlang、PHP、Perl、Ruby

3、混合型语言

既然编译型和解释型各有缺点就会有人想到把两种类型整合起来,取其精华去其糟粕。就出现了半编译型语言。比如C#,C#在编译的时候不是直接编译成机器码而是中间码,.NET平台提供了中间语言运行库运行中间码,中间语言运行库类似于Java虚拟机。.net在编译成IL代码后,保存在dll中,首次运行时由JIT在编译成机器码缓存在内存中,下次直接执行(博友回复指出)。我个人认为抛开一切的偏见C#是这个星球上最好的编程语言。可惜微软的政策限制了C#的推广。

Java先生成字节码再在Java虚拟机中解释执行。

严格来说混合型语言属于解释型语言。C#更接近编译型语言。

 

动态语言和静态语言

1、动态语言

是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。

主要动态语言:Object-C、C#、JavaScript、PHP、Python、Erlang。

2、静态语言

与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、C++。

 

3、注意:

很多人认为解释型语言都是动态语言,这个观点是错的!Java是解释型语言但是不是动态语言,Java不能在运行的时候改变自己结构。反之成立吗?动态语言都是解释型语言。也是错的!Object-C是编译型语言,但是他是动态语言。得益于特有的run time机制(准确说run time不是语法特性是运行时环境,这里不展开)OC代码是可以在运行的时候插入、替换方法的。

C#也是动态语言,通过C#的反射机制可以动态的插入一段代码执行。所以我说C#是这个星球最好的编程语言。

 

动态类型语言和静态类型语言

1、动态类型语言

很多网上资料把动态类型语言和动态语言混为一谈,简直是误人子弟。动态类型语言和动态语言是完全不同的两个概念。动态类型语言是指在运行期间才去做数据类型检查的语言,说的是数据类型,动态语言说的是运行是改变结构,说的是代码结构。

动态类型语言的数据类型不是在编译阶段决定的,而是把类型绑定延后到了运行阶段。

主要语言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl。

2、静态类型语言

静态语言的数据类型是在编译其间确定的或者说运行之前确定的,编写代码的时候要明确确定变量的数据类型。

主要语言:C、C++、C#、Java、Object-C。

3、注意:

相当一部分程序员,也包括曾经的我,认为解释型语言都是动态类型语言,编译型语言都是静态类型语言。这个也是错的。swift是编译型语言但是它也是动态类型语言。C#和Java是解释型语言也是静态类型语言。

强类型语言和弱类型语言

1、强类型语言:

强类型语言,一旦一个变量被指定了某个数据类型,如果不经过强制类型转换,那么它就永远是这个数据类型。你不能把一个整形变量当成一个字符串来处理。

主要语言:Java、C#、Python、Object-C、Ruby

2、弱类型语言:

数据类型可以被忽略,一个变量可以赋不同数据类型的值。一旦给一个整型变量a赋一个字符串值,那么a就变成字符类型。

主要语言:JavaScript、PHP、C、C++(C和C++有争议,但是确实可以给一个字符变量赋整形值,可能初衷是强类型,形态上接近弱类型)

3、注意:

一个语言是不是强类型语言和是不是动态类型语言也没有必然联系。Python是动态类型语言,是强类型语言。JavaScript是动态类型语言,是弱类型语言。Java是静态类型语言,是强类型语言。

 

如果我的理解有误,请在回复中不吝指出,谢谢。

转载于:https://www.cnblogs.com/zy1987/p/3784753.html

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

编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别 的相关文章

随机推荐

  • 2.使用服务端SDK

    使用服务端SDK 一 服务端SDK 1 简介 2 功能介绍 二 使用SDK 1 安装 2 初始化 3 创建测试类 三 创建测试用例 1 获取视频播放凭证 2 获取视频播放地址 一 服务端SDK 1 简介 sdk的方式将api进行了进一步的封
  • 人工智能的道德与伦理

    人工智能的道德与伦理 对人工智能的研究始于上世纪50年代 近几年 科学界和产业界对它的兴趣超越了以往 最近一年半来 谷歌收购了十几家机器人公司 并正在开发人工智能的一个图腾 无人驾驶汽车 去年 社交媒体脸谱成立了新的人工智能实验室 数据显示
  • 技术架构演进之路-Docker【二】

    docker 技术架构演进之路 了解每种技术架构以及如何演进的 熟悉Docker在架构中的核心作用 八大架构演进 一 单机架构 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img 9o2adujk 168437644
  • vue axios全攻略

    不再继续维护vue resource 并推荐大家使用 axios 开始 axios 被越来越多的人所了解 本来想在网上找找详细攻略 突然发现 axios 的官方文档本身就非常详细 有这个还要什么自行车 所以推荐大家学习这种库 最好详细阅读其
  • Linux应用编程

    进程控制 fork函数 函数说明 创建一个子进程 函数原型 pid t fork void 返回值 失败返回 1 成功返回 父进程返回子进程的ID 非负 子进程返回 0 pid t类型表示进程ID 但为了表示 1 它是有符号整型 0不是有效
  • 23种设计模式 之 State模式(状态模式)[C语言实现]

    一 概念定义 State模式 允许一个对象在其状态发生改变时 改变它的行为 State模式和Strategy模式非常相似 需要说明的是两者的思想是一致的 只不过封装的对象不同 State模式封装的是不同的状态 而Strategy模式封装的是
  • mssql sqlserver 指定特定值排在表前面

    摘要 这是一篇来自 猫猫小屋 的按特定值的排序位置的文章 下文讲述sql脚本编写中 将 特定值排在最前面的方法分享 实验环境 sqlserver 2008 R2 例 将数据表中指定值为0的行排在最前面呈现给用户 create table t
  • top命令按内存和cpu排序

    一 按进程的CPU使用率排序 运行top命令后 键入大写P 有两种途径 a 打开大写键盘的情况下 直接按P键 b 未打开大写键盘的情况下 Shift P键 效果如图 二 按进程的内存使用率排序 运行top命令后 键入大写M 有两种途径 a
  • 判断BigDecimal是否为null

    开发中的小总结 在开发中如果对BigDecima做赋值操作的时候就需要事先对BigDecima做是否为null的校验不然程序会报空指针异常 if BigDecima null BigDecima的初始化
  • python —函数的说明文档、作用域以及嵌套和闭包

    一 函数的说明文档 给函数中得代码做解释说明 用三个引号包括 def a 定义一个函数 a 设定内容 b 同 for循环的range函数 使内容 b 循环200次 return b 你好世界 for i in range 200 print
  • kafka入门,提高生产者吞吐量练习(七)

    修改配置Java batch size 批次大小 默认16k linger ms 等待时间 修改为5 100ms compression type 压缩snappy RecordAccmulator 缓冲区大小 修改为64m 代码例子 pa
  • 14个UI精美功能强大的Android应用设计模板

    由于狂热的开发者社区和移动设备的日益普及 Android的商业应用程序成为一个不断增长的市场 因此 毫不奇怪 业务应用程序模板也有需求 因为它们有助于减少编码的一些繁琐部分 并允许开发人员专注于更专业的工作 这篇文章从各大知名的模板网站中找
  • Git 创建新工程流程

    git status 查看状态 确保文件都是干净的 git branch a 查看所有分支 git pull 同步到最新的代码 git checkout b branchname 创建并切换新分支 git push set upstream
  • python入门笔记--常见函数总结(重要)

    help 函数名 可以查看函数的用法 1 lambda定义函数 2 map 函数 生成新序列 map 的功能是将函数对象依次作用于序列的每一个元素 每次作用的结果储存于返回的序列中 将序列1中的每个元素 3生成新序列 将两个序列的每个元素相
  • 使用G2O库时编译错误

    编译时出现如下错误 CMake Error at CMakeLists txt 11 find package By not providing FindG2O cmake in CMAKE MODULE PATH this project
  • python3(十一)内置模块和类型转换

    内置模块 不用import就可以直接使用 常用内置函数 命令 作用 help obj 在线帮助 obj可是任何类型 callable obj 查看一个obj是不是可以像函数一样调用 repr obj 得到obj的表示字符串 可以利用这个字符
  • 初识PE文件结构

    前言 目前网络上有关PE文件结构说明的文章太多了 自己的这篇文章只是单纯的记录自己对PE文件结构的学习 理解和总结 基础概念 PE Portable Executable 可移植的执行体 是Win32环境自身所带的可执行文件格式 它的一些特
  • MySQL开机无法启动,需手动启动才可以。

    环境 Window10 戴尔笔记本 问题 每次机器重启 MySQL的服务都没有开起来 查看服务 确认已将MySQL的服务设为自动启动 原因 Windows服务管理器对所有服务的状态进行管控 服务管理器会等待服务就绪 这个时间默认为60秒 然
  • c#二值化特征相关提取

    using System using System Collections Generic using System Linq using System Text using System Threading Tasks using Ope
  • 编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别

    最近在研究Python和Erlang 反复提到动态类型语言 动态语言 解释型语言这些概念 这些概念很生涩 在这里做一个总结 编译型语言和解释型语言 1 编译型语言 需通过编译器 compiler 将源代码编译成机器码 之后才能执行的语言 一