「喵」语言:为猫咪设计的编程语言

创新工场 2021-09-15 18:25

我工作时,我们家猫咪最爱趴在电脑前,要么抢我的键盘当床垫,要么拿大部头的计算机教科书当靠枕,或者用爪子在我正在读的论文上挠挠划划。这猫看来是当程序员的料。



我就寻思,要是这猫想学编程序,该让他学什么语言呢?Python?JavaScript?Rust?


好像都不合适。


干脆,我给猫咪设计一种全新的编程语言吧。猫咪们只要对着计算机「喵」「喵」「喵」地叫个不停,就能输入指令并运行程序了。这语言必须做到:


  • 主要只使用「喵」这一个表意符号,否则我们家猫咪难以输入程序指令。
  • 指令不超过10条,否则我们家的学渣猫咪记不住。
  • 要能实现所有其他编程语言都能实现的基本功能,包括顺序、分支、循环等基本结构。或者,图灵完备?
  • 要让猫咪能在编程中学到基本的计算机原理和数据结构知识。

「喵」语言闪亮登场!

现在宣布,正式以开源方式发布猫咪专用的全新编程语言——「喵」语言(Meowlang)!

「喵」语言的发布位置在:

https://github.com/wixette/meowlang

「喵」语言好用吗?这要问问我们家猫咪啦!我们来看一个用「喵」语言写的入门程序:

喵;喵;喵;

什么什么?「喵」了三声?这段代码的作用是什么?

用「喵」语言运行这段代码的结果是:


哈哈,屏幕上输出了三只小猫咪!

三声「喵」就输出三只小猫咪?五声「喵」就输出五只?你这个「喵」语言是蒙事的吧?这是真正的编程语言吗?真正的编程语言,可是需要实现各种复杂算法的……

嗯,别着急,别着急。大家知道图灵完备吗?设计一种新的编程语言,当然要尽量追求图灵完备,要能实现其他编程语言或其他类型图灵机的主要功能。我设计的「喵」语言可不只是叫几声「喵」就输出几只猫咪那么简单的哦。

来看下我家猫咪用「喵」语言编程的基本功练习——运行下面的「喵」语言代码,屏幕上将输出一串斐波那契数列:

喵喵喵喵喵喵喵喵;喵喵喵喵;喵;喵;喵喵;喵喵喵喵喵喵喵喵喵喵;喵喵喵喵;喵喵;喵;;喵喵喵;喵喵喵喵;喵喵;喵喵喵喵;喵喵喵;喵喵喵喵喵喵;喵喵喵喵;喵喵喵;喵喵喵喵喵;喵喵;喵喵喵;喵喵喵喵喵;喵喵喵;喵喵喵;喵喵;喵;喵喵喵喵喵喵喵;喵喵喵喵喵喵喵喵喵;喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵;喵喵喵喵喵喵喵喵;喵喵喵喵喵喵;喵喵喵;喵喵喵喵喵喵喵喵喵喵;

哇,这么多「喵」!这么复杂!这真能输出斐波那契数列?那还能有假?只要我家猫咪对着计算机,按照上面代码里的节奏和次数,叫这么多声「喵」,计算机就会用小猫咪的图案输出斐波那契数列:


上图每一行猫咪的个数,1,1,2,3,5,8,13,21,34,55,不就是标准的斐波那契数列吗?

只要我们家猫咪愿意,且能够忍受用「喵」语言编程时的低效率,他用「喵」语言编出一个「喵」操作系统或「喵」深度学习框架,理论上也不是不可能。

而且,「喵」语言还特别贴心地支持不同口音的猫咪。中国猫咪可以用「喵」或拼音「miao」来记录代码,英美口音的猫咪可以用「Meow」来记录,而拉丁口音的猫咪可以用「Miaou」来记录。比较国际范儿的猫咪还可以混合这些所有不同口音的记录方式,比如下面的口音混杂代码是我们家猫咪在计算 5 + 3 等于几:

MeowMeow;Miaou Miaou Miaou Miaou Miaou;MeowMeow;miao miao miao;喵喵喵喵喵喵;喵;喵喵喵;

是不是特别贴心?

如何用「喵」语言编程

好,想学「喵」语言编程的猫咪和工程师朋友们注意了,以下是有关「喵」语言的全部中文技术内容。

如何运行「喵」语言程序?

直接访问「喵」语言解释器的在线页面。国内流量请访问:

https://pingpingze.com/meowlang/

国际流量请访问:

https://wixette.github.io/meowlang/

