這些年,我們愛著的 Objective-C⋯⋯

Objective-C 是開發 OS X 和 iOS 應用的標準語言。即便是天天跟它打交道的開發者,有些也會誤以為 Objective-C 就是 Apple 公司創建出來的語言,但實際上它並不是 Apple 的親骨肉,而是從別人家過繼過來的孩子⋯⋯
評論
評論

原文刊載於 雷鋒網 ,Inside 獲授權刊登。

Objective-C 是開發 OS X 和 iOS 應用的標準語言。即便是天天跟它打交道的開發者,有些也會誤以為 Objective-C 就是 Apple 公司創建出來的語言,但實際上它並不是 Apple 的親骨肉,而是從別人家過繼過來的孩子。

程式設計語言是一個規範,它可以有許多種應用。在歷史的漫漫長河中也出現過其他 Objective-C 應用,下面我會主要以 Apple 的 Objective-C 角度來論述。

出生

Objective-C 的誕生要追溯到 1980 年左右。那時 Brad Cox 和 Tom Love 兩位工程師還在 ITT 實驗室工作,他們意識到程式設計語言的抽象程度在軟體開發中扮演著重要角色。他們認為 Smalltalk 在這方面做得非常出色,但執行效率是瓶頸,並且實驗室裡大部分系統軟體都是用 C 語言完成的,因此他們希望把 Smalltalk 的好處帶到 C 語言裡。Objective-C 就是在這樣的背景下誕生了。

成長

1983 年,Brad Cox 和 Tom Love 成立了 Stepstone 公司,並發表了第一個 Objective-C 應用。據 Brad Cox 回憶,最初的應用就是個簡單的預處理器。他們使用 sed 和 awk 等工具把 Objective-C 直接翻譯為 C 語言。可 C 語言並不原生支援 Objective-C 的動態語義,例如 dynamic dispatch。動態語義是透過一個 library 來實現的,這個 library 逐漸發展成了現在的 runtime library(簡稱 runtime)。

後來 Stepstone 被 Steve Jobs 領導的 NeXT 收購,Objective-C 由此迎來它的首次發展。不過 NeXT 並沒有在語言中引入新特性,而是對 runtime 做了一些優化,即 NeXT runtime。

Apple 收購了賈伯斯的 NeXT 後,就把 NeXT 當時在使用的 Objective-C 直接繼承了過來,即所謂的「Objective-C 1.0」。後來 Apple 在語言中增加了一些新特性,例如屬性、fast enumeration、垃圾回收(後來被 ARC 取代)。不久前 Apple 為 Objective-C 引入了輕量級泛型。這樣的改進可謂進步巨大,runtime 也被完全重寫並開源了出來。 Apple 將這一新的應用稱為「Objective-C 2.0」,也就是我們現在看到的這個樣子。

Apple 對語言的持續改進讓開發者歡欣鼓舞。Objective-C 2.0 也在 OS X 和 iOS 應用開發的浪潮中站穩了腳跟。作為語言的使用者,我對 Objective-C 語言是愛恨交加。一方面,小巧的語言結構、動態的本質讓開發變得多姿多彩,特有的方括號也讓程式碼添了幾分味道;另一方面,從現代的眼光來看,語言缺乏一些高級特徵,比如命名空間 namespace、完整的泛型支援等。雖然仍不完美,但承擔起 Apple 應用開發的重擔,它做到了。

性格

早期的 Objective-C 只支援手動記憶體管理,開發者必須仔細去跟蹤每個對象的生命周期,猶如做針線活一般,步步小心謹慎,否則就會扎破手指。而同時期的許多語言都已開始引入了更高級的記憶體管理,例如垃圾回收,Java 就是其中的典型代表。雖然手動記憶體管理在執行效率上有優勢,但同時也帶來了額外的心智負擔。好在後來引入了自動引用計數 ARC。雖然它的背後仍然是引用計數,但大多數時候不需要開發者跟蹤對象的生命周期,而是交由編譯器和 runtime 來做。開發者只需要注意一些特殊情況即可,例如循環引用。

Objective-C 不支援 namespace,也就意味著它不支援嵌套類,所有符號會在編譯階段連接到一個全局的 namespace 下。如果連接時發現了重複的符號,編譯就會失敗。為何 Apple 遲遲不在 Objective-C 中引入 namespace 呢?其實 Apple 曾多次考慮過這個問題,但發現這是個大坑,填起來困難重重。

