發表文章

目前顯示的是 十月, 2018的文章

GCC Built-in Functions

最近上課的時候鬧了一個大笑話(而且那門課還是組合語言不是程式設計...)。我寫了下面這隻程式:
int main() { printf( "Hello\n" ); return 0; } 很明顯,這程式沒有 include 任何 header file,理論上應該是要包含 stdio.h。在編譯的過程中,compiler 吐出了下面的警告信息 (不是錯誤信息唷):

test.c: In function ‘main’:
test.c:3:5: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
     printf( "Hello\n" );
     ^
test.c:3:5: warning: incompatible implicit declaration of built-in function ‘printf’
test.c:3:5: note: include ‘<stdio.h>’ or provide a declaration of ‘printf’

但是程式會動,還是可以印出 Hello 的字樣。為什麽?我這時候信誓旦旦的跟大家說,因為 printf 在 libc.so 裡面有,因此就算編譯的時候找不到,gcc 在連結 libc.so 的時候還是會看的到 printf ,所以這時候還是可以執行的。為了證明這件事情,我用 nm 去看一下編出來的 test.o

0000000000000000 T main
                 U puts

等一下, where is my printf?? ...在學生面前要保持鎮定,大概 printf 在系統裡被改成 puts ... 然後再做實驗給同學看,這次換成利用 libm.so 的 pow 函式。
int main() { printf( "2^3 = %f\n", pow( 2.0,3.0 ) ); return 0; } 然後說,這時候應該一定會有警告,而且程式還跑不起來,因為沒有 link 到 libm.so (我可沒有 -lm 的選項啊)。結果 ... 居然可以跑 ... …

基督徒要如何處理「尤西弗羅困境」?

最近看到一段有趣的影片,在談到哲學上存在已久的難題,或者應該說是有沒有任何權威可以作為「善」的基礎。這個難題叫做「尤西弗羅困境」。

要說明「尤西弗羅困境」,我來抄一下 Wikipedia 上面的說明:


好的事物之所以好是由於上帝指定它們為好;上帝規定某些事物為好的是由於那些事物本身就是好的。 很明顯,這兩種宣告是互相衝突的。
如果採用第一種說法的話,那麽如果上帝說:「說謊是好行為」,難道我們就要這樣接受嗎?如果採用第二種說法,那麽就存在一個比上帝更大,上帝不得不接受的準則囉。基於這個困境所帶來的難題,有些哲學家認為過去的經典或是偉人並不能夠成為道德的準則。對基督徒來說該如何處理這個問題呢?
其實基督徒的答案很簡單。
路18:19 耶穌對他說:「你為甚麼稱我是良善的?除了神一位之外,再沒有良善的。 約1:9-10那光是真光,照亮一切生在世上的人。他在世界,世界也是藉着他造的,世界卻不認識他。 雅1:17 各樣美善的恩賜,和各樣全備的賞賜,都是從上頭來的,從眾光之父那裡降下來的,在他並沒有改變,也沒有轉動的影兒。 約壹1:5神就是光,在他毫無黑暗,這是我們從主所聽見又報給你們的信息。
根據聖經的啟示,唯有上帝的真正善的本體。也就是由上帝來決定何為善、何為正義、何為愛。所以,好的事物之所以為好,是因為上帝決定這是好的。
那我們應該怎麼回覆柏拉圖在這個困境所提出的問題呢?像是「如果上帝決定說謊是好的」,那樣怎麼辦呢?請注意,當我們人類提出這個問題的時候,是先從自己的頭腦來判斷,我們相信自己的邏輯思考能力勝過相信上帝的啟示。從這一刻起,人就已經把自己高抬超過上帝了。正如同性戀往往抬出「愛」的口號,卻忘了「愛」的本體的上帝並沒有認同這是愛。所以造成這個困境的不是上帝,是我們自己得罪了上帝。