当前位置:首页 » 编程软件 » 读懂编译器需要知识

读懂编译器需要知识

发布时间: 2025-04-28 07:25:11

㈠ CPU是怎么看懂代码的

备注:这是我问答内容的一个精编版,增加了一些内容,所以和原内容略有不同。

去年底,有中国开发者已经开发出文言文编程语言,并在GitHub上摘得了5500星,在国内引起不小反响。这件事给普通人的印象是, 科技 发展日新月异,电脑CPU太厉害,都能读懂文言文了!

CPU真的能看懂文言文代码吗?答案是CPU既看不懂文言文代码,也看不懂英文代码。

现在的CPU晶体管数量动辄几十亿个,结构非常复杂,但内部传输的信号只有两种:高电压和低电压,分别代表数字信号“1”和“0”(也有相反的),因此CPU唯一能看懂的就是由“1”和“0”组成的代码。

由于程序(代码)存储在电脑硬盘中时,也是“1”和“0”的形式,是否就意味着,只要程序存到硬盘中,CPU就能认识呢?

答案是CPU仍然看不懂这些程序,因为以“1”和“0”位模式存储的程序和以“1”和“0”写成的机器语言完全是两回事,简单说,两者的区别类似于汉语书和英语书都用纸和油墨印制,但依然是两种不同的语言,不会英语的依然看不懂英语书。

机器语言是CPU唯一能看懂的语言,也是第一代编程语言。

图片说明:早期的计算机程序员使用机器语言编程,将用0和1数字编成的程序代码打在纸带或卡片上(打孔代表1,不打孔代表0),再将它通过纸带机或卡片机输入计算机,进行运算。

机器语言的最大特点是面向计算机硬件编程,简单说就是程序员需要通晓计算机硬件知识,写的程序要真实表示数据是如何被计算机操纵的。对程序员来说这就比较头大,一方面不仅需要通晓计算机硬件知识,另一方面如果计算机使用了不同的硬件,那么就得重新编程。

毕竟上得了“厅堂”(搞掂硬件)下得了“厨房”(玩得转软件),只有少数大神能做到,加上机器语言纯用“0”和“1”序列组成,非常单调枯燥,不仅扼杀了编程的趣味,而且对视力也是一种考验,稍微一眼花,看错1或0的排列位置,就会制造一个大BUG。

于是,有一帮人开始琢磨了:能不能将计算机硬件从编程中分离出来,让硬件知识小白也能编程?

最先开窍的是蓝色巨人IBM,它在其System/360计算机中引入了ISA(Instruction Set Architecture)概念,将编程所需要了解的硬件信息从硬件中抽象出来,这样编程人员就可以面向ISA编程。由于ISA是用来描述编程时用到的抽象机器(不是具体的电脑CPU),包括了一套指令集和一些寄存器,因此,程序员只要知道ISA,不需要了解具体的硬件知识,就可以编写程序,在ISA相同的电脑上运行。

这样一来,就出现了汇编语言,但汇编语言用符号写成,还是不够接地气儿,于是高级语言就诞生了。高级语言的诞生,使程序员将精力从复杂的计算机结构转移到要解决的问题,从而可以专心烹调程序大餐。

由此也可以看出,现在的程序员并不都是了解计算机硬件的,所以妹子们不要指望自己的程序员男朋友给你DIY电脑,或者电脑坏了,他能给你省下一笔修理费。他说不会修,那就是真的不会修。

自从高级语言出现后,人类开始了在编程语言上的放飞自我,经过数十年的发明创造,现在的高级编程语言已超过2500种,像比较知名的C++和java等,都属于高级语言。

但问题出现了,CPU能理解的机器语言还是那个机器语言,几十年来没有变化,让它读懂高级语言那是不可能的。

怎么办?

其实,早在高级语言出现之前的汇编语言时代,聪明的计算机研发人员就开发出了专门的程序,用来将汇编语言和高级语言翻译成机器语言,其过程相当于将英语名着翻译成汉语着作。

说白了,这种翻译程序相当于人类中的翻译家。

翻译程序有两种工作方法:编译和解释,相应的程序名称是编译器和解释器。两者的区别是,编译是在执行前把整个源程序(高级语言程序)翻译成目标程序(机器语言程序),而解释是一次只翻译和执行源程序中的一行。