困難之一是與 C 和 C++ 之間的協調。由於 Apple 允許 Objective-C 和 C++ 混合編程(Objective-C++),這就要求 Objective-C 的 namespace 與 C++ 的保持相容,然而這是不可能的。另一種選擇是只對 Objective-C 語言實現 namespace,不過也有問題。因為 Objective-C 語言是 C 語言的超集,C 語言沒有 namespace 的概念,其結果只能對 Objective-C 的類實現 namespace。但是 Objective-C 中的那些方法又會最終編譯成 C 語言的函數,只能對方法做 name mangling,這又會導致 ABI 不相容。目前 Apple 尚未找到能完美解決這一問題的方案,Objective-C 也只能先感慨著與 namespace 的緣分未到了。

Objective-C 早期不支援匿名函數或者閉包,但隨著社群的呼聲越來越高,Apple 最終為 Objective-C 增加了這一特性。不過有趣的是,Apple 是直接在 C 語言中實現的,稱之為 block。Objective-C 擴展了 block,以適應 Objective-C 的記憶體管理。

Objective-C 1.0 不支援泛型。直到 Objective-C 2.0 才引入了輕量級泛型。注意,之所以輕量級是因為它完全由編譯器實現,沒有 runtime 參與,泛型訊息在程式碼生成階段就被丟棄了。可能 Apple 也不希望在 runtime 中引入額外的代價吧。

社群

隨著 OS X 和 iOS 開發生態的繁榮。越來越多的開發者投入到 OS X 和 iOS 應用開發中來,社群湧現出許多優秀的第三方庫。

第三方庫不斷積累,包括依賴管理亟待解決。可 Apple 並沒有官方的解決方案。既然沒有官方的,那就自己動手做一個吧,CocoaPods 就是這樣問世的。不過由於 Xcode 的封閉,CocoaPods 的開發過程也非常艱難,經常因 Xcode 的升級而出現不相容的狀況。但 CocoaPods 最終克服了重重障礙,成為管理依賴的首選。

社群的不斷壯大讓 Objective-C 長期占據著 TIOBE 排行榜前 10 的位子,所以這門古老的語言在 21 世紀依然能綻放耀眼的光芒。

未來

2014 年一聲炮響,Swift 橫空出世,Apple 不遺餘力地向世界宣告著這個親骨肉的到來,而有關繼子 Objective-C 該何去何從的討論也愈演愈烈。誠然,Swif 解決了 Objective-C 的許多痛點,例如支援 namespace、運算符重載、更輕鬆的記憶體管理等。我想,Objective-C 不會在短時間內離我們遠去,因為社區中還有大量的 codebase 是用 Objective-C 寫的。並且,Objective-C 與 C / C++ 語言更親近,如果專案中需要和大量 C / C++交互使用,Objective-C 仍然會繼續發揮餘熱。


【一圖看懂】民生基礎建設的資安防禦為何重中之重?ACW SOUTH 沙崙基地打造天然氣、石化、變電所三大測試場域為大眾保駕護航

這幾年的新冠疫情、俄烏戰事奪走許多寶貴生命,讓網路流行一句「你的歲月靜好,是有人為你負重前行。」當我們能夠安居樂業過著恬靜生活,其實是仰賴一群人在社會各個角落堅守崗位,多數人才能享受無虞的生活及安全的家園。
評論
Photo Credit:TNL Brand Studio
評論

我們在食衣住行許多方面皆與水、電、天然氣等資源息息相關,在高度數位化的現代,臺灣在面對這些資源的基礎建設時,網路安全的防禦為何比其他國家更需謹慎面對?這件事可以從俄烏戰爭獲得啟發。

Photo Credit:TNL Brand Studio

從俄烏戰爭居安思危,臺灣每月面臨 4000 萬次的網路攻擊

有人說如果有一天真的發生第三次世界大戰,那一定會發生在網路上。從近期的俄烏戰爭來看,除了使用傳統槍砲坦克,更值得注意的是雙方都派出大量 IT 駭客,攻擊對方的油水電重要基礎建設的伺服器、通訊設施,企圖阻斷即時資訊,藉此癱瘓敵方的民生設備運作。

事實上,一般駭客不會主動攻擊一個國家的基礎建設,大多是鎖定企業等級為目標,像是美國燃油管線營運公司,受到來自東歐的勒索病毒攻擊,被迫暫停營運同時還要支付新台幣 1 億 4,000 萬元的贖金,造成當地民眾恐慌,發生一波搶購燃油熱潮。

而臺灣因為政治戰略的因素,外部駭客總是虎視眈眈,想要癱瘓我國的民生關鍵基礎設施。過去幾年間臺灣每月平均受到 2,000 萬到 4,000 萬次外來攻擊,甚至懷疑一起大型惡意軟體攻擊,幕後的駭客是有國家力量在撐腰。

