实战 | 一不小心创造了新的编程语言!
鱼皮平时会写一些有趣的小项目练练手。谁知道,前段时间,一不小心创造了一门新的编程语言!
先通过一个小视频了解一下(请全屏观看)~
如你所见,视频中的代码出现了大量的 Emoji 表情符号,非常有趣,这是鱼皮创造的编程语言的特色(和 Emojicode 类似)。鱼皮将这门编程语言取名为『 🐟 语言 』,正是希望它像水中鱼儿一样自由、灵活、快乐、游刃有 🐟。
下面给大家介绍一下 🐟 语言。
啥是 🐟 语言?
🐟 语言是一门基于 JavaScript 的逗比编程语言。它支持面向表情符号编程,不仅吸收了 JavaScript 语言的各种优点,还摒弃了 JavaScript 里大量复杂难懂的关键词,使得 🐟 语言具有功能强大和简单易用两个特征,它允许程序员以优雅的思维方式进行复杂的编程,并且具有一定的减压效果。
🐟 语言作为一门图灵完备的编程语言,具有很多优秀的特性,比如简单性、高性能、分布式、健壮性、安全性、平台独立、可移植性、多线程、动态性等等。这些特性使得其几乎适用于所有类型应用的开发,比如编写桌面应用程序、Web 网站、分布式系统、嵌入式系统、小程序、快应用等,就连现在最热门的 AI、大数据、区块链等领域也完全不在话下。
目前已推动腾迅、阿狸、字节挑动、美団、百渡、拼爹多、京冬等多家公司使用,成功帮助企业降本增效,帮助员工告别 996,深受好评,谁用了不叫一声 XXX!
我们也采访了一些使用 🐟 语言的开发者,分享下他们的故事。
王大爷和 🐟 语言
王大爷今年 28 岁,是一名互联网公司的前端开发,我们来看看 🐟 语言怎么帮助他重拾自我。
在踏入互联网行业之初,我觉得压力也没那么大。但工作一段时间后发现,我们每天要面对成千上万的代码,全是些英文单词,看久了头晕眼花,而且一不注意就会出现 bug。我常常因为改 bug 熬到深夜,没有时间陪伴家人,我的妻子也因此离开了我。
后来我们公司来了一名驾构师,他提出使用 🐟 语言来进行新项目的开发。开始我还一脸不屑,不就是 Emojicode 么,哗众取宠。
但是当我真正上手使用 🐟 语言,才发现真的是如丝般顺滑。
首先是通过一行命令就能轻松启动项目,打包构建通通丢掉。
./yulang.sh myproject
当枯燥无味的英文变成了一个个小表情后,我敲代码就像在画漫画,轻松有趣。还能够通过脚本一键把 JavaScript 项目重构为 🐟 语言,真太方便了!
🐌 value;
🐒 N 🐟 10;
🐚 🦄
🦀 (value 🐟🐟🐟 🦒 || value 🐟🐟🐟 🐧) 🦄
🐮 🦉 Error();
🦁
🦁 🐩 (e) 🦄
🥚 (N) 🦄
🐁 0:
🐦;
🐁 10:
🐦;
🦖:
🦁
🦁 🐙 🦄
value 🐟 0;
🦁
而且 🐟 语言非常地健壮,帮助我告别了原本一辈子都改不完的 bug。用了一段时间 🐟 语言后,我发现我已经离不开它了,我愿称它为最强!
如今,我已经是一名 🐟 语言高级攻城狮,也在为我们公司招聘更多的 🐟 语言人才。前段时间,我的妻子又回到了我的身边,感谢 🐟 语言,让我重拾自我,拥有幸福的人生!
感谢王大爷。
相信此时的你一定非常好奇,这么生动、形象、优秀、牛逼、无敌的编程语言是怎么实现的呢?
其实很简单,站在巨人的肩膀上,只需五分钟,就能实现 🐟 语言。
五分钟实现 🐟 语言
整个 🐟 语言分为两部分,核心包和运行脚本,总共就 5 个文件,非常轻量。
你肯定会问:“只有 5 个文件,就能实现编程语言么?”
其实思路很简单,我们并不是真正地从 0 到 1 实现编程语言,而是可以通过编写一个 “编译器”,将任何格式和语法的源文件转换成直接能够在浏览器和 Node 等环境中运行的 JavaScript 脚本语言,就像 TypeScript 和 FreeMarker 等模板引擎一样。
因此,实现 🐟 语言的过程就简化为开发一个 “编译器” 和一个执行脚本。
定义编译规则
我们可以发挥想象,尽情地定义新编程语言的格式和编译规则。比如 🐟 语言中,使用大量的 Emoji 表情符号进行编程。
🐘 getSum(val, N) 🦄
🧸 (🐢 i 🐟 0; i < N; i++) 🦄
val +🐟 i;
🦁
🦔 val;
🦁
🦌.log('result 🐟 ' + getSum(value, N))
而 🐟 语言的编译规则很简单,就是通过定义一本字典,将 Emoji 表情符号映射成 JavaScript 中的关键字。
比如下面的字典 map.js 中,定义了 Emoji 和关键字两个数组:
const emojis = ['🐔', '🐖', '🐺', '🐑',
'🦆', '🐧', '🐭', '🐂',
'🐯', '🐰', '🐉', '🐍'
];
const keyWords = ['abstract', 'arguments', 'boolean', 'break',
'byte', 'case', 'catch', 'char',
'continue', 'debugger', 'default', 'delete'
];
使用 JavaScipt 中的对象将两个数组进行关联,存储为字典("🐔" 对应 "abstract","🐖" 对应 "arguments"):
// '🐔' => 'abstract'
const emojiWordMap = {};
// 'abstract' => '🐔'
const wordEmojiMap = {};
for (let i = 0; i < keyWords.length; i++) {
emojiWordMap[emojis[i]] = keyWords[i];
wordEmojiMap[keyWords[i]] = emojis[i];
}
开发编译器
定义好规则后,在编译器中编写应用规则的逻辑,将源文件(.yu)输出为目标文件(.js)即可。
1. 通过 fs 库读取源文件:
const fs = require('fs');
const basePath = './src';
const filepath = `${basePath}/${process.argv[2]}.yu`;
let fileData = fs.readFileSync(filepath, 'utf-8');
2. 使用 replace 字符串替换函数,按照定义好的字典,将源文件中的 Emoji 替换为 JavaScript 中的对应关键字:
const {emojiWordMap} = require('./map');
for (const emoji in emojiWordMap) {
fileData = fileData.replace(new RegExp(emoji,'g'), emojiWordMap[emoji]);
}
3. 输出目标文件:
fs.writeFile(`${basePath}/${process.argv[2]}.js`, fileData, { 'flag': 'w' }, err => {
if (err) {
throw err;
}
console.log(`✅ compile succeed!`);
});
一个编译器就开发完成了!可以编写一些文件进行测试。
开发执行脚本
虽然编译器开发完了,但是总不能每次都让开发者手动编译再去运行代码吧?就像手动编译执行 C 语言,何等的麻烦!
可以编写一个执行脚本,开发者只需执行脚本,脚本会自动编译源文件,并执行编译出的 JavaScript 文件,代码运行结束后还将自动清理编译结果文件。
脚本文件并不复杂,接受源文件路径作为参数,通过 node 命令执行编译、运行编译后的代码,通过 rm -rf 实现文件的清理:
#!/usr/bin/env bash
# 基本路径
basePath="./src"
# 参数校验
if [[ ! -n $1 ]]; then
echo "❌ error: no filename!"
exit 1
fi
# 编译
node ./core/compile.js $1
# 执行
node ${basePath}/$1
# 清理
rm -rf ${basePath}/$1.js
大功告成,就这么简单!
快运行试试看~
亿点优化
基础的编译执行流程跑通后,我们还可以做很多事情来优化项目。比如:
1. 编写一个字典文档,帮助开发者查看:
2. 编写一个校验器,防止字典文档编写错误:
3. 编写一个反编译器,将 JavaScript 文件编译成 🐟 语言源文件(.yu),就是把编译器的规则字典反过来即可。
4. 实现更复杂的编译规则。
等等,这不就是前端工程化么?文档、规范、校验、反编译、自动化、优化。
看来,即使是一个很小的前端项目,只要不断思考和打磨,也是能够成为一个好的作品。
最后,鱼皮得承认,🐟 语言是个辣鸡到不行的语言,本篇文章前半部分都是在胡编乱造。但是,如果 🐟 语言的实现如果能够给大家一些启发和思考,激发大家的兴趣,我觉得这个项目就成功了,升值了~
如果本文让您乐了,或者对您有帮助的话,希望能点个在看,多多转发,感激不尽!下次鱼皮会准备一个更好玩的项目~
🐟 语言现已开源至 GitHub,欢迎大家下载使用,点击下方阅读原文一键传送。
往期推荐
鱼皮送福利啦!抽奖开始!
11 月 15 日,所有关注『鱼皮客栈』公众号的同学,在后台回复 “抽奖”,即可参与瓜分红包和幸运小奖品!分享转发有机会奖品升级!
阅读最多:超长鼠标垫
分享最多:QQ长鹅
留言最多:QQ小公仔
幸运奖:腾讯云U盘、笔记本等
感谢大家支持,鱼皮会继续努力创作优质内容!