语言对比 c++ Java go python js

语言特点

编译执行和解释执行

1.编译执行:将源代码一次性转换为机器码文件,然后直接运行机器码文件。

2.解释执行:将源代码一行一行的解释执行。

根本区别是运行时:

解释型需要一边解释,一边运行。

而编译型在运行之前就已经将程序编译成机器码了。所以编译运行比解释运行

面向过程和面向对象

面向过程是一种以过程为中心的编程思想,它首先分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,在使用时依次调用即可。常见的面向过程的编程语言有 C语言

面向对象是以对象为中心的编程思想,按人们认识客观世界的思维方式,采用基于对象的概念建立模型,以此模拟客观世界分析、设计、实现软件的一种编程思想,常见的面向对象的编程语言有 java,c++语言。

二者的优点:

面向过程:
面向过程性能比面向对象高。 因为类和对象的创建、调用、销毁都需要性能开销。

面向对象:
面向对象易维护、易复用、易扩展。 因为面向对象有封装、继承、多态等特点,所以可以设计出低耦合的系统,使系统更加灵活易于维护。

补充:
函数式编程与命令式编程(面向对象和面向过程)最大的不同其实在于:

函数式编程关心数据的映射,命令式编程关心解决问题的步骤

静态语言:在编译期间就确定了变量的类型,C/C++,go、JAVA
动态语言:在运行期间才确定变量的类型。Python、JavaScript

强类型:不能隐式类型转换,只能强制类型转换

弱类型:可以隐式类型转换

强类型和弱类型

强类型是指不允许变量隐式类型转换,弱类型则允许隐式类型转换。

各自优缺点:强类型的速度可能略逊于弱类型语言,但是强类型定义语带来的严谨性又避免了不必要的错误。

注意:强制转换只改变变量的值的类型,而没有改变变量的类型。变量的类型是不允许改变的。

举个js弱类型的例子吧:

var A=5;
var B="5"
sumA=A+B;
sumB=A-B;

sumA=55,系统默认+字符连接符,将A转化为字符串类型;
sumB=0;系统认为-是算数运算符,从而将B转化为int类型,所以sum为5-5=0;

静态语言和动态语言

定义
静态语言:在编译期间就确定了变量的类型,C/C++,C#、JAVA
动态语言:在运行期间才确定变量的类型。Python、JavaScript

对比
静态语言的优势:
1、编译时检查出错误的类型匹配,以提高程序的安全性;
2、可以根据对象类型优化相应运算,以提高目标代码的质量;
3、减少运行时刻的开销。
所以适合实现复杂的业务逻辑、开发大型商业系统

动态语言:
正好与强类型相反,编译时的检查很弱,它仅能区分指令和数据,弱类型语言允许变量类型的隐式转换,如字符串和数值可以自动转化。

语言总结

java是静态强类型 编译+解释
go是静态强类型 编译
c++是静态强类型 编译
JavaScript是动态弱类型 解释执行+编译
py是动态强类型 解释

 i=1
 print(i)
 i=”hello world”
 print(i) 

上面看起来py是弱类型,但其实如果有一个整数,如果不明确地进行转换 ,不能将把它当成一个字符串
在这里插入图片描述

C++

静态强类型语言,编译执行,速度很快。兼容c语言,所以支持面向对象和面向过程。
允许程序员手动垃圾回收

C/C++编译器工作原理:
1、预处理:
预处理过程主要处理那些源文件中的以“#”开始的预编译指令。包括#include,#define, #if等等
主要的处理规则如下:

  • 将所有的#define删除,并且展开所有的宏。
    如#define a b 就是将所有的a替换成b
  • 处理所有的条件预编译指令,,如#if,#ifdef,#else,#endif,以此来决定对哪些代码进行处理,将那些不必要的代码过滤掉
  • 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置

2、编译+汇编
编译:
通过词法分析、语法分析、语义分析、源代码优化、类型检查等等,将源代码翻译成汇编代码。

汇编:
通过代码生成、目标代码优化等把汇编语言代码翻译成二进制机器码
在这里插入图片描述

3、链接:
前面的编译中,每个源代码模块是单独编译的,然而不同的模块之间不可避免地要相互引用变量或函数,这些变量或函数的地址只有在此阶段才能确定。链接过程就是把编译器生成的一个个目标文件链接成可执行文件
此阶段的链接是静态链接,运行期间的链接则是动态链接。

