Programlamada Değerlendirme Kriterleri (call-by-value,call-by-name)

Armağan Ersöz —  5 Mayıs 2014 — 1 Comment

Yeni yeni Scala ile uğraşmaya başladım daha ilk derslerden fonksiyonların değerlendirme stratejileri üzerine yararlı birkaç video izledim. Üzerine bu stratejileri biraz araştırdım ve Scala’da en çok gündeme gelen call-by-value ve call-by-name stratejilerini burada paylaşmak istedim. Bunu öğrenmek benim için çok yararlı oldu. Ben her zaman şuna inanıyorum. Maharet sadece kodu yazmakta değil, arkada nelerin döndüğünü de bilmektedir.

O yüzden bu 2 stratejiden kısaca bahsedeceğim. Yazacaklarım çok detaylı değil öğrendikçe paylaşacağım.

Not: Eğitimi bitirdiğimde yazıyı editleme hakkını kendimde saklı tutuyorum 🙂

Öncelikle fonksiyonları tanımlayalım.

def suare(x: Double) = x * x

def sumOfSquares(x: Double, y:Double) = square(x) + square(y)

call-by-value tekniği nasıl çalışıyor?

sumOfSquares(3, 2+2)

---sumOfSquares(3,4)
---square(3) + square(4)
---3*3 + square(4)
---9 + square(4)
---9 + 4*4
---9+16
---25

Bu örnekte yorumlayıcı(interpreter), fonksiyonları uygulamadan önce fonksiyonların argümanlarını birer değere indirgiyor.  Bu yöntem call-by-value yöntemi.

Şimdi call-by-name yöntemine bakalım.

sumOfSquares(3,2+2)
---square(3) +  square(2+2)
---3*3 + square(2+2)
---9 + square(2+2)
---9 + (2+2) * (2+2)
---9 + 4 * (2+2)
---9 + 4*4
---9+16
---25

Bu tipte ise öncelik fonksiyonların uygulanması. Value’ya indirgemek 2. Planda kalıyor.
Bu biraz basit bir fonksiyondu. Şimdi biraz daha karmaşıklaştıralım.
Bir değer döndürmenin yanında ek bir işlem daha yapan fonksiyonlar ile çalışalım. (a function with a side-effect)

def something()={
println("calling something")
1// return value
}

İki farklı stratejiyi de görmek için iki farklı türde fonksiyon tanımlayalım.

def callByValue(x:Int)={
println("x1="+ x)
println("x2="+ x)
}

def callByName(x:=>Int)={
println("x1="+ x)
println("x2="+ x)
}

Şimdi çıktılara bakalım;

---callByValue(something())
calling something
x1=1
x2=1
---callByName(something())
calling something
x1=1
calling something
x2=1

Farkettiğiniz üzere callByName fonksiyonunun çıktısında ‘calling something’ bir kez, diğerinde 2 kez yazılmış. Neden?

Çünkü; callByValue fonksiyonu parametresini önce değere indirgiyor. Yani something() fonksiyonunun değerini  callByValue fonksiyonuna parametre olacak yazıyor.Sonra fonksiyonu çağırıyor. Fakat callByName’de durum farklı. Önce değere indirgemek yerine fonksiyonları uyguluyor. Uygulanacak fonksiyon kalmayınca değere indirgemeye başlıyor.

Son örnek olarak da Scala’cı abimiz Martin Odersky’ın güzel bir örneği var.

def test(x:Int, y:Int)= x*x

We want to examine the evaluation strategy and determine which one is faster (less steps) in these conditions:

test(2,3)

call by value: test(2,3) --- 2*2 --- 4
call by name: test(2,3) --- 2*2 --- 4
Here the result is reached with the same number of steps.

test(3+4,8)

call by value: test (7,8) --- 7*7 --- 49
call by name: (3+4)*(3+4) --- 7*(3+4)--- 7*7 ---49
Here call by value is faster.

test(7,2*4)

call by value: test(7,14) --- 7*7 --- 49
call by name: 7 * 7 --- 49
Here call by name is faster

test(3+4,2*4)

call by value: test(7,2*4) --- test(7, 8) --- 7*7 --- 49
call by name: (3+4)*(3+4) --- 7*(3+4) --- 7*7 --- 49
The result is reached within the same steps.

Sonuç olarak; yazdığınız fonksiyonların hangi değerlendirme kriterlerinden geçtiğini ve programınız için kullanmanız gereken değerlendirme kriterini bilmek faydalı olacaktır diye düşündüm. Umarım anlaşılır olmuştur.

Not: Örnekler Scala syntax’i ile yazılmıştır.

Kullandığım referanslar:

http://www.scala-lang.org/docu/files/ScalaByExample.pdf

http://stackoverflow.com/questions/13337338/call-by-name-vs-call-by-value-in-scala-clarification-needed

Armağan Ersöz

Posts Twitter

Genelde web uygulamaları geliştiren yazılımcı. Kadıköylü. Şu an Avustralya'da yaşıyor.

One response to Programlamada Değerlendirme Kriterleri (call-by-value,call-by-name)

  1. Teşekkür ederim. 🙂
    Örnekler StackOverFlow’da gördükten sonra bir de buradaki açıklamayı okuyunca güzelce oturdu.

    Sevgiler..

Arc için bir cevap yazın Cevabı iptal et