首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实战 | 一不小心创造了新的编程语言!

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

作者头像
程序员鱼皮
发布2020-11-25 10:34:55
6040
发布2020-11-25 10:34:55
举报
文章被收录于专栏:鱼皮客栈鱼皮客栈

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

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

如你所见,视频中的代码出现了大量的 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. 实现更复杂的编译规则。

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

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


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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员鱼皮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 啥是 ? 语言?
  • 王大爷和 ? 语言
  • 五分钟实现 ? 语言
    • 定义编译规则
      • 开发编译器
        • 开发执行脚本
          • 亿点优化
          相关产品与服务
          云开发 CloudBase
          云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档