Malt開發實錄(一)不斷改變的設計

我開了個新系列(沒錯以前的系列爛尾了,心情好再寫)

看名字就知道,講的是Malt的開發過程

但事實上正式的Malt第一版還沒有發布

這涉及到以下幾點原因

  • 設計目標及方向幾經改動
  • 之前的代碼寫得太糟糕了,重構之
  • 換實現語言
  • 以及最重要的原因——Lazy

所以這就是Malt跳票了半年多的原因

當然我說這麼多並不是為了給我找借口(廢話,你看我這不來發文章了嘛),換言之,寫文章的目的就是督促自己勤快點,早日寫完malt,然後開新坑/逃

開個玩笑,Malt我肯定要長期維護的

咳咳,好了,廢話說這麼多,現在開始咱們的正題

Malt的設計變遷

最初的設計

剛開始的時候,Malt在我的設想中應該是個完美的語言

應該是什麼樣子的呢:

  • 支持函數式,過程式,面向對象編程範式(當然到後來又變成了純函數式)
  • Mark-Delete辣雞回收
  • 動態語言(類Lisp、Python),但支持類型約束
  • 一切皆為函數(哪怕是個Number都是個返回self的函數,沒錯我當時就有這麼極端)
  • 一切皆為對象
  • 語法像commonlisp那樣「完美」

<!-- 不存在的 -->

後來(應該說是現在,中間省略)

因為某些事情,我改變了想法

我認為:簡潔為主,實用為基本,健壯性至上

我不需要寫個拳打java,腳踢Python的語言出來

我只需要實現一個我自認為能用,好用的東西出來就行了

不管是對於運行時實現者還是Maltlang用戶,只要寫起來舒服就好

對象模型:

不再是『一切皆為對象』

我將Maltlang的內置類型分為了兩類:

一類是簡單數據類型

什麼意思呢?這是指一個變數能表示下的類型

另一類則是複雜數據類型

這是指無法由一個變數所表示出的類型

換言之:像Bool,Number,Char之類的類型我們直接設計為值類型

而像String, Tuple, Lisp, Map這一類的複雜數據類型我們設計為引用類型

這樣有一個好處,就是降低複雜度,同時避免大量小對象創建所造成的開銷

【這是代碼,因為知乎的代碼編輯器和渲染器太辣雞了,所以我待會傳圖上來,RNM】

同時,Malt取消了原本設計中的用戶Class,因為用不著,這種設計已經夠用了,大不了用map模擬Class和Object

因為如果追求完美保證一致性的話所有內置對象都要套一層Class對象

垃圾回收:

由原本的Mark-Delete變為了Reference count

咱這可不是在抽風

首先,Reference count在無數次實踐中證明了是一種非常有效的方案

例如com技術(聽說過),Python的GC演算法之一,Rust對象所有權管理策略,C++智能指針等

另外咱們後來的目標為簡潔為主,盡量輕量級,所以我們不必採用可能會導致Stop on worldMark-Delete演算法,畢竟從Root Object Set一個個遍歷不管怎麼優化還是很消時間的啊,從整體來講,RC的即時回收無非是把挨個遍歷的時間給鋪平了而已

當然,我說這麼多,無非是這個原因——我懶,我不想做,反正現在這麼多用RC的玩意都工作的好好的,只要不亂搞應該沒事

當然,就算我巧舌如簧也不能改變一個事實——循環引用

a = []b = [a]a.append(b)# 不用看了,沒有高亮的,我寫的時候就沒有,知乎的CodeEdit就是這麼辣雞

這段代碼在Python的某個版本之前(我忘了)會造成內存泄漏,Python為了解決這個問題才引入了mark-delete

至於Malt。。。你看我這麼懶像是會解決這種問題的人嘛/逃

這個時候就體現出了Malt設計簡單的原因了,因為足夠簡單,所以很容易能察覺出對象循環引用的問題(就算察覺不出我也有靜態分析器和動態分析器(別捉急,會有的)),所以這個問題應該是很好規避的啦

好了,咱這個系列的第一章就寫到這裡,有空我看如果漏了點什麼我再加上,現在先碎覺去了,好睏


推薦閱讀:

要獲得「機器學習或數據科學」的工作,到底選哪種編程語言更好?
關於Vert.x的冷知識
多維度分析2017年最熱門的編程語言

TAG:編程語言 | ProgrammingLanguage |