主流编程语言的底层实现是什么以及gcc,clang,llvm等编译器的区别

一、前言

      跟朋友聊天的时候,说到js的底层实现是什么,c/c++还是其他的,一顿好奇之后疯狂百度,顺带也查查python,go,java这些高级语言的底层实现,还是挺有意思的。

      顺带又查了下gccLLVM编译器,emmmm,只能说学无止境。。。

二、c和c++和c#的区别

1、高级语言和低级语言

参考:
计算机语言的几种分类

计算机语言发展简史

低级语言: 如机器码(machine language)、汇编(伪机器语言)和符号语言是属于低级语言;

高级语言: C、C++ 、C#、pascal、python、lisp、prolog、FoxPro、Objective-C 、Swift 、java、php等是属于高级语言。

机器码: 计算机能够直接识别的二级制编码,无论语言多高级都要转成二级制文件来让计算机识别运行。

汇编: 用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址,在不同的设备中有着不同的指令集

      高级语言与低级语言的区别:高级语言大部分不能直接更硬件打交道,这使得相对来的程序运行速度降低,总之一句话来说那种语言更接近人性化的语言就更高级。

2、c 和 c++ 和 c#的区别

(1)C语言

      C是完全面向过程的语言,用于开发规模较小的程序效率很高,但是程序较大,就显得代码量多,编写效率下降了。
      二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。
由于标准的存在,使得几乎同样的C代码可用于多种操作系统,如Windows、DOS、UNIX等等;也适用于多种机型。C语言对编写需要进行硬件操作的场合,优于其它高级语言。

(2)C++

      C++是半面相对象的,引入了类的封装性、继承性、多态性大大简化程序编写,提到了代码重用率。
      c和c++的关系: C++既面向过程又面向对象,而且她继承了C语言的所有优点,又对C语言功能做了很多扩充,可以认为C++就是C的增强版。

(3)C#
      C#是完全面向对象的语言,简单易学,开发效率非常高。C#不支持多重继承,这是与C++明显区别的地方。 在标准的C#安全代码中不支持指针类型的操作。C#是微软公司发布的一种由CC++衍生出来的面向对象的编程语言、运行于.NET Framework.NET Core(完全开源,跨平台)之上的高级程序设计语言。

三、各主流语言的底层实现

      高级语言的底层实现,主要是看它的编译器或者解释器是用什么语言写的,这些编译器把高级语言编译成了机器码。

1、python的底层实现

      用 C 语言编写实现的 Python,又称为 CPython。平时我们所讨论的 Python,指的其实就是 CPython。除了用 C 语言实现外,Python 还有其他的实现方式。例如,用 Java 语言实现的 Python 称为 JPython,用 .net 实现的 Python 称为 IronPython 等等。

2、 java的底层实现

      java是运行在java虚拟机上的,java虚拟机是c/c++实现的,因此可以说java的底层是c/c++

3、php的底层实现

参考:php底层是什么语言
      php的底层是c语言。我们都知道php是运行在zend引擎上的,zend引擎是纯C实现,是PHP的内核部分,它将PHP代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕Zend实现。

4、js的底层实现

参考:js是用什么语言编写实现的
      js是运行在浏览器上的,比如针对pc端来说,一般浏览器引擎是c/c++开发的,比如v8引擎因此可以说js的底层是c/c++
      但是对于手机端浏览器,可能安卓是用java写的,ios是用objectC写的,因此不能直接下定论,只能根据浏览器的引擎语言实现来说。

5、node是用什么语言写的

参考:node.js底层是什么语言

      node.js 使用C++开发的。 它是JS运行平台(运行环境)。它的语法就是javascript,区别在它是运行在服务器上的。证据 :node的源码在 GitHub网站上 , 项目根目录的src文件夹下很多以 .cc 后缀结尾的文件里有class字眼 ( C++有class而C没有 )

6、golang是用什么语言写的

