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

news2025/2/26 14:10:51

文章目录

    • 一、前言
    • 二、c和c++和c#的区别
      • 1、高级语言和低级语言
      • 2、c 和 c++ 和 c#的区别
        • (1)C语言
        • (2)C++
    • 三、各主流语言的底层实现
      • 1、python的底层实现
      • 2、 java的底层实现
      • 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

一、前言

      跟朋友聊天的时候,说到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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/75902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[激光原理与应用-45]:《焊接质量检测》-2- 常见焊接缺陷与检验方法

目录 一、概述 二、焊接缺陷的分类 2.1 按产生原因 2.2 按性质分有: 2.3 按在焊缝中的位置分有: 三、焊接缺陷检验的常用方法 一、概述 对于一个金属结构来说,焊接检验就是对所有焊缝或焊接接头而言的,也就是对焊接缺陷的检…

2022年高压快充行业研究报告

第一章 行业概况 高压快充即为快速充电,衡量单位可用充电倍率(C)表示。充电倍率越大,充电时间越短。依据公式,电池充电的倍率(C)充电电流(mA)/电池额定容量(…

Python爬虫——Scrapy框架

Scrapy是用python实现的一个为了爬取网站数据,提取结构性数据而编写的应用框架。使用Twisted高效异步网络框架来处理网络通信。 Scrapy架构: ScrapyEngine:引擎。负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事…

西部广播电视杂志《西部广播电视》杂志社《西部广播电视》编辑部2022年第21期目录

特稿:乡村振兴战略下的媒体实践《西部广播电视》投稿:cnqikantg126.com 乡村振兴中广播电视角色定位研究 王菾; 1-4 对农宣传中广播电视传播功能研究 周艺培; 5-711 广播电视助力涉农产业发展 胡朗铭; 8-11 省级乡村频道发展的典型个案研…

答疑1209

1、在fmu v2中回传电压值 在comm task 里面有电压读取的任务,pool 电池的电压状态 这是上层会调用hal层,也就是adc.c里面的read函数 主要是fmu v2 里面没有写adc的驱动函数,也就是driver层,这里需要模仿v5上面的驱动来补充一下&a…

[附源码]计算机毕业设计交通事故档案管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Pytest框架批量安装插件解析

1、新建一个工程 使用新的环境变量 1.1.插件文件 新建一个txt的文件,将常用插件放在该文件中,如下图 文件名:requirements.txt 常用插件: pytest pytest-html pytest-xdist pytest-ordering pytest-rerunfailures allure-pyt…

探究菊花文的“密码”(文中转换器源码仅一行代码哦)

菊花文、方框文,看起来很神奇的样子。其实,也就是在字符串中插入了特殊字符,利用特殊字符的显示特性获得的混合显示效果而已。(文中转换器源码仅一行代码哦🤗) (本文获得CSDN质量评分【90】)【学习的细节是欢悦的历程】Python 官网…

Alpine安装Oracle JDK存在的问题

简介 前面我们提到了Alpine使用的不是正统的glibc,对于一些强依赖glibc的系统建议不要使用Alpine,比如使用了Oracle JDK的系统,建议在Alpine换成OpenJDK。 Alpine官方给出了Alpine的三大特征 Small、Simple、Secure,但其实我们知…

【论文阅读】 AdaptivePose: Human Parts as Adaptive Points

DOI:https://doi.org/10.1609/aaai.v36i3.20185 AAAI 2022 Published:2022-06-28 Others阅读/整理:翻译1、翻译2 Intro&Background 多人姿态估计方法 two-stage methods【图a】 这些方法使用绝对关键点位置,定位的…

顺时针打印矩阵

大概题意为: 第一步: 第二步: 第三步: 第四步 : 这样核心就设计好了,接下来设计剩余的东西 设计题目程序 1.题目要求我们返回一个地址,所以我们创造一个一维数组,它的元素个数为行…

华为机试_HJ61 放苹果【简单】【收藏】

目录 描述 输入描述: 输出描述: 解题过程 提交代码 递归方法 动态规划方法 学习代码 递归方法 动态规划方法 收藏点 描述 把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法&#xff…

Postman(七): postman应用实战

Postman(13): postman应用实战 postman应用实战 下面以微信公众平台举例: 第一步、先创建文件夹 第二步、打开postman,创建collections 第三步、设置环境变量,全局变量 设置环境变量;如下图: 设置全局变量&#xf…

银河麒麟V10 + 飞腾CPU编译安装 Qt5.9.9

一、准备工作 1. 下载Qt源码包 这里我们要编译的是Qt5.9.9,下载网址:https://download.qt.io/archive/qt/5.9/5.9.9/single/ 在任意空闲位置新建文件夹,并将源码包放到该目录下。(这里在/home目录下新建名为Qt_Source的文件夹&a…

Unity Animancer插件(二)精确控制

一、通过名称播放动画 前面我们讲的都是直接通过动画片段的引用播放动画,Animancer也提供了直接通过动画名称来播放动画的方法。但这并不是推荐的使用方式,因为通过字符串播放比通过引用播放效率略低,且更难维护。 首先我们需要在角色身上挂…

2022年ACM杰出会员名单公布:23位华人学者入选

12月7日,2022年度ACM杰出会员(Distinguished Member)名单公布! 本次评选设有三个奖项,分别表彰在计算机领域做出的教育贡献、工程贡献和科学贡献。 ACM创立于1947年,目前在全球130多个国家和地区拥有超过…

OceanBase 4.0 解读:降低分布式数据库使用门槛,谈谈我们对小型化的思考

关于作者 赵裕众 OceanBase 资深技术专家,2010 年加入支付宝后从事分布式事务框架的研发,2013 年加入 OceanBase 团队,目前负责存储引擎相关的研发工作。 近年来,随着应用场景多样化和数据量的增长,我们看到分布式数据…

判别分析-书后习题回顾总结

5-2 题目 理论基础 多总体的距离判别 马氏距离:dG2(x)(x−μ)2σ2d^{2}_{G}(x)\frac{(x-\mu)^{2}}{\sigma^{2}}dG2​(x)σ2(x−μ)2​ 取马氏距离最小的那一个,就属于这类。 贝叶斯判别准则 计算qtft(x)q_{t}\times f_{t}(x)qt​ft​(x) ft(x)12πσ…

001:Object-C介绍、创建第一个iOS工程、MVC架构

常见APP基础业务模块: 常见App类型:通信与存储、流媒体、直播技术、图片处理、内容展示、Web、组件化、IM类型、音视频、直播类型、摄影摄像类型、资讯类型、工具、购物类型。 App 展示界面动画:底部TabBar、Navigation、列表、图片ImageVi…

一文囊括Ceph所有利器(工具)

原文链接: 知乎专栏: 一文囊括Ceph所有利器(工具) - 知乎 前言 ceph的工具很多,包括集群管理与运维,还有性能分析等等。 所以本文期望应收尽收所有的工具,也当做自己的一个梳理与总结,当自己需要的时候知道有哪些利器可以使用…