03.05 編程語言漫遊


編程語言漫遊


前幾天突發奇想,想做個App,主要是想感受一下互聯網行業火熱的技術氛圍。

在移動互聯網時代,技術更迭如火如塗,你方唱罷我登場,不亦樂乎,有很多我自認為有趣的現象。

比如Java,以前還詬病於它的虛擬機,性能太弱,現在是互聯網技術的中流砥柱,一是硬件速度跟上了,二是JVM虛擬機的性能也越來越好了。而且竟然出現了以JVM為生態的其他語言,如Scala,一種多範式語言,可以優雅地進行函數式編程,又如Kotlin,更優雅的Java,大有取代Java之勢,已經成為Android平臺的官方語言了。

要做App,那就先學習了一下Swift吧!Swift語言本來沒有引起我的注意,這幾年我的注意力在Golang,因為Golang在國內很火,有很多的文章介紹它有趣的特性,比如有垃圾回收、協程,語言簡單優雅,編譯速度快。而Swift似乎沒有聽到有什麼值得注意的特性。

但學習了Swift後發現,其實它啥也不缺, 有垃圾回收,有異步編程,也能函數式編程。按Apple的調性,優雅是自然的了。

對於像我對函數式有魔症的人,自然是要研究一下其函數式編程能力,於是又看了《Swift函數式編程》,什麼函子、單子的,全然看不懂。

我忽然想到,既然對函數式這麼執著,為啥不直接學習一門純函數式的語言呢?於是又“漫遊”到了Haskell。

函數式的語言其實前幾年也接觸過,先是Lisp,後又學習了Scheme,還做了一個小項目。Lisp系語言我其實不太喜歡,畢竟括號太多了。

Haskell號稱是純函數式言語,具有“證明即程序、結論公式即程序類型”的特徵。其實之前我也有學習過Haskell,還看了一本全英文的教程,現在已經沒什麼印象了,估計是沒有看懂,也可能是當時看懂了,沒有實踐,又忘記了。

函數式編程語言出現於上世紀七十年代,現在隨著計算機性能的提升、多核的發展、軟件規模的擴大、軟件複雜度的劇增,函數式語言再度興起,為解決這些問題提供了優美獨特的框架。連Java和C++這種老牌的語言,也都加入了很多函數式的特性,如匿名函數、閉包、柯里化等。用別的語言去學習函數式特性,就好像霧裡看花,隔靴搔癢,又好像是在大街上撿到一個貝殼。如果直接學習純函數式語言,哇,就好像一下子掉到了一個沙灘上,到處是貝殼,而不是在門外窺探而不得其法。於是你就會真正理解惰性求值、柯里化、函子、單子,以及為什麼需要這些特性。

在Haskell漫遊了一番,再回到Swift,發現了SwiftUI這個新發布的SDK。用官方的話說,SwiftUI是一種創新、簡潔的編程方式,通過Swift的強大功能,在所有Apple平臺上構建用戶界面。驚喜於它的一些特性,比如用Swift本身去設計UI,而不是用其他的方法,比如XML等,這也沒有什麼,Qt不也可以嗎?更有趣的是,它是熱加載、熱更新的,即你可以邊該代碼,同時看到修改的效果。

想想吧,Swfit語言,有垃圾回收,有異步編程,有類型推導,有可以熱更新的UI,對於我們用C/C++編程的人,是多大的誘惑?

好吧,這是Apple的生態,於我何干?

其實Swift是開源的,也有Linux版,但SwiftUI是否支持Linux就不知道了。

既然看了這麼多,索性再瞭解一下Flutter。這一兩年也經常聽到Flutter這個詞,但覺得這可能是互聯網和App的技術,自己也用不上。但瞭解以後發現,Flutter遠不至於此。Flutter是基於Dart的UI框架,試圖覆蓋全平臺,包括macOS、iOS、Android、Linux、Fuchsia,對,就是Fuchsia,由Google公司開發的繼Android和Chrome OS之後的第三個系統,Flutter是構建未來的Google Fuchsia應用的主要方式。

Flutter基於Dart,而Dart作為現代編程語言,也擁有現代語言的特質,垃圾回收、異步編程、類型推導等,並且Dart支持JIT和AOT,性能於C++相比也不差。有Google的支持,Dart和Flutter前途一片光明。

更重要的是,Flutter也採用了與SwiftUI相同的技術:熱更新、熱加載。Flutter的熱重載可以讓你快捷方便的試驗、重構UI、添加特性和修復bug。在仿真器、模擬器和ios、android硬件上體驗亞秒級的重載,而不會丟失狀態。最簡單的體驗是,你可以一邊寫代碼,一邊看到界面的變化,這對於傳統的UI編程,幾乎是革命性的。

我們現在使用C++/Qt編程,寫完代碼,要先編譯,才能看到你的設計結果,而C++編譯也是賊慢,在編譯這段時間,你可能去喝杯咖啡,或者看會兒手機。所以,用C++/Qt,設計工作會不斷地被迫中斷,本來半小時的工作,你可能兩個小時才完成。

再想想SwiftUI和Flutter,沒有內存的顧慮,亞秒級編譯,編碼如絲綢般順滑,多麼美妙啊!

有一段時間,大家說想用Python,但Python是動態語言,素有“動態一時爽,維護愁斷腸”的說法。動態語言在大型軟件的維護上,詬病已久。

而現代的編程語言多是靜態類型語言,Golang、Dart、Swift、Scala、Kotlin均是如此,強制的類型檢查,可以將很多錯誤消滅在編譯期,而不是運行時。同時,現代編程語言中又引入了強大的類型推斷機制,為靜態語言帶來了如動態語言般的簡潔。就連C++也引入了auto關鍵字,用於類型推斷,簡化書寫。

前些年,Qt的QML出來的時候,也想著學習一下,但始終沒有真正學起來,因為QML很複雜,首先要學習一門新的聲明式語言QML,還要學習JavaScript,C++也是必須精通的了,三種語言揉合在一起,還有它們之間的交互,想想都複雜。

而SwiftUI和Flutter沒有這樣的問題,SwiftUI只使用Swift,業務和UI均用Swift,而Flutter只使用Dart,業務和UI都可以使用Dart,所以會簡化很多事情。Swift語言和Dart語言為了更好地設計UI也做了許多適應性改造,讓UI設計更加優雅,畢竟Swift和SwiftUI都是Apple的,Dart和Flutter都是Google的,可以無間的合作,創造出革命性的產品。

SwiftUI和Flutter,遙相呼應,異曲同工,可能代表了UI技術發展的方向,未來可期!也會給其他編程語言帶來借鑑和衝擊,也期待著可以在像我們這樣的傳統行業中引起些許波瀾。


分享到:


相關文章: