call by address、value、name速度誰快

我在知識+看到這題,

http://tw.knowledge.yahoo.com/question/question?qi...

call by address= call by name >call by value

可是我書中寫 address> name > value

那到底是誰對誰錯@@?

謝謝

Update:

是知道答案了..但也來個人回答吧~"~

Update 2:

Reference速度最快這點沒問題。

在於 name 和 value誰快@@"

我書本在 call by name 描述中是這樣的,

於 call by name 中,實際參數會取代被呼叫程式中所有對應的形式參數,故真正執行是系統會以實際參數得傳遞名稱來進行,所以會有 side-effect。

call-by-name 於程式繫結的速度介於 call by value和 call by address 之間。

Update 3:

我書本在 call by value 描述中是這樣的

於 call by value中,實際參數和形式參數佔用不同的記憶體空間,

因此形式參數的變動不會影響到實際參數(亦即沒有 side-effect)。

call by value 中程式繫結(Binding)的速度最慢。 @@

Update 4:

這是我參考第二本書的題目, (82普考)

當主程式呼叫副程式時,其間參數的傳遞方式下列何者錯誤?

A)call name 速度快於 call by value (?)

B)call by address 速度快於 call by value (沒問題)

C)call by address 速度快於 call by name (沒問題)

D)call by name最快(沒問題,call by address 才是最快,所以D是錯的)

答案是給d。也是address> name > value

J大講的也有理,所以有點亂了。@_@

5 Answers

