编译型语言、解释型语言以及对其可移植性与跨平台性的理解

目录

前言

一、编译型语言和解释型语言

二、可移植性与跨平台性

三、常见问题与解答

1. C语言具有可移植性是如何体现的?

2. C语言可以在不同平台上运行,为什么不具有跨平台性?

3. 可移植性与跨平台性的区别(个人理解)

4. Java语言是什么型语言,Java语言如何实现跨平台?

5. 解释型语言具有跨平台性而编译型语言不具有(个人理解) 

参考文献


前言

本文整理了编译型语言、解释型语言以及其可移植性与跨平台性的概念,按作者的思路从头到尾展开梳理,多为参考一些文章后的个人理解,如有错误欢迎读者指正。


一、编译型语言和解释型语言

高级语言可以分为编译型语言和解释型语言。

编译型语言:使用编译器一次性将源代码翻译成可执行代码,编译产生的可执行代码可在特定平台上随时运行而无需重新编译。这里笼统地认为源代码到可执行代码的过程为编译,使用的是针对平台(CPU和操作系统)特定的编译器。

解释型语言:使用解释器进行逐条解释执行,每次运行都需要解释器逐条解释一遍。

二、可移植性与跨平台性

可移植性:在一种系统中编写的程序稍作修改或不修改就可以在其他系统运行。

跨平台性:上一篇文章中提到“不同CPU使用的指令系统和编码格式不同,编译得到的可执行代码不同;而在相同CPU上使用不同操作系统时,编译得到的可执行代码也不同,因为启动代码不同”。CPU和操作系统对应了硬件平台和软件平台,可以在不同平台上运行就称为跨平台。

个人理解是可移植性重点在源代码的可移植,而跨平台重点在编译结果的跨平台运行。

三、常见问题与解答

1. C语言具有可移植性是如何体现的?

这里引用一下参考文章方便大家理解

API对于程序员来说就是系统提供的接口,任何涉及系统调用都要通过API来完成。对于不同的操作系统都有不同的一套API,也就是说对于不同的操作系统系统调用的接口是完全不同的。所以在API层我们是不能移植的。

基于各种操作系统平台不同,应用程序在二进制级别是不能直接移植的(因为编译需要链接启动代码,不同系统处理程序的方式不同,启动代码不同)。我们只能在代码层去思考可移植问题,在API层面上由于各个操作系统的命名规范、系统调用等自身原因,在API层面上实现可移植也是不大可能的。那怎么才能实现可移植呢?

答案是:在各个平台之间,基于大部分需求抽象出一个中间层。在中间层中屏蔽底层细节,在我们程序员看来C语言库就是这样一个中间层的作用。在各个平台下,我们默认C标准库中的函数都是一样的,这样基本可以实现可移植。但是对于C库本身而言,在各种操作系统平台下其内部实现是完全不同的,也就是说C库封装了操作系统API在其内部的实现细节。

因此,C语言提供了我们在代码级的可移植性,即这种可移植是通过C语言库这个中间层来完成的。

但是,C语言程序中针对特殊硬件设备或操作系统特殊功能编写的部分,通常是不可移植的

大家都可以看出上面的可移植是有条件的,C语言本身不能实现完全的可移植,为什么呢?因为,在我们程序中,我们经常会调用系统API,由于这些API在C语言中没有对其封装,所以我们只能用使用其原始的API,对于原始的API在各个操作系统中他们命名不同,就不能跨平台移植。所以,我们要写出完完全全的跨平台的程序,还是需要其他的一些手段。例如在我们的代码中下功夫。以下代码可以帮助我们实现各平台之间的可移植:

#ifndef _WINDOWS_

CreateThread(); //windows下线程的创建

#else

Pthread_create(); //Linux下线程的创建

#endif

对于头文件,也使用同样的预编译宏来实现。如:

#ifndef _WINDOWS_

#include <windows.h>

#else

#include <thread.h>

#endif 

这样就可以实现代码的可移植了。在编译的时候只要通过#define就可以选择在那个平台下完成程序的编译。

总的来说,借助封装和平台特定的编译器(包含不同平台对应的库函数)可以实现C语言源代码(稍作修改如系统调用原始API或不作修改)的可移植性,在不同平台移植需要重新编译。

2. C语言可以在不同平台上运行,为什么不具有跨平台性?

C语言可以在不同平台运行基于源代码的可移植性。在Windows中使用的系统调用无法在Linux系统使用,编译时就会报错,需要对源代码进行修改。而对于编译产生的结果来说,不同平台下编译产生的可执行代码不同,拿Windows编译的可执行代码去Linux系统运行,显然是行不通的。

由此我认为跨平台重点在于编译结果的跨平台运行,而C语言不具备。

