小言_互联网的博客

再谈编程语言设计和实现

303人阅读  评论(0)

   \;
   \;
   \;

之前工作的总结

现在在做的zhangqi-lang和之前的suatin-lang有很大不同,主要是构造AST的方法,

一,suatin-lang构造AST的方法是,一开始遇到了字符放在根节点,后面来的

字符,判断其类型,再判断根节点类型,然后更改已有的AST,把

新的节点加入——

这种方法让我写了两三千行!!!

二,zhangqi-lang构造AST的方法是使用编译原理的知识,通过简易的文法,

消除左递归,

自顶向下——这种方法只写了四百行就解决了!!!

但是,suatin-lang是运行在AST上的,通过每个节点的三个解释接口调用,

		virtual double interpret();					 //五则运算
		virtual std::string interpret_str();		 //字符串拼接
		virtual bool interpret_bool();               //布尔运算

按照DLR的方法运行,所以做的工作比zhangqi-lang多多了,再者,一开始没有经验

很多需要总结成小函数的块都留到最后,但是我并没有做到最后……

suatin-lang的数据类型只有double,bool,string三种,对应三个解释接口,

release编译后 的速度是100万的数的空for循环运行一秒。

zhangqi-lang的基本数据类型有int,float,double,bool,string,complex等,之后还要加几个,

复杂数据类型有范围,数组,字典,函数,枚举,类,线程等,这些都很有挑战性。

因为暂时事情太多太复杂,没办法考虑运行,所以除了构造AST,

其他的工作暂时都不做了。
   \;

累了

现在还在制作AST,我已经不想做下去了,还是没有成就感,悻悻苦苦做的AST也没太大作用,

因为我累了,关于变量池、局部变量、作用域、模块、线程、类、

零成本对象(没用到的代码绝对不付出任何代价)、

虚拟机(这才是大BOSS)、

字节码(现在还看不懂,该如何设计自己的字节码)、x86、jit、

LLVM(LLVM IR好复杂)、两语言问题、

不提供捕获异常(所有错误都能找到源头或者打印到日志)、

多种字符串问题、中文、Unicode、像Gua语言一样开辅导班?、

大数运算问题、复数、矩阵、协程、标准库、

支持嵌入式、支持GUI、支持跨语言调用、

支持元编程(代码更改代码,不知道什么意思)、

支持web?(开什么玩笑,web我什么工程都没做过好吗,就学了点

jsp和javascript)

   \;

文法的作用?

【zhangqi-lang】【9】文法设计

statement          :=   ( vardef_stat | assign_expr | 
                          expression | funccall | return_stat | del_stat
                        )   
	                    endstat |
	                    'break'|'exit'|'next'|'redo'|'reloop'|'reboot'

在制作AST的过程中,我发现我写的函数,和其中运行的逻辑顺序,和文法的一些

产生式很像。我并不是对应着文法写的,但是写着写着就让我感觉能不能直接

在设计的时候就把文法中的符号写成Parser中的小函数呢,按照文法的逻辑相互调用,

然后再填入处理代码——

很可惜,这种想法有点问题,的确Parser和文法相似,但是不一样,不能直接写成文法的逻辑。

一些产生式在从左往右推导的时候,一开始遇到的符号不是唯一的,没办法确定候选式,

所以,写下的文法,需要被修改,按照什么LL(1),即最多peak一个符号就

能确定候选式——zhangqi-lang现在的项目,在词法分析阶段就要向后

peak两个char,AST时,还需要向前peak一个token

但是,这么多产生式,想消除左递归真的很难,有间接左递归可能消不掉。
   \;

计划

我不想开源了,没用!大家都只是来找找自己需要的,没人关心这个语言是否

能推广,这可不行,我需要制作一个能推广出去的语言。它需要很方便使用,

很方便用来替代如matlab、ruby、lua等语言做事。

意思是一能包含别人的优点,二是自己使用特别方便——

比如放入U盘,插入电脑

后对文件进行一些操作——这种基本需求当然需要满足,做做小病毒这种。

