木蘭 (程式語言)

木蘭，名稱來自模組單元語言的縮寫，是一種教學用程式語言，其語法規範來自Lua，編譯與執行環境使用Python實現。由中國科學院計算技術研究所入股的中科智芯公司於2020年1月15日發表，團隊領導人為中科院副研究員劉雷。這套程式語言是中科智芯公司的重點產品，主要應用於中華人民共和國境內的中小學及幼兒園，作教育使用。發表之初，研發團隊曾稱這個程式語言可使用於人工智慧與物聯網，完全自主研發，編譯器與整合開發環境套件也完全由團隊開發。在發表後，被質疑是以Python 3.7套件套殼產生。開發者劉雷承認是基於Python做二次開發，完全自主研發以及針對人工智慧及物聯網應用開發等說法為過度誇大。至2020年1月20日，官方下載網頁無法開啟，劉雷也被中科院停職接受調查。簡介.木蘭由中國科學院計算技術研究所國家重點實驗室編譯組研發團隊於2020年1月15日發表。在發表時，開發團隊領導人劉雷聲稱這套程式語言完全由這個研發團隊進行自主設計、開發、程式設計，編譯器與整合開發工具套件也完全自主開發，完全掌握核心技術；劉雷認為這個程式語言將會成為「智慧物聯時代的C語言」。劉雷聲稱，木蘭是為針對人工智慧與物聯網應用而開發的程式語言；不過因為有易於理解及使用的特性，在尚未被大量使用於應用開發的情況下，木蘭已經投入中小學及幼兒園的教育課程中使用。在硬體上，能夠搭配中華人民共和國自主研發的龍芯、寒武紀處理器，在作業系統上可搭配Android、iOS、Linux、Windows系統跨平臺運作。中科智芯科技有限公司提供“青少年人工智慧教育”相關的服務，其網頁上介紹木蘭語言時則僅聲稱該語言是“專為人工智慧教育而生的程式語言”。2020年1月20日，中科智芯科技網站所提供的木蘭的“語言環境”的安裝包名稱為ulang-0.2.2.exe。語法內容.因為官方尚沒有提供完整開發檔案與整合開發套件，這個程式語言的實質內容並不清楚，但在開放 ulang.exe 下載後，開發者社群對它進行逆向工程，對它的特性有基礎瞭解。透過重現專案，發現了更多語法特性。下面是用木蘭原始碼編寫的猜 1-100 數字例程，可用 ulang.exe 執行。using Cmd in cmd; using exit in sys; using randrange in randomtype GuessNumber : Cmd {intro, prompt = "I have a number within 100 in mind, guess which one?", "Try: "numberInMind = randrange(1000) / 10; history = []; closestDiffSoFar = 100func $default(row) {$history.append(n); $compare(n)func $compare(n) {else {println("Too " + (n &gt; $numberInMind ? "large" : "small") + "!")println("Getting close though") if $gettingCloser()func $gettingCloser {minDiff = min(map(n -&gt; { diff = n - $numberInMind; return diff &gt; 0 ? diff : -diff }, $history)){ $closestDiffSoFar = minDiff; return true } if $closestDiffSoFar &gt; minDiffGuessNumber().cmdloop()其語法的最直觀特色之一是取消了 Python 的強制縮排，改用大括號。透過語句末尾的分號，支援一行內編寫多個語句。函式方面，可以用 $ 代替 self；在函式無引數時，定義時可以省略 ()；支援 lambda 函式內多個語句。型別方面，型別擴充套件使用冒號表示；型別變數需用大括號包圍，如例程中的 intro、prompt 等。內建函式方面，添加了 println；isinstance 改為 isa。註釋段用 /* */，註釋行用 //。關鍵詞方面有諸多修改，比如由 Python 使用的 def 改成 func，類似於Swift、Go與PHP；try...except 改為 try...catch；None 改為 nil，True/False 改為 true/false；class 改為 type 等等。不支援漢字作為變數名稱，保留的關鍵字中也沒有漢字，因此不能以中文來進行程式設計。與此相比，Python 3可以使用Unicode文字作為變數名。實現原理.在程式執行時，用 RPly 進行詞法與語法分析後生成 Python 抽象語法樹，呼叫 Python 內建函式 compile 生成可執行碼，再呼叫 Python 內建函式 exec 執行。執行速度與 Python 相近。由於基於 Python 的執行時環境，可以跨平臺運作。除了執行木蘭原始碼，ulang.exe 還有引數支援周邊功能。其中 --dump-python 藉助 codegen 庫將木蘭原始碼生成對應的 Python 程式碼。透過擴充套件 Python 內建函式 __import__，支援匯入木蘭模組，同時仍支援匯入 Python 模組，而且不需 __init__.py 即可找到模組。語法與 Python 基本對應。using some_moduleusing module1, module2using some_method in some_moduleusing * in some_moduleusing * in .using ceil in math關於核心技術的爭議.在其執行檔ulang-0.2.2.exe開放下載後，CSDN網友“沉迷單車的追風少年”等開發者發現，這個執行檔是直接用PyInstaller將Python 3.7套件打包成一個執行檔，圖示直接使用Python的官方圖示。在解開後，其內容大部份都是python 3.7的官方套件，包括python的建構環境、套件等，自行撰寫的部份不多，與其宣稱完全自主開發不同。開發者劉雷回應，在8位元單晶片上的編譯器是由他們團隊自主開發，在32位元處理器上則是基於Python二次開發，其語法規範來自Lua，但擴充了資料型別，主要使用於中小學教育，而不是人工智慧與物聯網開發。1月19日，相關負責人劉雷被中科院停職檢查。之後劉雷則表示木蘭專案沒有使用任何科研經費。1月19日，官方下載網頁已經無法開啟。處罰.2020年1月23日，中國科學院計算技術研究所釋出《關於“木蘭”語言問題的調查與處理意見》，認為劉雷在“木蘭”語言的宣傳活動中存在欺瞞、虛假陳述和誇大宣傳的行為，取消其五年內專業技術崗位晉升的申請資格，取消三年內科研專案的申請資格，崗位等級從工程師一級降為助理工程師一級。評論.《經濟日報》認為，學術界的醜聞“讓人痛心”，認為科學不容玷汙，應加強科學道德和學風建設。認為科研工作者應該“以身作則，還學術、還科研一片淨土”。重現專案.由於木蘭原始碼並未由官方釋出，於1月16日在知乎提出問題‘「木蘭」程式語言有什麼特色？’的程式語言愛好者吳烜隨即建立了木蘭程式語言重現專案，並開源在Gitee。2020年11月25日，該專案在開源中國主辦的評選活動中位列“最積極運營專案”前20名。此專案透過修改詞法分析部分，使木蘭支援了中文識別符號。猜數字例程改用中文命名如下。using Cmd in cmd; using exit in sys; using 隨機範圍數 in 隨機數type 猜數字 : Cmd {intro, prompt = "木蘭想了個 100 之內的數，猜是幾？", "猜猜吧: "想的 = 隨機範圍數(1000) / 10; 歷史 = []; 至今最近 = 100func $default(行) {$歷史.append(數); $比較(數)func $比較(數) {else {println("太" + (數 &gt; $想的 ? "大" : "小") + "了!")println("不過接近咯") if $接近了()func $接近了 {最近 = min(map(數 -&gt; { 差 = 數 - $想的; return 差 &gt; 0 ? 差 : -差 }, $歷史)){ $至今最近 = 最近; return true } if $至今最近 &gt; 最近猜數字().cmdloop()