1. 程式人生 > >通用型的中文程式語言探討之一: 高考

通用型的中文程式語言探討之一: 高考

在可預見的未來, 高考仍是最重要的也最有社會影響力的人才選拔機制. 很久沒有關注, 最近得知高考自選科目中開始增加了程式設計一項(見如何評價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