Swift 會不會取代 Objective-C?

說到 Swift 會不會完全取代 Objective-C,目前看起來是,在 iOS 8 推出之後,應該不少應用程式會使用 Swift 開發,但是 Framework 這一層還是要用 Objective-C 來寫。

我們還是要回來看 Objective-C 與 Swift 的 run time 是怎麼實作的。無論是在 Objective-C 或 Swift 中,一個 class 有哪些 method,都是儲存在 virtual method table (以下簡稱 vtable)中,但是實作方式不一樣。

Objective-C 的 vtable 是個像是 dictionary 的實作,table 中每一筆資料都是 C 字串當 key(又稱 selector),對應到相對的 C Function pointer,所以每次呼叫某個 Objective-C 物件的某個 method,就是透過一個叫做 objc_msgSend 的 function,在表格中根據字串當 key,尋找對應該執行的 function—如果找不到,還會去問這個 Class 是否有實作 forwardInvocation: 這個 method,還是沒有的話,就會丟出找不到 method 的 exception,這部份可以參考蘋果自己的官方文件

至於 Swift 的 vtable 則是一個 array,對某個物件呼叫某個 method 時,相當於要求執行這個 function array 當中的第幾個 function(參見 Mike Ash 的文章)。

如此就會造成以下影響:在 Swift 中,尋找要呼叫的 method 的速度,理論上就會比 Objective-C 來得快,因此同樣功能的程式,用 Swfit 寫,整體上應該會比用 Objective-C 來得快。但同時,Swift 的 vtable 中每個 function 的順序就不能改變,在編譯的時候,vatble 裡頭是什麼順序,在執行的時候就得要是什麼順序,如果是執行的時候載入了不同的 runtime,順序不對,那就會呼叫到錯誤的 function。

蘋果是怎麼確保 compile 時用到的 runtime 與執行時的 runtime 是同一份呢?就是,在編譯應用程式的時候,Xcode 會自動把一份 Swift runtime 複製到應用程式的 bundle 中;所以,你的裝置中有多少個 Swift 應用程式,就會有多少份 Swift runtime。Swift 的 runtime 本身不大,這麼做還沒什麼問題,但是你寫一個 iOS 應用程式還會用到 Foundation、UIKit…一大堆的 Framework,如果要把每個 Framework 都複製一份,聽起來就很不對,照裡說不會換成 Swift 才對,Objective-C 當初用字串當 key,某方面來看,也就是為了處理像 DLL Hell 這樣的問題。

外部開發者比較沒有機會寫到比較底層的 Framework,如果只是寫一個 iOS 應用程式的話,按照蘋果的宣稱,全都用 Swift 寫看來不是什麼問題。

而在 iOS 8 之後,蘋果也終於開放在應用程式 bundle 中,放置自己寫的、或別人包好的 Framework(Mac OS X 從一開始就開放了)。如果是自己寫的 Framework,而且這個 Framework 與主要應用程式的 Target 是在同一個 Xcode project 中,跟著主應用程式 Target 一起編譯,那應該還不會有什麼問題,但如果用的是別人已經編譯好的 Framrwork,那就相當危險—你不能夠保證別人的這個 Framework,與你現在的開發環境用的是同一個版本的 Swift runtime。

iOS 8 同時也開放了一些系統 extension,這些 extension 感覺起來原理就是 Mac OS X 上的 plug-in bundle,透過 dynamic loading 讀入外部的 library。感覺起來 extension 用 Swift 寫似乎也頂危險的—一個應用程式載入一堆 plug-in,每個 plug-in 可能相依於不同的 Swift runtime,看起來就會出亂子。不過目前還沒看到蘋果自己在這方面有什麼文件。

ATAT

ATAT

買了一台 ATAT 的樂高積木,放在辦公室裡。

ATAT 實在是整個《星際大戰》系列,甚至是我所看過的所有科幻作品中,最引人入勝的機械設定之一。整個機體的設定真是何等的荒謬,而就是 ATAT 的荒謬,使得 ATAT 如此讓人著迷。

在脆弱、修長的四肢上,是巨大笨重的軀體,裡頭裝載了複製人雜魚大軍。明明就是毫不堅實、搖搖欲墜的基礎,偏偏又要弄得異常高大,只要破壞其中一隻腳,立刻再起不能、失去作戰能力。ATAT 的四肢脆弱就罷了,作為運兵用途的機械,關節居然被設計成完全無法轉向,開始走動之後,就只能夠直線前進;搭配遲鈍的移動速度,把 ATAT 送上戰場之後,就是單調、不知變通地一路緩慢亂衝一陣,最後重重地、狠狠地摔落地面。這樣的機械設計出來,根本就是讓官兵趕著送死。

只能夠直線前進,我們還需要駕駛做什麼呢?頭部的駕駛艙到底有什麼作用呢?頸部的關節倒是可動的,我們可以讓當頭的東擺西擺,但不管頭怎麼擺、頭打算晃到哪個方向,腳就是無法改變方向,腳就是這麼脆弱,完全不會改變緩慢向前直線前進最後摔倒送命這種命運。

