
??
\;
??
\;
??
\;
之前作業的總結
現在在做的zhangqi-lang和之前的suatin-lang有很大不同,主要是構造AST的方法,
一,suatin-lang構造AST的方法是,一開始遇到了字符放在根節點,后面來的
字符,判斷其型別,再判斷根節點型別,然后更改已有的AST,把
新的節點加入——
這種方法讓我寫了兩三千行!!!
二,zhangqi-lang構造AST的方法是使用編譯原理的知識,通過簡易的文法,
消除左遞回,
自頂向下——這種方法只寫了四百行就解決了!!!
但是,suatin-lang是運行在AST上的,通過每個節點的三個解釋介面呼叫,
virtual double interpret(); //五則運算
virtual std::string interpret_str(); //字串拼接
virtual bool interpret_bool(); //布爾運算
按照DLR的方法運行,所以做的作業比zhangqi-lang多多了,再者,一開始沒有經驗
很多需要總結成小函式的塊都留到最后,但是我并沒有做到最后……
suatin-lang的資料型別只有double,bool,string三種,對應三個解釋介面,
release編譯后 的速度是100萬的數的空for回圈運行一秒,
zhangqi-lang的基本資料型別有int,float,double,bool,string,complex等,之后還要加幾個,
復雜資料型別有范圍,陣列,字典,函式,列舉,類,執行緒等,這些都很有挑戰性,
因為暫時事情太多太復雜,沒辦法考慮運行,所以除了構造AST,
其他的作業暫時都不做了,
??
\;
累了
現在還在制作AST,我已經不想做下去了,還是沒有成就感,悻悻苦苦做的AST也沒太大作用,
因為我累了,關于變數池、區域變數、作用域、模塊、執行緒、類、
零成本物件(沒用到的代碼絕對不付出任何代價)、
虛擬機(這才是大BOSS)、
位元組碼(現在還看不懂,該如何設計自己的位元組碼)、x86、jit、
LLVM(LLVM IR好復雜)、兩語言問題、
不提供捕獲例外(所有錯誤都能找到源頭或者列印到日志)、
多種字串問題、中文、Unicode、像Gua語言一樣開輔導班?、
大數運算問題、復數、矩陣、協程、標準庫、
支持嵌入式、支持GUI、支持跨語言呼叫、
支持元編程(代碼更改代碼,不知道什么意思)、
支持web?(開什么玩笑,web我什么工程都沒做過好嗎,就學了點
jsp和javascript)
?? \;
文法的作用?
【zhangqi-lang】【9】文法設計
statement := ( vardef_stat | assign_expr |
expression | funccall | return_stat | del_stat
)
endstat |
'break'|'exit'|'next'|'redo'|'reloop'|'reboot'
在制作AST的程序中,我發現我寫的函式,和其中運行的邏輯順序,和文法的一些
產生式很像,我并不是對應著文法寫的,但是寫著寫著就讓我感覺能不能直接
在設計的時候就把文法中的符號寫成Parser中的小函式呢,按照文法的邏輯相互呼叫,
然后再填入處理代碼——
很可惜,這種想法有點問題,的確Parser和文法相似,但是不一樣,不能直接寫成文法的邏輯,
一些產生式在從左往右推導的時候,一開始遇到的符號不是唯一的,沒辦法確定候選式,
所以,寫下的文法,需要被修改,按照什么LL(1),即最多peak一個符號就
能確定候選式——zhangqi-lang現在的專案,在詞法分析階段就要向后
peak兩個char,AST時,還需要向前peak一個token
但是,這么多產生式,想消除左遞回真的很難,有間接左遞回可能消不掉,
??
\;
計劃
我不想開源了,沒用!大家都只是來找找自己需要的,沒人關心這個語言是否
能推廣,這可不行,我需要制作一個能推廣出去的語言,它需要很方便使用,
很方便用來替代如matlab、ruby、lua等語言做事,
意思是一能包含別人的優點,二是自己使用特別方便——
比如放入U盤,插入電腦
后對檔案進行一些操作——這種基本需求當然需要滿足,做做小病毒這種,
如果能替代c語言做嵌入式就好了,編譯成.hex檔案——說到這,我想到了一種
編譯技術,即物件這種功能不應該是一個運行累贅,無論有沒有使用物件,
運行效率一樣,即使用了物件也會程序變成一樣快!!!
再比如替代scratch,我真想偷它一點用戶,如果能用我的語言替代scratch的話,
那么,就可以出現這種情況:
一些人使用簡單的mylang寫的代碼,就實作了scratch代碼復雜的操作,在小孩子面前炫耀一番,
- 可能有人覺得這些用途不算事,但是為了推廣,我不管三七二十一了,一條路走到黑,什么偏僻的要求都需要實作!!!(有點夸張)
替代ruby的元編程功能,即代碼很容易對代碼進行更改
替代javascipt的DOM功能,即對HTML的AST樹結點進行處理
替代python的檔案處理,還開什么培訓班,語言層面直接給你把問題都封裝
好了,對于使用者而已,提供一個客戶端軟體,,,等等,那跟語言有什么關系,
他們為什么不去下載檔案批量處理的軟體,而是要去學python???
不管了
??
\;
事實
過一段時間,我就鼓勵自己一下,做一會兒夢,雖然我真的希望推廣自己的
語言,但是最重要是為了鼓勵自己繼續——
群里實作了編程語言的人很多,大家都學會了,但是為什么大家都沒有推廣
自己的語言,編譯原理的知識,不用的話很快就忘了,學了這些,我真希望
自己能做點什么,不是簡簡單單做個字串處理器、計算器,我希望改變一些
東西,希望這個世界因為我而改變一點點,
你也許做了一個編譯器,寫了篇文章吹噓了一下,或者寫了一本沒用的書,
把代碼騰上去,但是不覺得有點問題嗎?和以前的BASIC編譯器相比,
自己明明也做了這么多努力,但是,一切并沒有改變,就像徒勞一樣,
我也買過6本的編譯器的書籍,最討厭的書就是日本人寫的,什么
《兩周做一個腳本語言》——其實第三天就開始使用一個不知道哪里來
的Parser庫,代碼部分沒有注釋,非代碼部分全是各種聊天,比如
作者:兩個月寫完一本書怎么可能呢?
前輩:我的書寫了兩個月才寫完真是不好意思,
作者:原來真的有人兩個月內能寫完啊!
《松本行弘:編程語言的設計與實作》——使用了yacc和lex之類的工具,文章
內容就是如何使用工具
明白我想說什么嗎?
不明白吧!
我不想罵這些人,看不懂應該是我自己的問題,我只是說,你也可以把自己的
代碼騰上去,編纂成書,也許能提高知名度呢?
為什么?
因為比起你自己做了一個語言,還是牛人又做了一個語言的知名度廣對吧!
比如各種古怪的編程語言介紹,遠遠比你寫一篇介紹自己做了一個語言火,
更有甚者,實作了某個語言的人,實作了另一個古怪的語言,那么人的知名度
高了,世界的鑰匙開始掌握在手中了!!!
?? \;
做一個古怪的編程語言
大家都會有的一個想法就是符號替換,把已有的語言替換一下變成另一個,
一眼看不出來,比如替換成表情包、替換成wWoO奇怪的字符等,但這太low了
就不說了,
第二種,就是使用簡單的符號,設計特殊的規則,很多都是這種,基本只有一個
列印字串的功能,
20 種最奇怪的編程語言
第三種,跨越維度,有一種Piet語言,不是編譯文本,而是編譯圖片,通過更改
一張圖片的各個位置的像素來編程,其實也只能列印字串,

另外一種Befunge
語言,也是編譯文本,但是順序不一定是從左往右,而是根據 <> v ^ 四種
符號,來更改指令指標的運行方向,比如列印hello,world
> v
v ,,,,,"Hello"<
>48*, v
v,,,,,,"World!"<
>25*,@
在目前,這是我覺得最酷的語言——但是
我并不急于也去做一個這樣的,多多思考,應該有更酷的!!!
先做個這樣的語言,打響知名度,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/259424.html
標籤:其他
上一篇:程式員的情人節應該這么優雅度過
下一篇:耐得住寂寞,守得住繁華
