python怎么被发明的英文_一门编程语言是如何被创造出来的?

一种语言的语法和语义设计与其具体实现(编译器、解释器和运行时)不是一回事,这里假设我们只是想设计语言而不一定去做实现。不过作为背景,一般我们先要先掌握一点编程基础,学习一些程序语言理论和编译原理。这里假设题主有一定编程基础,然后出于实用或者学习的目的想设计一种简单的语言。首先要思考以下问题:语言的用途或者使用场景是什么?设计一门语言并不十分困难,但是想在给定场景下发挥足够强大的功能则需要精巧的设计。可以预先思考或者调查对应场景下的使用习惯和惯用表达;

语言的形式是什么样子的?或者说,什么样的形式是符合语法的?可以先确定一个粗略的模型和核心的特点,然后再细化,用产生式把语法形式化出来,具体如何形式化可以学习一下形式语言的相关知识;

一段程序的行为(或者含义)应该是什么?我们通常把它称为程序的语义。

比如我们的需求就是要方便计算,设计一个命令式的计算器。那么我们可以把语法描述如下:

S -> E '\n' S | E '\n'

E -> E '+' E | E '-' E | E '*' E | E '/' E | '+' E | '-' E | '(' E ')' | N

N -> [0-9]+

这里S表示整个程序,E表示一个表达式,'\n'表示换行符,[0-9]+表示1个及以上数字组成的串。这样上面的语法就可以表达一些简单的算式。当然,上面的表达是有歧义的,例如

1+2*3

可以被划分为"1" "+" "2*3",也可以被划分为"1+2" "*" "3",这会对它的具体含义产生影响。可以通过改写产生式来消除歧义,这样的细节问题可以随便找一本形式语言或者编译的书看一下。之后确定每个产生式的含义,比如E '+' E表示两个表达式相加。这样我们计算器的语言就已见雏形了。

不过仅仅有这样纸面上的描述可能不是题主想要的(虽然我们可以说我们已经设计出来了一个语言)。通常语言设计出来之后(如果不是为了学术讨论)总要实现和应用的。这就要实现一个编译器或者解释器什么的。从0实现一个编译器的工程难度非常大,好在已经有很多现成的框架。比如可以用ANTLR来实现你的语法分析器,只要想我上面那样用符号描述一下语法,ANTLR会自己生成一个Parser。然后你可以遍历语法分析树(由解析出来的符号构成的树)然后去解释执行它。例如当你扫描到E '+' E这样的节点时,你先计算左右两端表达式的值(递归遍历就可以)然后把它们加起来就好了。这样我们实现了一个简单的计算器,不过对于更复杂的解释型语言都是类似的。

如果,比如说你想像C++一样让你的语言可以被编译成可执行文件,或者像Java一样编译成字节码,就有必要实现一个编译器,不过这远远超出设计一个语言的范畴了。一个比较快捷的方式是学习一下LLVM,然后去生成LLVM IR,之后的工作都交给LLVM就好了。这里有相关的教程,可以照着做一遍,然后你就成功开发了一个玩具语言。

最后,我觉得实际工作中的确有一些设计语言的需求,不过不是通用的语言,而是所谓的领域专用语言(DSL)。毕竟有很多特定的需求需要用精简的语言去描述,而通用语言引入太多不必要的性质和额外的麻烦。比如发明一套表示来描述特定的数据也可以算是相关的问题,有时候用json或者xml可能啰嗦而且不知所云,适时发明一个好的记号可能对实际工作效率有提高(前提是不把你的同事搞晕)。

由于答主相关知识也很有限,所答如有错误敬请指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值