实战 | 我创造了新的编程语言!

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


鱼皮将这门编程语言取名为『 🐟 语言 』,正是希望它像水中鱼儿一样自由、灵活、快乐、游刃有 🐟。

下面给大家介绍一下 🐟 语言。

啥是 🐟 语言?

🐟 语言是一门基于 JavaScript 的逗比编程语言。它支持面向表情符号编程,不仅吸收了 JavaScript 语言的各种优点,还摒弃了 JavaScript 里大量复杂难懂的关键词,使得 🐟 语言具有功能强大简单易用两个特征,它允许程序员以优雅的思维方式进行复杂的编程,并且具有一定的减压效果。

🐟 语言作为一门图灵完备的编程语言,具有很多优秀的特性,比如简单性、高性能、分布式、健壮性、安全性、平台独立、可移植性、多线程、动态性等等。这些特性使得其几乎适用于所有类型应用的开发,比如编写桌面应用程序、Web 网站、分布式系统、嵌入式系统、小程序、快应用等,就连现在最热门的 AI、大数据、区块链等领域也完全不在话下。

目前已推动腾迅、阿狸、字节挑动、美団、百渡、拼爹多、京冬等多家公司使用,成功帮助企业降本增效,帮助员工告别 996,深受好评,谁用了不叫一声 XXX!

真香警告!长安全新CS95试驾报告

我们也采访了一些使用 🐟 语言的开发者,分享下他们的故事。

王大爷和 🐟 语言

王大爷今年 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

大功告成,就这么简单!

点击查看源网页

快运行试试看~

image-20201115171534398

亿点优化

基础的编译执行流程跑通后,我们还可以做很多事情来优化项目。比如:

  1. 编写一个字典文档,帮助开发者查看:

    image-20201115172158618

  2. 编写一个校验器,防止字典文档编写错误:

    image-20201115172303227

  3. 编写一个反编译器,将 JavaScript 文件编译成 🐟 语言源文件(.yu),就是把编译器的规则字典反过来即可。

  4. 实现更复杂的编译规则。

点击查看源网页

等等,这不就是前端工程化么?文档、规范、校验、反编译、自动化、优化。

看来,即使是一个很小的前端项目,只要不断思考和打磨,也是能够成为一个好的作品。

最后,鱼皮得承认,🐟 语言是个辣鸡到不行的语言,本篇文章前半部分都是在胡编乱造。但是,如果 🐟 语言的实现如果能够给大家一些启发和思考,激发大家的兴趣,我觉得这个项目就成功了,升值了~

点击查看源网页

如果本文让您乐了,或者对您有帮助的话,希望能多多转发,感激不尽!下次鱼皮会准备一个更好玩的项目~

img

🐟 语言现已开源至 GitHub,欢迎大家下载使用,点击链接一键传送。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员鱼皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值