Operatör (bilgisayar programlama) - Operator (computer programming)

Gelen bilgisayar programlama , operatörler içinde tanımlanmış yapılardır programlama dilleri gibi genellikle davranırlar fonksiyonlar , ancak farklılık gösteren sözdizimsel veya semantik .

Yaygın basit örnekler arasında aritmetik (örneğin ile toplama +), karşılaştırma (örneğin, ile " büyüktür " >) ve mantıksal işlemler (örneğin AND, &&bazı dillerde de yazılmış ) bulunur. Daha ilgili örnekler arasında atama (genellikle =veya :=), bir kayıt veya nesnede alan erişimi (genellikle ) ve kapsam çözümleme operatörü (genellikle veya ) bulunur. Diller genellikle bir dizi yerleşik operatör tanımlar ve bazı durumlarda kullanıcıların mevcut operatörlere yeni anlamlar eklemesine ve hatta tamamen yeni operatörler tanımlamasına izin verir. .::.

Sözdizimi

Sözdizimsel olarak operatörler genellikle fonksiyonlarla çelişir . Çoğu dilde, fonksiyonlar sabit ile önek operatörün özel bir formu olarak görülebilir öncelik çoğu kez zorunlu olan, seviyesi ve çağrışımsal parantez mesela Func(a)(veya (Func a)içinde Lisp ). Çoğu dil, programcı tanımlı işlevleri destekler, ancak önek gösteriminden daha fazlasına ve tek bir öncelik düzeyine sahip olmadıkça, programcı tanımlı operatörleri gerçekten desteklediğini iddia edemez. Anlamsal olarak operatörler, farklı çağrı notasyonu ve sınırlı sayıda parametreye (genellikle 1 veya 2) sahip özel fonksiyon biçimi olarak görülebilir.

İşlenenlerinden göre operatörün pozisyonu olabilir öneki , çatı ve çatı ya da sonek ve bir sözdizimi ifadesi bir operatör ile ilgili olarak bağlıdır Arity sayısı ( işlenen ), öncelik ve (eğer varsa), birleşme . Çoğu programlama dili, ikili işleçleri ve birkaç birli işleçleri destekler, birkaçı daha fazla işleneni destekler, örneğin C'deki üçlü olan ?: işleci. Birli eksi gibi önek birli operatörler -xve artım sonrası gibi sonek birli operatörler vardır x++; ve ikili işlemler, x + yveya gibi infix'dir x = y. Daha yüksek Arity ait telkin işlemleri gibi ek sembolleri gerektiren üçlü operatörü  C, olarak yazılır:? a ? b : cBu tek ortak bir uygulama olduğu genellikle olarak anılır, gerçekten de - üçlü operatörü. Önek ve sonek işlemleri istenen herhangi bir ariteyi destekleyebilir, ancak . 1 2 3 4 +

Bazen bir dilin bölümleri, dilin açıklamasını veya uygulamasını basitleştirmek için "eşleştirme" veya "çevirme" operatörleri olarak tanımlanabilir. Bir çevreleme operatörü, işlenenlerini kapsayan iki veya daha fazla bölümden oluşur. Circumfix operatörleri, içerikleri değerlendirilir ve çevreleyen ifadede kullanılan sonuç değeri ile en yüksek önceliğe sahiptir. En tanıdık çevreleme operatörü, bir ifadenin hangi bölümlerinin diğerlerinden önce değerlendirileceğini belirtmek için kullanılan, yukarıda bahsedilen parantezlerdir. Fizikten başka bir örnek , Dirac'ın bra-ket notasyonunun iç çarpım notasyonudur . Circumfix operatörleri, çok sayıda veya değişen sayıda işlenen içeren işlemleri belirtmek için özellikle yararlıdır.

Bir dilin belirtimi, desteklediği işleçlerin sözdizimini belirtirken, Prolog gibi programcı tanımlı işleçleri destekleyen diller sözdiziminin programcı tarafından tanımlanmasını gerektirir.

