木蘭 (程式語言)

编程语言

木蘭(英語:Mulan),名稱來自模組單元語言(Module Unit Language)的縮寫,是一種教學用程式語言,其語法規範來自Lua,編譯與執行環境使用Python實現。由中國科學院計算技術研究所入股的中科智芯公司於2020年1月15日發表,團隊領導人為中科院副研究員劉雷[1]。這套程式語言是中科智芯公司的重點產品,主要應用於中華人民共和國境內的中小學及幼兒園,作教育使用[2]

木蘭
Mulan
編程範型多範式物件導向指令式函數式程序式面向切面
設計者劉雷
實作者中科智芯公司
釋出時間2020年1月15日,​4年前​(2020-01-15
作業系統跨平台

發表之初,研發團隊曾稱這個程式語言可使用於人工智能物聯網,完全自主研發,編譯器整合式開發環境套件也完全由團隊開發。在發表後,被質疑是以Python 3.7套件套殼產生。開發者劉雷承認是基於Python做二次開發,完全自主研發以及針對人工智能及物聯網應用開發等說法為過度誇大。至2020年1月20日,官方下載網頁無法打開,劉雷也被中科院停職接受調查。

簡介

木蘭由中國科學院計算技術研究所國家重點實驗室編譯組研發團隊於2020年1月15日發表。在發表時,開發團隊領導人劉雷聲稱這套程式語言完全由這個研發團隊進行自主設計、開發、編程,編譯器與整合開發工具套件也完全自主開發,完全掌握核心技術;劉雷認為這個程式語言將會成為「智能物聯時代的C語言」。劉雷聲稱,木蘭是為針對人工智能物聯網應用而開發的程式語言;不過因為有易於理解及使用的特性,在尚未被大量使用於應用開發的情況下,木蘭已經投入中小學及幼兒園的教育課程中使用。在硬件上,能夠搭配中華人民共和國自主研發的龍芯寒武紀處理器,在作業系統上可搭配AndroidiOSLinuxWindows系統跨平台運作[3][4][5]

中科智芯科技有限公司提供「青少年人工智能教育」相關的服務,其網頁上介紹木蘭語言時則僅聲稱該語言是「專為人工智能教育而生的程式語言」。2020年1月20日,中科智芯科技網站所提供的木蘭的「語言環境」的安裝套件名稱為ulang-0.2.2.exe。[6]

語法內容

因為官方尚沒有提供完整開發檔案與整合開發套件,這個程式語言的實質內容並不清楚,但在開放 ulang.exe 下載後,開發者社群對它進行逆向工程,對它的特性有基礎了解。通過重現專案,發現了更多語法特性。下面是用木蘭原始碼編寫的猜 1-100 數字常式,可用 ulang.exe 執行。

using Cmd in cmd; using exit in sys; using randrange in random

type GuessNumber : Cmd {
  {
    intro, prompt = "I have a number within 100 in mind, guess which one?", "Try: "
    numberInMind = randrange(1000) / 10; history = []; closestDiffSoFar = 100
  }

  func $default(row) {
    try { n = int(row) }
    catch e : ValueError { println("`row` is not a number, try again"); return }
    $history.append(n); $compare(n)
  }

  func $compare(n) {
    if n == $numberInMind { println("Bingo!"); exit() }
    else {
      println("Too " + (n > $numberInMind ? "large" : "small") + "!")
      println("Getting close though") if $gettingCloser()
    }
  }

  func $gettingCloser {
    minDiff = min(map(n -> { diff = n - $numberInMind; return diff > 0 ? diff : -diff }, $history))
    { $closestDiffSoFar = minDiff; return true } if $closestDiffSoFar > minDiff
  }
}
GuessNumber().cmdloop()

其語法的最直觀特色之一是取消了 Python 的強制縮排,改用大括號。通過陳述式末尾的分號,支援一行內編寫多個陳述式。

函數方面,可以用 $ 代替 self;在函數無參數時,定義時可以省略 ();支援 lambda 函數內多個陳述式。

類型方面,類型擴充使用冒號表示;類型變數需用大括號包圍,如常式中的 intro、prompt 等。

內建函數方面,添加了 println;isinstance 改為 isa。

註釋段用 /* */,註釋行用 //。

關鍵詞方面有諸多修改,比如由 Python 使用的 def 改成 func,類似於SwiftGoPHP;try...except 改為 try...catch;None 改為 nil,True/False 改為 true/false;class 改為 type 等等。

不支援漢字作為變數名稱,保留的關鍵字中也沒有漢字,因此不能以中文來進行編程。與此相比,Python 3可以使用Unicode文字(包括漢字)作為變數名。

實現原理

在程式執行時,用 RPly [7] 進行詞法與語法分析後生成 Python 抽象語法樹,呼叫 Python 內建函數 compile 生成可執行碼,再呼叫 Python 內建函數 exec 執行。執行速度與 Python 相近。由於基於 Python 的執行時環境,可以跨平臺運作。

除了執行木蘭原始碼,ulang.exe 還有參數支援周邊功能。其中 --dump-python 藉助 codegen 庫將木蘭原始碼生成對應的 Python 代碼。

通過擴充 Python 內建函數 __import__,支援匯入木蘭模組,同時仍支援匯入 Python 模組,而且不需 __init__.py 即可找到模組。語法與 Python 基本對應。

using some_module
using module1, module2
using some_method in some_module
using * in some_module
using * in .
using ceil in math

關於核心技術的爭議

在其執行檔ulang-0.2.2.exe開放下載後,CSDN網友「沉迷單車的追風少年」等開發者發現,這個執行檔是直接用PyInstaller將Python 3.7套件打包成一個執行檔,圖示直接使用Python的官方圖示。在解開後,其內容大部份都是python 3.7的官方套件,包括python的建構環境、套件等,自行撰寫的部份不多,與其宣稱完全自主開發不同[8][9][10]。開發者劉雷回應,在8位元單晶片上的編譯器是由他們團隊自主開發,在32位元處理器上則是基於Python二次開發[11],其語法規範來自Lua,但擴充了資料類型,主要使用於中小學教育,而不是人工智能與物聯網開發[12][13]。1月19日,相關負責人劉雷被中科院停職檢查[14]。之後劉雷則表示木蘭專案沒有使用任何科研經費[15]。1月19日,官方下載網頁已經無法打開[16]

處罰

2020年1月23日,中國科學院計算技術研究所發佈《關於「木蘭」語言問題的調查與處理意見》,認為劉雷在「木蘭」語言的宣傳活動中存在欺瞞、虛假陳述和誇大宣傳的行為,取消其五年內專業技術崗位晉升的申請資格,取消三年內科研專案的申請資格,崗位等級從工程師一級降為助理工程師一級[17]

評論

經濟日報》(中國經濟網)認為,學術界的醜聞「讓人痛心」,認為科學不容玷污,應加強科學道德和學風建設。認為科研工作者應該「以身作則,還學術、還科研一片淨土」[13]

重現專案

由於木蘭原始碼並未由官方發佈,於1月16日在知乎提出問題『「木蘭」程式語言有什麼特色?』的程式語言愛好者吳烜隨即建立了木蘭程式語言重現專案,並開源在Gitee[18]。2020年11月25日,該專案在開源中國(OSCHINA)主辦的評選活動中位列「最積極運營專案」前20名[19]

此專案通過修改詞法分析部分,使木蘭支援了中文識別碼。猜數字常式改用中文命名如下。

using Cmd in cmd; using exit in sys; using 随机范围数 in 随机数

type 猜数字 : Cmd {
  {
    intro, prompt = "木兰想了个 100 之内的数,猜是几?", "猜猜吧: "
    想的 = 随机范围数(1000) / 10; 历史 = []; 至今最近 = 100
  }

  func $default() {
    try {  = int() }
    catch 例外 : ValueError { println("`行` 不是数,请再试"); return }
    $历史.append(); $比较()
  }

  func $比较() {
    if  == $想的 { println("中了!"); exit() }
    else {
      println("太" + ( > $想的 ? "大" : "小") + "了!")
      println("不过接近咯") if $接近了()
    }
  }

  func $接近了 {
    最近 = min(map( -> {  =  - $想的; return  > 0 ?  : - }, $历史))
    { $至今最近 = 最近; return true } if $至今最近 > 最近
  }
}
猜数字().cmdloop()

註釋

  1. ^ 趙廣立. 中科院计算所发布国产编程语言“木兰”. 中國科學報. 2020-01-16 [2020-01-19]. (原始內容存檔於2021-10-06). 
  2. ^ 中科院计算所发布国产编程语言“木兰”. 科學網. 2020-01-16 [2020-01-18]. (原始內容存檔於2020-02-29). 
  3. ^ 中科院发布“智能物联时代的C语言—木兰”. OFweek人工智能網. 2020-01-17 [2020-01-18]. [永久失效連結]
  4. ^ 孫自法. 面向智能物聯 中國科研團隊發佈「木蘭」編程語言體系. 北京新浪網. 2020-01-16 [2020-01-18]. (原始內容存檔於2020-02-06). 
  5. ^ 孫自法. 面向智能物联 中国科研团队发布“木兰”编程语言体系. 中國新聞網. 2020-01-15 [2020-01-23]. (原始內容存檔於2020-01-16). 
  6. ^ 编程软件. 中科智芯科技有限公司. [2020-01-23]. (原始內容存檔於2020-01-20). 
  7. ^ alex/rply: An attempt to port David Beazley's PLY to RPython, and give it a cooler API.. [2021-01-30]. (原始內容存檔於2020-10-31). 
  8. ^ 声称掌握核心技术,实则换皮Python?国产编程语言木兰引起社区热议. 機器之心. 2020-01-17 [2020-01-18]. (原始內容存檔於2021-05-09). 
  9. ^ 换皮都换不利索?扒一扒中科院"自主研发"的编程语言. cnBeta. 2020-01-19 [2020-01-23]. (原始內容存檔於2020-01-23). 
  10. ^ 国产编程语言“木兰”被质疑抄袭Python,负责人道歉. 財富中文網. 2020-01-19 [2020-01-19]. (原始內容存檔於2020-07-20). 
  11. ^ 自主開發編程語言被指Python套殼,中科院開發者道歉. 北京新浪網. 2020-01-18 [2020-01-18]. (原始內容存檔於2020-02-14). 
  12. ^ 邱晨輝. 被指换皮后 编程语言"木兰"研发团队为夸大事实道歉. 中國青年報. 2020-01-18 [2020-01-19]. (原始內容存檔於2020-01-19). 
  13. ^ 13.0 13.1 沈慧. 编程语言“木兰”换皮?中科院计算所:当事人科研不端已停职检查. 經濟日報·中國經濟網. 2020-01-19 [2020-01-23]. (原始內容存檔於2020-01-19). 
  14. ^ 中科院計算所. 关于“木兰”语言问题处理情况的说明. 中科院計算所網站. 2020-01-19 [2020-01-19]. (原始內容存檔於2020-01-24). 
  15. ^ 当事人回应:“木兰”没有使用任何科研经费. 觀察者網. 2020-01-19 [2020-01-23]. (原始內容存檔於2020-01-20). 
  16. ^ 每經記者 曾劍 每經編輯 梁梟. 首款自主开发编程语言“木兰”被质疑抄袭 现暂无法下载. 每日經濟新聞. 2020-01-19. 
  17. ^ 中科院:取消 “木兰”语言问题当事人五年内晋升资格. [2020-01-27]. (原始內容存檔於2020-01-27). 
  18. ^ 木兰编程语言 - OSCHINA - 中文开源技术交流社区. [2021-01-30]. (原始內容存檔於2020-12-25). 
  19. ^ 2020 年度 OSC 中国开源项目评选:最积极运营项目. [2021-01-29]. (原始內容存檔於2021-01-21). 

相關條目