📣 独立日限时特惠: VIP通行证立减$68
查看: 2909| 回复: 10
跳转到指定楼层
上一主题 下一主题
收起左侧

[学Java/C#] 编程语言,脚本语言,解释语言。求深度解释区别

头像被屏蔽
提示: 作者被禁止或删除 内容自动屏蔽

上一篇:我就看看我一个月后能刷多少!!!!
下一篇:刷题的困惑
全局:
老子也学Python吗?
回复

使用道具 举报

推荐
kuboy 2020-5-3 00:40:35 | 只看该作者
全局:
本帖最后由 kuboy 于 2020-5-3 00:59 编辑

所有语言都属于编程语言,这个还好理解,但脚本语言和解释语言的区别。。。。我也是懵逼的,说一下解释型和编译型的区别吧。

编译型语言和解释型语言的界限实际上已经比较模糊了,想弄清楚它们的区别,我觉得还挺麻烦的。

简单地说,编译型语言的特点是:代码必须作为整个工程来编译,优点是便于类型检查,降低运行时错误率,编译之后可以在相应的平台上独立运行,不再依赖编译器,一次执行,多次运行(特点1),比如C经过gcc编译产生obj文件,只要源码不变,编译一次,每次执行obj文件即可,少了重复编译,也就运行效率高(特点2),缺点是不能跨平台(特点3),因为编译是针对操作系统进行进行的。
解释型语言的特点是:代码的每一行可独立解释执行(代码块除外),所以灵活(特点1),比如你可以在命令行状态下一行一行敲python,敲一行执行一下,跨平台(特点2),因为解释型语言是由解释器执行的,只要有解释器(有时候也叫虚拟机)就能执行,缺点是执行速度慢、效率低(特点3),因为每次执行都要解释一次。

综上,编译器把源码编译成可执行文件就不管了,执行是交给操作系统做(所以无法跨平台),但是注意,我们说它运行效率高,但整体编译的过程效率不一定高,编译器把源码到运行的过程分离成了编译+运行,所以运行效率确实高,但解释器是一个整体,就是解释运行,一行一行的解释运行,所以效率低。

对于编译型语言,如果修改一点点代码就要重新编译,是不是效率很低,请看JAVA。
为什么说JAVA是解释 + 编译的混合型语言,早期的Java是先通过 Javac 将源码翻译成.class字节码,然后JVM 对字节码逐行解释执行,标准的解释型语言。但是当某个方法或代码块运行很频繁时,重复的解释执行效率就很低,为了提高执行速度,引入了即时编译,JVM中的JIT编译器会把热点代码(经常执行的代码)编译成与本地平台相关的机器码,以后执行到这部分代码,操作系统直接执行编译好的机器码就行了,不必重复解释执行,其它代码由JVM中的解释器逐行解释执行。简单说,经常变动的代码解释执行,拥有了解释型语言灵活的特点,不变的代码(比如引入的库文件)直接编译成机器码,拥有了编译型语言的高效

为什么说编译型语言和解释型语言的界限越来越模糊呢?
你说编译型语言是先编译出一个可执行文件,再执行,解释型语言是直接逐行解释执行,但很多解释型语言现在也是先编译出一个字节码文件,再执行啊。这里的编译到底该怎么理解?什么是编译?比如python会把重复使用的模块编译到pyc文件中,下一次运行不再重复编译,那编译是指语法分析语义分析吗?但任何一个高级语言都避不开这两步啊,编译是指产生了中间文件吗?那解释型/编译型语言也都产生了中间文件啊,我以为我懂了,但是我又懵了,到最后我觉得,编译型语言和解释型语言都是分为编译和执行两步:
1. 编译这一步,编译型语言就是把源码编译成了做系统可执行的文件,解释型语言就是把源码编译成了解释器可执行的文件
2. 执行这一步,编译型语言是由操作系统执行,解释型语言是由解释器执行,就理解为在操作系统上面又封装了一层吧,有了这个解释器,就可以跨平台了。

它们的区别:
1. 执行流程上不同。编译型语言有一个单独的编译过程,把程序的执行分离成编译和执行两步。而解释型语言只有一步,解释器对源码解释并执行(虽然这个解释的过程也很复杂,但解释和执行是一个整体,由解释器完成),
2. 产生的中间码不同。编译型语言会产生一个本地平台能运行的可执行文件,然后由当前操作系统运行。解释型语言为了提高效率一般也会产生一个中间码,叫做字节码,然后由解释器执行字节码。
3. 跨平台。编译型语言针对不同型号的CPU和操作系统,需要编译成不同的可执行文件。
最后回到你的问题“Python究竟少了哪一部分”。
其实不仅python,任何一个高级语言,从源码到执行,该走的比如词法分析,语法分析等一步都少不了,最后还不是要变成01去执行?所以不如说是隐藏了什么,对于编译型语言,我们能看到它经过编译器产生了可执行文件,可执行文件其实就是汇编码了,汇编和机器码是一一对应的关系,所以操作系统基本上就可以直接执行了,对于Python呢,你就当在操作系统上又封装了一个python解释器,python经过编译产生的字节码,还没到汇编码那一步,也就是说操作系统没法直接执行pyc文件,但python解释器可以执行啊,从字节码之下,全部隐藏了。

再打个不太恰当的例子,编译型语言就是经过编译,产生了qq.apk 或者 qq.ipa,或者qq.exe,对应小米手机,苹果手机,win电脑这些不同的设备来安装运行,而解释型语言就是,我弄个网页版qq,管你什么设备,有浏览器就能用,我浏览器负责执行,你Android,IOS,Windows瞧好喽。现在虚拟机和解释器的概念也经常混着用,其实也是,解释器不就是虚拟机吗,我管你什么操作系统,装了我虚拟机,你就随便玩,当然,虚拟机和解释器的区别,我是看了很久也没名吧,我就当他们,没区别吧





评分

参与人数 10大米 +15 收起 理由
patriotJ + 2 给你点个赞!
KHNOGG + 1 赞一个
zjrtomjohn + 1 赞一个
ripxd + 1 给你点个赞!
Elric + 1 很有用的信息!

查看全部评分

回复

使用道具 举报

全局:
解释语言是编程语言的一种,一句一句边解释边运行而不是先编译成字节码或机器码再运行;举个例子,常见的Python就是解释语言,你在某个地方插入个词法错误比如敲乱码,它会运行一下运行到哪里错了哪里报错,前面的部分照常运行,相反编译型语言在编译阶段发现问题就会直接报错而不运行;解释型省去了编译链接的时间,但解释型语言运行速度往往比编译过的语言慢;
脚本语言不是一个很严格的概念,但一般就是指解释语言。
回复

使用道具 举报

全局:
那就百度一下
回复

使用道具 举报

全局:
编译语言相对解释语言能跟安全一些,可以在compile time发现错误,而不是等到runtime才发现。
回复

使用道具 举报

无效楼层,该帖已经被删除
🔗
uuisafresh 2020-5-7 01:04:43 | 只看该作者
全局:
本帖最后由 uuisafresh 于 2020-5-7 01:10 编辑

以我的理解,简单来说,需要解析的叫解析语言,不需要的,叫你说的那个编程语言。C++是你说的那个编程语言,编译产物是机器码,是不依赖任何别的东西仅仅是一个Linux系统(或者别的系统)就能运行的二进制执行码。需要解析的,比如Java,经过编译javac,就是Java的二进制码(据说这是Java的IRJava不了解很多),这个东西不是机器码,操作系统不能识别,能识别他的是jvm,他必须依赖jvm才能被解析,被运行,又比如说python,经过解析的python也不是机器码,而是.pyc,即Python的bytecode,能识别他的同样是virtual machine,但这个virtual machine还是在Python解析器里面,可以看CPython的ceval.c。解析语言之所以要virtual machine,因为比如他们需要语言本身做垃圾回收,引用计数,他们对象回收不依赖程序员,他们语言层面给程序员提供便利,开发更方便,但是灵活性减少,trade-off。所以你所说的编程语言产物就是机器二进制执行码,再比如fortran,他的产物也是机器码,所以C和Fortran的library(同属机器码)可以混合编译,可以相互link,但C++和Fortran不行,应为他们name mangling机制不同(后话),Python和Java当然也不能,因为他们产物.pyc和java.class完全不同。当编译产物相同,是可以相互调用的,比如webassembly想实现的东西
回复

使用道具 举报

🔗
小牧 2020-5-19 16:44:28 | 只看该作者
全局:
以C++ , java , python 三种programming language 为代表, 说说自己对三种类型语言的世界观的理解。

通常来说, 学习难度, C ++ > java > python, 但语言没有好坏。

cpu的机器指令-----------接近人类自然语言的程序设计语言
C++  >              java          >      python


程序设计语言的诞生是基于某种需求, 我需要什么样的功能, 倒推需要一种语言具有某种语言特性, 然后某种语言就应运而生了。 c++ 高度依赖于平台platform, 好处是性能极致, 坏处是不能跨平台, 即write once, compiler once, run once。 换了platform, 则需要重新compiler。 为了跨平台, 有了virtual machine的概念, 有了jvm, 有了java, 使得java能够 write once, compile once , and run anywhere(in jvm); 跨平台是java 的有点, 缺点是性能不如c++极致。 再后来, 需要更简单易用的程序设计语言, python简单易用, 则意味着越接近人类自然语言, 则越远离机器指令, 所以python将跨平台发挥到了极致, 意味着需要强大的解释器interpreter, 一句简单的python code, 可能后台interpreter做了特别多的工作, 变成了一段机器指令; 缺点是性能差。

java可以某中程度上认为介于两者之间, 既要跨平台, 又要兼顾性能。

以上是比较high level的解释,每种语言都有各自的优缺点, 发展过程中出现的弊病, 可能都需要新的程序设计语言去取其精华, 去其糟粕。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表