天天看點

中文程式設計的前世今生

雲栖号資訊:【 點選檢視更多行業資訊

在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

寫這篇文章前,我想先放一張圖

中文程式設計的前世今生

這是 1942 年,人類發明的第一台計算機 ENIAC,它占地 170平方米,按照杭州将近 3 萬一平的地價,放它需要花 500 萬。這台計算機上如何寫代碼?它靠的是六位小姐姐通過改變接線來實作。

中文程式設計的前世今生

格蕾絲·赫柏,不僅是世界上第一位女程式員,還是一名将軍,發明 bug 一詞并寫下千年蟲 bug 的女神

第二台 EDVAC 開始,想必大家也有耳聞,用的打孔機。

中文程式設計的前世今生

其實程式設計原理很簡單,衆所周知,我們的電腦無論手機還是 pc,都沒有超出馮·諾伊曼架構。底層是由 0 和 1 兩個電位構成,我們所有的程式設計指令,最終都要變成 0 和 1 計算機才能了解。我們知道 CPU 隻負責計算,本身不具備智能。你輸入一條指令,它就運作一次,然後停下來,等待下一條指令。這些指令都是二進制的,稱為操作碼(opcode),打孔機輸入的就是這些。

一系列操作指令,形成一套指令集(ISC),目前世面上常見的指令集有RISC (簡單指令集)和複雜指令集(CISC).簡單地說,簡單指令集 就是隻規定非常簡單的二進制處理器指令,複雜的指令也隻是最基本的指令的疊加組合。複雜指令集本身就有一個很龐大的指令集庫,内置了很多指令庫,隻需要調用即可。

前者主要代表有 ARM 架構,後者主要代表有 X86 架構。ARM 架構憑借着核心簡單帶來的低功耗,在移動和 5G 時代備受歡迎。

經典的分層

當然,對于人類來說,二進制是不可讀的,人類又發明了彙編。彙編其實就是二進制指令的助記形式,與指令基本上是一一對應的(有很少的一些抽象),隻要把彙編映射成二進制,就可以被 CPU 直接執行,是以它是最底層的低級語言。

吹牛能直接看二進制的反派第一部就領了便當

計算機的分層架構設計思想,簡直是人類智慧的精華。從半導體實體學到雲計算,每一層都是對下一層的抽象,上層不需要關心下層的實作,隻需要知道自己要給下一層的輸入輸出是什麼。

中文程式設計的前世今生

在彙編語言之上,出現了對人類更友好的進階語言如 C 語言,它使用近似英語的文法描述代碼來表達代碼,然後由 gcc 編譯器編譯成彙編。

以下是一段簡單的 C 代碼及它在 i7 的 macbook 編譯的彙編形式:

中文程式設計的前世今生

我們可以看到,C 比彙編更接近自然語言,而彙編,則是在和指令和寄存器打交道。

中文程式設計

事實上,世界各國的開發者都進行了基于母語設計程式設計語言文法的嘗試. 有些已經商用且活躍至今。中文圈内比較有名的當屬易語言了,還有前陣子産生話題性的文言文程式設計。

很多人聽到易語言有些不屑,然而這門語言在一個灰色領域卻是 top 級的語言。這個領域就是遊戲外挂和黑産木馬。國内超過八成以上的外挂和盜号程式來自于易語言。

一門語言的是否能火起來,和進入這個子領域的契機有關。比如 C語言,解決了源代碼跨的可移植性問題,C 成為編寫作業系統和底層協定的首選語言。Java 趕上企業資訊化大潮,強類型、垃圾回收及面向對象的進階抽象,使得架構大型企業級應用不會成為災難。

js 的流行在于各大浏覽器廠商談不攏,js 成為唯一各浏覽器開箱即用的語言,恰好趕上 web2.0 技術興起,js 具備了不可取代性,之後隻能進一步對這門本身設計有缺陷的語言向後相容擴充,node 的興起,則是 js 這門語言在向浏覽器宿主之外擴張的自然擴張,利益于不錯的性能和龐大的使用者群體。

Python 則憑借着強大的表現力和數學标準庫,在人工智能領域大受歡迎。中文程式設計,則命中了一個小的群體,這些人不是科班出身,甚至很多沒有學曆,對英語有天生排斥,有一點小聰明,有強烈意願的要做成某件事的人。

易語言官方論壇注冊人數近百萬,能在一個小衆領域中做成功,肯定有一些過人之處,雖然易語言的使用者群偏離了開發者初衷。

中文程式設計的前世今生

