百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

编程语言是怎么被实现出来的?_编程语言是怎么创造出来的

yund56 2025-03-01 13:28 9 浏览

你知道经常使用的编程语言是怎么被实现出来的吗?


今天就聊聊这个问题。


聪明的人类发现把简单的开关组合起来可以表达复杂的bool逻辑,在此基础之上构建了 CPU ,因此 CPU 只能简单的理解开关,用数字表达就是0和1。


创世纪:聪明的笨蛋


CPU 相当原始,就像单细胞生物一样,只能把数据从一个地方搬到另一个地方、简单的加一下,没有任何高难度动作,这些操作虽然看上去很简单很笨,但 CPU 有一个无与伦比的优势,那就是一个字:快,这是人类比不了了的,CPU 出现后人类开始拥有第二个大脑


就是这样原始的一个物种开始支配起(划掉)另一个叫做程序员的物种。


一般来说两个不同的物种要想交流,比如人和鸟,就会有两种方式:要不就是鸟说人话,让人听懂;要不就是人说鸟语,让鸟听懂;就看谁厉害了。


最开始 CPU 胜出,程序员开始说鸟语并认真感受 CPU 的支配地位,好让 CPU 可以工作,感受一下最开始的程序员是怎么说鸟语的:



程序员按照 CPU 的旨意直接用0和1编写指令,你没有看错,这就是代码了,就是这么原生态,然后放到打孔纸带上输入给CPU,CPU 开始工作,这时的程序可真的是看得见摸得着,就是有点浪费纸。


这时程序员必须站在 CPU 的角度来写代码,画风是这样的:

1101101010011010100100110010100111001000110111101011101101010010

乍一看你知道这是什么意思吗?你不知道,心想:“这是什么破玩意”。但 CPU 知道,心想“这就简直就是世界上最美的语言”。


终于有一天程序员受够了说鸟语,好歹也是灵长类,叽叽喳喳说鸟语太没面子,你被委以重任:让程序员说人话。


你没有苦其心志劳其筋骨,而是仔细研究了一下 CPU,发现 CPU 执行的指令集来来回回就那么几个指令,比如加法指令、跳转指令等等,因此你把机器指令和对应的具体操作做了一个简单的映射,把机器指令映射到人类能看懂的单词,这样上面的01串就变成了:

sub?$8,?%rspmov?$.LC0,?%edicall?putsmov?$0,?%eax

这样,程序员不必生硬的记住1011.....,而是记住人类可以认识的ADD SUB MUL DIV等这样的单词即可。


汇编语言就这样诞生了,编程语言中首次出现了人类可以认识的东西


这时程序员终于不用再“叽叽喳喳”,而是升级为“阿巴阿巴”,虽然人类认知“阿巴阿巴”这几个字,但这和人类的语言在形式上差别还是有点大。


尽管汇编语言已经有人类可以认识的单词,但汇编语言和机器语言一样都属于低级语言。


所谓低级语言是说你需要关心所有细节


关心什么细节呢?我们说过,CPU 是非常原始的东西,只知道把数据从一个地方搬到另一个地方,简单的操作一下再从一个地方搬到另一地方。


因此,如果你想用低级语言来编程的话,你需要使用多个“把数据从一个地方搬到另一个地方,简单的操作一下再从一个地方搬到另一地方”这样的简单指令来实现诸如排序这样复杂的问题


有的同学可能对此感触不深,这就好比,本来你想表达“去给我端杯水过来”:



如果你用汇编这种低级语言就得这样实现:



我想你已经 Get 到了。


CPU 实在太简单了,简单到不能了理解任何稍微抽象一点诸如“给我端杯水”这样的东西,但人类天生习惯抽象化的表达,人类和机器的差距有办法来弥补吗?


换句话说就是有没有一种办法可以自动把人类抽象的表达转为 CPU 可以理解的具体实现,这显然可以极大增强程序员的生产力,现在,这个问题需要你来解决。



思来想去你都不知道该怎么把人类的抽象自动转为 CPU 能理解的具体实现,就在要放弃的时候你又看了一眼 CPU 可以理解的一堆细节:



电光火石之间灵光乍现,你发现了满满的套路,或者说模式


大部分情况下 CPU 执行的指令平铺直叙的,就像这样:



这些都是告诉 CPU 完成某个特定动作,你给这些平铺直叙的指令起了个名字,姑且就叫陈述句吧,statement。


除此之外,你还发现了这样的套路,那就是需要根据某种特定状态决定走哪段指令,这个套路在人看来就是“如果...就...否则...就...”:

if?***??blablablaelse?***??blablabla

在某些情况下还需要不断重复一些指令,这个套路看起来就是原地打转:

while?***??blablabla

最后就是这里有很多看起来差不多的指令,就像这里:



这些指令是重复的,只是个别细节有所差异,把这些差异提取出来,剩下的指令打包到一起,用一个代号来指定这些指令就好了,这要有个名字,就叫函数吧:

func?abc:??blablabla

现在你发现了所有套路:

//?条件转移if?***??blablablaelse?***??blablabla//?循环while?***blablabla//?函数func?abc:??blablabla