打个形象的比方,解释器相当于发布会的实时翻译,演讲的嘉宾说一句,实时翻译马上翻译一句。编译器则相当于着作翻译家,整本翻译完成后,再让出版社印刷上市。

经过翻译程序的努力,现在CPU能看懂程序员写的程序了。当然,用开头提到的文言文编程语言编写的程序想要让CPU看懂,还得多一道翻译步骤,即要么翻译成Javascript,要么翻译成Python。多转了一圈,不知道程序执行效率如何。

由于CPU不能直接理解用高级语言写成的代码,必须依赖翻译程序翻译成机器语言,因此翻译程序可以极大地影响甚至决定处理器性能的发挥。如果没有一个好的翻译程序,那么CPU的性能再强大,也好比茶壶装的饺子,倒不出来。

正因为如此,谷歌在安卓4.4之后,抛弃了Dalvik虚拟机,改为ART,实际是将翻译程序从解释器切换到编译器,发挥了芯片的性能,提高了程序运行效率。

现在,手机大厂包括华为、OPPO和vivo都开始重视编译器开发,说到底就是为了发挥芯片性能,让它不再成为倒不出饺子的茶壶。

最后总结一下,用翻译程序把程序员编写的程序翻译成二进制代码的机器语言后,CPU就能看懂代码了,而且翻译程序的优劣可以影响乃至决定CPU性能发挥。

图片源自网络,版权归图片作者所有。

㈡ 学习编程的基本知识

学编程要具备一定的基础,总结之有以下几方面:
(1)数学基础 必须喜欢数学! 从计算机发展和应用的历史来看计算机的数学模型和体系结构等都是有数学家提出的,最早的计算机也是为数值计算而设计的。因此,要学好计算机就要有一定的数学基础,初学者有高中水平就差不多了。
(2)逻辑思维能力的培养 学程序设计要有一定的逻辑思维能力,“逻思力”的培养要长时间的实践锻炼。要想成为一名优秀的程序员,最重要的是掌握编程思想。要做到这一点必须在反复的实践、观察、分析、比较、总结中逐渐地积累。因此在学习编程过程中,我们不必等到什么都完全明白了才去动手实践,只要明白了大概,就要敢于自己动手去体验。谁都有第一次。有些问题只有通过实践后才能明白,也只有实践才能把老师和书上的知识变成自己的,高手都是这样成材的。
(3)选择一种合适的入门语言 面对各种各样的语言,应按什么样的顺序学呢?程序设计工具不外乎如下几类: 1)本地开发 应用软件开发的工具有:VS、Delphi 、VC++ ( C++ Builder ) 等;数据库开发工具有:Visual Foxpro 、Oracle Developer 、Power Builder 等。 2)跨平台开发 开发工具如 Java 等。 3)网络开发 对客户端开发工具如:Java Script 等;对服务器开发工具如:ASPX 、PHP、ASP 、 JSP 、ISAPI 、NSAPI 、CGI 等。 以上不同的环境下几种开发工具C#中 法简单并容易理解,界面设计是可设化的,易学、易用。选 C#作为入门的方向对出学者是较为适合的。

(4)注意理解一些重要概念

一本程序设计的书看到的无非就是变量、函数、条件语句、循环语句等概念,但要真正能进行编程应用,需要深入理解这些概念,在理解的基础上应用,不要只简单地学习语法、结构,而要吃透针对这些语法、结构的应用例子,做到举一反三,触类旁通。
本人自己学的是C#,现在感觉了自己也在不断成长,的确编程是一条“不归路”,既然选择了就勇敢走下去!慢慢地语言差异的概念越来越模糊。走上设计居上的路。只有不断学习,不断充实才能走的更远!

㈢ 一文读懂ninja构建系统