Rating
  • 1 decade ago
    Favorite Answer

    喵喵咪,怎麼會很少?

    人類語言就是啊!

    看,我不就用 call by name 叫你!

    眼睛脫窗、沒看到你有打〝程式〞語言的 Jacob 留

    2009-03-07 21:02:16 補充:

    Call By,

    Reference: 『簡』言之,C的傳址可算是一種。

    void ref(int *var);

    int main(void)

    { int i;

     ref(&i);

     return i;

    }

    變數本身一定有位址(register除外)!

    所以,直接可以傳過去,當然快。

    Value: 多數語言定義、Compiler 也使用Call by value。

    (少數語言,因為語言的架構不能怎麼樣,

     而Compiler 在實做上,會用這個,來代替那個!

     最常見的是 Java!語言定義Value,實做(為了速度!)是Reference!

    C範例如下:

    void val(int var);

    int main(void)

    { int i;

     val(i);

     return i;

    }

    它必須先 copy 一份答案,再傳給被呼叫者。

    被呼叫者只拿到拷貝的值,所以叫 call by value。

    這個 copy 要時間及空間 (RAM),所以比較慢!

    尤其,傳的是 struct 等大於 CPU bits數 的型別時,

    耗時相當可觀!

    Name: 敝人熟悉的程式語言中,應該沒有!

    它不適合目前主流語言用的語系 (imperative language)。

    AlgoL是少數使用call by name 的 imperative語言。

    (下面東東,因為沒有實戰經驗,都是看書來的!可能有誤!)

    它傳的是一種怪物,可以讓被呼叫者去重新計算那值!

    以 C 來看(注意:C沒這東東!),類似:

    void name(double theta)

    { Recalculate theta;

     use theta;

    Recalculate theta;

     use theta;

    Recalculate theta;

     use theta;

    }

    也就是說:被呼叫者每次用到那參數,都會重算一次!

    這怎麼會快?

    但,萬一沒用到過,它就不會被計算,那就會快了!

    或是,一次計算可以得到一大塊東東,那也會快!

    但,這些,都是 call by reference 可以辦到的!

    call by reference 辦不到的,是 re-calculate!(還有其它)

    也就是說,計算中用到的其它值若是變了,

    被呼叫者可以一直取得最新的值下去計算!

    這在網路程式可以有它的優點,

    在平行上,用得好,也會是優點(用不好是致命傷!)

    『通常』,用不到的是不會傳去當參數的。

    傳去,當然是要用!

    也就是說,它並不能省下傳遞時間!

    (除了能算出大量資料,或由不同的 CPU/核去算資料!)

    但,我們有沒有〝傳〞過沒用的〝參數〞呢?

    有! if (A && B) 就是! @.@

    在 A 不成立下,B不會被計算!

    所以,我們就〝傳〞了沒有用的〝參數〞了!

    為何我一直打〝〞?

    因為:(在 C)if 不是函數!所以,A, B 也不是參數!

    常看這討論版的,會看到我有時會寫一些莫名其妙的東東:

     不要寫 if(, for(, switch(, while(,要加個空白在(前!

     要寫成 if (, for (, switch (, while (

    其實,只是要建立程式師清楚的印象:這是函數、這是 keyword!

    使用不同語言時,搞不清這個,可能就寫不出好的程式!

    綜合上述,可以得到:速度上,

     Reference (address) > Value > Name

    但,在一些不良設計的程式,或一些極少數特例上,會是

     Reference > Name > Value

    2009-03-07 21:04:54 補充:

    當然,傳給另一 CPU / 核,去算,極少數下,會是

     Name > Ref > Value

    另外,少數 value 會算不出來的,用 name 法,可以讓主程式不會掛著!

    但,Multi-Thread可以處理掉這問題!

    所以,主流語言,不但因所屬語系不易使用,

    也因可用別的方法取代,而多數沒用支援。

    2009-03-08 15:07:36 補充:

    書講的可能比我寫的淺。

    簡言之,call by name 是傳個要計算的怪物去,

    通常,那是個類似 pointer的東東。

    副程式由那個〝Pointer〞去 evaluate 那參數的值。

    我說的,是整個過程:傳遞+得到結果。

    而書講的,是傳遞時間而已。

    2009-03-08 15:16:50 補充:

    由英文維基可見:我說的『指整個』與『指傳遞期間』,應該是對的。

    In call-by-name evaluation, the arguments to functions are not evaluated at all — rather, function arguments are substituted directly into the function body using capture-avoiding substitution. 續

    2009-03-08 15:17:50 補充:

    If the argument is not used in the evaluation of the function, it is never evaluated; if the argument is used several times, it is re-evaluated each time.

    Call-by-name evaluation can be preferable over call-by-value evaluation 續

    2009-03-08 15:18:18 補充:

    because call-by-name evaluation always yields a value when a value exists, whereas call-by-value may not terminate if the function's argument is a non-terminating computation that is not needed to evaluate the function. (注意下面這段) 續

    2009-03-08 15:18:31 補充:

    Opponents of call-by-name claim that it is significantly slower when the function argument is used, and that in practice this is almost always the case as a mechanism such as a thunk is needed.

    2009-03-08 15:24:20 補充:

    所以,這種要學生只要考慮部份東東的考題與教學,

    是老師不懂/老師不負責任的說明!

    實際應用上,怎可只考慮部份效應?

    In 老師,又有人在罵老師了!

    你訂〝昏〞戒指研究完了沒?

    又有人在罵你套房牌的同行了!

    2009-03-08 15:57:26 補充:

    http://tw.knowledge.yahoo.com/question/question?qi...

    又一個分不清 keyword 和 function 的例子!

    老師!老師!應該又是套房牌的老師害的!

    天堂牌的 In 老師,約束一下你不同牌的同行吧!!

    Source(s): 語言學課本、Wikipedia
  • 1 decade ago

    我在懷疑:

    版大問題中所指的 name 會不會是和 Alias 搞混了?

  • 1 decade ago

    大師還幽默的

    有幫助記憶效果0.0

  • SiYu
    Lv 5
    1 decade ago

    call by name

    因該是最慢的把.

    目前很少有程式語言支持call by name

    2009-03-04 08:20:58 補充:

    jacob lee 不要鬧了. 這種冷笑話不好笑

  • How do you think about the answers? You can sign in to vote the answer.
  • novus
    Lv 6
    1 decade ago

    上面那個回答有誤

    他以為call by name == call by ref

Still have questions? Get your answers by asking now.