在可預見的未來, 高考仍是最重要的也最有社會影響力的人才選拔機制. 很久沒有關註, 最近得知高考自選科目中開始增加了編程一項(見 "如何評價2017浙江高考七選三科目中包含技術?" ). 雖然個人對編程是否應該進入高考仍有保留看法, 但至少全民(都應該可以)編程這一趨勢已經很明顯了. 這應該是中文編 ...
在可預見的未來, 高考仍是最重要的也最有社會影響力的人才選拔機制. 很久沒有關註, 最近得知高考自選科目中開始增加了編程一項(見如何評價2017浙江高考七選三科目中包含技術?). 雖然個人對編程是否應該進入高考仍有保留看法, 但至少全民(都應該可以)編程這一趨勢已經很明顯了. 這應該是中文編程興起的另一個契機(前文中文編程興起的必然性討論了一些更技術性的原因).
看了2017年浙江的高考卷, 感覺演算法/體系/基礎知識比較少, 比較偏技術. 相信以後會逐漸調整. 畢竟技術更新快, 而前者更經得起時間考驗也更有含金量. 個人覺得演算法在短期內仍需要一個具體的編程語言作為載體, 畢竟教學實踐中不可能作純粹的紙上演算法. 那麼, 一個適合演算法設計和實踐的中文編程語言, 假如能在高考卷中使用, 相信會是一個中文編程的里程碑.
本文試圖列出一些(當然絕不是全部)這一假想中的語言/開發環境的功能特性和示例, 希望拋磚引玉. 其中, 對每項功能的必需性按照一到三排列, 一最高.
版權/安全
- [一] 必須從開始就理清所有依賴庫的版權問題, 為商用掃清顧慮
- [一] 殺毒軟體不能誤報
功能/API
- [一] 可以實現所有現有語言能夠完成的功能. (註: 評論指出'所有'一詞有歧義. 這裡原意是指它附帶的API以及可使用的第三方庫的功能能夠覆蓋大多數應用場景) 如果這一語言的主要用途只是教學(比如LOGO), 那麼它應該很難被選擇為教學用的語言, 畢竟現在大環境是實用至上. 因此, 即使它本身(核心庫)的功能比較局限, 只要可以無縫集成其他通用語言 (比如可以調用Java庫的wkgcass/Latte-lang)即可.
- [一] 支持64位系統, 跨平臺(Windows/Linux/Mac), 最好支持移動平臺(即使不能, 最好提供基本的線上編程環境)
- [二] 常用功能需要中文API, 即使是封裝現有API也可. 在高考題中可以看到還是不少與UI和I/O有關, 中文化爭取早日覆蓋常用API.
語法設計
(將在program-in-chinese/overview持續改進和更新)
- [一] 相對英文編程語言的直譯, 語法應更接近中文自然語言語法, 並且包含的特殊符號儘量使用數學常用符號. 比如下麵一種設想的語言(歡迎拍磚!), 與Python的二分查找對比.
選擇{}作為函數體邊界, 因為數學定義中常用左大括弧(如下). 暫時沒有想到比添上右大括弧更合適的設計. 至於{}是否允許省略, 傾向於不允許, 以規避歧義. 另一種可能是類似日語編程語言"撫子" - 第三版特色初探, 不用{}而是使用關鍵詞作為結束標誌("直到這裡"之類)
- 縮進量不改變語義, 僅為改進可讀可選: 為避免意外的縮進錯誤導致的語義錯誤
- 用'為'替代==, 為避免誤寫為=導致的無心之失. 在數學中, =的相等意義與賦值更接近. 數學中>, <作為判斷條件使用, 與代碼中意義相同, 適合沿用. 至於'大/小於等於', '不等於', 個人傾向於直接用≥, ≤, ≠符號. 而不用>=, <=, !=. 至少搜狗還算容易打出, 雖然效率挺低. (後得知易語言IDE也會自動將>=格式化為≥)
- 避免//這種數學中沒有的符號, 用'向下取整'是可讀性優先於簡短性
- 數組/列表下標用(), 因為它們其實是索引/下標的函數, 類似Scala設計
- [三] 是否用帶空格設計, 個人認為不用強求(取決於技術可行性). 下麵的語法如果不帶空格, 也許會貌似自然語言而語法不夠自然. 當然歡迎提出不帶空格的示常式序!
- 斷句是否用換行或者特殊符號, 個人傾向於避免引入額外符號
- 調用對象中的方法, 沒有想到比"某實例.某方法(..)"之外的方案, 去掉"."分隔符同樣會有不帶空格設計類似問題, 從而間接添加了方法命名的限制
支持全/半形. 選擇有, 開發環境在編輯源碼時就對源碼自動轉換到一種格式, 或者編譯時自動轉換到一種格式. 個人現在感覺前者更能使源碼格式統一, 但開發環境和編譯器的耦合度恐怕更高. 易語言好像採用前者, 日語編程語言"撫子"-第三版實現初探好像採用後者.
定義 二分查找(數組, 目標) {
左索引 = 0
右索引 = 取長度(數組) - 1
位置 = -1
當 左索引 ≤ 右索引 且 位置 為 -1 {
中索引 = 向下取整((左索引 + 右索引) / 2)
如果 數組(中索引) 為 目標 {
位置 = 中索引
} 否則 {
如果 數組(中索引) > 目標 {
右索引 = 中索引 - 1
} 否則 {
左索引 = 中索引 + 1
}
}
}
返回 位置
}
Python:
def binarySearch(array, key):
left = 0
right = len(array) - 1
res = -1
while left <= right and res == -1:
mid = (left + right) // 2
if array[mid] == key:
res = mid
else:
if array[mid] > key:
right = mid - 1
else:
left = mid + 1
return res
性能
- [一] 為了適合演算法實踐, 代碼的運行能如實反映演算法複雜度
- [二] 絕對性能的優先順序至少在前期不高, 最好做到與主流腳本語言性能在一個量級
開發環境
- [一] 界面是中文
- [一] 所有反饋信息首先有中文版
- [一] 編輯輔助功能: 代碼補全和自動格式化
- [一] 調試功能: 斷點調試
- [一] 完備集成最新的語言和核心庫文檔, 並方便在開發過程中查閱
- [二] 集成定製的輸入法, 為中文代碼輸入進行特殊優化
- [二] 開發環境/語言/核心庫版本都可以在開發環境中直接更新
- [三] 內置代碼版本控制功能
項目開展與維護
- [一] 開源. 除了像M$這樣有歷史積累的公司, 很難想象官方會倚靠一個剛起步的初創公司對這種需要中長期支持的語言/開發環境進行維護. 為了儘快完善語言和工具鏈, 也必需倚靠開源社區的力量.
- [一] 源代碼中儘量以中文命名, 因為目標受眾是中文使用者, 自然開發社區也會以中文母語的開發者為主, 除了開發環境, 語言本身相關工具鏈對外部的依賴即使有也應該可以局限到獨立模塊, 因此中文命名的技術障礙不大.
- [一] 用哪個語言實現, 需要結合功能特性綜合考慮. 一些可能的選項: C#, Java, JavaScript/TypeScript
一些相關討論和參考:
討論: 適合中文用戶的編程語言和IDE, 側重於現有語言/IDE不具備的特性 · Issue #11 · program-in-chinese/overview