这些相比汇编语言已经有了质的飞跃,因为这已经和人类的语言非常接近了


接下来你发现自己面临两个问题:

  1. 这里的blablabla该是什么呢?

  2. 该怎样把上面的人类可以认识的字符串转换为 CPU 可以认识的

    机器指令?


你想起来了,上文说过大部分代码都是平铺直叙的陈述句,statement,这里的blablabla 仅仅就是一堆陈述句吗?


显然不是,blablabla 可以是陈述句,当然也可以是条件转移if else,也可以是循环while,也可以是调用函数,这样才合理。


虽然这样合理,很快你就发现了另一个严重的问题:


blabalbla中可以包含 if else 等语句,而if else等语句中又可以包含blablabla,blablabla中反过来又双可能会包含if else等语句,if else等语句又双叒有可能会包含blablabla,blablabla又双叒叕可能会包含if else等语句...



就像盗梦空间一样,一层梦中还有一层梦,梦中之梦,梦中之梦中之梦...一层嵌套一层,子子孙孙无穷匮也...



此时你已经明显感觉脑细胞不够用了,这也太复杂了吧,绝望开始吞噬你,上帝以及老天爷啊,谁来救救我!


此时你的高中老师过来拍了拍你的肩膀,递给了你一本高中数学课本,你恼羞成怒,心想我现在想的问题这么高深,岂是一本破高中数学能解决的了的,抓过来一把扔在了地上。


此时一阵妖风吹过,教材停留在了这样一页,上面有这样一个数列表达:

f(x)?=?f(x-1)?+?f(x-2)

这个递归公式在表达什么呢?f(x)的值依赖f(x-1),f(x-1)的值又依赖f(x-2),f(x-2)的值又依赖...



一层嵌套一层,梦中之梦,if中嵌套 statement,statement 又可以嵌套if...


等一下,这不就是递归嘛,上面看似无穷无尽的嵌套也可以用递归表达啊


你的数学老师仰天大笑,too young too simple,留下羞愧的你佛手而去,看似高科技的东西竟然用高中数学就解决了,一时震惊的目瞪狗带不知所措无地自容。


有了递归这个概念加持,聪明的智商又开始占领高地了。

不就是嵌套嘛,一层套一层嘛,递归天生就是来表达这东西的 (提示:这里的表达并不完备,真实的编程语言不会这么简单):

if?:?if?bool?statement?else?statementfor:?while?bool?statementstatement:?if?|?for?|?statement

上面一层嵌套一层的盗梦空间原来可以这么简洁的几句表达出来啊,你给这几句表达起了高端的名字,语法


数学,就是可以让一切都变得这么优雅


世界上所有的代码,不管有多么复杂最终都可以归结到语法上,原因也很简单,所有的代码都是按照语法的形式写出来的嘛。


至此,你发明了真正的人类可以认识的编程语言。


之前提到的第一个问题解决了,但仅仅有语言还是不够的。

现在还差一个问题,怎样才能把这语言最终转化为 CPU 可以认识的机器指令呢?


人类可以按照语法写出代码,这些代码其实就是一串字符,怎么让计算机也能认识用递归语法表达的一串字符呢?


这是一项事关人类命运的事情,你不禁感到责任重大,但这最后一步又看似困难重重,你不禁仰天长叹,计算机可太难了。


此时你的初中老师过来拍了拍你的肩膀,递给了你一本初中植物学课本,你恼羞成怒,心想我现在想的问题这么高深,岂是一本破初中教科书能解决的了的,抓过来一把扔在了地上。


此时又一阵妖风挂过,书被翻到了介绍树的一章,你望着这一页不禁发起呆来:



树干下面是树枝,树枝下是树叶,树枝下也可以是树枝,树枝下还可以是树枝、吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮,哎?这句不对,回到上面这句,树干生树枝,树枝还可以生树枝,一层套一层、梦中之梦、子子孙孙无穷匮、高中数学老师,等一下,这也是递归啊!!!我们可以把根据递归语法写出来的的代码用树来表示啊



你的初中老师仰天大笑,图样图森破,看似高科技的东西竟然靠初中知识就解决了。


计算机处理编程语言时可以按照递归定义把代码用树的形式组织起来,由于这棵树是按照语法生成的,姑且就叫语法树吧。


现在代码被表示成了树的形式,你仔细观察后发现,其实叶子节点的表达是非常简单的,可以很简单的翻译成对应的机器指令,只要叶子节点翻译成了机器指令,你就可以把此结果应用到叶子节点的父节点,父节点又可以把翻译结果引用到父节点的父节点,一层层向上传递,最终整颗树都可以翻译成具体的机器指令



完成这个工作的程序也要有个名字,根据“弄不懂原则”,你给这个类似翻译的程序起了个不怎么响亮的名字,编译器,compiler。


现在你还觉得二叉树之类的数据结构没啥用吗


至此,你完成了一项了不起的发明创造,程序员可以用人类认识的东西来写代码,你编写的一个叫做编译器的程序负责将其翻译成 CPU 可以认识的机器指令。


