查看原文
其他

实战 | 一不小心创造了新的编程语言!

鱼皮 程序员鱼皮 2022-08-14

鱼皮平时会写一些有趣的小项目练练手。谁知道,前段时间,一不小心创造了一门新的编程语言!

先通过一个小视频了解一下(请全屏观看)~


如你所见,视频中的代码出现了大量的 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,欢迎大家下载使用,点击下方阅读原文一键传送。


往期推荐

编程百晓生 | 世上竟有如此优雅的代码!

求职 | 小 y 的 Java 后端秋招经历和感悟

小记 | 从 0 到 1,看我玩弄千万日志于股掌

编程百晓生 | 啥是数据库?

小记 | 再次登上学生时代的个人博客,泪目



鱼皮送福利啦!抽奖开始!

11 月 15 日,所有关注『鱼皮客栈』公众号的同学,在后台回复 “抽奖”,即可参与瓜分红包和幸运小奖品!分享转发有机会奖品升级!



阅读最多:超长鼠标垫

分享最多:QQ长鹅

留言最多:QQ小公仔

幸运奖:腾讯云U盘、笔记本等


感谢大家支持,鱼皮会继续努力创作优质内容!


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存