3. 可移植性与跨平台性的区别(个人理解)

个人认为这两个概念已经比较模糊了,对于C语言源程序来讲,在不涉及系统调用时是可以通过重新编译运行实现跨平台的,只不过生成的可执行文件不能跨平台运行,似乎跨平台性更强调运行。具有跨平台性的语言自然具有可移植性。

4. Java语言是什么型语言,Java语言如何实现跨平台?

Java语言结合了编译型语言和解释型语言,主要借助JVM(Java Virtual Machine,Java虚拟机)实现跨平台。

如图,Java源代码经过编译得到字节码,字节码是二进制码,不需要对应当前使用的平台(或可以理解JVM为一个软件构成的计算机系统,字节码对应的是虚拟机这个平台的指令集)。然后再借助系统对应的JVM翻译成特定的机器码。JVM翻译有两种:解释器和即时编译器JIT(针对反复执行的热点代码使用编译器执行更快)。

Java实现跨平台:一是虚拟机的存在使得Java源码编译的结果要对应JVM虚拟机这个平台,所以无论在哪个平台运行,编译的结果即字节码都是相同的;二是提供了Java API实现接口的一致,即使涉及不同平台的系统调用使用的函数都相同,具体实现由JVM中对应的解释器或编译器实现。由此Java语言的源码和编译生成的二进制字节码都会一致,具有跨平台性。

5. 解释型语言具有跨平台性而编译型语言不具有(个人理解) 

对于源程序中针对特殊硬件设备或操作系统特殊功能(如系统调用)编写的部分,我认为解释型语言具有类似Java语言使用的Java API。在不同系统的源程序中涉及系统调用而使用的函数都相同,具体实现由平台特定的解释器去完成。

编译型语言是否可以这样使用?如果可以的话,使用一致的接口让编译器去具体实现,这样的结果就是源代码是具有跨平台性的,但是编译生成的可执行代码无论如何是不能跨平台的。

因此区别编译型语言不具有跨平台性的原因主要还是编译型语言编译产生的可执行代码不同,无法在不同平台运行。而解释型语言一边解释一边执行,没有编译产生的中间代码,只要通过特定的解释器就可以实现源代码的跨平台。

(我是这样说服自己的,欢迎大家指正,在后续学习过程中有新的理解后会来补充)


参考文献

如何理解语言的跨平台? - 知乎

java 可以跨平台的原因是什么? - 知乎

https://www.cnblogs.com/yaoxiaowen/p/7470460.html 关于跨平台的一些认识

对于C语言可移植性的思考_HelloWorld的技术博客_51CTO博客

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java是一种编译语言Java代码在编译之前需要先经过编译器的处理,将源代码编译成字节码文件,然后这些字节码文件可以在Java虚拟机(JVM)上解释执行。这种方式可以提高Java程序的能,并且可以使得Java程序跨平台运行,因为不同的平台只需要安装相应的Java虚拟机即可。 ### 回答2: Java是一种混合语言,既可以编译也可以解释。Java程序首先通过编译器将源代码转换成字节码(bytecode),然后这些字节码可以在Java虚拟机(JVM)上解释执行。编译过程将源代码转换成字节码,可以提前发现一些语法错误,这可以减少程序运行时的错误。一旦程序编译完成,字节码可以在不同的操作系统上运行,只要安装有适当版本的Java虚拟机。解释执行过程通过JVM将字节码逐行解释成机器语言执行。这种解释执行方式使得Java具有跨平台的特,同一份字节码可以在不同的操作系统和硬件上运行,因此被广泛用于开发跨平台应用程序。然而,为了提高Java程序的能,还可以通过即时编译(Just-In-Time Compilation)将字节码转换成本地机器码执行,这种方式将一些频繁执行的代码编译成本地机器码,以提高程序的执行速度。因此,Java既具备了编译语言的静态检查和跨平台,又具备了解释型语言的灵活和动态能优化。 ### 回答3: Java是一种编译语言编译语言是指在运行程序之前需要将程序源代码通过编译器转换为机器可执行的二进制代码。在Java中,源代码是通过Java编译器(javac)将源代码(.java文件)编译Java字节码文件(.class文件)。然后,Java虚拟机(JVM)通过解释器(解释和执行字节码)将字节码转换为特定机器的指令执行程序。 与解释型语言不同,Java编译时会将代码转换为机器可以理解的形式,这使得Java在执行时更加快速和高效。此外,Java字节码在不同的平台上是可移植的,这意味着可以在不同的操作系统和硬件上执行同一份Java程序。 总之,Java是一种编译语言,通过编译器将源代码转换为字节码文件,并由Java虚拟机解释执行。这种设计使得Java程序在不同平台上具有高度可移植性和高效

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值