实战 | 我创造了新的编程语言!
魚皮平時會寫一些有趣的小項目練練手。誰知道,前段時間,一不小心創造了一門新的編程語言!
魚皮將這門編程語言取名為『 🐟 語言 』,正是希望它像水中魚兒一樣自由、靈活、快樂、游刃有 🐟。
下面給大家介紹一下 🐟 語言。
啥是 🐟 語言?
🐟 語言是一門基于 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)即可。
通過 fs 庫讀取源文件:
const fs = require('fs');const basePath = './src'; const filepath = `${basePath}/${process.argv[2]}.yu`;let fileData = fs.readFileSync(filepath, 'utf-8');使用 replace 字符串替換函數,按照定義好的字典,將源文件中的 Emoji 替換為 JavaScript 中的對應關鍵字:
const {emojiWordMap} = require('./map');for (const emoji in emojiWordMap) {fileData = fileData.replace(new RegExp(emoji,'g'), emojiWordMap[emoji]); }輸出目標文件:
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 ]]; thenecho "? error: no filename!"exit 1 fi# 編譯 node ./core/compile.js $1# 執行 node ${basePath}/$1# 清理 rm -rf ${basePath}/$1.js大功告成,就這么簡單!
快運行試試看~
億點優化
基礎的編譯執行流程跑通后,我們還可以做很多事情來優化項目。比如:
編寫一個字典文檔,幫助開發者查看:
編寫一個校驗器,防止字典文檔編寫錯誤:
編寫一個反編譯器,將 JavaScript 文件編譯成 🐟 語言源文件(.yu),就是把編譯器的規則字典反過來即可。
實現更復雜的編譯規則。
等等,這不就是前端工程化么?文檔、規范、校驗、反編譯、自動化、優化。
看來,即使是一個很小的前端項目,只要不斷思考和打磨,也是能夠成為一個好的作品。
最后,魚皮得承認,🐟 語言是個辣雞到不行的語言,本篇文章前半部分都是在胡編亂造。但是,如果 🐟 語言的實現如果能夠給大家一些啟發和思考,激發大家的興趣,我覺得這個項目就成功了,升值了~
如果本文讓您樂了,或者對您有幫助的話,希望能多多轉發,感激不盡!下次魚皮會準備一個更好玩的項目~
🐟 語言現已開源至 GitHub,歡迎大家下載使用,點擊鏈接一鍵傳送。
總結
以上是生活随笔為你收集整理的实战 | 我创造了新的编程语言!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: When we use PdfStamp
- 下一篇: 顺着 IT 的潮流,C语言再次迎来了春天