文章目录
-
- 一、前言
- 二、c和c++和c#的区别
- 三、各主流语言的底层实现
-
- 1、python的底层实现
- [2、 java的底层实现](#2、 java的底层实现 "#2_java_49")
- 3、php的底层实现
- 4、js的底层实现
- 5、node是用什么语言写的
- 6、golang是用什么语言写的
- 7、rust是用什么语言写的
- 8、.NET是编程语言吗?是的话底层是用什么写的
- 9、object-C的底层是用什么写的
- 四、编译器GCC和Clang和LLVM
-
- 1、clang,clang++gcc,gcc++
- 2、gcc和LLVM
- [3、关于LLVM IR](#3、关于LLVM IR "#3LLVM_IR_121")
一、前言
跟朋友聊天的时候,说到js
的底层实现是什么,c/c++
还是其他的,一顿好奇之后疯狂百度,顺带也查查python
,go
,java
这些高级语言的底层实现,还是挺有意思的。
顺带又查了下gcc
和LLVM
编译器,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#
是微软公司发布的一种由C
和C++
衍生出来的面向对象的编程语言、运行于.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
编译器后端用的LLVM
,LLVM
官方提供支持的有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
中。目前主要支持的编译器有 GCC
和 Clang
。是扩充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++
clang
和gcc
是比较早期的编译器,主要是对c
的支持,也可以编译c++
。
clang++
和g++
是专门编译c++
程序的,编译的时候会自动链接c++标准库stl
注意: clang
的错误提示更人性化,其中错误的语法不但有源码提示,还会在错误的调用和相关上下文的下方有~~~~~和^
的提示,相比之下 GCC
的提示很天书。
2、gcc和LLVM
LLVM
是为了解决gcc
编译代码无法复用问题,LLVM
一上来就站在比较高的角度,制定了LLVM IR
这一中间代码表示语言。LLVM IR
充分考虑了各种应用场景,例如在IDE
中调用LLVM
进行实时的代码语法检查,对静态语言、动态语言的编译、优化等。
注意: gdb
调试器是gcc
自带的,LLVM
是LLDB
调试器
3、关于LLVM IR
参考:
LLVM 相比于 JVM,有哪些技术优势?
IR和ByteCode有什么区别?
我们知道LLVM IR
是有特定规范的中间代码,java
的byteCode
也是中间代码,他们之间有什么区别呢?有兴趣的可以参考下以上链接。
答案是:Bytecode(字节码)是一种IR(中间表示)的形式。
关于编译原理,内容实在是太多了,感兴趣的同学可以根据这些关键词自行搜索学习,博主这里只是科普下,有个印象就行。
end