頭到底還可以做些什麼呢?你看到了那幾門砲管,於是恍然大悟—是了,是嘴砲。ATAT 左邊有一門嘴砲,右邊有一門嘴砲,下巴還有兩門嘴砲,這玩意有好多嘴砲。

這樣的東西擺在辦公室裡,實在太合適了。

Swift

來講講從今年 WWDC 之後,到目前為止練習 Swift 語言的心得。

想想其實蘋果推出一門新語言其實並不奇怪。雖然對許多人來說,是最近幾年才開始學 Objective-C,但是 Objective-C 算一算已經有三十多年的歷史,而三十年過去,自然不少人會看到這門語言的缺陷。

Continue reading

有人問我 Design Pattern

我說,Design Pattern 對軟體工程師而言,就像是在格鬥電玩裡頭所謂的「連續技」(Combo)那樣的東西。

你學會了開發工具的操作與程式語言,像是學會了如何使用搖桿上每個按鈕的功能,你開始接觸函式庫,像是選擇了要使用的角色,你學會某個函式如何使用,就像是學會了某個招式。

接下來,你發現將某些招式組合起來,可以發揮更大的威力,像是,如果你玩格鬥天王系列,就知道如果讓草薙京把對手踢到空中的時候,就可以施展大蛇薙,這,我們稱之為連續技;如果你平常就熟練這些連續技,又清楚出招的時機,經常可以有效傷害對方,取得不錯的成績。

Design Pattern 就是這些年來許多軟體工程師所整理出來,在某些情況下,你可以如何用某些方式組合函式與物件之間的關係,並且給了這些關係特定的名字,讓在你日復一日的開發工作中,在遇到某些類似的時機可以用上,而且提供了一套現成的詞彙,方便你說明你做了什麼,或是打算怎麼做某個東西。

有人問我會不會注重、應不應該注重 Design Pattern,這個問題實在有點奇妙…我還沒有看過多少人玩格鬥電玩不練連續技,但也沒有看到有人每次在對戰中,都非要把某套連續技施展出來不可。

Continue reading

台灣最有競爭力的服務業

王炳忠在描述為什麼要唱《中華民國頌》的時候,把整場行動的動機與意圖都說得很清楚:「當群魔出來的時候,他聽到一點比較正氣的聲音,他們就會害怕,所以我們現場就要把這個大聲的唱出來。不要怕他們,大聲的喊中華民國不必害怕。」—也就是說,「白狼」張安樂率領群眾前往立法院的行動,本質上是一場驅魔儀式;如果前往立院反服貿的群眾的心態是前往救災,那麼張安樂則是率領教團,前往立法院做法。

我猜想教義大概是這樣:「中華民國」是個形而上又超自然的存在,而這個存在的性質,就張安樂的說法「你們都是中國人 X 出來的」,應該是某種生殖神,如果觸怒這個生殖神,大概會有絕子絕孫的後果。而當社會發生混亂的時候,則可以透過儀式的力量,召喚「中華民國」的某種神力(大概會透過「來來來,你來你來」這類的咒語),就可以讓社會恢復秩序,讓分裂回歸到統一—所有的儀式不都是這樣嗎?結婚儀式的神力可以讓兩個不同的家族變成一體,入學儀式則是讓原本屬於學校外的新生變成學校的一員。

不過,就這場儀式來說,到底有發揮多少神力,就不得而知了。但至少應該不具有取悅北京與中國國族主義的成分,召喚中華民國會讓對岸怎麼看,不妨參考一下去年張懸的遭遇。

「中華民國」如何發展出一套超自然的教義,以及儀式的細節,看起來非常值得人類學家深入探討,暫且不表。而在服貿這場憲政災難現場出現某種的宗教力量,對於某些人來說,應該也會有某種安定人心的效果,君不見馬航 MH 370 消失的時候,大馬政府也請出巫師祈福。有至於教團的主持人有黑道背景,稍微想想,似乎也不是什麼問題,台灣人應該很習慣這種狀況。

說到這裡你突然意識到,什麼才是台灣最有競爭力的服務業。當我們的政府還宣稱台灣處於鎖國狀態,必須要把門打開,這門服務業早就走向國際,而且國際化的程度讓人嘆為觀止—迪士尼在宣穿電影《冰雪奇緣》釋出了主題曲 Let it go 的 二十五國語文版本,清海無上師電台老早就有二十五國字幕了。就連馬修連恩都信妙禪師父,而如果說要拼經濟,哪有比洗個踏腳的布就可以撿到五顆鑽石更便捷的法門呢?

但是這麼有競爭力的服務業,我們有辦法輸出到對岸嗎?那這個服貿協定到底有什麼用呢?那麼,你會相信像 NCC 主委石世豪所說,「服貿協議簽署後,台灣網頁即可突破原有封鎖、在大陸呈現,對台灣的電子商務是一大利多,更有利擅長以網站開店的年輕人透過大陸跟全世界做生意」?

