浅谈程序语言设计

从本质出发

Posted by steve02081504 on January 29, 2019

前言

这是我第一次写blog,想来想去没什么好写的,不如说说程序语言设计吧
首先,这里说的程序语言只是指可运行语言
其次,这些大部分是我的主观看法,如果与你的看法不一致,勿喷,请一笑置之
最后,如果我有什么地方说的不对,请通过about页面内的联系方式告知我,或者在页面最下方评论

反正我也大概不会改,别把你憋坏了


正文

编程语言的设计是很容易的,定义文法,定义执行方式,完成
但如何设计出易懂如bf、快速如small talk、简洁如asm、安全如c、自由如java、好看如perl、易学如mma、最好再和scala一样引发血案造就传奇的语言呢?
ELC
首先,我们应当搞清楚为什么会存在编程语言这种东西
伟大的思想家鲁迅曾经说过:

“任何事物都有其存在的原因,隔壁翠花也是如此

为什么现在很少有人用机器语言写程序呢?
编程语言的意义,或说,其价值,在于以下几点:

细节隐藏

计算机史上最有历史意义的事情莫过于a=a+1的出现替代了三条asm
细节隐藏代表着你不用将脑细胞花费在问题的细节上,你大可以关注问题的解决方法,而不是如何分配内存、何时调用fclose:这些计算机早已自动帮我们完成了
试想一下,如果

1
2
3
4
5
6
7
8
int a;
{
	//...
	unique_ptr<rand_t> b=new rand_t;
	//...
	b->get_rand(a);
	//...
}

需要写成

1
2
3
4
5
6
7
8
9
10
int a;
{
	//...
	struct rand_t*b=malloc(sizeof(struct rand_t));
	build_rand_t(b);
	//...
	get_rand_from_rand_t(b,&a);
	//...
	destruct_rand_t(b);
}

且不说c版本的代码有忘了free memory之嫌,更不说如果c版本在第二个省略号中直接返回会如何:
很明显的,在这种情况中,c版本有行数多、要考虑的东西多、出错难找等弊端,而这正是通过细节隐藏能够避免的

抽象

在我看来,抽象是一种变相的细节隐藏,以至于两者往往难以分清
从algol68中允许自定义类型,到《lambda之究极厕所清洁剂》提及的scheme中的λ, 实际上,抽象所带来的无非是单个步骤替代多个步骤、考虑范围缩小等,这与细节隐藏是相似的

减少字数

实际上抽象也好隐藏细节也罢,都有一个共同点:字数减少了
cobol的宏绝对是世界上最棒的发明,以至于下到c上到lisp统统效仿,而即便cpp创始人不情不愿,宏功能也仍然在cpp中占有一席之地
宏给使用者带来了什么? 为何众多程序员用宏上瘾?究竟是人性的扭曲还是道德的沦丧?欢迎收看今天的◆◆◆◆,让我们走进项目steve.h的作者,探究宏的秘

宏实际上只是批量的文本修改,但人类

“真是怠惰啊”


在不损伤可读性的情况下,字数这种东西能省就省
为什么呢?

  • 一般来说不损失可读性的代码缩减意味着进一步抽象,而这有利于人的理解
  • 某公司曾做过一个调查,结论是单个程序员单位时间所产出的代码行数固定
  • 此公司还做过一个研究,此研究表明随着代码规模的增长,bug数随之增加

当然,宏不是唯一节省字数的方法,很多语言有着其他的方法帮助你写出同样效果而字数更少的代码,常见的如includetemplate,以及code generation

给予使用者精神层面的痛苦

这点某知名语言jaba(防律师函,不是拼写错误)的作者做得很棒,本来打算就不班门弄斧了
但还是觉得要说几句
你看在这一点上很多语言虽然比不过jiva,但是也做得相当不错
比如说吧,

  • 用户定义的struct使用时必须加上struct关键字
  • 死不改写的语法规范
  • 反复修改的语法规范
  • 学语言前先熟悉键盘
  • ”本软件公司长期收购游标卡尺”
  • 听说你们◆◆◆◆◆又双叒叕更新了?
  • 面向括号编程
  • 你也用◆◆啊,2还是3?

总结一下: 一个好的语言应当具有强大的抽象能力、允许用户隐藏细节、写出来的代码字数少、让使用者放弃希望(?)等特点。
但这里有一些应当注意的点:

隐藏细节≠放弃细节掌控

抽象≠鬼画符

字数少≠天书

这些点本来还想细说一下,不过后来想想貌似没有必要


写在最后: 当你确定你的语言大体如何后,你就可以开始实现了
语法分析方面你可以用的工具有yaccflexcocojavaccgrammatica等一堆子
如果是编译型语言你还可以依赖于llvm等项目
如果是解释型语言就更为简单了
不过应当注意的是,尽管使用工具可以让你的语言很快成型,但也会使你错失很多学习的机会
凡事都有两面性,这是不可避免的
仅此


日后我大概会写另一篇关于语言实现的博文(咕咕咕)
仍然是瞎扯,仍然是不知所云
总之如果愿意关注我的bolg,请于github上watch此项目
就写到这里好了


人类在疯狂探索着这个世界,如同饿狼扑食一般.
知道所谓的”求知欲”实际上是什么吗?
说得那么好听,也只是在发现探索能够改善生活后,对自己贪得无厌欲望的美称罢了.
…..人类,一直如此,着.
之前是,现在是,今后,也会是.



知识共享许可协议
若无特殊声明,本作品网页、文字、程序部分与原本无许可部分采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,以外的部分遵循其原有许可协议。
若您于许可外使用本作品任一部分,其作者有权依法追究您一切民事与刑事责任。