如果能替代c语言做嵌入式就好了,编译成.hex文件——说到这,我想到了一种

编译技术,即对象这种功能不应该是一个运行累赘,无论有没有使用对象,

运行效率一样,即使用了对象也会过程变成一样快!!!

再比如替代scratch,我真想偷它一点用户,如果能用我的语言替代scratch的话,

那么,就可以出现这种情况:

一些人使用简单的mylang写的代码,就实现了scratch代码复杂的操作,在小孩子面前炫耀一番。

  • 可能有人觉得这些用途不算事,但是为了推广,我不管三七二十一了。一条路走到黑,什么偏僻的要求都需要实现!!!(有点夸张)

替代ruby的元编程功能,即代码很容易对代码进行更改

替代javascipt的DOM功能,即对HTML的AST树结点进行处理

替代python的文件处理,还开什么培训班,语言层面直接给你把问题都封装

好了,对于使用者而已,提供一个客户端软件。。。等等,那跟语言有什么关系,

他们为什么不去下载文件批量处理的软件,而是要去学python???

不管了
   \;

事实

过一段时间,我就鼓励自己一下,做一会儿梦,虽然我真的希望推广自己的

语言,但是最重要是为了鼓励自己继续——

群里实现了编程语言的人很多,大家都学会了,但是为什么大家都没有推广

自己的语言。编译原理的知识,不用的话很快就忘了,学了这些,我真希望

自己能做点什么。不是简简单单做个字符串处理器、计算器,我希望改变一些

东西,希望这个世界因为我而改变一点点。

你也许做了一个编译器,写了篇文章吹嘘了一下,或者写了一本没用的书,

把代码腾上去,但是不觉得有点问题吗?和以前的BASIC编译器相比,

自己明明也做了这么多努力,但是,一切并没有改变,就像徒劳一样。

我也买过6本的编译器的书籍,最讨厌的书就是日本人写的,什么

《两周做一个脚本语言》——其实第三天就开始使用一个不知道哪里来

的Parser库。代码部分没有注释,非代码部分全是各种聊天,比如

作者:两个月写完一本书怎么可能呢?
前辈:我的书写了两个月才写完真是不好意思。
作者:原来真的有人两个月内能写完啊!

《松本行弘:编程语言的设计与实现》——使用了yacc和lex之类的工具,文章

内容就是如何使用工具

明白我想说什么吗?

不明白吧!

我不想骂这些人,看不懂应该是我自己的问题,我只是说,你也可以把自己的

代码腾上去,编纂成书,也许能提高知名度呢?

为什么?

因为比起你自己做了一个语言,还是牛人又做了一个语言的知名度广对吧!

比如各种古怪的编程语言介绍,远远比你写一篇介绍自己做了一个语言火。

更有甚者,实现了某个语言的人,实现了另一个古怪的语言,那么人的知名度

高了,世界的钥匙开始掌握在手中了!!!

   \;

做一个古怪的编程语言

大家都会有的一个想法就是符号替换,把已有的语言替换一下变成另一个,

一眼看不出来。比如替换成表情包、替换成wWoO奇怪的字符等,但这太low了

就不说了。

第二种,就是使用简单的符号,设计特殊的规则。很多都是这种,基本只有一个

打印字符串的功能。

20 种最奇怪的编程语言

第三种,跨越维度。有一种Piet语言,不是编译文本,而是编译图片,通过更改

一张图片的各个位置的像素来编程,其实也只能打印字符串。

另外一种Befunge

语言,也是编译文本,但是顺序不一定是从左往右,而是根据 <> v ^ 四种

符号,来更改指令指针的运行方向,比如打印hello,world

>              v
v  ,,,,,"Hello"<
>48*,          v
v,,,,,,"World!"<
>25*,@

在目前,这是我觉得最酷的语言——但是

我并不急于也去做一个这样的,多多思考,应该有更酷的!!!

先做个这样的语言,打响知名度。


转载:https://blog.csdn.net/weixin_41374099/article/details/113800931
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场