ninja是一种高效的构建工具,专为大型项目设计,以下是对ninja构建系统的简要介绍

  1. 基本定义

    • 构建工具:ninja用于调用各种工具来编译大型项目。
    • 生成目标:ninja不是为人直接编写的,而是通常由其他程序生成。
  2. 设计哲学

    • 避免模糊:ninja避免makefile中可能存在的模糊内容,如dir/*.cpp,而是直接列出具体要执行的命令。
    • 明确命令:ninja本质上就是一条一条地列出了具体要执行的命令,并直接执行。
  3. 核心特点

    • 依赖关系分析:ninja会分析命令之间的依赖关系,并据此优化构建过程。
    • 高效构建:通过精确分析依赖关系,ninja能够实现高效的增量构建。
  4. 安装方式

    • GitHub下载:直接从ninja的GitHub release页面下载,确保安全。
    • pip安装:使用pip包管理工具进行安装,方便快捷。
    • conda安装:使用conda包管理工具进行安装,适用于特定环境。
  5. 构建配置文件

    • 文件名:ninja的构建配置文件一般叫做build.ninja。
    • 内容理解:虽然不直接编写build.ninja,但需要大致看懂它,以便调试或理解构建过程。
  6. 增量编译

    • depfile机制:通过编译器支持,将文件与头文件的依赖关系输出到depfile中,用于增量编译。
    • 检查修改:ninja会根据depfile的内容,检查相关文件的修改时间,以决定是否重新编译。
  7. phony规则

    • 定义:phony是ninja的一个内置规则,意思是“假冒的”,即一个不存在规则的规则。
    • 用途:phony规则不会执行任何操作,但会在输入和输出之间建立依赖关系。
  8. 构建目标

    • 默认目标:不带参数的ninja命令会构建文件里的default构建目标。
    • 手动构建:可以使用ninja [target]来手动构建某个特定的目标。
  9. 高级用法

    • 清理生成文件:ninja t clean可以清理全部生成文件。
    • 查看依赖图:ninja t browse可以打开一个网页浏览器查看文件之间的依赖图。
    • 导出依赖图:ninja t graph可以导出依赖图的dot graph文件。
    • 列出构建目标:ninja t targets all可以列出全部的构建目标。
    • 切换目录和文件:ninja C /path/to/dir f /path/to/file可以让ninja切换到指定目录去执行命令,并读取指定配置文件。

通过以上内容,可以对ninja构建系统有一个初步的认识。ninja以其高效、简洁的设计哲学,成为大型项目构建的重要工具。

㈣ 软件开发需要掌握哪些知识

成为一名好的程序员,不是简单地通过学几门课程就能做到的。我个人认为成为一名好的程序员的要素有:

1。扎实的基础知识;

2。很强的解决问题的能力;

3。熟练的编程调试能力;

4。创新能力;

5。团队合作能力;

6。持续的自学能力;

7。好奇心

这些能力和品质(甚至可以说是习惯)都应该从大学阶段就着手培养,并且从身边的小事开始培养。比如,很多中国的大学毕业生都缺乏编程和调试经验。学习C语言,考试过关就算学会了。课题项目中,只要程序能够编译,运行,并且输入输出满足要求就了事了。但是,写程序的时候是否想过如何把程序写得更加精炼,高效,高质量?对程序调试中出现的问题是否刨根问底知道原因,还是不求甚解搪塞过去算数?还有,很多中国的大学毕业生对于知识的掌握肤浅,机械,没有好奇心,不会刨根问底。比如,学会了C,有没有看过一个object在编译后,在汇编代码中是如何被初始化的?这个object的各个成员在内存中是如何放的?在一个成员函数被调用的时候编译器在汇编代码中加入了哪些额外的动作?虚函数的调用是如何实现的?这些东西恐怕在编程语言或编译原理中都没有详细提到。但是,你是否有过好奇心去知道?最后,一些中国学生的大问题就是死记硬背,没有学到某种算法技术的根本原理,没有应变和创新的能力。比如,有个问题是如何在不用额外内存的情况下把一棵树的同一层节点都连起来。很多学生都能够回答这是一个广度遍历的问题。但是,课本上说了广度遍历是一定要有额外数据结构辅助的(队列)。所以,不给额外内存怎么行?请看,课本上说的用队列的方法记住了,但是就是不知道为什么要用队列。如果深刻掌握了这个队列的作用,那么这个问题是很容易的。

举了这么多例子,我想说明的事,想成为一位好程序员(其实从事任何一个行业都是如此),重要的是要养成一个钻研,好奇,创新,动手,合作,不满足于填鸭,不满足于考试交差,不满足于表象的一种优秀的习惯。这不是学几门课能够一蹴而就的。当然,如果你的在校课程不能使你满足,我以及论坛上的朋友可能能够给你推荐一些书或科目。

我觉得要提高编程的能力,有一位良师很重要。这位良师可以是在编程方面比你走在前面的同学,也可以是学校里你帮他做项目的老师,也可以是校外公司里的老师或老板。很多东西在实际的项目中,有一位良师察看你的程序,帮你指出不足,手把手地指导你调试,会对你很有帮助。所以,当学会了书本上的基本知识以后,可以努力寻找一些有实用性的项目,借机在项目中找到高手指导。这个项目可以在学校找,也可以到校外找。一开始不要计较报酬,甚至如果能够寻到高手指点,白干也行。

其次是读好的源代码。多读好的源代码就象多读好的文章,会有利于自己写作。能够读懂别人的代码也是一门硬功夫。将来很多项目中你不会重头做,而是在半途加入(一般文档又不很齐全),因此需要能够很快读懂别人代码和想法的能力。

再次是看一些编程方面的好书。WritingSolidCode是一本很经典的书。最近出的WritingSecureCode也不错。在你熟练掌握C以后,可以学一下C并熟悉面向对象的程序设计思路。在掌握C的基础上可以看一下DesignPatterns。

看你要把编程学到多么专业。到一定程度,你会发现如果没有学过数据结构,算法原理,编译原理和操作系统,可能在某些方面会遇到一些障碍。所以,如果有精力和条件的话,可以同时了解这些方面的知识。

最后,我要提醒你不要因为编程这一业余爱好而影响了你本专业的课程,除非你决定转行。对很多在校学生来说,本专业的成绩很重要,因为这个成绩可能会影响到将来找工作,申请研究生院等等。英语也很重要。我读翻译的计算机书总觉得隔了一层,翻得不贴切。能够直接阅读英文资料更好。

㈤ 想学计算机编程但是不知道学什么

1.首先刚入门的话,你要先明确目标选择一门编程语言入门。个人建议选择java或者C。在学习编程语言的时候,计算机有关的知识你也是需要涉及的,也要多多去了解一下,看一些书籍,在网上下载视频边看边学效果会好一些。在你理论知识的基础上学习起来会相对容易一些。当你熟悉掌握一门语言后,这个时候就可以有学习的目标了。自己对哪方面感兴趣喜欢哪种语言就学哪门。

2.我这边来简单介绍一下java的学习内容吧。

①JAVA编程基础(基础语法、面向对象、和谐特性等)

②WEB应用开发(静态网页制作、Oracle数据库、Java Web开发技术、Linux技术、网站性能与安全、软件工程开发流程、Java Web和谐等)

③企业级框架开发(数据结构与算法、SSH框架、JavaEE和谐等)

④项目实训

3.如果你真的想学好编程语言,C语言也是蛮重要的。但是新手学C语言通常会出现一个问题,就是除了写个排序算法,似乎根本想不出来C语言有什么用。这是因为我们的教科书讲C语言的时候,只讲这些基本算法,甚至连读写文件都不去讲,更不用说图形界面处理了和网络操作了,没有这些知识,想写一个真正的应用那是不可能的。不过,书上没有不等于学不了,文件操作和网络操作的讲解网络上有着大把的讲解,只要你找几篇文章看看,具备了这些基础知识,写一个自己的WEB服务器并不难。在逐步增加功能完善功能的同时,你的C语言基本上就可以达到相当牛人的水平了。

4.互联网行业目前还是最热门的行业之一,学习IT技能之后足够优秀是有机会进入腾讯、阿里、网易等互联网大厂高薪就业的,发展前景非常好,普通人也可以学习。

想要系统学习,你可以考察对比一下开设有相关专业的热门学校,好的学校拥有根据当下企业需求自主研发课程的能力,建议实地考察对比一下。

祝你学有所成,望采纳。

热点内容
正态分布随机数C语言 发布:2025-04-28 16:07:11 浏览:885
安卓没有原生设置怎么安装 发布:2025-04-28 16:00:31 浏览:667
青岛少儿编程哪家好 发布:2025-04-28 15:49:53 浏览:847
密码箱密码正确打不开怎么办 发布:2025-04-28 15:49:00 浏览:19
幼儿编程坑 发布:2025-04-28 15:48:56 浏览:552
php异步同步 发布:2025-04-28 15:41:58 浏览:738
梦幻西游脚本吧 发布:2025-04-28 15:38:29 浏览:590
爱奇艺怎么缓存高清视频 发布:2025-04-28 15:37:33 浏览:231
安卓手机一个圆点怎么打 发布:2025-04-28 15:36:46 浏览:222
查找字符串linux 发布:2025-04-28 15:35:24 浏览:489