后人根据你的思想构建出了C/C++、以及后续的Java、Python,这些语言现在还有一帮人在用呢。


来源:码农的荒岛求生

编辑:virens

相关推荐

一对多查询,Vlookup公式组合Countifs,详细解读!

我们模拟工作中的使用场景,只保留了关键的两列数据需要根据部门条件,把所有的员工信息给匹配出来首先,当存在多个结果值时,我们去查找的时候,只会返回第一个出现的值:=VLOOKUP(D2,A:B,2,0)...

自动获取vlookup函数的第三参数,再也不用一列一列的数了

对于vlookup函数,很多人都有会这样的想法:vlookup函数的第三参数为什么就不能自动的获取到呢,还需要一个一个的数太烦人了。有没有什么方法能自动的获取vlookup函数的第三参数呢?当然有了,...

VLOOKUP函数比对一般用法

格式"=VLOOKUP(要查谁,在哪查,返还值为查询范围的第几列,精确还是近似)"。中间用逗号隔开。如:A列为全部人员姓名,B列为对应全部身份证号码,C列为部分人员姓名(有在A列里的,...

VLOOKUP的这些坑,你都知道吗?

VLOOKUP的这些坑,你都知道吗?VLOOKUP是大家常用的查找引用函数,很多人正式学习Excel都是从这个函数开始的,但有的时候VLOOKUP却不太听话,公式返回错误结果,让人苦不堪言。有时明明数...

重塑Excel体验:VLOOKUP与公式联动,轻松实现多列信息一键匹配!

真心羡慕啊!每次我都要慢悠悠地一个个用VLOOKUP去找数据,跟蜗牛爬似的慢,还容易出错,可你看看人家同事,手一挥,几十秒就搞定了,那叫一个利索!步骤一:输入VLOOKUP函数并设置查找值在需要输入公...

巧用Vlookup函数揪出“第三者”

在一张Excel表格的重复记录中,让你快速列出每种不同物品第2次或第n次出现的记录,你会怎么做?Vlookup函数就有这个本事。举例来说,产品或者物流表格中往往会记录有同一货物的多笔数据(如下图的今日...

一次匹配多个值,Vlookup、Xlookup、Filter公式,你用哪个

举个工作实例,左边是员工信息表数据需要根据编号,把后面所有的信息一次性的匹配出来工作中,经常遇到这种问题,有3个公式,可以快速的解决,分别是VLOOKUP公式,XLOOKUP公式,Filter公式1、...

Excel实例:VLOOKUP与XLOOKUP双条件精确查找、模糊查找

咱们今天通过实例聊聊VLOOKUP和XLOOKUP,看看它们在精确和模糊查找上有什么不同。我们假设有一个数据表,这个表里有地区、品类以及对应的金额。根据大区和品类这两个条件,来查找并匹配出相应的金额数...

带超链接的Vlookup公式查找匹配,你会么

举个例子,左边有源数据,现在我们需要根据部分员工数据,查找匹配工资,并且带一个超链接,当我们点击工资数据时,自动跳转到原数据位置1、查找结果正常我们想查找匹配出结果,用vlookup公式,或xlook...

Vlookup公式查找出错,原表明明有数据

Vlookup公式天天用,但是经常出错,还找不出原因,今天分享3步检查曲,举个工作中的例子:左边是工资表,需要查找匹配部分员工的工资数据1、公式引用出错我们使用VLOOKUP公式,查找匹配,输入的公式...

不用嵌套其它函数,VlOOKUP实现一对多查找

在处理日常工作时,我们常会遇到一份详细的花名册,其中记录了众多人员的多项信息。然而,当需要从这份名单中快速提取特定人员的相关资料时,一个常见的问题是:目标信息与花名册中的列顺序并不一致。如图所示:面对...

VLOOKUP函数开挂用法:多表多文件多区域查找大揭秘

在日常办公中,Excel堪称我们的得力助手,而VLOOKUP函数更是其中的明星,被大家广泛运用,堪称“数据查找神器”。说起VLOOKUP函数,相信大家都不陌生。最常见的用法,就是在一个表...

按需填充 根据指定数字填充重复数据

由于公司启用了新标签,现在需要根据盘点产品数重新打印指定数量的标签。比如冰箱4台,洗衣机2台,那么就要在D2:D5数据区域复制4个重复的冰箱品名、2个重复的洗衣机品名,以此类推(图1)。手动复制容易出...

那些可以替代VLOOKUP的函数们!

大家好,今天我们来讲讲那些和VLOOKUP功能一样的函数们,但是却没有VLOOKUP函数那么有名气,所有总是嫉妒VLOOKUP函数。VLOOKUP函数大家肯定都很熟悉了。VLOOKUP函数是一个查询类...

VLOOKUP跨表查找,你会吗?

VLOOKUP跨表查找,你会吗?VLOOKUP函数是大家最常用的查找引用函数,我们在工作中经常用它按照条件查找对应的数据,但是当数据源分散在多张工作表中时,你知道怎么跨表查找吗?今天我通过一个Exce...