运行:
“静态的程序”被载入内存,由 CPU 逐条语句执行,就形成了“动态的进程”。

补充:
从C到C++,从程序性能的角度来考虑,这两种语言允许程序员自己管理内存,包括内存的申请和释放等。因为没有垃圾回收机制所以C/C++运行起来速度很快,但是很容易导致“内存泄露”

后来为了提高程序开发的速度以及程序的健壮性,java和C#等高级语言引入了GC机制,即程序员不需要再考虑内存的回收等,而是由语言特性提供垃圾回收器来回收内存。但是随之而来的可能是程序运行效率的降低。

java

静态强类型语言
面向对象
解释+编译
一次编译,到处运行,与os无关
自动垃圾回收

Go

天然支持高并发,是go语言最大的亮点
支持goroutine协程,可实现大并发处理,高效利用多核。
利用管道通信机制,形成 Go 语言特有的管道 channel 通过管道 channel , 可以实现不同的 goroute 之间的相互通信。

静态强类型

编译执行,编译速度很快,内存开销小。

自动垃圾回收,采用标记-清除算法
没有像java那样使用虚拟机,编译器在编译代码的时候会插入相关的代码进源程序,去实现什么时候需要暂停,什么时候启动回收。
至于GC算法和GC时执行的代码,则是在runtime里面。

没有类和继承的概念,所以严格来说不是面向对象的语言
但是它又通过接口(interface)来实现多态性。支持面向对象的编程风格。
因此可以说go是混合型的语言。

Go 语言其实也有一些动态语言的特性(通过关键字 var)

go编译原理
在这里插入图片描述
相对C++少了预处理阶段
1、编译:
对源文件进行词法分析、语法分析、语义分析、优化,最后生成汇编代码文件,以 .s 作为文件后缀。

中间代码的生成
Go 语言的中间代码表示形式为 SSA(Static Single-Assignment,静态单赋值),之所以称之为单赋值,是因为每个名字在 SSA 中仅被赋值一次。。
过程其实就是从 AST 抽象语法树到 SSA 中间代码的转换过程,在这期间会对语法树中的关键字在进行一次更新,更新后的语法树会经过多轮处理转变最后的 SSA 中间代码。

目标代码生成与优化
不同机器的机器字长、寄存器等等都不一样,意味着在不同机器上跑的机器码是不一样的。最后一步的目的就是要生成能在不同 CPU 架构上运行的代码。
为了榨干机器的每一滴油水,目标代码优化器会对一些指令进行优化,例如使用移位指令代替乘法指令等。

2、汇编:
然后汇编器会将汇编代码转变成机器可以执行的指令,即机器码。

3、链接:
编译过程是针对单个文件进行的,文件与文件之间不可避免地要引用定义在其他模块的全局变量或者函数,这些变量或函数的地址只有在此阶段才能确定。
链接过程就是要把编译器生成的一个个目标文件链接成可执行文件

4、运行:
可执行文件可以直接在机器上执行。一般而言,先执行一些初始化的工作;找到 main 函数的入口,执行用户写的代码;执行完成后,main 函数退出;再执行一些收尾的工作,整个过程完毕。

可执行文件是分成各种段的,比如数据段、代码段、BSS段等等,运行时会被装载到内存中。各个段具有不同的读写、执行属性,保护了程序的安全运行。

python

python是动态弱类型、面向对象的,解释执行(所以运行速度慢)、动垃圾回收的脚本语言

解释型
Python解释器由编译器和虚拟机构成,编译器将源代码编译成字节码,然后再通过Python虚拟机来逐行解释执行这些字节码。

python解释器有很多种:

CPython:C语言开发,相较JVM没有JIT及时编译,使用最广,官方解释器

IPython:基于CPython之上的交互式解释器

PyPy:采用JIT及时编译技术,对python代码进行动态编译,追求执行速度

Jython:运行在Java平台上的解释器,可以直接编译成Java字节码由JVM运行。

JavaScript

解释执行的脚本语言,动态的弱类型语言。
跨平台性脚本语言。
JavaScript依赖于浏览器本身,与操作环境无关,只要有支持JavaScript的浏览器,就可正确执行

猜你喜欢

转载自blog.csdn.net/qq_40337086/article/details/122168289