為什麼這篇c語言函式庫鄉民發文收入到精華區:因為在c語言函式庫這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者EdisonX (閉上眼的魚)看板C_and_CPP標題Re: [問題] 新手一問:C比較常被拿...
※ 引述《WeBurn (燒)》之銘言:
: ※ 引述《ODEs (發奮丘溫泉隊)》之銘言:
: : 我知道很多作業系統都是用C寫的,
: : 那請問C也可以用來寫一般的 application 嗎?
: : 還是現在一般的 application program 都是用Java寫的?
: : 新手一問, 請大家包涵~ <(_ _)>
: C多被拿來寫(跨平台)開源庫或程式
: x264 ffmpeg bluez flac CELT...etc
: 理由很簡單,C++很多庫 不少編譯器都沒完整實作
: 不要講說VC++/g++大多有實作
: 使用者會在什麼環境,用什麼編譯器
: 這是完全無法控制的事
: 反之C較沒這問題,依循C89(ansi C)標準來實現
: 絕大多數都沒問題
: 另外,JAVA的庫 絕大多數都是由C來實現者
: 當然也有些是用匯編
推文引用
先給個連結,有空過目細閱 http://ppt.cc/J5JZ 。
對 C/C++ 這兩種程式語言而言,它有所謂的「規範」,
就像一個產品在規劃時期的時候,會有人去開它的標準規格一樣,
比如說是 隨身聽產品 ,假設有人定義出這項產品有哪些功能、體積等規格。
是的,所以當有人試用過這些 mp3 產品之後,
可能會再把標準規格改過,第一代可能叫 WalkMan <1998>,
試用了一年後可能覺得它的標準規格要改,改完後就叫 WalkMan<2000>。
以 C 而言,常聽到的規格諸如 ANSI C、C89、C90、C99,
就像上述一樣,它本身只是「規格」而已,
這種規格書紀錄非常詳細,甚至可以買得到,
從 + - * / 、識別字、括號、註解,
一直到要有哪些函式庫、哪些函式、 引數為何、轉回值為何,都有詳細規範,
說穿了,它只是一份書面的資料罷了。
而那些有在規格書上出現的函式庫,就叫「標準函式庫」。
是的,所以它又分成了 ANSI C、C89、C90、C99 標準函式庫。
< 回到 WalkMan 的例子 >
而當公認的 WalkMan 規格開出來後,會去實作的廠商不只一間,
這些根據這份規格實作出來的才是一份真正的產品。
對 C/C++ 而言,也一樣,有一些廠商或團體,
會去實作這些語言規範,成為一個軟體,這個軟體通常就叫「編譯器」,
< 雖然這些的編譯器說的有點模糊,含蓋了許多其它的東西,不過太細跳過 >
諸如 gcc (GNU 出產)、vc (M$ 出產) 等,它們本身是編譯器,
如果要提到編譯器和軟體之間有什麼不一樣的話: #1FFfqI25 (C_and_CPP)
推文裡面說的便是,對於 C 語言而言,
大多數的編譯器都會實作其完整的「標準函式庫」,
但對 C++ 而言,要實作其完整的標準函式庫並不多。
< 這也不能怪這些編譯器開發單位,因為 C++ 真的是包山包海 >
但一些實作的產商,可能為了吸引別人的使用、購買,
除了「盡可能完整」的提到標準函式庫之外,
還會再多提供自家開發、額外的函式庫,
所以每家自己的函式庫可能不一樣,自然的,
你用了自家特有的函式庫後,就別想要拿這份程式碼,
能在其他編譯器裡順便編譯完成、生成執行檔。
比如說,在 vc 裡面開發,使用了他們特有的 _y0, _y1, _yn ( bessel function)
函式庫,就別期待這份程式碼可以在其他的編譯器 (如 bcb 、 gnu gcc 等) ,
順利編譯、產生執行檔。
那,為何要強調「標準函式庫」?
假設哪天你換了作業系統之後,像是從 windows 換到 linux 或是 FreeBSD 等等,
如果程式裡面有用到不是標準的函式庫,是該編譯器特有的,
那很可能換了作業系統之後就不能正常執行。
但尷尬的是,C/C++ 標準函式庫裡面完全沒有規定,
真正要寫 GUI (使用者圖形化界面)時,該調用哪些函數,
所以在 linux 下寫的圖形化界面、在 windows 下寫的圖形化界面,
程式碼很可能會不一樣,這問題便是討論串中的「跨平台」問題。
當然「跨平台」這說法現在已有點泛濫了,只要是
作業系統、CPU 架構不同 (x86, x64)、編譯器(compiler)不同 等,
這些都被統稱為不同之平台,而要解決跨平台問題,往往是最麻煩的,
最理想的狀況就是,寫好同一份程式碼,
這份程式碼它在不同的平台編譯後所產生的執行檔,都可以順利執行。
基本上個人認為這難度頗高,試想一下作業系統有哪些就好...
而在討論串裡面所提到的 QT, gtk , VC, MFC, wx... 等,
他們除了標準函式庫之外,都還有自己其他「額外」的函式庫,
但同一份程式碼要從 windows 作業系統跨到 linux 作業系統,
基本上好像是不可能的,但確實有幾份 compiler 致力在做這件事,
這便是原文推文串裡所在討論的一些事。
關於跨平台問題,本身會是一項筆戰,
考慮的話以後要將產品多角化時會較方便,
但相對的開發會花很多時間,假設考慮了三份作業系統,
你可想一下,同一個 function,最差的情況可能要寫三次。
所以真正「跨平台」問題,基本上不怎麼可能由一般的 coder 去解決,
一般 coder 能做的事情很少,大多能做的只有第一步 :
去找、去問 哪套編譯器對於跨平台這件事有在支援。
若您真屬初學者,跨平台問題現在對你而言實在是太早,
除非現在對你而言已是工作上的選擇才有討論的必要
: : 我知道很多作業系統都是用C寫的,
: : 那請問C也可以用來寫一般的 application 嗎?
: : 還是現在一般的 application program 都是用Java寫的?
: : 新手一問, 請大家包涵~ <(_ _)>
在回到原問題前,先跳個 tone,
我忘了在哪裡看過一篇什麼 師父 與 徒弟 的故事,"so long" (很長),
< 有人記得在哪的話麻煩 po 縮網址 , 感謝>
故事大綱是二、三個 programmer 接了一份要寫網頁的案子,
這二、三個 programmer 看別人用 ASP 覺得很好用,
但他們師父認為 ASP 是邪魔歪道,叫他們要用 C 語言寫,
因為痛苦是一種修鍊。
莫名的師公 ( 師父的師父 )突然出現,罵了這群人不上進,
想當初,這問題他還要用 asm (組合語言) 完成才行。
C/C++ 可以做的事很多,
諸如 作業系統、硬體控制、再寫一份程式語言、視窗程式、資料庫管理、
文書編輯軟體等等,這些都辦得到,甚至可以較不精確的說
「 VB 辦得到的事情,用 C 語言一定也辦得到」
「既然 VB 辦得到的事, C 語言都辦得到,那 VB 為什麼還會存在?」
原因是, C 語言辦得到的,不代表 C 語言適合辦。
你可以想一下,如果有份功能相同的程式,
用 VB 寫起來 100 行,用 C 語言寫起來 500 行,
用 asm 寫起來 10000 行,你會先哪個?
為何不選 asm ?他的效能最快耶 !而且 asm 也可以寫視窗程式耶! <無誤>
承如大多數人所言,扣除掉平台問題,C語言在做的事情大多是比較低階,
或強調這份程式需要極高效率的時候,扣除一些極少數的例外,
C/C++ 通常會是首選的程式語言,甚至也有些人真的先 asm 做那「極需」效率的東西。
< 不過寫起來未必會比較快,想知道原因的話可查一下什麼是 lazy evaluation >
: : 還是現在一般的 application program 都是用Java寫的?
答案是:不一定。
一般的 application program 會挑用哪種程式語言未必,
以單機而言,在 Windows 上可能會是 C++/CLI、 C# ,也可能會是其他。
因為有些問題可能會有某方面的程式語言較適合撰寫,
甚至一些公司內部會以 C/C++ 程式語言,
再去開發其他的 library 或程式語言, 這些看起來根本就是另一個程式語言。
也如我於上篇所說的,很多人的做法是,對於這份程式較強調效率部份,
可能用 C/C++ 語言寫好,包成動態連結檔 (dll),
而在刻劃一些視窗、button 等的工作,就交由另一套程式語言做去 (如 vb),
最後按下 button 的動用,就去呼叫包好的 dll function。
至於到底要選用哪一套,或選用哪幾套程式語言,
這通常不會是由一般 coder 在做的決策,
而是一些歷史因素,或是主管、客戶端在決定的事。
最後給的建議是,別想一套程式語言打天下,
也別認為學很多程式語言是件很難的事,
只是學會 C++ 或 Java < 是不用到 Monster Level >,
其他的程式語言要學會真的不難,
甚至相信很多人是,因為這份專案臨時要學 VBA 之類的其他程式語言,
還不都是花一、二星期邊學邊寫,專案趕完後 VBA 是什麼又全忘光了。
以上一點心得,參考就好。
--
「自從我學了 C# , 人都變聰明 , 考試都考一百分」
「自從我學了 VB , 皮膚都變好 , 人也變漂亮了 」
「自從我學了 Java , 明顯變壯 , 個子也變高了 」
「自從我學了 C++ , 內分泌失調 , 頭都禿了... 」
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.76.161