终极编程语言的面貌(版本号:2018-04-13)


#1
                      道( TAO )

                    by---道士( Taoist )

我理想中的编程语言的语法应该有类似下面的特性:

最明白易懂,

最对身体有益,

最容易辨识,

输入成本不高,

其他条件不是人脑考虑的事情(比如性能),所以也许它将是手工编程的终极形式的某些体现。

使用颜色/ Unicode字符编程意味着使用颜色/ Unicode字符来设置函数/变量的范围。
Programming with color/Unicode characters means using color/Unicode characters
to set the scope of functions/variables.

不废话,先来段代码:

e706b1ef9e8d727f7184288c4301b25733280be3

难道就搞不出比这更明显的冒号了吗?不然赋值符只能用“=”

box1.Put_Item


我们可以用颜色或带修饰的字母和unicode特殊符号,继续精细格式化语法成分。 比如我随便归类一下:

局部变量名 黑或白;

  • 类 名 : 全大写 且 >=2(个字母),

    模块名 : 全大写 且 >=2(个字母)且 首字母或单词带修饰符或尾部以特殊符号结尾,

    常量: 全大写字母且字母具有修饰符 或 名称以特殊符号结尾 或 有特殊颜色

    变量名: 不允许有大写字母, 函数名 : 首字母大写

    1. 局部变量:黑色或白色

      全局变量:字母具有修饰符 或 名称以特殊符号结尾 或 有特殊颜色

      实例函数名称 / 实例变量名称 :同颜色(非黑色/白色)

      类函数名称 / 类变量名称 :同颜色(非黑色/白色)

    2. 变量颜色(统一用冷色调或暖色调):局部变量-黑或白,实例变量-某种排它色,类变量-某种排它色

                              全局变量-字母具有修饰符 或 名称以特殊符号结尾 或 有特殊颜色
      

      函数颜色(统一用冷色调或暖色调):实例函数-某种排它色 , 类函数-某种排它色 ,私有函数-某种排它色

  • 属性名称结构若与其他函数名称无区别也行(因为属再英语语法上都使用名词性成分,基本可辨识);
    再名称结构用特殊符号作为结尾就更容易区别

  • 散列:和数组一样有索引,键名用特定颜色表示,方便作为参数区别局部变量

  • 数学符号:和数学教科书中的符号一模一样。

  • 复合数据的类型下标:从1开始。从1开始。从1开始。

  • 循环语句: 条件中可不设定变量(由语言默认指定),用 箭头符号 递增/递减等。如:初始值3递增道100

    for 3 ↑ 100 { # 变量 a 初始值 3 } 或 for 3 → 100 { … },还可用:arrow_up_down: :left_right_arrow:等符号表示不同的循环方式(方便写算法)

  • 逻辑符: 或( / ) ,与( ;)

  • 基于本文内容构建的新编程语言,由于要在命令行输入代码,所以至少要编写一套颜色语法

    (否则只能基于“上修饰符字母/下修饰符字母/上下修饰符字母/普通字母构建语法”)

    而该新编程语言相应的IDE程序,应当允许编程用户有自行设定 【颜色-作用域】 配对权限。

  • 所有的特殊符号都将只有唯一的功能;保证在编程时尽可能少的用到空格键。因此需要从新设计编程字符。

    令所许多特殊编程符号的长度足够大,留白足够多。因为我们打算在用特殊符号连接两个语法成分时,

    无需敲入空格键(例如书写“a : b + c”和"a.b"时两者都不需要空格键。)

  • 类/模块等语法成分在外形的结构上具有排他性,程序和人都能辨识它们,所以不需要人为的设定“颜色语法”

(加不加颜色都可以)

  • 颜色输入: 编写一个输入法程序,类似中文的拼音输入法。 用户在输入作为函数名/变量名的单词后,
    会显示一个具有编号和最终名称的选项框, 用户通过键盘中的数字键或者通过L_SHIFT键切换选项。
    按L_SHIFT键,提示窗口中只有不同作用域的变量名称/散列键名称的选项,连击L_SHIFT键循环切换选项;
    按R_SHIFT键,提示窗口中只有不同作用域的函数名称的选项,连击R_SHIFT键循环切换选项。
    按任意特殊符号键输入所选内容或按特定键选择内容取决于符号在语言中是否能作为名称。

  • 符号的输入 : 敲击键盘中某个符号键,出现选项提示窗口,敲击用户打算输入的下一个字符选择第一个选项。
    按L_SHIFT键,在最常用符号选项之间循环切换; 按R_SHIFT键,在较少用的符号选项之间循环切换;
    主键盘区域有11个纯符号键,10个数字/符号键。 假设左右shift各分配4个选项,那么就有74符号可选,
    中文全角的符号可在切换中文输入法后输入,于是可输入符号不只74个
    快捷键:
    L_SHIFT , R_SHIFT , L_SHIFT + 空格 , L_SHIFT +j , L_SHIFT + u, L_SHIFT + k,

     L_SHIFT + R_SHIFT,  L_SHIFT + n,     L_SHIFT + m,   L_SHIFT (按两下), 
    
     L_SHIFT + h,         R_SHIFT + 空格 , R_SHIFT(按两下),   F5。
    
  • 颜色/unicode字符编程还有另一种呈现方式: 变量名首字母大写,函数名不能有大写字母。
    也许这种方式在辨识度上要好于上例。 效果如下:


20180411-2


备注:
本文中用颜色进行编程的想法来源于sublime编辑器,感谢sublime作者。
但sublime和其他IDE/编辑器一样只是依据关键词对语法成分进行上色提高辨识度,
并不是用颜色进行编程。 谢谢sublime和其他编辑器/IDE。


#3

(這兩天去北京一趟,今天才回文)

我 … 認真的一點回你好了

如果你去唸一下編譯器 / 語法分析器( syntactic analysis / parsing )之類的,就會知道為何有其嚴格定義,且不能混淆

再來就是為何都是英文,原因是你玩很多 VM 可能都不支援 UTF-8,且你的上下左右的全形該怎樣在 vim 內輸入?如果不安裝任何東西的情況下,最後一根稻草應該是你的語法分析器也需要支援 UTF-8 才行 … 且照上面來玩,你的保留字應該會過多 … 保留字過多全等於踩雷機率也會很多|||

然而如果 L_SHIFT & R_SHIFT 你都用了,那麼你應該只能在本機使用,因為 SSH 之類的我記得都只有單一 SHIFT 訊號 … 甚至沒有||| (因為你輸入 “A” 就直接傳出 0x41 即可,為啥還要輸出 shift + ‘a’ 兩個訊號?且你還要送 shift 鍵的按下和釋放才行||| 封包丟了應該會打成四不像唄|||)

然後 … Ruby 是動態語言,除非完整 trace 否則你不知道其根源是啥(靜態語言類似 go / java / c++ 之類的才做得到,簡單的來說)

abc

請問這是啥?可能是

abc = 123
abc = Class
def abc ; end

Abc = 123
def Bcd ; end
class Cde ; end

ABC = 123
class BCD ; end
def CDE ; end

以上全部正確 … 因為常數只有開頭大寫限制而已,動態語言系列是編譯時才宣告,所以顏色如何判定成來源?(我是看過有的 IDE 會追啦,但追到後面大都先掛給你看|||或是慢到你不想用之類的)

甚至你說的 emoji 系列,之前有個 Ruby 笑話好像這樣寫的(以下是正規寫法)

class Fish
  def self.🔪
    return '🍣'
  end
end
🐟 = Fish

🐟.🔪 #=> "🍣"

anyway 我沒想拒絕你的空想,但程式語言必須非常明確才行,而你也才能看見類似『Ruby 受到 Smalltalk / Perl 影響』的介紹語句才是,簡單的來說都是"繼承"其明確且增加其活性,而非空想到最後發生特例時 … 無法收尾的好

而原文你的一些擴充性當然也可以實作,類似你說的

for 3 → 100 { … }

沒那麼麻煩,只需要

class Integer
  alias → :upto
end
3.→ 40 do |i| puts i ; end
3.→(40){|i|puts i}

Ruby 其實很自由,但 … 你要照規則來才行,而你也可以使用 Ruby 的規則來創造屬於你自己的二次語言?而不是重新寫一個 (( 有空你應該可以去看看 Ruby 的 C code

最後為何要用 = 而非全形的: … 如同我上面所說,你混淆了,或是會讓別人混淆

puts true ? "Hi" : "No"
puts true ? "Hi" : "No"

abc = 123
abc : 123
abc : 123

這是三元判斷式與替換 = 為 :,請你半秒內回答其差異且選擇正確的那個,如果改了冒號之後 … 這就是我上面說的明確哩 … 然而,你知道 Unicode 內定義了多少冒號嗎?

https://unicode-search.net/unicode-namesearch.pl?term=COLON

大約 20 多個唄,而你說的箭頭

https://unicode-search.net/unicode-namesearch.pl?term=ARROW

高達 100 個以上 … okay 回到你的原文,再想想唄?如果 “一ㄧ-__i|l1” 都很難分得清時 … 請你再想想唄

最後的最後,如果你把 UTF-8 加入保留字內後,你的文字是無法上下對齊的

https://unicode-search.net/unicode-namesearch.pl?term=SPACE

當連空白都有不同寬度,甚至還有一個 『ZERO WIDTH SPACE』 時,更別說其他字符在不同字型上面的表現 … 把這些當作 spec 我會感覺你在開玩笑就是 …


#4
编程行为只能发生在特定的编程环境之下。 一台电脑有输入自造字体的能力。
首先,这套语法规则通过翻译必然是能被编程环境解析。我在文中提到“unicode”的目的仅是提示各位去unicode里挑选外形上易于辨识的图形符号(也包括26个字母以外的拉丁符号 或 中文中的简单字体比如“田”等), 这些非“键盘字面量”的符号只用于语法,每一个非英文字母在语法中只有唯一的功能,我在文中说的符号数量,是表示编程专用输入法输出自造/unicode字符的能力巨大(这倒是让我意识到文中输入法解释中没有谈及带修饰符的英文字母的输入方式,但有那么多快捷键不说也罢,实现方式参照文中的输入方式)
其二,非英文字母一个用途是作为变量/函数名称的后缀,目的是表明其作用域。另一个用途是构成独立的语法成分,比如+号只用于运算加法(所以函数调用符和数字小数点在表现和底层代码上都是不一样的)。
其三,某个未来的编程语言的作者可以将首字母带修饰符的单词或全部字母带修饰符的单词作为变量/函数的名称。 
最后,后台自然有相应的代码进行解析。无论这种解析要经过几道流程, 把颜色/非键盘字面量符号用于编程语言的语法是绝对可以实现的。   即便将来每台电脑只认ascii码,语言开发者也可以先将非ascii码转换为ASCII码,再解释其词法和语法变成另一门底层语言。

#5

首先 … 類似 JavaScript 有支援 『箭頭函式運算式(arrow function expression)』而 Ruby 有 lambda function 他們大概長這樣的

x => y.func // JavaScript 快速創造 anonymous function,等同 function( ... ){ ...}
succ = -> (x){|i| puts i} # Ruby 快速創造 lambda 等同於 lambda{ ... }

所以你回去看你的 unicode 的部份的箭頭,與你補述的部分(unicode => ascii)部分,是否別人已經完成了

包括你想用的"田"字,是否可以打成

[+]

即可,按鍵還比你輸入 unicode 少,還全世界通用,嘛 … 所以人家那樣設計不是沒道理的啦|||,而且你現在設計的是語言的 spec,其實就是保留字的部分 … 然而卻說用得"很少" … 我感覺這是開玩笑就是(簡單的來說你再改的部分就是中英文的 『this / is / 這 / 是 / 的』改成別的字,也基本上就是語言的根本 … 你可以分析一下有多少的量才是?)

再來,設計程式語言最偉大的並不是設計出來,而是"取得認同",包括所有的 linux distribution 都一樣,當你沒看透這點忙碌下去都是做白工的 … 所以一開始要找小的 group 討論,發行 alpha 測試, open source 出來讓別人檢視,這和 kickstarter 之類的募資平台完全相同,因為開發需要非常多的人力,而你需要吸收非常多的開發者來協助開發,尋找 bug,被人 fight,被人 challenge,被人驗證,然後開創新的遊樂園,來讓玩的人開心,進而自發性的想要對外宣傳,進而變成教徒,所以設計一直都很簡單,但 … 你應該少看了後面那一大段,在我的眼光看來都是自 high 就是,至少和我腦中的許多東西衝突到 … 不過相同的,我其實沒有想阻礙你空想或進行實作的限制,而是單純把後面那邊解釋完,而非你徒勞了很久才領悟唄?

再來,回應這篇的主題:『终极编程语言的面貌』,其實對於我而言你的東西太粗淺了,只是修改非常表象的東西,而非對本質的提升,如果你比對 Perl / Ruby / Crystal / Python / C / Go / Erlang / Java,每個學兩個月,看懂其中心思想與想解決的問題時,就會知道每個語言表象其實不是必要點,而是真正想解決的問題就是,如果解決的問題能得到飛躍性的提升,則他再難寫,都有人用的,因為大家需要其優點,類似最近大家都在推的 Erlang 的 Elixir ((好啦我是 Go 派的哈哈))

然而另外一方面,同你主題,我心中的『终极编程语言的面貌』目前還沒出現,我需要的介面也還沒有 … 我所想得到的需要類似"攻殼機動隊"插腦袋的全息影像與 AI 解析介面,必須完全潛行,之後才能將思緒分散,並將思緒寫成程式,否則你的行為只能局限於你眼前的鍵盤上,與你個人,然而如果思緒能變成一種語言,這世界就沒有語言的隔閡,且可以欣賞到任何一個美景,任何一種感動,則人類的邊界才能打破,宗教/性別/語言/膚色 … 這些不再是圍籬時,也才會世界大同 … 這不是比較有趣嗎?

每個世代的人都感覺上一個世代的東西是包袱,守舊,但嘗試改革後在下一代就會相同感覺,然後 loop,這就是繁衍的本質,沒有對錯可言,但改進前建議先看一下為什麼前人這樣選擇,否則人生苦短,踩坑花時間還沒經驗值,就別做了唄,否則機會成本會無限增加,然而花費生命真的有意義時,就開始找夥伴唄,如同這邊一樣,我也在找一同前進的夥伴不是?