Contents ...
udn網路城邦
舉個例子讓你體會為何C語言很難寫AI程式
2021/12/28 08:52
瀏覽1,080
迴響0
推薦4
引用0

最近在進行一個大工程,將我用VB開發近半年的螺絲釘辨識核心程式翻譯成C#,以便跟客戶開發的周邊介面程式整合,我以極高的效率一天平均約1000行的速度趕工了一個禮拜,預計今天可以翻譯完(語法無誤),再花一兩天測試調整細節,確認是否與VB程式計算結果完全同步就算完工了!

我之前說過C語言不適合寫AI,所以才會橫空出世冒出一個Python語言,即使Python執行速度很慢,並不利於需要大量計算的AI程式,速度慢加上演算多不是慢上加慢嗎?但是眾口鑠金,多數做AI的人還是寧願拋棄C語言改用Python!沒常寫這類程式的人可能無法體會這種難言之隱,就給大家看個例子!

上面程式中的bmp是一個已經存在的Bitmap影像物件,我希望建立一個叫做Mb的實體副本,Clone複製本物件的指令。既然bmp已知是個Bitmap,它被複製出來的物件當然也是個Bitmap,我將它指定給Mb這個被宣告過是Bitmap的變數應該沒錯吧?

但是C#就會堅持說:「你錯了!」它的邏輯很奇怪,任何物件被複製之後,被複製出來的物件種類就被「忘記」了!恢復成object的不特定種類,所以你必須「明確」再次告訴電腦:這個被複製的Bitmpa物件「確實是一個Bitmap物件」?要寫成這樣才是對的:

是不是脫了褲子放屁?它還很堅持,沒脫下褲子你就是不能放屁?如果我正在想著複雜的邏輯,接下來要如何使用Mb做甚麼運算,給他這個「錯誤」鬧一下,很可能就分心忘了下一步要幹嘛了?人腦的記憶體有限嘛!還有更誇張的例子如下:

上面第一行是VB程式,第二行是C#程式,邏輯是我想將陣列A中的01成員的axi屬性值相減取絕對值,在VBPython之類「較不嚴謹」的語言中這是很簡單的工作,但是C語言的「強制型別」邏輯就很怪?任何已知型別的物件一旦放入集合,它又變成模糊的object!所以A[0]必須聲明它是TgInfo型別,還要替它加一個括號((TgInfo)A[0])才會是一個相當於VBA[0],可以呼叫取得axi屬性的TgInfo物件?

如果那一堆大中小括號之中,有任何一個因為手殘或老花眼多打、少打或位置打錯,當然就是錯誤,要看仔細再重打一次了!我相信就是因為這個原因,才會說人老了就一定不能寫程式了!手會抖眼會花時要做這種事真的很難!如果我一開始就用C#開發這個專案,我會花上兩三倍的時間才能做到現在的進度!而且大部分的精神時間都在小心注意不要忘了型別轉換,而不是專心想我要設計的邏輯!

這讓我直接想到動物方城市電影中那個讓人抓狂的樹懶公務員!如果你像我一樣經歷了這幾天的工作,你就會充分理解為什麼明明Python執行效率很差,C語言又是幾十年來的主流語言,資源多速度快,還是被大家棄用,尤其是寫複雜演算法的時候!關鍵因素就是「好不好寫」了!

在電腦效能較差的年代,寫出來的程式跑得快最重要,即使比C更難寫的組合語言,有時還是必須硬著頭皮使用的!隨著電腦硬體越來越好,我們越來越不需要配合電腦的愚笨本質,可以用軟體翻譯我們的高階人類語法,就是編譯程式了!

VB其實一開始設計的目的就跟現在的Python一樣,讓使用者可以不必那麼麻煩直接面對超笨又超龜毛的樹懶,代價就是寫出的程式速度較C語言慢!中間需要較多翻譯程式嘛!但是到了.NET時代VB的速度就不比C慢了!而且還繼續保有人性化好寫的特質。

Python其實就是另一個新冒出來的VB,而且還在經歷20年前VB的演化歷程,所以我說聰明的AI演算法開發者應該學我用VB除非他們甚麼模組都無法自己開發,還必須仰賴其他的Python使用者提供!我是很純粹的自有AI技術開發者,VB對我來說最方便!但為了與外界溝通,使用C#語言也不會是我的障礙啦!

有誰推薦more
全站分類:心情隨筆 工作職場
自訂分類:不分類

限會員,要發表迴響,請先登入