臺灣民生建設資安防禦迫在眉睫,ACW SOUTH 沙崙基地扮演關鍵角色

身為島國的臺灣,電力、石油、天然氣及水利等資源設備,是供應國內經濟發展及民生需求的重要資產。面對各項能源設備資安的防護,我國經濟部長王美花過去就曾公開表示,「油電水等關鍵設施假使被破壞,後果不堪設想,所以資安是重要基本功,一定要發展做好防護措施。

身為國內首屈一指的「ACW SOUTH 沙崙資安服務基地」(以下簡稱 ACW SOUTH 資安基地),承接起重責大任,提供資安實驗場域,模擬攻防演訓及產品驗測服務;也會邀請資安服務廠商與工控營運業者到沙崙場域,進行實作的技術交流。

ACW SOUTH 資安基地計畫團隊表示,「透過資安服務商與工控營運業者的交流分享,有助促進產業對於工控資安了解與場域運用;同時我們也會辦理工控資安等相關課程、研討會及交流會,鏈結資安與工控業者幫助雙方有更深入的技術合作。」

目前 ACW SOUTH 資安基地的「關鍵基礎設施工控場域」主要有「石化/化工、天然氣及變電所」三套系統,模擬五套攻擊劇本,協助相關基礎設備的管理者,在受到攻擊當下知道該如何反應,及早因應強化資安防禦實力。萬一遭遇偽造工作站監看數據、偽造命令操控電磁閥和空壓機、電驛傳輸通訊中斷等攻擊事件,就能立刻啟動應變流程。

走訪 ACW SOUTH 資安基地關鍵基礎設施,了解三大測試場域功能有多強

場域一、石化基礎設施
2020 年臺灣兩大石化公司接連傳出資安攻擊事件,部分資訊系統感染勒索軟體病毒,造成加油站的支付系統停擺,導致消費者付款機制受到影響。

ACW SOUTH 資安基地提供的化工模擬製程實體運作機櫃,是全台首座「石化/化工製程水位控制平台」,模擬情境為一般化工反應槽連續式循環水流水位控制,以水為循環流體模擬,可提供研究測試與訓練使用、自主開發攻防情境。來現場測試的業者,可透過視覺式監控介面與 DCS 收集現場監測儀表的即時資訊,做到收集完整數據紀錄及警報,具體測試資安防護設備與解決方案。

場域二、天然氣基礎設施
美國一家天然氣壓縮公司曾經受到勒索軟體攻擊,駭客透過魚叉式網釣攻擊入侵 IT 網路,再找機會滲透到 OT 網路,並在這兩個網路部署勒索軟體,導致人機介面、伺服器完全失能,公司業務被迫停擺兩天。

ACW SOUTH 資安基地的儲槽氣體壓力監控系統,模擬情境為天然氣廠氣體儲槽壓力,使用空壓機模擬天然氣體,當氣體壓力高於或低於警報值時,系統畫面警示工作站主機,並同時記錄數據變化、警報和事件。

場域三、變電所基礎設施
2021 年台電董事長說台電遭駭客攻擊幾乎每天發生;俄烏戰爭過程,俄羅斯駭客也曾嘗試對烏克蘭發電廠下手,利用資料破壞軟體發動攻擊,藉此癱瘓高壓變電所,讓烏克蘭當地無電可用。

電力系統無論在發電、輸電及配電的任一部分發生故障,都有可能影響整個供電系統異常,因此保護電驛的作用就在及早隔離故障,避免影響到後續的相關設備。ACW SOUTH 資安基地的保護電驛監控系統採用 IEC61850 標準來進行網路通訊,可用來監視、記錄電驛突發事件,藉此模擬變電所遭受攻擊的危機處理。

要讓臺灣關鍵基礎設施免於駭客襲擊,可說是天方夜譚,但我們能做的是提升資安、強化防禦韌性,更有餘裕時間來防禦或補救攻擊。ACW SOUTH 資安基地的關鍵基礎設施,目前打造了三大測試場域,擁有可實際演練的攻防腳本,並進行資安產品的驗測。

ACW SOUTH 資安基地深知臺灣以製造業起家,尤其近年半導體領域成為舉世聞名的護國神山;另外因應全球淨零碳排議題,綠能也是前景可期的重要產業。因此在 ACW SOUTH 資安基地除了有關鍵基礎設施,還設計智慧製造、智慧綠能、半導體及物聯網等主題,可為相關業者做攻防演訓及產品驗測,有助提升我國整體資安防禦力。

「經濟部工業局 廣告」