沒有人應該擁有過大的權力

國內學者專家這麼多,說起來這些事情應該輪不到我來講;或是說,其實接下來要講的事情,我以為所有人都應該知道,但周圍還是有些朋友不清楚,那還是花點時間說一下好了。

通過服貿協議,與對岸擴大貿易範圍,這是好事還是壞事?有些人說是好事,有些人說是壞事。贊成的人認為透過自由化可以促進經濟發展,如果不簽,台灣會持續衰退,台灣沒有未來;反對的理由也很多,包括中資進入台灣之後會加大貧富差距而造成社會極化,自由經濟的好處一向都只會是富人有利而已,同時對岸又一向是以經濟手段達成政治目的,貿然開放又會有國家安全疑慮。

光是這些就吵不完了,但是為了節省篇幅,我們先假設服貿利大於弊,服貿協定是件好事。我們來問下一個問題:

那麼,你打算授與多少權力給行政部門與執政黨,辦理這件好事?

除了服貿協議之外,你打算授與政府多少權力,簽訂所有的兩岸協定?

你是否同意,你可以完全信任政府?—反正這個政府是個好政府,好政府打算做好事,就讓政府想簽訂什麼就簽訂什麼,簽出來的協議一定都是好的。

還是,你覺得,就算立意是好的,在執行過程中還是有可能搞砸,所以應該要有一套監督機制,確定政府的作為符合民意?

根據執政黨的說法,服貿不是黑箱:行政院去年六月本來就是以備查案將服貿協定送交立法院,依法原本不用經過立法院審議,但是基於尊重朝野協商的結果,於是將服貿協議改成審議案,同時中間加開公聽會聽取民間意見,如果有黑箱,這個奇怪的朝野協商才是黑箱。之後,由於在野黨不斷的杯葛議事,但為了台灣的未來,再不簽訂協議,台灣就會錯過經濟發展的時機,執政黨逼不得已,只好將服貿協議視為行政命令,宣布三個月未審查視為通過。

我們把上面這段描述,用不同的說法再說一次:根據大法官解釋,國際條約都需要經過國會審議,但是與對岸的關係不在此限,也就是說,兩岸協議是否需要國會審議,法律上留下一片空白,沒有相關法律,於是在如何簽訂兩岸協議這一塊就不是法治,而是人治,變成了人治就各自朝對自己有利的方向解釋。

行政部門就認為不需要國會審核,但國會透過朝野協商將備查案改成審議案,想來行政權就不太高興了,既然有人很喜歡用朝野協商壞了行政部門的好事,行政部門就很有可能,會想辦法除掉經常用朝野協商礙事的人。

而當立委張慶忠用 30 秒時間宣布服貿協議通過的時候,同時代表了兩件事情。第一,是國民黨不想理會朝野協商的結果,找一條法律通過服貿,之所以這麼做全是因為在野黨的杯葛—說也奇怪,杯葛議事本來就是在野黨的本分,在野黨不杯葛議事還要做什麼?有些人很喜歡講學生的本分是什麼,怎麼就不讓在野黨盡本分呢?

而因為在野黨杯葛,所以執政黨就什麼事情都可以做了嗎?就算一直被杯葛,國民黨還是可以選擇繼續想辦法讓服貿送上院會,透過是國會多數黨的優勢通過,不是嗎?所有的優勢都在國民黨這邊,國民黨真的別無選擇嗎?如果這條邏輯成立,國民黨有什麼資格指責其他別無選擇的人?

不過,某方面來看,推翻朝野協商也是對的,這種事情本來就不該靠人治。

第二,無視於這套人治的結果,就等於是執政黨宣布,兩岸協議事項都不需要經過民意機關監督。今天是服貿協議,而當這個先例一開,接下來可以適用到之後所有的兩岸協議。

保障民主政治的運作,仰賴的是沒有人可以擁有過大的權力,因此將權力分成三份相互制衡。當行政權力不受立法機構的監督,把人民的權力都交付到行政機關的手中,要說這不是黑箱,也的確不是,一般我們會用另外一個詞來描述這種狀況,我實在很不想用這個詞,因為我真的很不想把這個詞用在台灣上。

即使你支持服貿協議,也該注意服貿協議是怎麼通過的。你覺得你應該把你全部的權力都交出去,讓政府簽訂任何協議嗎?今天簽署服貿,剛好是你支持的,但我們知道兩岸之間接下來一定還會有其他的協議,服貿之後還有貨貿,你相信接下來的協議你都支持嗎?如果遇到了你反對的協議呢?到時候你要怎麼辦呢?此時此刻,你是不是該預留一些保險?

你當然可以支持服貿,但是,沒有人應該擁有過大的權力。

如果你希望行政權力還是可以受到監督,又不想要倚賴朝野協商這種人治,那就應該回歸法治。而這其實就是太陽花學運的訴求,制定《兩岸協議監督條例》—先立法,再審查。