参考:https://baijiahao.baidu.com/s?id=1666860904685373696&wfr=spider&for=pc
golang本身是用什么语言写的?
      早期Go是用汇编语言和C语言实现的,后来Go成熟了之后,Go语言就开始自举、用早期版本重写了Go语言编译器。
      Go语言是效率很高的编程语言,比Java、C#、PHP、Python这些基于虚拟机以及解释性语言性能要好、资源使用效率也更高。go编译器可以直接把生成的汇编语言转换成机器码,不需要像其他高级语言还需要转换一遍,因此效率非常高。

7、rust是用什么语言写的

      Rust编译器后端用的LLVMLLVM官方提供支持的有C++OCaml两种,Rust的开发者选择了OCaml实现了初版编译器,目前已经完全自举了。linux内核目前支持用rust去重构C程序,说明大佬们还是很看好rust的。

8、.NET是编程语言吗?是的话底层是用什么写的

      .net是一个平台,在这个平台里边可以用很多语言来开发,比如:c# ,vb,F#,j# 等等 。netcore是微软新开发的全新的可以跨平台的平台框架,同样netcore中可以用多种语言开发
      C#.net平台下的一门语言而已,而且是.net平台主推的开发语言,很优秀,而且性能很高

9、object-C的底层是用什么写的

      Objective-C 是一种通用、高级、面向对象的编程语言。它扩展了标准的 ANSI C 编程语言,将 Smalltalk 式的消息传递机制加入到 ANSI C 中。目前主要支持的编译器有 GCCClang。是扩充C的面向对象编程语言,主要使用在Mac OS X系统中,Objective-C的流行归功于iPhone的成功。编写iPhone应用程序的主要编程语言是Objective-C

四、编译器GCC和Clang和LLVM

参考:
【编译原理】GCC/Clang/LLVM的区别与联系
gcc/g++/clang,相当于javac:
GCC vs Clang: 两大编译器巨头的龙争虎斗

具体细节可以参照这三篇文章。

      GCC是传统的编译器(该模型同样适用于解释器和JIT 编译器),主要工作原理分为三段式:
在这里插入图片描述

1)前端:解析源代码、检查语法错误、翻译为抽象的语法树
(2)优化器:将抽象语法树翻译生成中间代码,并对中间代码进行优化
(3)后端:将优化器优化后的中间代码转换为目标机器的代码,通用功能包括指令选择、寄存器分配和指令调度

简单来说:

1、clang,clang++gcc,gcc++

      clanggcc是比较早期的编译器,主要是对c的支持,也可以编译c++
      clang++g++是专门编译c++程序的,编译的时候会自动链接c++标准库stl
注意: clang的错误提示更人性化,其中错误的语法不但有源码提示,还会在错误的调用和相关上下文的下方有~~~~~和^的提示,相比之下 GCC 的提示很天书。

2、gcc和LLVM

      LLVM是为了解决gcc编译代码无法复用问题,LLVM一上来就站在比较高的角度,制定了LLVM IR这一中间代码表示语言。LLVM IR充分考虑了各种应用场景,例如在IDE中调用LLVM进行实时的代码语法检查,对静态语言、动态语言的编译、优化等。
注意: gdb调试器是gcc自带的,LLVMLLDB 调试器

3、关于LLVM IR

参考:
LLVM 相比于 JVM,有哪些技术优势?
IR和ByteCode有什么区别?
      我们知道LLVM IR是有特定规范的中间代码,javabyteCode也是中间代码,他们之间有什么区别呢?有兴趣的可以参考下以上链接。
答案是:Bytecode(字节码)是一种IR(中间表示)的形式。

      关于编译原理,内容实在是太多了,感兴趣的同学可以根据这些关键词自行搜索学习,博主这里只是科普下,有个印象就行。

end

猜你喜欢

转载自blog.csdn.net/LJFPHP/article/details/128258260