Yazan : Şadi Evren ŞEKER
Bilgisayar bilimlerinde önemli konulardan birisi olan programlama dillerinin işlemleri yapma sırasını belirler. Bir programlama dilinde işlem önceliği bir iki farklı unsura göre belirlenir. Öncelikle sonucu etkileyen ve işlemin matemetiksel önceliğine göre bir tercih yapılır. Örneğin çoğu C benzeri dillerde C dilindeki işlem öncelikleri kullanılır.

İçerik
1. Soldan sağa öncelik (left to right precedence)
2. Sağdan sola öncelik (right to left precedence)
3. İşlemlerde kısa devre (Short Circuit)
4. İşlemlerde kısa devreden doğan Yan Etki (Side Effect)
5. İşlemlerde çalışma önceliğinden doğan Yan Etki (Side effect)

Bilindiği üzere programlama dilleri kesin (Deterministic) dillerdir ve muğlak ifadelere (ambiguity) izin verilmez. Dolayısyla bu işlem önceliğinin yanında aynı öncelikli işlemlerinde belirli bir sıraya göre yapılması gerekir.
Bu aşamada soldan sağa öncelik (left to right precedence) ve sağdan sola öncelik (right to left precedence) şeklinde iki seçim yapılabilir.

Soldan sağa öncelik (left to right precedence)
Aynı önceliğe sahip işlemlerin soldan sağa doğru çalıştırılmasıdır. Aşağıdaki örneği ele alalım:

3 + 5 + 7 + 9

Programlama dili tasarlanırken şayet soldan öncelik verilirse yukarıdaki işlemin yapılma sırası aşağıdaki şekilde olur.

(((3+5) + 7 ) + 9 )

Yukarıda görüldüğü üzere önce soldaki işlem sonra bu işlemin sonucu üzerinden sırayla soldan sağa diğer işlemler yapılır.

Sağdan sola öncelik (right to left precedence)

Aynı önceliğe sahip işlemlerin sağdan sola doğru çalıştırılmasıdır. Aşağıdaki örneği ele alalım:

3 + 5 + 7 + 9

Programlama dili tasarlanırken şayet sağdan öncelik verilirse yukarıdaki işlemin yapılma sırası aşağıdaki şekilde olur.

(3 + ( 5 + ( 7 + 9 )))

Yukarıda görüldüğü üzere önce sağdaki işlem sonra bu işlemin sonucu üzerinden sırayla soldan sola doğru diğer işlemler yapılır.

İşlemlerde kısa devre (Short Circuit)

Mantıksal işlemlerde, derleyici (compiler) bazı işlemleri kısa devre yapabilir. Örneğin aşağıdaki en basit mantıksal işlemler olan ve (and) ve veya (or) işlemlerini ele alalım.

a b VEYA (Or)
0 0 0
0 1 1
1 0 1
1 1 1
a b VE (And)
0 0 0
0 1 0
1 0 0
1 1 1

Yukarıdaki tabloda görüldüğü üzere Ve işlemi sırasında a veya b taraflarından bir tanesinin 0 olması sonucun doğrudan 0 olmasına ve benzer şekilde Veya işlemi sırasında da tarafların bir tanesinin 1 olması sonucun 1 olmasına sebep olmaktadır.

Programlama dilleri tasarlanırken bu durumdan faydalanarak hız artışı sağlanır. Örneğin aşağıdaki eğer satırını (if statement) ele alalım:

if( a < 5 || b < 10)

Yukarıdaki bu kontrolde a’nın değerinin 5’ten küçük ve b’nin değerinin 10’dan büyük olması kontrol edilmiştir. Şayet a’nın değeri 5’ten küçükse bunun anlamı yukarıdaki Veya işleminin sonucunun doğru (true) çıkacağıdır ve bu durumda işlemin geri kalanı olan b<10 kontrolü yapılmaz.

Benzer şekilde aşağıdaki kontrolde de Ve işlemi kısa devre yapılabilir:

if( a < 5 && b < 10)

Yukarıda Ve kontrolü sırasında şayet a değişkenin değeri 5’e büyük veya eşitse kontrolün bu ilk kısmı yanlış (false) olarak dönecektir. Bu durumda kontrolün ikinci kısmına bakılmasına gerek kalmayacak ve sonuç yanlış (false) olarak değerlendirilerek eğer satırına (if statement) girilmeyecektir.

İşlemlerde kısa devreden doğan Yan Etki (Side Effect)

İşlemlerin çalıştırılması sırasında beklenmeyen durumların oluşmasına yan etki ismi verilir. Örneğin aşağıdaki kodu inceleyelim:

if ( a < 5 || ++ b > 4)

Yukarıdaki satırda programı yazan programcı büyük ihtimalle a’nın 5’ten küçük olup olmadığını kontrol etmiş ve ayrıca b’nin değeri bir arttırıldığında 4’ten büyük olup olmadığı kontrol etmiştir.

Ancak yukarıdaki bu niyet gerçekleşmeyebilir. Bir önceki konuda gördüğümüz kısa devre (shor circuit) işlemi gerçekleşirse ve a’nın değeri 5’ten küçükse programlama dili kotnrolün ilk kısmı doğru olduğu ve kontrol bir Veya işlemi olduğu için ikinci kısma bakmaksızın sonucu doğru ilan edecektir. Ne yazık ki programcının b’nin değerini 1 arttırma beklentisi de gerçekleşmiyecektir.

Örnek bir çalışma için :

a=3 , b=7

ile yukarıdaki kontrol yapılırsa çalışma sonucunda b= 7 olarak kalır. Ancak

a=7 , b=7

ile yukarıdaki kontrol yapılırsa çalışma sonucunda b = 8 olarak değişir.

İşlemlerde çalışma önceliğinden doğan Yan Etki (Side effect)

Programlama dillerinin işlemleri soldan sağa veya sağdan sola doğru çalıştırdığını görmüştük. Bu durum bir takım beklenmedik yan etkilere sebep olabilir. Örneğin aşağıdaki kodu ele alalım:

int i = 1;
f(){
   i=i+2;
}
g(){
   i=i*2;
}
main(){
   int j = f() + g() + i++;
   print(j);
}

Yukarıdaki kodu incelediğimizde i isminde bir global değişken tanımlanmıştır. Bu değişken f fonksiyonunda 2 arttırılmış, g fonksiyonunda ise 2 ile çarpılmıştır.

Buradaki soru main fonksiyonunda j değişkenin değerinin ne olacağıdır.

Şayet soldan sağa öncelikli çalıştırma yapılıyorsa bu durumda önce f sonra g fonksiyonları çalıştırılarak toplanacak ardından da i’nin değeri 1 arttırılarak sonuca eklenecektir. Yani sırasıyla:

f() -> i = 3 olacak

g() -> i = 6 olacak

j değeri için 3 + 6 + 7 = 16 bulunacaktır.

Ancak çalışma sırası sağdan sola öncelikli olsaydı:

i’nin değeri 1 arttırılarak 2 olacaktı

g() -> i= 4 olacak

f() -> i = 6 olacak

sonuçta j için 6 + 4 + 2 = 12 bulunacaktır.

Yukarıda da görüldüğü üzere programlama dilinin işlemlerin önceliği aynı olduğunda bile hangi sırayı kullandığı çok önemlidir. Yani toplama işleminin yer değiştirme özelliği bulunur ama bu özellik yukarıdaki şekilde yazılan kodlarda problem olabilir.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir