所有的编程语言最后会编译成C,再编译成汇编,最后落实到硬件操作上吗?

关于解释器的具体原理,以及加强型算法——如JIT,可以参见笔者的专栏《华为方舟编译器源代码分析》的《干掉Java虚拟机来提升应用程序性能:只有华为想到了吗?》。

4. 一些直接面向高级语言的机器

历史上还专门开发过面向高级语言的机器,中间是不需要汇编语言过渡的。比如大名鼎鼎的LISP语言。曾经人们专门为LISP语言开发过对应的机器。但是最终的商业成果并不理想,主要是当时一些条件还不成熟。


周林ZhouLin


浏览了一下,基本上大家的回答都没说到点子上,基本上编程语言不会生成其他其他语言,也不会生成什么汇编,会由编译器直接生成二进制文件,但这些二进制代码并非所有都跟硬件打交道,跟硬件打交道的程序非常少。只有驱动才跟硬件打交道,即使是操作系统内核都需要通过驱动才能调用得到硬件!更何况大部分人开发的程序远远还没到跟内核打交道,内核之上是各种组件,各种运行时库,各种接口!或java虚拟机构成操作系统!即软件的运行环境!程序调用操作系统的各种api,各种公共接口,或其他硬件发行的sdk等等等等!离硬件很远很远。


人工智能应答机


计算机能够识别的语言只有机器语言,也就是0-1代码,咱们可以直接编写0-1代码让计算机执行程序,没有问题。但是,这就增加我们学习编程的学习成本和编程成本,为此咱们的前辈们开发了编程语言,最早的是汇编语言,通过编译器将汇编语言变成机器语言;另外一种是高级语言,像Python、java、C++、MATLAB、VB等等。高级语言接近于人类语言,学习成本、编程成本低,汇编语言学习成本较高,目前除了对计算速度要求极其严格的环境,一般不采用汇编语言。

因此,高级语言和汇编语言不是递进的关系,即高级语言不会编译成汇编语言,他们都会变成机器语言(即0-1代码),供计算机硬件识别并驱动计算机完成相关功能。


AI与Python


语言通常分两种,解释型和编译型。解释型是在程序运行时由解释器解释成机器码。而编译型,是事先就编译成了机器指令集。这些编译过程并不需要通过先转汇编再转机器码,而是直接转的,当然这有个过程,比如C/C++都是先编译,再链接成机器码的。

给楼主这种错误的感觉估计是受反汇编影响。因为汇编是目前最接近机器码的语言,而编译后的二进制机器指令集也是最容易翻译成汇编,所以反编译一个编译后的程序通常都是以汇编来显示。


汛1


我来回答这个问题,其实际情况并不是这样的,首先要明确的是,我们不管用什么语言编写程序最后都要生成机器能够识别的语言。我以自已最为熟悉的编程语言C语言和汇编语言为例来说明吧!



我们知道计算机是不能直接识别C语言或汇编语言的,要经过编译软件把这些人类很容易读懂的语言生成计算机能够“识读”的语言,我们称之为“机器语言”。机器语言都是以“1”和“0”组成的,我们人类很难读懂!



因此,在用编程软件编写程序时,编程软件都有把源程序编译成目标文件的功能,比如我们常用的keil软件,只要通过简单的设置便会自动生成后缀为.Hex的目标文件,我们要把这个文件通过下载软件下载到计算机中就可以了!不需要相互转换。我们用汇编写程序也是一样的方法。不过所生成的目标文件其格式可以是.Hex文件或者.bin文件,只不过前者以十六进制形式出现而后者以二进制形式出现!我们可以类推出其它编程语言都应该大同小异。



当然,最后我们可以使C语言和汇编语言相互转化的,我们称为反汇编!这种方法用的场合较少!以上是我对这个问题的回答!欢迎朋友们参与讨论这个话题。敬请观注电子及工控技术!


电子及工控技术


首先这种认识是不正确的,所有的编程语言要转化成机器语言然后才去运行,肯定不会转化成C语言去运行,因为C语言还是要汇总成机器语言去运行。从类别上讲编程语言主要分成两种,一种在运行之前提前生成二进制文件,机器上电直接运行就可以了;另外一种是一边运行一边编译最终的结果也是转化成二进制文件,这样机器才能准确的识别出来。只要是遵循冯诺依曼的架构都要转化成二进制的文件让机器去运转执行,可能在未来量子计算机发展起来架构会有所改变,起码在很长的一段时间内还会继续这种架构存在。

编程语言如何实现跨平台运行

