※ 本文為 MindOcean 轉寄自 ptt.cc 更新時間: 2019-06-06 00:10:33
看板 Gossiping
作者 標題 Re: [問卦] 為甚麼C語言自訂函式一定要在主程式上面?
時間 Wed Jun 5 21:55:19 2019
※ 引述《fragmentwing (片翼碎夢)》之銘言:
: 如題
: 最近終於開始自學C語言
: 為甚麼C語言一定至少要放個原型在主程式上方才行?
: 或者說,明明都是一行一行讀取,其他語言是怎麼做到可以把函式到處亂擺的
這問題非常好,我不知為何會引來負面聲音,可能是原發問人沒有把「其他語言」清楚
標示出來吧?抑或是問題太簡短呢?有趣的問題如果被忽略,那真是太可惜。
其實由 Dennis M. Ritchie (以下簡稱 dmr) 開發的早期 C 語言編譯器 [1] 沒有明確
要求 function prototype 的順序。dmr 在 1972 年發展的早期 C 編譯器,原始程式碼
後來被整理在名為 "last1120c" 磁帶中 [2],我們如果仔細看 c00.c 這檔案,可發現
位於第 269 行的 mapch(c) 函式定義,在沒有 forward declaration [3] 的狀況下,
就分別於第 246 行和第 261 行呼叫,奇怪吧?
而且只要再瀏覽 last1120c 裡頭其他 C 語言程式後,就會發現根本沒有 #include 或
#define 這一類 C preprocessor [4] 所支援的語法,那到底怎麼編譯呢?在回答這問題
前,摘錄 Wikipedia 頁面的訊息:
> As the C preprocessor can be invoked separately from the compiler with
> which it is supplied, it can be used separately, on different languages.
> Notable examples include its use in the now-deprecated imake system and for
> preprocessing Fortran.
原來 C preprocessor 以獨立程式的形式存在,所以當我們用 gcc 或 cl (Microsoft
開發工具裡頭的 C 編譯器) 編譯給定的 C 程式時,會呼叫 cpp (伴隨在 gcc 專案的
C preprocessor) 一類的程式,先行展開巨集 (macro) 或施加條件編譯等操作,再來
才會出動真正的 C 語言編譯器 (在 gcc 中叫做 cc1)。值得注意的是,1972-1973 年
間被稱為 "Very early C compilers" 的實作中,不存在 C preprocessor (!),當時
dmr 等人簡稱 C compiler 為 "cc",此慣例被沿用至今,而無論原始程式碼有幾個檔
案,在編譯前,先用 cat [5] 一類的工具,將檔案串接為單一檔案,再來執行 "cc"
以便輸出對應的組合語言,之後就可透過 assembler (組譯器,在 UNIX 稱為 "as")
轉換為目標碼,搭配 linker (在 UNIX 稱為 "ld") 則輸出執行擋。
所以說,在早期的 C 語言編譯器,強制規範 function prototype 及函式宣告的順序
是完全沒有必要的,要到 1974 年 C preprocessor 才正式出現在世人面前,儘管當時
的實作仍相當陽春,可參見 dmr 撰寫的 "The Development of the C Language" [6]
是完全沒有必要的,要到 1974 年 C preprocessor 才正式出現在世人面前,儘管當時
的實作仍相當陽春,可參見 dmr 撰寫的 "The Development of the C Language" [6]
C 語言的標準化是另一段漫長的旅程,來自 Bell Labs 的火種,透過 UNIX 來到研究
機構和公司行號,持續影響著你我所處的資訊社會。
你或許會好奇,function prototype 的規範有什麼好處呢?這就要從 "Rationale for
International Standard -- Programming Languages -- C" [7] 閱讀起,依據 C9X
RATIONALE 的第 70 頁 (PDF 檔案對應於第 78 頁),提到以下的解說範例:
extern int compare(const char *string1, const char *string2);
void func2(int x) {
char *str1, *str2;
// ... x = compare(str1, str2);
// ...}
編譯器裡頭的最佳化階段 (optimizer) 可從 function prototype 得知,傳遞給函式
compare 的兩個指標型態參數,由於明確標注了 "const" 修飾子,所以僅有記憶體地
compare 的兩個指標型態參數,由於明確標注了 "const" 修飾子,所以僅有記憶體地
址的使用並讀取相對應的內容,但不會因為修改指標所指向的記憶體內容,從而沒有產生
副作用 (side effect)。這樣編譯器可有更大的最佳化空間,可對照「你所不知道的 C
語言:編譯器和最佳化原理篇」,得知相關最佳化手法。
一如 C9X RATIONALE 提到,C 語言和其他受 Algol 影響的程式語言,都具備 function
prototype 機制,這使得編譯時期,就能進行有效的錯誤分析和偵測。無論是 C 語言、
B 語言,還是 Pascal 語言,都可追溯到 ALGOL 60 [9]。
prototype 機制,這使得編譯時期,就能進行有效的錯誤分析和偵測。無論是 C 語言、
B 語言,還是 Pascal 語言,都可追溯到 ALGOL 60 [9]。
ALGOL 是Algorithmic Language (演算法使用的語言) 的縮寫,提出巢狀 (nested) 結構
和一系列程式流程控制,今日我們熟知的 if-else 語法,就在 ALGOL 60 出現。
ALGOL 60 和 COBOL 程式語言並列史上最早工業標準化的程式語言。
可參見本看板 #1SdKXN4t
Re: [問卦] 為什麼只有C語言 A B語言呢? - Gossiping板 - Disp BBS
![[圖]]()
![[圖]]()
Han3 Kiang O2 (客家語四縣腔) 電腦程式語言的發展是個迷人的主題,畢竟人們一直都想駕馭著電腦,而程式語言就是 其中最關鍵的議題之一。為何我們該認真看待程式語言的歷史呢?因為即便某些程式
![[圖]](http://i4.disp.cc/t/s2/www.prnewswire.com/3a5a49aeabcba0a37bf95e28933b5bb3.jpg)
程式語言的演化,深受底層工具和硬體限制的影響,這次探討的 function prototype
及函式宣告的順序,其實就反映出編譯器演化的歷程。人類史上第一個編譯器,A-0
System 開發於 1951-52 年間,注意到當時的用語是 "System",而且名稱 A-0 代表
System 開發於 1951-52 年間,注意到當時的用語是 "System",而且名稱 A-0 代表
Arithmetic Language version 0,與其說是今天我們提及的高階語言編譯器,不如說是
程式的載入器 (loader) 或連結器 (linker)。
相關訊息可參見本看板 #1RhWSNPG
Re: [問卦] 寫程式語言的語言是怎麼來的? - 看板 Gossiping - 批踢踢實業坊
![[圖]]()
![[圖]]()
這問題困擾我超過 25 年,身為「文組」的我,希望可以解答部分提問。 致力於人文和科學教育的 Crash Course [1] 有部很棒的短片,可在十分鐘內 回覆上述大部分問題,請見: 短片中提及人類史上第一個編譯器,A-0 System [2] 開發於 1951-52 年間,注意
![[圖]](http://img.youtube.com/vi/RU1u-js7db8/0.jpg)
![[圖]](http://img.youtube.com/vi/GcDshWmhF4A/0.jpg)
這問題困擾我超過 25 年,身為「文組」的我,希望可以解答部分提問。 致力於人文和科學教育的 Crash Course [1] 有部很棒的短片,可在十分鐘內 回覆上述大部分問題,請見: 短片中提及人類史上第一個編譯器,A-0 System [2] 開發於 1951-52 年間,注意
黑格爾在其 1820 年的著作「法哲學原理」提到: (德語原文)
> Was vernuftig ist, das ist wirklich;
> und was wirklich ist, das ist vernuftig.
英語可解讀為 "What is rational is actual and what is actual is rational.",
像是 C 語言這樣的工業標準,至今仍活躍地演化,當我們回顧發展軌跡時,凡是合乎
理性 (vernuftig),也就必然會出現、或成為現實 (wirklich),反過來說也成立。
甚至我們可推敲 C9X RATIONALE 字裡行間,每個看似死板規則的背後,其實都可追溯出
像是上方的討論。
歡迎關注「你所不知道的 C 語言」系列講座:
https://hackmd.io/@sysprog/HJpiYaZfl
千萬別忘了 C 語言的發展就是為了開發 UNIX 作業系統和相關系統程式,而 Linux 核心
自然就是將 UNIX 精神發揚光大的智慧結晶,歡迎關注「Linux 核心設計」課程,附有
線上教材:
http://wiki.csie.ncku.edu.tw/linux/schedule
[1] Very early C compilers and language,
https://www.bell-labs.com/usr/dmr/www/primevalC.html
[2] 位於 GitHub 的副本,
https://github.com/mortdeus/legacy-cc/
GitHub - mortdeus/legacy-cc: The earliest versions of the very first c compiler known to exist in the wild written by the late legend himself dmr.
The earliest versions of the very first c compiler known to exist in the wild written by the late legend himself dmr. - mortdeus/legacy-cc ...
[4] https://en.wikipedia.org/wiki/C_preprocessor
[5] cat 工具程式的作用是 "concatenate and print file",
https://www.unix.com/man-page/posix/1posix/cat/
cat(1) - concatenate and display files catan(3m), catanf(3m), catanl(3m) - complex arc tangent functions catanh(3m), catanhf(3m), catanhl(3m) - complex arc hyperbolic tangent functions catgets(3c) - read a program message catman(1m) - create the formatted files for the reference manual catopen(3c), catclose(3c) - open/close a message catalog cat(1) - concatenate files and print on the standard output cat(1p) - concatenate and print files catan(3), catanf(3), catanl(3) - complex arc tangents catan(3p), catanf(3p), catanl(3p) - complex arc tangent functions catanh(3), catanhf(3), catanhl(3) - complex arc tangents hyperbolic catanh(3p), catanhf(3p), catanhl(3p) - complex arc hyperbolic tangent functions catch(n) - Evaluate script and trap exceptional returns catchsegv(1) - Catch segmentation faults in programs catclose(3p) - close a message catalog descriptor catdic(1) - Download a dictionary catgets(3) - get message from a message catalog catgets(3p) - read a program message catman(8) - create or update the pre-formatted manual pages catopen(3), catclose(3) - open/close a message catalog catopen(3p) - open a message catalog
The cat utility shall read files in sequence and shall write their contents to the standard output in the same sequence. OPTIONS The cat utility shall ...
![[圖]](https://www.unix.com/images/og-image.jpg)
https://www.bell-labs.com/usr/dmr/www/chist.html
[7] Rationale for International Standard -- Programming Languages -- C
http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf
[8] 你所不知道的 C 語言:編譯器和最佳化原理篇,
https://hackmd.io/@sysprog/Hy72937Me
https://en.wikipedia.org/wiki/ALGOL_60
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.82.61 (臺灣)
※ 文章代碼(AID): #1SzydGFl (Gossiping)
※ 文章網址: https://www.ptt.cc/bbs/Gossiping/M.1559742928.A.3EF.html
推 : 頭1F 06/05 21:55
→ : hello world2F 06/05 21:56
推 : 前十3F 06/05 21:56
→ : 我也這麼覺得4F 06/05 21:56
→ jiajia1 …
推 : 前十6F 06/05 21:57
推 : 先推7F 06/05 21:57
推 : 先推8F 06/05 21:57
推 : 這不是基本的嗎9F 06/05 21:58
推 : 推10F 06/05 21:58
推 : 嗯嗯嗯 就是這樣11F 06/05 21:58
推 : 神12F 06/05 21:59
推 : 看不懂13F 06/05 21:59
推 : 大大安安推一個14F 06/05 22:00
推 : 推一下 免得被說看不懂15F 06/05 22:00
推 : 推16F 06/05 22:00
推 : 推17F 06/05 22:00
推 : 看到這篇好像我不是CS的一樣QQ18F 06/05 22:00
推 : 朝聖19F 06/05 22:01
推 : 跪著推20F 06/05 22:01
推 : 這就是為什麼我恨C21F 06/05 22:01
推 : 專業22F 06/05 22:01
推 : 推23F 06/05 22:02
推 : 116一定是廢文 幫補血24F 06/05 22:02
→ : 淦 這樣摸不到C罩拉25F 06/05 22:02
推 : 大神又出來普渡眾生了26F 06/05 22:02
推 : 看不懂還是要推27F 06/05 22:02
推 : 嗯嗯 我也是這樣想的28F 06/05 22:02
推 : CCC29F 06/05 22:02
推 : 看不懂30F 06/05 22:03
推 : 推31F 06/05 22:03
推 : 恩恩跟我想的一樣 只是我懶的打32F 06/05 22:03
推 : 每次線上講座必看,可惜在新竹上班,不然就去旁聽了33F 06/05 22:03
→ : 我也是這麼想的34F 06/05 22:04
推 : 朝聖推35F 06/05 22:04
推 : 講古36F 06/05 22:04
推 : 老闆問我為什麼跪著上班37F 06/05 22:04
推 : 這個釣到jserv太扯38F 06/05 22:05
→ : 卡39F 06/05 22:05
推 : 錢錢40F 06/05 22:05
推 : 推41F 06/05 22:06
推 : 朝聖42F 06/05 22:06
推 : 太神啦 釣到ㄌ43F 06/05 22:06
推 : 推 朝聖44F 06/05 22:06
推 : 之前老師有去交大上物聯網什麼的課啊45F 06/05 22:06
推 : 看無46F 06/05 22:07
推 : 恩恩 跟我想得差不多47F 06/05 22:07
推 : 嗯嗯對丫48F 06/05 22:08
推 : 不過C++某些時候還是很好用啊49F 06/05 22:08
推 : 快推50F 06/05 22:09
推 : 推51F 06/05 22:09
推 : 前百52F 06/05 22:09
推 : 有神快拜53F 06/05 22:09
→ : 只能給個讚54F 06/05 22:09
推 : 跪了55F 06/05 22:09
推 : 嗯嗯 我也是這麼認為的56F 06/05 22:10
推 : 嗯,跟我想說的差不多57F 06/05 22:11
推 : 推一下 認真 還用RANDY的書 XD58F 06/05 22:11
推 : 先跪再說59F 06/05 22:11
推 : 沒錯 就是這樣60F 06/05 22:12
推 : 那為什麼有些程式語言不這樣用呢?61F 06/05 22:13
推 : 神62F 06/05 22:13
推 : 推63F 06/05 22:13
→ : 跟我想得差不多 中間有地方小錯但無傷大雅 可以接受64F 06/05 22:13
推 : 恩恩跟我想的一樣65F 06/05 22:13
→ : 完全看不懂,剛好也箭頭XD66F 06/05 22:13
推 : jserv下凡67F 06/05 22:13
推 : 太會了吧68F 06/05 22:14
推 : 推69F 06/05 22:14
推 : 看完覺得大學對不起我教授70F 06/05 22:14
→ : @jahfone, 最初C語言不用理會函式定義的順序,最終能夠處理71F 06/05 22:15
→ : 符號(symbol)之間的相依狀況即可。是後來C語言才變嚴格的
→ : 符號(symbol)之間的相依狀況即可。是後來C語言才變嚴格的
推 : 推! 好詳細長知識了 寫了這麼久的C都不知道標準來由73F 06/05 22:15
推 : 你在寫期刊74F 06/05 22:17
→ : @Ericz7000, 之前我在交大資工系還開了「自由開源軟體與75F 06/05 22:17
推 : 廢物cs生看不懂 QQQQQ76F 06/05 22:17
自由開源軟體與專案協作
此門課程分為二大部份,第一部份為與自由開源軟體專案協作相關的專題演講課程,包括技術平台的應用,以及授權知識的理解;第二部份為多人協同專案的實際參與,不限定參與方式必然為程式碼之寫作,但亦必須與自由開源軟體專案共工模式具有正相關,期末評分,則綜合演講課的出席比例,以及專案協作成果的報告內容為評鑑標準。 ...
![[圖]](https://sites.google.com//site/fossapc/_/rsrc/1472761230430/config/app/images/customLogo/customLogo.gif?revision=10)
→ : @kipi91718, 沒事,我只是練習打字,下次請鼓勵發問的人78F 06/05 22:18
推 : 推79F 06/05 22:19
推 : 這本書台灣不是很多人用的 根本是OS基石80F 06/05 22:19
→ : @jackwula9211, 針對 C++ 可講古的題材更多啊...嘶81F 06/05 22:20
推 : 有神快拜82F 06/05 22:22
推 : 但既然身為編譯式語言,完全可以分析完整份檔案再開始83F 06/05 22:23
推 : 好~! 完全不懂...還是給推84F 06/05 22:23
推 : 推85F 06/05 22:23
推 : 有神快拜86F 06/05 22:23
推 : 神87F 06/05 22:23
→ : 最佳化吧?哪個在先哪個在後其實可以忽略。88F 06/05 22:24
→ : @Gold740716, 涉及到 side effect89F 06/05 22:24
→ : cs 這篇看不懂可以自盡了90F 06/05 22:24
推 : 嗯嗯嗯 跟我想的差不多91F 06/05 22:25
推 : 一定要先推92F 06/05 22:26
推 : 你是不是成大教授93F 06/05 22:26
推 : 推94F 06/05 22:26
→ : 快推一個不然人家以為我們不懂Xd95F 06/05 22:26
推 : 推 跟我想的是一樣96F 06/05 22:27
→ : 我朋友交大教授 與你決一死戰97F 06/05 22:27
推 : 神98F 06/05 22:28
→ : @cattgirl, 可以請你朋友等我大學畢業,再來決鬥嗎?99F 06/05 22:28
推 : 推100F 06/05 22:29
推 : 推推101F 06/05 22:29
推 : 有神快拜102F 06/05 22:30
→ : 認真推103F 06/05 22:32
推 : 好強 XD104F 06/05 22:34
推 : 推105F 06/05 22:35
推 : 學程式語言還要讀歷史106F 06/05 22:35
推 : 推107F 06/05 22:37
推 : 嗯嗯 你說的沒錯108F 06/05 22:41
推 : 有貓給推109F 06/05 22:41
推 : 先推再看110F 06/05 22:41
推 : 推個111F 06/05 22:41
推 : 好啦,我看不懂112F 06/05 22:42
→ Wand …
推 : 怕114F 06/05 22:42
推 : 嗯嗯115F 06/05 22:42
推 : 所以簡單的來說就是為了更容易在編譯時期找到錯誤與116F 06/05 22:46
→ : 最佳化囉?
→ : 最佳化囉?
推 : 算是有表達到我的想法, 給你75分118F 06/05 22:46
推 : 推119F 06/05 22:48
推 : 有神快拜120F 06/05 22:51
推 : 恩 跟我想的差不多121F 06/05 22:52
推 : 就算一知半解也要推122F 06/05 22:53
→ : 德文你也懂?123F 06/05 22:55
推 : 推124F 06/05 22:55
推 : 有神快拜125F 06/05 22:56
推 : 推126F 06/05 22:56
推 : 跪推 +1127F 06/05 22:57
推 : 推128F 06/05 22:59
推 : 朝聖129F 06/05 23:02
推 : 嗚嗚身為理組還是看不懂130F 06/05 23:03
→ : @ab37695543xs, 回顧程式語言的發展,人類的想像力很豐富,131F 06/05 23:04
推 : 7777777777777132F 06/05 23:04
→ : 像是LISP這類對應到數學抽象思考的語言,很早就提出了。但C133F 06/05 23:04
→ : 卻走了實務導向的路途,也就是一方面讓語言本身定義嚴謹,
→ : 另一方面確保編譯器和連結器得以有效實作出來
→ : 卻走了實務導向的路途,也就是一方面讓語言本身定義嚴謹,
→ : 另一方面確保編譯器和連結器得以有效實作出來
推 : 只能跪著推了136F 06/05 23:05
推 : 朝聖推137F 06/05 23:06
推 : 推138F 06/05 23:06
推 : 朝聖jserv139F 06/05 23:07
推 : 快推!免得被別人發現我文組的!140F 06/05 23:07
推 : 推 以前計算機很弱,對於記憶體與size更是斤斤計較, 所141F 06/05 23:09
→ : 以能從人這邊規範就規範
→ : 以能從人這邊規範就規範
推 : 神143F 06/05 23:10
推 : 嗯嗯144F 06/05 23:11
推 : 嗯嗯我也是這麼想的 只是懶得打145F 06/05 23:13
推 : 原來如此146F 06/05 23:13
推 : 初音只是個軟體147F 06/05 23:14
推 : 全台文組同學深表贊同148F 06/05 23:15
推 : 朝聖149F 06/05 23:15
推 : 寫了大半輩子程式也看不懂這篇在說什麼 只能推了150F 06/05 23:16
推 : 我早告訴過你了151F 06/05 23:18
推 : 正如我想152F 06/05 23:20
推 : 趕快推 以免被發現完全看不懂153F 06/05 23:21
推 : 簡單說就是為了最佳化啦.... 越早將宣告的部分寫出154F 06/05 23:23
→ : 在轉換的初期處理的時候就可以更好的安排資源
→ : 在轉換的初期處理的時候就可以更好的安排資源
推 : 沒錯跟我想的一樣156F 06/05 23:23
推 : 你及格了!157F 06/05 23:23
推 : 對對對沒錯沒錯 就是這樣 我也是這麼覺得 只是還沒來158F 06/05 23:25
→ : 得及寫文章
→ : 得及寫文章
推 : 我知道啊160F 06/05 23:25
推 : 嗯嗯 我也這樣覺得161F 06/05 23:26
推 : 八卦好文必須推162F 06/05 23:28
推 : .........163F 06/05 23:31
推 : 原來大家都這樣想164F 06/05 23:32
推 : 好聞必推165F 06/05 23:32
推 : 推,沒想到還能看到德文166F 06/05 23:36
推 : 跪著讀167F 06/05 23:36
推 : 這其實真的很基本……168F 06/05 23:37
推 : 推169F 06/05 23:39
推 : 推170F 06/05 23:40
推 : 恩恩,對,就這樣嘛,恩171F 06/05 23:41
推 : 嗯嗯 對172F 06/05 23:45
推 : 推173F 06/05 23:47
推 : 推174F 06/05 23:48
推 : 推175F 06/05 23:49
推 : 先推再看176F 06/05 23:50
→ : 推個177F 06/05 23:53
推 : 跟我想的差不多 打到一半被你先回答了178F 06/05 23:53
→ : 唉 本來想開示的 你都講完了179F 06/05 23:54
推 : 嗯嗯,我也這樣覺得。180F 06/05 23:54
推 : 雖推,但太硬了… 無法看完181F 06/05 23:55
推 : 推推 學了C語言 但看到你的之後感覺什麼都沒學過182F 06/05 23:55
推 : 跟我想的一樣183F 06/05 23:56
推 : 推推184F 06/05 23:57
推 : 長知識了185F 06/05 23:59
推 : 推186F 06/06 00:00
推 : 推推187F 06/06 00:00
推 :188F 06/06 00:05
推 : 嗚嗚嗚我廢物 只看得懂3成189F 06/06 00:07
推 : 推190F 06/06 00:07
推 : 竟然釣到大神191F 06/06 00:07
--
※ 看板: Gossiping 文章推薦值: 1 目前人氣: 0 累積人氣: 1305
( ̄︶ ̄)b klin1 說讚!
2樓 時間: 2019-06-05 23:22:29 (澳門)
→
06-05 23:22 MO
學用語言和了解語言是兩種不同的概念,好吧⋯我兩種都不會,現在只連寫vba都瘋狂copy
3樓 時間: 2019-06-06 22:46:19 (台灣)
→
06-06 22:46 TW
一般人不用特別去學C語言啦~ 你要是台清交成的,會演算法,很容易就去聯發科,在那用C去寫protocol,例如5G晶片的protocol,它的難度不是C語言,而是protocol要與晶片要debug,調適~ 對高材生來說,學這個是瞬間的,C語言只是工具,幾天就會敲了,主要還是研究~
4樓 時間: 2019-06-06 22:51:17 (台灣)
→
(編輯過) TW
這說明什麼問題,一般人你學C,你會找不到頭路,那些公司根本不看你會不會C語言,首先看你學歷,想學寫程式找頭路的,跳過C,直接去學寫網頁、學別的高級語言比較實在~
回列表(←)
分享