anlambilim

Operatörlerin semantiği özellikle değere, değerlendirme stratejisine ve argüman geçirme moduna (boole kısa devresi gibi) bağlıdır. Basitçe, bir operatör içeren bir ifade bir şekilde değerlendirilir ve elde edilen değer sadece bir değer (bir r-değeri) veya atamaya izin veren bir nesne (bir l-değeri) olabilir.

Basit durumlarda bu, olağan işlev çağrılarıyla aynıdır; örneğin, ek x + ybir işlev çağrısı genellikle eşdeğer olan add(x, y)ve karşılaştırma daha azını x < yiçin lt(x, y)bağımsız değişkenlerin bilinen şekilde değerlendirilir, yani, daha sonra bir fonksiyonu değerlendirilir ve sonuç bir değer olarak döndürülür. Bununla birlikte, semantik önemli ölçüde farklı olabilir. Örneğin, atamada a = bhedef adeğerlendirilmez, bunun yerine konumu (adresi), referansa göre arama semantiğine bkarşılık gelen – değerini depolamak için kullanılır . Ayrıca, bir atama bir ifade (değersiz) olabilir veya değerin kendisi bir r-değeri (sadece bir değer) veya bir l-değeri (atanabilir) olan bir ifade (değer) olabilir. Başka bir örnek olarak, kapsam çözümleme operatörü  :: ve öğe erişim operatörü . ( veya 'da olduğu gibi ) değerler üzerinde değil, isimler üzerinde , esasen isimle arama semantiği üzerinde çalışır ve değerleri bir isimdir. Foo::Bara.b

Operatör işlenenleri olarak l değerlerinin kullanımı, özellikle tekli artırma ve eksiltme operatörlerinde dikkate değerdir . Örneğin, C'de aşağıdaki ifade yasaldır ve iyi tanımlanmıştır ve dizi indekslemenin bir l değeri döndürmesine bağlıdır:

x = ++a[i];

Önemli bir kullanım, bir sol ilişkisel ikili operatörün sol argümanını değiştirmesi (veya bir yan etki üretmesi) ve ardından bu argümanı bir l-değeri olarak değerlendirmesidir. Bu, tümü orijinal argümanı etkileyen bir dizi işleç sağlar ve yöntem basamaklandırmasına benzer şekilde akıcı bir arabirime izin verir . Yaygın bir örnek, aşağıdaki gibi akıcı çıktıya izin veren C++ kitaplığındaki operatördür : <<iostream

cout << "Hello" << " " << "world!" << endl;

Kullanıcı tanımlı operatörler

Bir dil, sabit sayıda yerleşik operatör içerebilir (örneğin , C ve C++ , PHP'de +, -, *, <, <=, !, = vb. ) veya programcı tanımlı operatörlerin oluşturulmasına izin verebilir. (örneğin Prolog , Seed7 , F# , OCaml , Haskell ). Bazı programlama dilleri operatör sembollerini + veya := gibi özel karakterlerle kısıtlarken , diğerleri gibi adlara da izin verir div(örneğin Pascal ).

Çoğu dilde yerleşik bir operatör grubu vardır, ancak bu, ayrıştırmayı önemli ölçüde karmaşıklaştırdığından, kullanıcı tanımlı operatörlere izin vermez. Birçok dil, operatörlerin yalnızca yerleşik türler için kullanılmasına izin verir, ancak diğerleri, mevcut operatörlerin kullanıcı tanımlı türler için kullanılmasına izin verir; bu, operatör aşırı yüklemesi olarak bilinir . Ancak bazı diller, yeni operatörlerin derleme zamanında veya çalışma zamanında tanımlanmasına izin verir. Bu, meta programlamayı (operatörleri ayrı bir dilde belirtme) veya dilin kendi içinde içerebilir. Yeni operatörlerin tanımı, özellikle çalışma zamanı tanımı, genellikle programların doğru statik analizini imkansız kılar , çünkü dilin sözdizimi Turing-complete olabilir, bu nedenle sözdizimi ağacını oluşturmak bile imkansız olan durma probleminin çözülmesini gerektirebilir. Bu , örneğin Perl ve bazı Lisp lehçeleri için geçerlidir .

Örnekler

Sözdizimsel olarak farklılık gösteren yaygın örnekler, matematiksel aritmetik işlemlerdir , örneğin ">" için " büyüktür ", adlar genellikle dilin işlevler için tanımlayıcı kümesinin dışındadır ve dilin işlevleri çağırmak için sözdiziminden farklı bir sözdizimiyle çağrılır. Bir işlev olarak, "büyüktür" genellikle gtveya gibi bir tanımlayıcı tarafından greater_thanadlandırılır ve işlev olarak çağrılır, olarak adlandırılır gt(x, y). Bunun yerine, işlem özel karakteri >( sözcüksel analiz sırasında ayrı olarak belirtilmiş ) ve x > y.

Anlamsal olarak farklılık gösteren (argüman geçirme kipine göre) yaygın örnekler, sıklıkla kısa devre değerlendirmesine sahip olan boolean işlemlerdir : örneğin, yalnızca öncekiler yanlış değilse sonraki argümanları değerlendiren bir kısa devre bağlantısı (X VE Y). katı değere göre arama işlevleri. Bunun yerine if/then/else işlevine benzer şekilde davranır.

Daha az yaygın operatörler şunları içerir:

Derleme

Bir derleyici, alt program çağrıları veya satır içi kod ile operatörleri ve işlevleri uygulayabilir . Bir dil tarafından desteklenen bazı yerleşik operatörler , merkezi işlem birimlerinde yaygın olarak bulunan az sayıda talimatla doğrudan eşlemeye sahiptir , ancak diğerleri ( örneğin , dize bitiştirmeyi ifade etmek için kullanılan '+' ) karmaşık uygulamalara sahip olabilir.

Operatör aşırı yüklemesi

Bazı programlama dillerinde bir operatör geçici polimorfik olabilir , yani birden fazla veri türü için tanımlara sahip olabilir (örneğin , + operatörünün hem sayıların eklenmesi hem de dizelerin birleştirilmesi için kullanıldığı Java'da olduğu gibi ). Böyle bir operatörün aşırı yüklendiği söylenir . Programcı tarafından operatör aşırı yüklemesini destekleyen ( C++ gibi ) ancak sınırlı sayıda operatöre sahip dillerde , operatör aşırı yüklemesi genellikle operatörler için özelleştirilmiş kullanımları tanımlamak için kullanılır.

Örnekte IF ORDER_DATE > "12/31/2011" AND ORDER_DATE < "01/01/2013" THEN CONTINUE ELSE STOPoperatörler şunlardır: ">" (büyüktür), "AND" ve "<" (küçüktür).

işlenen zorlama

Bazı diller ayrıca, bir operatörün işlenenlerinin , işlemin gerçekleşmesi için uygun veri türlerine örtük olarak dönüştürülmesine veya zorlanmasına izin verir . Örneğin, Perl'de zorlama kuralları 12 + "3.14"sonucun üretilmesine yol açar 15.14. "3.14"Ekleme yapılmadan önce metin 3.14 sayısına dönüştürülür. Ayrıca, 12bir tamsayıdır ve 3.14ya kayan ya da sabit noktalı bir sayıdır (ondalık basamağı olan bir sayı), bu nedenle tam sayı daha sonra sırasıyla bir kayan noktalı ya da sabit noktalı sayıya dönüştürülür.

JavaScript zıt kuralları izler—yukarıdaki aynı ifadeyi bulur, tamsayıyı 12bir dizgeye dönüştürür "12", ardından iki işleneni form şeklinde birleştirir "123.14".

Bir dilde zorlamaların varlığında, programcı, küçük programlama hatalarından kaçınmak için işlenen türleri ve işlem sonucu türü ile ilgili belirli kuralların farkında olmalıdır.

Programlama dillerinde operatör özellikleri

Aşağıdaki tablo, çeşitli programlama dillerindeki operatör özelliklerini göstermektedir:

Programlama dili Alfanümerik olmayan operatör sembolleri Alfanümerik operatör sembolleri Önek Infix son ek Öncelik çağrışım Aşırı yükleme Programcı tanımlı aşırı yükleme Programcı tanımlı operatör sembolleri
ALGOL 68 +* ** * / % %* %× - + <<= >= > = /= & -:= +:= *:= /:= %:= %*:= +=: :=: :/ =:

(Tüm operatörlerin kalın Alfanümerik eşdeğerleri vardır, bkz. sonraki sütun. Bazılarının ASCII olmayan eşdeğerleri vardır, aşağıya bakınız.) ¬ +× ⊥ ↑ ↓ ⌊ ⌈ × ÷ ÷× ÷* □ ≤ ≥ ≠ ∧ ∨ ×:= ÷:= ÷× := ÷*:= %×:= :≠:

olup abs Arg bin entier Leng seviyesi tek Repr yuvarlak kısaltmak i SHL SHR kadar aşağı LWB UPB lt le ge gt eşdeğer KD ve veya üzerinde mod elem minusab plusab timesab divab overab modab plusto isimli isnt Evet Evet Numara Evet (ön ek operatörleri her zaman 10 önceliğe sahiptir) Infix operatörleri sol birleştiricidir, önek operatörleri sağ birleştiricidir Evet Evet Evet
APL + - × ÷ ⌈ ⌊ * ⍟ | ! ○ ~ ∨ ∧ ⍱ ⍲ < ≤ = ≥ > ≠ . @ ≡ ≢ ⍴ , ⍪ ⍳ ↑ ↓ ? ⍒ ⍋ ⍉ ⌽ ⊖ ∊ ⊥ ⊤ ⍎ ⍕ ⌹ ⊂ ∪ ∩ ⍷ ⌷ ∘ → ← / ⌿ \ ⍀ ¨ ¨ & ⍨ ⌶ ⊆ ⊣ ⊢ ⍠ ⍤ ⌸ ⌺ ⍸ Alfanümerik semboller, anahtar kelimeden önce bir ⎕ işaretine ihtiyaç duyar Evet (yalnızca birinci dereceden işlevler) Evet Evet (yalnızca üst düzey işlevler) Daha yüksek mertebeden fonksiyonlar birinci mertebeden fonksiyonlardan önce gelir Daha yüksek mertebeden fonksiyonlar sol çağrışımlıdır, birinci mertebeden fonksiyonlar sağ çağrışımlıdır Evet Evet Evet (yalnızca alfasayısal)
C () [] -> . ! ~ ++ -- + - * & / % << >> < <= > >= == != ^ | && || ?: = += -= *= /= %= &= ^= boyutu Evet Evet Evet Evet Evet Evet Numara Numara
C++ ( daha fazla ) sizeof typeid yeni silme atma decltype static_cast dinamik döküm reinterpret_cast const_cast Evet Evet Evet Evet Evet Evet Evet Numara
C# ( daha fazla ) C/C++ ile aynı, ?.  ?[] ?? sizeof yeni stackalloc bekliyor fırlatma işaretli değil, delege varsayılanı olarak true false
LINQ : from select where group...by group...by...into join...in...on...eşittir... içinde...on...eşittir... sıraya göre ...azalan
Roslyn -yalnızca : __makeref __refvalue __reftype
Evet Evet Evet Evet Evet Evet Evet Numara
Java C/C++ ile aynı yeni atış örneği Evet Evet Evet Evet Evet Evet Numara Numara
Eyfel [] + - * / // = /= değil ve veya "ve sonra" "veya başka" anlamına gelir Evet Evet Numara Evet Evet Numara Evet Evet
Haskell + - * / ^ ^^ ** ​​== /= > < >= <= && || >>= >> $$! . ++!! : Ortak kitaplıklarda çok daha fazlası İşlevin adı geri tepmelere yazılmalıdır Evet Evet Numara Evet Evet Evet, Type sınıflarını kullanma Evet
paskal * / + - = < > <> <= >= := div mod değil ve veya içinde Evet Evet Numara Evet Evet Evet Numara Numara
Perl -> ++ -- ** ! ~ \ + - . =~ !~ * / % < > <= >= == != <=> ~~ & | ^ && || ' print sort chmod chdir rand ve veya değil xor lt gt le ge eq ne cmp x Evet Evet Evet Evet Evet Evet Evet Numara
Raku ++ -- ** ! ~ ~~ * / + - . < > <= >= == != <=> & | ^ && || // yazdır sıralama chmod chdir rand ve veya değil xor lt gt le ge eq ne bacak cmp x xx Evet Evet Evet Evet Evet Evet Evet Evet
PHP [] ** ++ -- ~ @! * / % + - . << >> < <= > >= == != === !== <> <=> & ^ | && || ?? ?: = += -= *= **= /= .= %= &= |= ^= <<= >>= yeni ayarlanmamış yazdırma yankı isset instanceof ve veya xor klonu Evet Evet Evet Evet Evet Numara Numara Numara
PL/I ( ) -> + - * / ** > ¬> >= = ¬= <= < ¬< ¬ & | || Evet Evet Numara Evet Evet Numara Numara Numara
Prolog :- ?- ; , . =.. = \= < =< >= > == \== - + / * casus meraklısı mod değil Evet Evet Evet Evet Evet Numara Numara Evet
tohum7 {} [] -> ** ! + - * / << >> & >< | = <> > >= < <= <& := +:= -:= *:= /:= <<:= >>:= &:= @:= dönüşüm varConv ayrıştırma conj div rem mdiv mod kere fazla The değildir ve ya rakam LpAd Rpad lpad0 Evet Evet Evet Evet Evet Evet Evet Evet
küçük konuşma (evet - En fazla iki karakter) Alfanümerik sembollerin anahtar kelimeden sonra iki nokta üst üste gelmesi gerekir Numara Evet Evet Numara Numara Evet Evet Evet
Süratli dışında herhangi bir Unicode sembol dizesi . , dahil ! ~ + - * / % =+ =- =* =/ =% &+ &- &* =&+ =&- =&* && || << >> & | ^ == != < <= > >= ?? ... ..< standart kitaplıkta gibidir? Evet Evet Evet Evet (öncelik gruplarında kısmi sıra olarak tanımlanır) Evet (öncelik gruplarının bir parçası olarak tanımlanır) Evet Evet Evet
Visual Basic .NET () . ! ?()?. ?! + - * / \ & << >> < <= > >= ^ <> = += -= *= /= \= &= ^= <<= >>= New Await Mod Like IsNot AndAlso Veya OrElse Xor If(...,...) If(...,...,...) GetXmlNamespace(...) GetType(...) NameOf( ...) TypeOf...TipOf...DirectCast Değil(...,...) TryCast(...,...) CType(...,...) CBool(...) CByte(...) CChar(...) CDate(...) CDec(...) CDbl(...) CInt(...) CLng(...) CObj(...) CSByte( ...) CShort(...) CSng(...) CStr(...) CUInt(...) CULng(...) CUShort(...)
LINQ : Toplamadan ...İçine Farklı Seçim Nerede <Sıralama Ölçütü>...[Yükselen|Azalan] Al <Süre> Atla <Skip while> Gruplandır...By...İçine Katıl...Açık <Gruba Katıl...Açık...İçine>
Evet Evet Evet Evet Evet Evet Evet Numara

Ayrıca bakınız

Notlar

Referanslar