隨手扎
JShell? 程式語言越來越像Lisp
JShell
JShell是在JAVA 9之後引入進來。 我是在翻JAVA 12(OpenJDK)工具的時後看到的,雖然好像長期支援(LTS)版本是JAVA 11… 算了,反正目前系統裝有JAVA 8(1.8)和手動下載的JAVA 12。
每個版本之前是有差異的。同樣都是編譯成class檔案,但在不同JRE下可能無法執行。上學期就有學弟妹來問,結果A編譯的B不能執行,只能由B來編譯分享給A。(向後兼容)
TK 之後再來說些這幾天看了幾個開源專案後對於這版本的事情的想法。
現在說回來 JShell。
什麼是JShell?就是JAVA Shell,也就是JAVA環境下的REPL。簡單說,直接給JAVA Code,就會直接返回值到環境中。
舉例來說,在JAVA 12的bin資料夾有jshell的可執行檔案,執行後就會進入一個類似Python或是Node.js的環境,或者說是shell、CMD下的環境。
(BTW, 我一開始還以爲是跨平臺的shell工具…是跨平臺沒錯,不過又要JAVA的語法和class,超不好用的吧)
在這個環境下,輸入合法的JAVA程式碼,會立刻執行,甚至無需定義Main Class。像是輸入(甚至連結尾分號都不用):
System.out.println("Hello")
就會像下面結果:
| Welcome to JShell -- Version 12
| For an introduction type: /help intro
S
jshell> System.out.println("Hello")
Hello
jshell>
目前來說JShell還有一些限制,不過這也意味著未來JAVA Code可能可以直接執行,甚至不需要寫Main Class。就跟Python一樣。
這讓我想到之前看過一篇文章在說"爲什麼現在語言越來越接近Lisp?",文章我可能還要翻翻看找不找的到。不過Lisp作爲世界上第二古老的高級程式語言。 早早就有了記憶體自動回收(GC)、自動型別判斷、Lambda、REPL等等這些幾乎是這幾年程式語言分分新增的特色功能。而文章最後認爲,程式語言寫到最後,都會完成半個LISP。
TK (所以說爲什麼不直接用LISP,之後再來分享我的看法XD)
最近,因爲區塊鏈的關係,也再弄C++11。C++我不是第一次學,可是C++11/14給我感覺還真不是同一個東西(C++也太大的學不完,只能說C++11把C++變得更大)。雖然C++11有些非常好用的特性, 像是自動型別推斷(auto)、匿名函式(lambda, JAVA 8的時後引入,同樣也是LISP這類型函式型語言的原本功能)。 寫C++11會有點不像是在寫傳統的靜態型別語言(有些物件原本的設計已經夠厲害了,而現在更把更多工作丟給編譯器)。
雖然直譯、編譯並不是看語言,但是以一個以物件導向爲賣點的語言JAVA,竟然官方開始走的越來越以過去不同,越來越像LISP。恩,怎麼說,在JAVA 8的Lambda已經有點吃驚,現在JAVA 9, 11,12幾乎側底讓我對JAVA改觀。
- Python的generator爆紅?(LISP很早也有類似做法closure)
- JAVA 8 引入Labmda(
()->{}
); - JAVA 9 有了JShell
- C++11 有
for(auto a : iterator){}
的寫法(就是for-each)。 - C++11 有
[]()->int{};
的匿名函式 - C++11 進化template的寫法(動態語言不會有template或Generic是的問題,BTW Common-Lisp是可以宣告型別的)
- C++11 多了move(可能像是Rust裏的borrow?)
FX,匿名函式寫法各自不同,再重新整理這些新特性的時後,一直想到EMCAScript的箭頭表達式(()=>{}
)。另外就是C/C++其實也是存在直譯器,有些還實現的還不錯。而Python、Node.js在追求exe(ex:Pyinstaller)。在LISP的規範中早就能有直譯、byte-code、native-code(依賴實現,不過Common-Lisp的標準HyperSpec,有明確的函式是compile和compile-file,反倒是要強制做記憶體回收,就幾乎完全依賴實現有沒有提供了)。可以參考下圖:
備註:圖片接取自ECL文件。
LINE Pay贊助 信用卡小額贊助