就拿典型的编程语言Java作为例子来阐述,java属于典型的跨平台语言,跨平台的语言编程的好处是在任何一个操作系统上完成代码编写之后就可以在任何平台来运行,一般开发java都在windows平台上开发,但真正在部署的时候既可以在linux服务器上运行,也可以在windows服务器上运行。但在实际运行过程中还是要遵循各自的指令体系,做这个时期的关键点就在于java的虚拟机,所以在安装运行环境的时候,不同的操作系统的版本是不一致的,java在编译的时候都会转化成字节码,字节码在不同操作系统的虚拟机都可以运行,虚拟机里面会把主流的操作系统指令都分别集成进去,也就是java版本在更迭的时候除了增加基本语法之外,还要在修改不同的操作系统底层实现,这样子才能真正做到跨平台运行。

跨平台在嵌入式领域使用的比较多,如果用C++开发的代码可以在宿主机上直接运行,调试完毕了然后再烧录到嵌入式板卡里面去运行,毕竟直接在PC的linux上调试代码,要比直接在板子里调试要方便的多,这就是跨平台的好处,除了方便开发代码还极大方便调试。

C语言在编程语言中的地位

虽然不是每种编程语言都要转化成C语言再去运行,但很多编程语言的底层都是C语言来实现的,这是真实存在的事实,但还是有很多人觉得C语言已经过时了,起码从招聘的简章C语言的比例在下降

,这个主要原因是国内程序员大部分都做着互联网的工作,互联网主要从事应用级开发比较多,所以一些集成化编程语言在国内比较能够吃得开,像python,php,Java在国内都有着良好的生态基础,这是国内软件环境决定的。

C语言在很多基础领域还是首选的编程语言,语法简洁但灵活多样,在实际功能的的时候效率高性能强,在很多领域还是第一编程语言,主要在通讯行业以及嵌入式领域还是C语言的主战场。非常流行的人工智能在底层很多功能实现也是基于C语言完成,只不过C语言的角色从前台走向了幕后,但重要性并没有因此而降低,即使选择C语言作为入门的编程语言,在基础过硬的情况下照样能找到合适的工作,不要迷信C语言已经不行了之类的话语。

对于编程语言的编译原理以及运行过程还是要多去涉猎,如果纯正的高级编程语言可能很少去关系这些个原理,都是去操心如何架构等方面的问题,底层如何实现功能对于上层调用方式都有决定性因素,尽管很多人不推荐第一门编程语言选择C语言,但从个人的角度出发,还是建议C语言作为入门编程语言,即使不是从事这方面的工作,起码在从知识体系上还是有很大的好处,希望能帮到你。


大学生编程指南


用C写的程序才会被编译成汇编语言,再由汇编器翻译成机器码。是这样的,要搞清楚一点,只有机器语言才能和底层硬件打交道,也就是每种高级语言的最终执行代码都是机器码,至于中间形式的目标代码则有很多种,像Java语言的代码被编译成一种叫字节码的中间代码,然后由相应平台的JVM翻译成机器码执行,还有的像JavaScript, Python这种解释型的语言根本就不经过编译,而是逐条代码直接翻译成机器码再执行。很多时候说C语言是最基础的语言并不是说所有语言都要往C语言上走一遍,一部分原因是因为C语言的特性使得它适合编写一些语言的底层支持模块,还有就是操作系统是由C语言编写的,应用程序与操作系统交互需要调用一些C写的模块。总之,你完全可以自己发明一种语言,你定义好语法规则,再写一个针对这种需要的编译器,能翻译成平台兼容的机器语言,那样就可以执行了。所以不存在什么语言都要转成C这一说


AncleDrew


不请自来,这个问题说清楚也简单。由汇编转换生成机器码,机器码是有一定的约束规则,汇编就是按照机器码规则生成机器码的。 汇编也是有语法规则的。比方说机器码是一个工具,汇编也是一个工具,最开始汇编这个工具来打造机器码这个工具。c语言也是一个工具,原理上c也可以直接翻译到机器码,但是没有先到汇编,然后再到机器码来的便利。只要按照对方的语法规则生成就好。其它高级语言可以先生成c,最终生成机器码,但是来的不方便。其它语言直接写个翻译工具直接到汇编就好了,汇编到机器码,没有必要重写,这样做优化更好做。大家都是工具,有一定的文法规则,只要按照对方规则创建,就可以翻译成功了。

新的语言编译器,肯定是一门老的语言写的,比如c,或者c++,再由gcc或者clang生成新的编译器。再之后,有了这个新的编译器,其实c也就可以被抛弃了,新的语言自己就可以来生成自己的编译器。比如c编译器,现在已经不是汇编写成的,就是c写成的。


jiangliuer-


不一定,和c语言同级的语言差不多是被编译成汇编语言,比如rust,go等语言都是和c语言同级的。


分享到:


相關文章: