什么是编译器?它的影响力到底有多大!

 什么是编译器?它的影响力到底有多大!_爱车智能_新能源  

 

 电脑不会说英语、普通话、德语、西班牙语或其他任何人类语言。尽管Siri和Alexa可能会出现,但是计算机和其他小工具都是他们自己的二进制语言(我们无法理解的语言)的母语。


这意味着,如果要编程计算机,则必须说计算机的语言,因为它不会说你的语言。而计算机的本机语言(也是唯一的语言)如下所示:


00110101101101011101010101010101110001010101011


等等而已。只是一个1和0。没有逗号,单词之间没有空格,没有彩色插图。只是一堆“位”,这个词以“二进制数字”的缩写开始。以不同的顺序排列这些位(这些1和0)将使计算机执行不同的操作。作为程序员,你要找出正确的顺序是你的工作。祝你好运。


当地球降温时,人们确实通过组织1和0对计算机进行编程。这太慢了,而且非常容易出错,因此我们想出了一些捷径来简化工作。我们称它们为编程语言,并且有很多。  Java,C ++,FORTRAN,Python,BASIC,Ada,Pascal,Rust,Swift 等数十种都是当今广泛使用的编程语言。  大多数程序员会“说”一种或两种编程语言,并且可能知道其他几种语言。像人类语言一样,人们倾向于拥有最喜欢的编程语言,并且也倾向于坚持早期学习的语言。


如果你使用C语言编写一个简短的程序,它可能看起来像这样:


什么是编译器?它的影响力到底有多大!_爱车智能_新能源


与0011010110的区别不是很大……它上面有实际的单词,即使它们是我们通常不认识的单词,例如“ printf”。它也有很多奇怪的标点符号散布在有趣的地方和花括号。当然不是英语,但是比起所有的零和零更容易阅读。绝对是一个进步。


再举一个例子,如果你使用FORTRAN语言而不是C编写相同的程序,则它看起来更像这样:


什么是编译器?它的影响力到底有多大!_爱车智能_新能源


没有太大的区别。像C程序一样,sorta看起来像是英语,但不是你三年级学习的任何英语。(是的,世界各地的所有程序员都使用相同的伪英语编程词,而不管其母语是什么。没有斯瓦希里语的C版本,也没有德语的FORTRAN。)


但是我们最初的问题呢?如果计算机只能理解1和0,那么C程序如何帮助我们?那就是编译器进来的地方。


 一个编译器是一个翻译。 它将上面我们看到的几乎英语的命令转换为计算机可以理解的“ 1”和“ 0”。这是单向翻译。它无法将一和零转换回C(或Python,Java,Rust等),因此编译器无法帮助你理解翻译后的程序。这一点在以后变得很重要。


 许多公司创建和出售编译器,此外还有免费的编译器。不同的编译器将以不同的方式翻译相同的程序,就像不同的词典可能以略有不同的方式定义相同的单词一样。 没关系,只要翻译后的程序产生相同的结果即可。当你向某人指示“转到停车标志,然后向左转”时,与“在停车标志处向左转”一样。即使方向不同,它们实际上是相同的。计算机程序也是如此。


 编写程序的方法不只一种正确的方法,而且有多种方法可以将其从编程语言转换为计算机的1和0。一些编译器努力产生尽可能最短,最紧凑的翻译(“先停然后停”。)。 其他目标则是为了提高性能(“尽可能快地驶向停车标志,在通过消火栓时猛拉驻车制动器,向油箱倾斜,向左摆动,夹住顶点,然后继续行驶!”)。你明白了。


 同一编译器甚至可以生成两种类型的翻译,以及两者之间的各种版本。你可以使用编译器开关(可选命令,告诉编译器是需要小型程序,快速程序还是介于两者之间的命令)来控制它们。


 你只需要使用一次编译器。程序翻译完成后,无需一遍又一遍地做。编译(翻译)总是像这样提前完成,而不是每次运行程序时都要完成。但是,如果更改程序,则需要再次编译。


如果编译器出错了怎么办?如果错误翻译了你的命令并生成了错误的程序该怎么办?可能发生这种情况,但这很少见。如今的编译器非常可靠,如果你的程序无法按预期方式工作,则问题通常出在其他地方。


 对于程序员来说,犯错的情况更为普遍。 幸运的是,编译器可以为你捕获很多错误,从简单的错字到更大的问题。例如,如果你遗漏了C程序中的第一个花括号(位于第二行的末尾),则编译器将捕获该错误并通知你。它不会为你修改程序;你仍然需要自己做。但是至少编译器发现了错误并停止尝试翻译没有意义的东西。


 编译器无法捕获的是更细微的错误。 它无法知道你想要程序执行的操作,只能知道你已告诉程序执行的操作。如果你不小心输入了“帮助我,世界!” 而不是“你好,世界!” 你的编译器无法解决该问题。它假设你是故意这样做的,也许你是这样做的。编译器只能修复很多东西。其余的取决于你。


 当你使用自己喜欢的编程语言编写程序时,称为源代码。编译器为你翻译完之后,所得的一和零称为目标代码。上面的C和FORTRAN程序都是源代码的示例,它们都做几乎相同的事情。


