我女兒學校的「生活科技」課程的期末測驗中,有一道Arduino程式的相關試題,她答錯了,題目大致像這樣:
底下程式中的setup()和loop()代表什麼?
void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); }
答案:
- 主程式
- 副程式
- 其他:╴╴╴╴
BASIC語言的「主程式」和「副程式」
先說明一下,在一般的電腦概論中,程式碼裡面的主要程式稱作「主程式」;主程式以外,可重複使用的程式片段,叫做「副程式」。我接觸的第一個高階程式語言叫做BASIC(培基),底下範例包含主程式和副程式,早期的BASIC語言用「行號」標示程式敘述的位置,第100行是一段副程式,RETURN代表「回到主程式的下一行繼續執行」,GOSUB代表“go to subroutine”(跳到某一行開始的副程式):
Pascal語言的「副程式」叫做function(函式)或procedure(程序)
我第二個學習的高階語言叫做Pascal,這是我在1991年時購買的參考書籍“Macintosh Pascal Programming Primer”,因為原文書很珍貴,所以我替它包了塑膠膜:
Pascal語言有function(函式)和procedure兩種「副程式」寫法。這本書的第28頁提到:“functions return values; procedures don’t.”(函式有傳回值;程序則沒有)。
實際上,整本書裡面並沒有使用「副程式(subroutine或subprogram)」這種概括性的說法,都是稱作「函式(function)」或「程序(procedure)」。
這是我以前做的筆記,沒想到會在30年之後翻閱它;翻到自己以前寫的筆記,有時會覺得,哇勒…這小子怎麼那麼蠢…
附帶一提,這本書的範例檔要額外購買。書本定價美金$24.95,需要範例程式磁碟片的話,要填寫書本末頁的表單,並附帶可在美國兌現的美金$30元支票寄給出版社(不收信用卡,美國以外地區加收運費美金$5元)。
在那個年代,程式開發工具也不是免費的。
C和C++語言的函式
我第三個學習的高階程式語言是C,這是當年買的書本:
這是書本1-3頁對C語言的介紹:C語言寫成的程式是由函數(Function)與變數(Variable)構成的。我習慣把“function”稱作「函式」,以便跟數學函數區別。
回到文章開頭的問題,Arduino程式語言的本質是C++,Arduino語言的創造者建立了一些簡化程式開發的函式,例如:setup(), loop(), pinMode(),…等等,讓微電腦控制的初學者容易上手。
所以,Arduino程式裡的setup()和loop()是什麼?
- 主程式
- 副程式
- 其他:╴╴╴╴
嚴格來說,我覺得答案應該是「其他:函式」,但學校給的答案是「1. 主程式」。我跟女兒說,沒關係,那不過是名稱的定義,就好比台灣「滷肉飯」,有些店家寫「魯肉飯」,我們都知道那是什麼,好吃最重要 🙂