不吐槽年代感的 win 98 風格,外易語言的 ide 提供了非常友好的可視化布局界面及調試能力。從基礎程式設計能力到幾乎涵蓋了作業系統的所有庫函數的調用。可以開發下載下傳工具,即時通訊、播放器、網站等衆類型程式,并且都有官方和第三方模闆。ide 的代碼編輯部分也做得很用心 ,常被人吐槽的打「如果」快還是 if 快,其實在 ide 裡隻要輸入 rg 的拼音首字母就能快速補全語句塊了,整個 ide 體驗下來,完全不需要切中文輸入法。

然而其實外挂的開發難度并不簡單,從 LSP 注入到驅動注入,甚至核心重載,VT 調試,用内聯彙編來劫持記憶體資料。這些根本不是一個連英語單詞都拼不來的半吊子能搞定的事。易語言在外挂界流行,其實還有個外行人不了解的内情:做外挂是在法律的邊緣試探,黑客一般不直接出售外挂,而是打包成 dll 非完整的外挂程式形式輸送到黑産下遊來逃避制裁。易語言說白了核心隻做了一件事,調庫。

擴充 JS

講了這些,似乎做為中文程式設計的一哥易語言也不是多光彩的事,然而,這件事對我們來說卻有一些借鑒作用。易語言做為封閉的商業軟體,注定無法成為主流,但我們其實可以簡單地為 js 做一些定制來做到類似的事情。以下是一個可以直接正常運作的  js 程式:

中文程式設計的前世今生

如果覺得還不夠友好,我們可以通過詞法分析再簡單地擴充一下 js:

中文程式設計的前世今生

以上代碼,我們定義一個叫「很容易語言」的文法邊界,然後将邊界内的字元串通過詞法分析拆解成 token,再将 token 生成抽象文法樹 AST,再通過 AST 轉回普通 JavaScript,我們就可以很容易擴充 js,使其更具備中文表現力,又能依托  js 的完善生态。

更自然的語言

以上的方式,隻能降低程式設計入門的門檻,但還是需要嚴格的文法界定符,從資訊論的角度看,降低熵就要增加人力,這部分複雜度并沒有減少和轉移。我們需要更自然的語言來描述邏輯,這就是 NLP。

自然語言有 5 個難點,使得計算機處理很困難:

  • 多樣性,如「我打了小明」,「小明被我打了」自然語言沒有太多規律,但我們能能多種句式了解一緻,說明仍有内在規律。
  • 岐義性,如果不聯系上下文,缺少環境的限制,語言有很大的歧義性,如「播放美人魚」,是要看聽安徒生童話,還是想看周星馳電影,還是想聽周傑倫的歌?
  • 魯棒性,語言多字少字錯字噪音,如比這話句你并不會覺得無發了解。
  • 常識,自然語言有知識依賴,比如開車,到底是開車還是開車?
  • 上下文,對話的上下文,使用者身份,使用者畫像。

對于上小結的代碼,我們用一種更說人話的方式表達就是:「在頁面 xx 位置畫一個紅色正方形」。這句話,轉成代碼,有資訊是丢失的。比如,xx 位置,對應 dom 選擇器是啥?紅色具體色值是啥?正方形多少大小合适?用 canvas 畫還是 svg 畫?

對于實踐,我們可以多增加一些上下文限制來使得樣本處理簡化:

  • 程式設計語言:如中文程式設計語言,它本身是非常結構和嚴限制的
  • 模闆:适用于限定類的場景,挖坑
  • 可視化編排: 比如通過畫流程表達邏輯,本質還是強結構限制
  • 專家系統 :需要通過規則,分析到丢失資訊,再進一步對話提問

思考

為什麼我們需要中文程式設計?

傳統的開發工具鍊路提效,本質上沒有解決任何問題,隻是用機器代替了部分人力勞動,而機器是高效且不會出錯的。

一個需求的生命周期,從業務方提出想法,到産品經驗梳理成 PRD,再到灌輸給程式員,逼着程式員上線。這個過程,我們發現,我們都是在讨論同一件事,隻是通過不同的方式來描述這件事。需求方通過自然語言,碼農通過程式語言。這個過程中,有很大的一部分工作量是雙方重複的,隻是表達語言不同。

我們是否可以在需求詳審的早期,更多地識别出資訊缺漏的部分?是否可以找到更多的共性部分,通過更結構化地方式表達,或者更智慧的方式去了解?

【雲栖号線上課堂】每天都有産品技術專家分享!

課程位址:

https://yqh.aliyun.com/live

立即加入社群,與專家面對面,及時了解課程最新動态!

【雲栖号線上課堂 社群】

https://c.tb.cn/F3.Z8gvnK

原文釋出時間:2020-04-22

本文作者:設計稿智能生成代碼

本文來自:“

掘金

”,了解相關資訊可以關注“掘金”

繼續閱讀