如果你仅仅有一般程序设计的基础,直接要设计一门语言是有难度的。结合我个人的经验,以下路径应该比较适合语言初学者:你需要有基本的编译原理常识。构造基本的编译原理常识,一方面来自于你对已有语言的使用经验,了解基本术语。比如我用C,那么我起码知道语言要素包括宏、表达式、语句、语句块、函数、指针等;我还知道C语言有编译、链接和执行三个阶段。这些基本概念对你宏观掌握你的学习进程是很有必要的。另外一方面编译原理的常识,要来自图书。比如龙书、SICP。
在这一步,你得知道大部分语言的处理都要分为词法、语法、语义和代码生成四个阶段。每个阶段,分别是做什么的。了解具体的编译算法。了解到什么程度,取决于你使用第三方工具,还是需要自己从字符开始处理。个人建议,乔姆斯基文法体系、(扩展)巴克斯范式(EBNF),正则表达式,和LL(1)的递归下降分析法是必须要掌握的。对LL(k),LR(k)要有概念。其中,四则运算表达式的分析是很好的练习。对语法的感觉。
初学者设计语言的难度有两点。第一,不知道什么样的语法/语义是你需要的;第二,不知道你设计的文法能否实现。你是需要一个类似于自然语言的脚本,还是只是一个表达式。经过3阶段的训练我认为你已经有了独立撰写语法的能力。可以写一个基础版本的出来。实现你的语言,特别是词法和语法部分。这一步最好能Log出尽可能多的信息,例如词列表并打印出分析树。
一门语言在程序语言的角度上是不是好,跟他的library毫无关系,跟他能够写出怎样的library才有关系。一个library还不存在,有可能代表他写不出来,也有可能代表只是没人去写。当你试图创造一门语言的时候,你就不能以大众的标准来衡量他。
其实哪个语言不能有numpy?只是没做罢了。所以在numpy这一点上,大部分语言都是一样——能做。你关心的就是这些,能,还是不能。而不是有,还是没有。这是微软很多年前的后来改名叫midori的C#操作系统项目早就给C#实验性添加的东西就不说了,F#的computation expression也好,erlang的actor也好,哪个不比go的channel强?再说了,Java的库为什么用起来就是不如C#的舒服,这完全是因为Java的语法导致的,而不是人类的想象力导致的。