“嘿,帅哥,帮我编个最新的包呗,我想体验一下”,“好,我更新下代码”(一分钟过去了)。“靠,又编不过了,不好意思,编不了包了,要不你再等等呗”,作为产品经理的你只好悻悻的走开了,但你心里也许会各种嘀咕,“编不过”,什么“编”,“编”什么,为啥“不过”,为啥经常一更新就“编不过”。你可能也经常把“编包”放在嘴边,可这到底在说啥玩意儿啊?今天我们就来一探究竟。
如果你英语不太差,有意无意瞟到程序员屏幕上的那些代码,其实也能看点门道出来。这个即使是不懂编程的外行也能稍微看懂一二的编程语言就是高级语言。
高级语言跟人类语言(一般是英语)比较接近,它的出现大大降低了当一个程序员的门槛,目前各种类型的程序员,什么Android的,IOS的,前端的,后台的用的编程语言虽然不同,但都是高级语言,让他们互相看看彼此的代码,虽然不是那么熟悉,其实也都能看懂个七七八八。
这就跟中国人,日本人,泰国人在一起用英语交流差不过,虽然彼此都感觉有点别扭,但是也还能懂。但是计算机是机器不是人,计算机的世界只有0和1,它懂得语言是这样的“010000100111101001...”,它懂得语言我们称为机器语言,不过早期的程序员就在跟这种东西打交道。(所以上古时期的程序员是“神”,现在的程序员是“农”,高级语言就是让程序员走下神坛的“架”)
那么问题来了,一个来自火星,一个来自金星,二者语言差异这么大,怎么沟通的呢?最容易想到的办法就是请个翻译。是的,程序员写的代码最终还是要被翻译成机器能懂的语言,最终才能够最终被机器执行。(来自金星的你或许在被来自金星的她甩过无数的耳光后,才能明白语言翻译的重要性)
计算机世界负责这种翻译的叫做编译器,它的任务就是把高级语言翻译成低级语言,这里要注意的是,低级语言不一定是机器语言哦,它可能还是在机器语言之上的中间语言,还需继续翻译。(PS:也有编译器把低级语言翻译成高级语言的,可以用来做反编译)。语言是由单词+语法组成的,编译器和翻译一样,会分析一种单词+语法组成的语言,然后变成另一种单词+语法组成的语言,如果原始的语言有单词或者语法的错误,编译器就会报错。
这里要提一下两个比较有代表性的语言,C和JAVA,显然,这 两种语言都是高级语言,但是在使用编译器的策略上,它们则是完全不同的。C语言通过编译器编译得到的目标语言是和硬件平台相关的,这就是说,在一个平台上编出来的程序需要在另个平台上重新编译才能在对应的平台的上运行,而JAVA的编译器统一输出为JVM(JAVA虚拟机)能懂得中间语言(字节码),只要对应的平台上安装了JVM,就能直接执行JAVA程序了。
上面没听懂没关系,我们可以这样来理解,现在有A,B,C,D四个不同语言的国家,每个翻译最多学一门外语,这四个国家要全部都能互相交流,按照C语言的策略需要六个翻译(怎么算的?画四个点,把他们全都互相连起来,看看有几条线呗)。而JAVA则把这个问题变成了一个脑筋急转弯——能不能用更少的翻译呢?于是JAVA说A,B,C,D四个国家不需要直接沟通,每个翻译只需要懂自己国家的语言和英语(字节码)就可以了,翻译之间互相通过英语沟通,对应国家的翻译只需要将英语解释成对应国家的语言就可以了,按照这样的策略就只需要四个翻译了(怎么算的?随便点一个English的点,然后向四个国家的点画四条线呗)。
当然,事情都是有两面性的,毕竟通过一门中间语言来间接沟通,从效率上讲都比直接翻译要慢一些。所以JAVA在这一块也做了改进,将一些经常执行的代码翻译后的机器码保存起来,下次直接用,这样就不用每次都把“欧巴”先翻译成“Brother”了,“欧巴,撒浪嘿呦”这种是可以秒懂的。
最后,再来回答下开头提出的问题。程序员说的“编”就是编译器在进行翻译,“编不过”呢,就是编译器在翻译的过程中发现有单词和语法不符合规范,向程序员提出警告——必须按照规范来,否则不予通过。这个和bug还不一样,bug是编包成功后,在使用的时候才出现的,但是这种编译阶段出现了错误,必须解决了才能继续。那么为啥经常一更新就编不过了呢?自然是哪个二货没检查就提代码 了呗。
登录 | 立即注册