这就提出了一个有趣的问题。你可以使用所需的任何语言编写程序吗?是的,差不多。上面的两个程序可以用Java,Rust或任何其他语言编写,但它们仍将以相同的方式工作。你将使用其他编译器将Rust源代码转换为目标代码的一和零,但是计算机不会知道两者之间的区别。翻译了程序后,计算机将永远不会“看到”源代码,也不知道或不在乎你使用哪种语言编写程序。  编程语言完全是为了我们的方便,而不是机器的语言。


不同的计算机和不同的微处理器芯片会说不同的语言吗?不。嗯,是。有点。情况很复杂。没有计算机能够理解Java,C,Ada或其他任何一种编程语言。这就是为什么我们有编译器。使用什么编程语言都没有关系。源代码语言和硬件之间没有联系。并不是说Intel x86处理器仅运行Java程序,或者ARM处理器仅运行以Swift编写的程序。那样行不通。编程语言与处理器无关,反之亦然。任何处理器都支持任何语言,因为是由编译器将源代码转换为处理器可以理解的二进制目标代码。


话虽如此,不同的处理器芯片确实具有他们理解的不同二进制语言。这就是所谓的指令集架构或ISA。例如,所有基于ARM的芯片都使用相同的指令集。相同的1和0序列将在任何基于ARM的芯片上工作,但不适用于具有不同ISA的Intel或AMD x86芯片。该二进制目标代码也无法在Microchip PIC,MIPS处理器,RISC-V或任何其他ISA上运行。源代码与处理器无关。目标代码不是。


 因此,访问程序的源代码很重要。它允许你将一个程序转换为多个不同的处理器芯片,甚至是具有不同ISA的程序。 源代码是“ Rosetta Stone”,它可以进行无限的翻译,即使对于尚未发明的未来处理器也是如此。使用源代码和适当的编译器,你可以翻译任何程序以在任何芯片上运行。你还可以编辑,更改和更新程序,然后重新编译(重新翻译)它以生成新的目标代码。


这就是“开源”软件运动背后魅力的一部分。程序员可以自由共享其源代码,以便其他程序员可以查看其工作原理,查找原始程序员可能找不到的错误,以及在源代码中添加自己的增强功能,进行编译,并分发该程序的更新版本。所有这些都无需花费任何金钱。没有源代码,你将无法执行任何操作。


 对源代码的控制意味着商业控制。大多数公司都将其源代码保密,就像可口可乐保护其配方一样。他们,而且只有他们,才能将其程序从源代码编译为不同芯片所需的目标代码。 这使公司可以控制程序的运行位置和运行方式。Microsoft保留了Windows 10的源代码控制权,这意味着只有Microsoft可以决定可以运行Windows 10的芯片类型(哪种微处理器ISA)。Apple可以控制MacOS的源代码,依此类推。你和我不能只在我们想要的任何计算机上运行Windows或MacOS,因为我们无法对其进行编译。


相反,Linux的源代码是免费提供的。任何人都可以在任何计算机上编译它,这是其普及的原因之一。FreeRTOS,Apache,PHP和许多其他开源软件项目也是如此。开源软件不一定比商业软件更好或更差。他们只是关于分配,贡献和控制的不同哲学。


48
134
0
31

相关资讯

  1. 1、一周韩剧榜评:《绅士》结局挥发正能量2592
  2. 2、榜妹热线杨幂新电影、谭松韵杀青、郭麒麟资源、朱正廷行程、沈月资源_什么3556
  3. 3、内容热度破9000的《小舍得》,看看诞生了哪些弹幕热梗?217
  4. 4、良辰美景好时光讲的是什么故事徐璐林一新剧原著叫什么3534
  5. 5、她当众给韩星下跪颁奖,金马奖忽略巩俐引争议,网友直呼败光人品3716
  6. 6、她在TVB剧里演好人时常“黑化”,演坏人时却经常“洗白”!4217
  7. 7、她是初代黄蓉也是金马影后,两次婚姻均失败,如今女儿性向成迷3793
  8. 8、陈思诚被佟丽娅按倒《北爱》丝变“受虐狂”849
  9. 9、王丽坤最近太忙,不仅抓猪还要介绍对象398
  10. 10、《金蝉脱壳2》最强后盾特辑戴夫挺身相助越狱天团再添制胜砝码1216
全部评论(0)
我也有话说
0
收藏
点赞
顶部