「喵」语言解释器左上的编辑框内可输入「喵」语言程序。点击「Run」按钮运行程序。右上浅黄色区域显示运行结果。下面的浅绿色区域显示错误提示。如果勾选了「Debug」调试信息选项,下面的浅绿色区域会显示程序运行时详细的代码和数据状态。


如何在本地调试运行?

「喵」语言是以Apache 2.0协议发布的开源软件。从以下地址下载所有源代码:

https://github.com/wixette/meowlang

本地系统需要安装 node.js 和 yarn 环境。用以下代码初始化:
yarn

可以在命令行用以下命令执行「喵」语言代码:
node . -i examples/fibonacci.meow

如果需要查看调试信息,可以增加调试选项:
node . -i examples/fibonacci.meow -d

「喵」语言程序的基本结构

「喵」语言最核心的设计思路:代码即数据,数据即代码。

一个「喵」语言程序,其实就是一个列表(list),这个列表被称为「喵」列表(Meow List)。

一个 Meow List 是由一组「喵」元素(Meow element) 组成的。

每个 Meow element 包含零个或多个 Meow token,并以分号 “;” 结尾。每个 Meow element 中包含的 Meow token 的个数(非负整数),也被称为该 Meow element 的值。

根据运行时的具体情况,一个 Meow element 可以被视作一个指令,也可以被视为一个操作数:

  • 当一个 Meow element 被视作一个指令时,该 Meow element 的值即为指令代码(opcode)。
  • 当一个 Meow element 被视作一个操作数时,该 Meow element 的值即为该操作数的值。

一个「喵」语言程序运行时,被解释器加载的程序本身,实际上是一个可读/可写的内存中列表(list)。从语义上说,该列表既是一串即将被解释器先后执行的指令序列,也同时是所有指令在执行时唯一能够访问(存取)的内存数据结构。

简言之:「喵」语言的指令集就是通过存取内存中的 Meow List 来完成计算功能的指令,这些指令的操作对象也是 Meow List 中的每个数值。

因为代码和数据本质上就是一个列表(list),如果需要,「喵」语言程序可以随时改变甚至重写自身的逻辑——这可是很多高级编程环境都不具备的特性哦。

每个 Meow token 就是一声猫叫,在代码中可用以下任何一种形式(不区分大小写)来表示:

  • 英语口音:Meow
  • 法语口音:Miaou
  • 中文口音:喵
  • 中文拼音:miao

例如,以下代码包含 5 个 Meow element,每个 Meow element 的值依次是 0,1,2,3,4:

;Meow;Meow Meow;Meow Meow Meow;Meow Meow Meow Meow;

代码中允许出现空格、制表符、换行符等空白字符。空白字符只用于格式化代码。解释器执行代码时会忽略所有空白字符。

代码中 Meow token 的不同形式(不同口音的「喵」)可以混用。

既然「喵」语言程序本质上就是一个非负整数组成的列表,那其实「喵」语言代码也可以用一种简化的方式来记录:每行记录一个非负整数,每个非负整数对应于一个 Meow element。比如与上面代码等价的简化形式为:

01234

普通「喵」语言源代码文件建议以 .meow 为后缀,简化形式的「喵」语言源代码文件建议以 .smeow 为后缀。

「喵」语言指令集

目前,「喵」语言一共只有 10 条指令,以下是每条指令的详细信息:


以上说明中使用的几个标记符号的含义如下:
  • IP:指令指针(Instruction Pointer),指向 Meow List 中当前要执行的指令位置。程序刚开始运行时,IP 的值为 0。
  • T:Meow List 尾部最后一个元素的值。
  • N:当前指令所在元素的下一个元素的值。
  • E(N):Meow List 中的第 N 个元素。N 是当前指令所在元素的下一个元素的值。

参考

「喵」语言其实是一种深奥编程语言(Esoteric programming language)。下面这个网站收集了数千种深奥编程语言(由此可以看出世界上的程序员是有多么闲):

https://esolangs.org/

「喵」语言的设计思路主要借鉴了一种名为「小鸡」的编程语言,并在其基础上做了较大幅度的改动。参见:

https://esolangs.org/wiki/Chicken

欢迎参与

欢迎使用「喵」语言教更多的猫咪学会编程。

欢迎为「喵」语言贡献功能或代码,或使用「喵」语言编写并分享有趣的代码。

宠爱猫咪,人人有责。



推荐阅读:

李开复时代杂志专栏:中国世界工厂 + AI 的未来 | 创观点


改造者系列:农业“+AI”全环节守护新疆棉花 | 创观点


改造者系列:将核酸检测提效40倍的自动化变革推手 | 创观点


李开复:中国、北京,是科学家创业最好的地方



推荐阅读