主流编程语言的底层实现是什么以及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是用什么语言写的

参考:baijiahao.baidu.com/s?id=166686...
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 编译器),主要工作原理分为三段式:

cpp 复制代码
(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

相关推荐
桃园码工20 小时前
2-测试bigcache做进程内缓存 --开源项目obtain_data测试
vscode·mysql·go·postman
ZQDesigned2 天前
在 Windows 和 macOS 上配置 Golang 语言环境
后端·go
楽码2 天前
只需一文:了解validator标签以轻松验证
后端·安全·go
煎鱼eddycjy3 天前
新提案:由迭代器启发的 Go 错误函数处理
go
煎鱼eddycjy3 天前
Go 语言十五周年!权力交接、回顾与展望
go
不爱说话郭德纲3 天前
聚焦 Go 语言框架,探索创新实践过程
go·编程语言
0x派大星5 天前
【Golang】——Gin 框架中的 API 请求处理与 JSON 数据绑定
开发语言·后端·golang·go·json·gin
IT书架5 天前
golang高频面试真题
面试·go
郝同学的测开笔记5 天前
云原生探索系列(十四):Go 语言panic、defer以及recover函数
后端·云原生·go
秋落风声6 天前
【滑动窗口入门篇】
java·算法·leetcode·go·哈希表