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

İçinde bilgisayar Programlama, operatörler içinde tanımlanan yapılardır Programlama dilleri genel olarak davranan fonksiyonlar ama hangisi farklı sözdizimsel olarak veya anlamsal olarak.

Yaygın basit örnekler arasında aritmetik (ör. +), karşılaştırma (ör. "büyüktür" ile >), ve mantıklı işlemler (ör. VEayrıca yazılmış && bazı dillerde). Daha ilgili örnekler şunları içerir: Görev (genelde = veya :=), alan bir kayda erişim veya nesne (genelde .), ve kapsam çözüm operatörü (sıklıkla :: veya .). Diller genellikle bir dizi yerleşik operatörü tanımlar ve bazı durumlarda kullanıcıların mevcut operatörlere yeni anlamlar eklemelerine veya hatta tamamen yeni operatörler tanımlamalarına izin verir.

Sözdizimi

Sözdizimsel olarak operatörler genellikle zıttır fonksiyonlar. Çoğu dilde, işlevler, sabitlenmiş özel bir önek operatörü biçimi olarak görülebilir. öncelik genellikle zorunlu olan düzey ve çağrışım parantez Örneğin. 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üzeyinden fazlasına sahip olmadıkça, programcı tanımlı operatörleri gerçekten desteklediklerini iddia edemez. Anlamsal olarak operatörler, farklı çağrı notasyonu ve sınırlı sayıda parametreye (genellikle 1 veya 2) sahip özel bir işlev biçimi olarak görülebilir.

Operandlara göre operatörün konumu, önek, infix veya postfix ve bir sözdizimi ifade bir operatörü dahil etmek, derece (sayısı işlenenler ), öncelik ve (varsa), birliktelik. Çoğu programlama dili desteklenir ikili operatörler ve birkaç tekli operatörler gibi birkaç işleneni destekleyen ?: Üçlü olan C operatörü. Tekli eksi gibi önek tekli operatörler vardır -xve son ek tekli operatörler, örneğin artış sonrası x ++; ve ikili işlemler infixtir, örneğin x + y veya x = y. Daha yüksek çaplı infix işlemleri, ek semboller gerektirir, örneğin üçlü operatör ?: C olarak yazılmıştır a? M.Ö - aslında, bu tek yaygın örnek olduğu için, genellikle üçlü operatör. Önek ve sonek işlemleri istenen herhangi bir ariteyi destekleyebilir, ancak 1 2 3 4 +.

Bazen[1][2] bir dilin bölümleri "eşleşme" veya "sınır eki" olarak tanımlanabilir[3][4] operatörler, dilin açıklamasını veya uygulamasını basitleştirmek için. Çevreleme operatörü, işlenenlerini çevreleyen iki veya daha fazla parçadan oluşur. Circumfix işleçleri en yüksek önceliğe sahiptir, içerikleri değerlendirilir ve sonuç değeri çevreleyen ifadede kullanılır. En bilinen çevresel düzeltme operatörü, bir ifadenin hangi bölümlerinin diğerlerinden önce değerlendirileceğini belirtmek için kullanılan yukarıda bahsedilen parantezlerdir. Fizikten bir başka örnek de iç ürün Dirac'ın notasyonu sutyen-ket notasyonu. 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 programcı tanımlı operatörleri destekleyen, sözdiziminin programcı tarafından tanımlanmasını gerektirir.

Anlambilim

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

Basit durumlarda bu, normal işlev çağrılarıyla aynıdır; örneğin, ekleme x + y genellikle bir işlev çağrısına eşdeğerdir ekle (x, y) ve karşılaştırmadan daha az x -e lt (x, y)yani argümanlar her zamanki yöntemleriyle değerlendirilir, ardından bazı işlevler değerlendirilir ve sonuç bir değer olarak döndürülür. Bununla birlikte, anlambilim önemli ölçüde farklı olabilir. Örneğin, ödevde a = b hedef a değerlendirilmez, bunun yerine yer (adres) değerini saklamak için kullanılır b - karşılık gelen referansla arama anlambilim. Ayrıca, bir atama bir ifade (değer yok) 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üm operatörü :: ve eleman erişim operatörü. (de olduğu gibi Foo :: Bar veya a.b) değerler üzerinde değil, isimleresasen isimle arama anlambilim ve değerleri bir isimdir.

Operatör işlenenleri olarak l-değerlerinin kullanımı özellikle tekli artırma ve azaltma operatörleri. Ö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ürdüğü gerçeğine bağlıdır:

x = ++a[ben];

Önemli bir kullanım, sol ilişkisel ikili operatörün sol argümanını değiştirmesi (veya bir yan etki oluşturması) ve ardından bu argümanı bir l değeri olarak değerlendirmesidir.[a] Bu, tümü orijinal argümanı etkileyen bir dizi operatöre izin vererek akıcı arayüz, benzer basamaklı yöntem. Yaygın bir örnek, << C ++ 'da operatör video akışı aşağıdaki gibi akıcı çıktıya izin veren kütüphane:

cout << "Merhaba" << " " << "dünya!" << son;

Kullanıcı tanımlı operatörler

Bir dil sabit sayıda yerleşik operatör içerebilir (ör. +, -, *, <, <=, !, =vb. C ve C ++, PHP ) veya programcı tarafından tanımlanan operatörlerin (ör. Prolog[5], Tohum7[6], F #, OCaml, Haskell ). Bazı programlama dilleri, operatör sembollerini aşağıdaki gibi özel karakterlerle sınırlar: + veya := diğerleri gibi isimlere de izin verirken div (Örneğin. Pascal ).

Çoğu dilin yerleşik bir işleç seti vardır, ancak ayrıştırmayı önemli ölçüde karmaşıklaştırdığı için kullanıcı tanımlı işleçlere izin vermez.[b] Çoğu dil, operatörlerin yalnızca yerleşik türler için kullanılmasına izin verirken, diğerleri mevcut operatörlerin kullanıcı tanımlı türler için kullanılmasına izin verir; bu olarak bilinir operatör aşırı yükleme. Bazı diller yeni operatörlerin derleme zamanında veya çalışma zamanında tanımlanmasına izin verir. Bu, meta programlamayı (operatörlerin ayrı bir dilde belirtilmesi) veya dilin kendi içinde içerebilir. Yeni işleçlerin tanımı, özellikle çalışma zamanı tanımı genellikle doğru yapar statik analiz dilin sözdizimi Turing-complete olabileceğinden programların kullanılması imkansızdır, bu nedenle sözdizimi ağacını oluşturmak bile imkansız olan durdurma problemini çözmeyi gerektirebilir. Bu, Perl örneğin ve bazı lehçeler Lisp.

Örnekler

Sözdizimsel olarak farklılık gösteren yaygın örnekler matematikseldir Aritmetik işlemler, Örneğin. ">" için "daha büyük ", genellikle dilin setinin dışındaki adlarla tanımlayıcılar işlevler için ve işlev çağırmak için dilin sözdiziminden farklı bir sözdizimi ile çağrılır. Bir işlev olarak, "büyüktür" genellikle bir tanımlayıcıyla adlandırılır, örneğin gt veya great_than ve bir işlev olarak adlandırılır gt (x, y). Bunun yerine, işlem özel karakteri kullanır > (sırasında ayrı olarak belirtilir sözcük analizi ) ve ek gösterimi x> y.

Anlamsal olarak (bağımsız değişken geçirme moduna göre) farklılık gösteren yaygın örnekler, genellikle kısa devre değerlendirmesi: Örneğin. sıkı değere göre çağrı işlevlerine sahip bir dilde, yalnızca daha öncekiler yanlış değilse sonraki argümanları değerlendiren kısa devre yapan bir bağlantı (X VE Y). Bu, if / then / else'e benzer şekilde davranır.

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

Derleme

Bir derleyici, operatörleri ve işlevleri, alt rutin aramalar veya ile satır içi kod. Bir dil tarafından desteklenen bazı yerleşik operatörler, az sayıda Talimatlar yaygın olarak bulunan merkezi işlem birimleri ama diğerleri (Örneğin. '+' ifade etmek için kullanılır dize birleştirme ) karmaşık uygulamalara sahip olabilir.

Operatör aşırı yükleme

Bazı programlama dillerinde bir operatör olabilir özel amaçlı polimorfikyani, birden fazla veri türü için tanımlara sahiptir (örn. Java nerede + operatörü hem sayıların toplanması hem de dizelerin birleştirilmesi için kullanılır). Böyle bir operatör olduğu söyleniyor aşırı yüklenmiş. Programcı tarafından operatörün aşırı yüklenmesini destekleyen dillerde (örneğin C ++ ) ancak sınırlı bir operatör kümesine sahipse, operatör aşırı yükleme genellikle operatörler için özelleştirilmiş kullanımları tanımlamak için kullanılır.

Örnekte EĞER ORDER_DATE> "31.12.2011" VE ORDER_DATE <"01/01/2013" İSE DURDURMAYA DEVAM EToperatörler şunlardır: ">" (büyüktür), "AND" ve "<" (küçüktür).

Operand zorlama

Bazı diller ayrıca bir operatörün işlenenlerinin örtük olarak dönüştürülmesine izin verir veya mecburi, işlemin gerçekleşmesi için uygun veri türlerine. Örneğin, Perl zorlama kuralları yol açar 12 + "3.14" sonucunu üretmek 15.14. Metin "3.14" toplama işlemi gerçekleşmeden önce 3.14 sayısına dönüştürülür. Daha ileri, 12 bir tamsayıdır ve 3.14 ya kayan ya da sabit noktalı sayıdır (içinde ondalık basamağı olan bir sayı), böylece tamsayı daha sonra sırasıyla bir kayan noktaya veya sabit noktalı sayıya dönüştürülür.

JavaScript zıt kuralları izler - yukarıdaki aynı ifadeyi bulursanız, tamsayıyı dönüştürür 12 bir dizeye "12", sonra iki işleneni birleştirerek "123.14".

Bir dilde zorlamaların varlığında, programcı, ince programlama hatalarından kaçınmak için işlenen türleri ve işlem sonuç 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 diliAlfanümerik olmayan operatör sembolleriAlfanümerik operatör sembolleriÖnekInfixPostfixÖncelikİlişkisellikAşırı yüklemeProgramcı tanımlı aşırı yüklemeProgramcı tanımlı operatör sembolleri
ALGOL 68+* ** * / % %* %× - + < <= >= > = /= & -:= +:= *:= /:= %:= %*:= +=: :=: :/=:

(Tüm operatörlerin cesur Alfanümerik eşdeğerler, c.f. sonraki sütun. Bazılarında yok ASCII eşdeğerleri, c.f. altında.)¬ +× ⊥ ↑ ↓ ⌊ ⌈ × ÷ ÷× ÷* □ ≤ ≥ ≠ ∧ ∨ ×:= ÷:= ÷×:= ÷*:= %×:= :≠:

değil abs arg çöp Kutusu giriş uzunluk seviye garip repr yuvarlak kısaltmak ben shl shr yukarı aşağı lwb upb lt le ge gt eq ne ve veya bitmiş mod elem minusab Plusab Timesab divab abartmak modab artı dır-dir isntEvetEvetHayırEvet (önek operatörleri her zaman 10 önceliğe sahiptir)Infix operatörleri sol ilişkilidir, önek operatörleri sağ ilişkilidirEvetEvetEvet
APL+ - × ÷ ⌈ ⌊ * ⍟ | ! ○ ~ ∨ ∧ ⍱ ⍲ < ≤ = ≥ > ≠ . @ ≡ ≢ ⍴ , ⍪ ⍳ ↑ ↓ ? ⍒ ⍋ ⍉ ⌽ ⊖ ∊ ⊥ ⊤ ⍎ ⍕ ⌹ ⊂ ⊃ ∪ ∩ ⍷ ⌷ ∘ → ← / ⌿ \ ⍀ ¨ ⍣ & ⍨ ⌶ ⊆ ⊣ ⊢ ⍠ ⍤ ⌸ ⌺ ⍸Alfasayısal sembollerin anahtar kelimeden önce ⎕ olması gerekirEvet (yalnızca birinci dereceden işlevler)EvetEvet (yalnızca üst düzey işlevler)Üst düzey işlevler birinci düzey işlevlerden önce gelirÜst düzey işlevler sol ilişkilidir, birinci düzey işlevler sağ ilişkilidirEvetEvetEvet (yalnızca alfanümerik)
C() [] -> . ! ~ ++ -- + - * & / % << >> < <= > >= == != ^ | && || ?: = += -= *= /= %= &= ^=boyutuEvetEvetEvetEvetEvetEvetHayırHayır
C ++ (Daha )boyutu typeid yeni sil atmak decltype static_cast dinamik oyuncu kadrosu reinterpret_cast const_castEvetEvetEvetEvetEvetEvetEvetHayır
C # (Daha )C / C ++ ile aynıdır. ?.  ?[] ??boyutu yeni stackalloc adı bekliyor atmak işaretli işaretli değil, temsilci olarak varsayılan doğru yanlıştır
LINQ: gruba göre ... gruba göre ... göre ... birleştirmek ... içeri ... açık ... eşittir birleş ... içinde ... eşittir ... sırayla. ..Azalan
Roslyn -sadece: __makeref __refvalue __reftype
EvetEvetEvetEvetEvetEvetEvetHayır
JavaC / C ++ ile aynıyeni atmak örneğiEvetEvetEvetEvetEvetEvetHayırHayır
Eyfel[] + - * / // = /=değil ve veya "ve sonra" "veya başka" anlamına gelirEvetEvetHayırEvetEvetHayırEvetEvet
Haskell+ - * / ^ ^^ ** == /= > < >= <= && || >>= >> $ $! . ++ !! : Ortak kütüphanelerde çok daha fazlasıFonksiyonun adı ters işaretlere konulmalıdırEvetEvetHayırEvetEvetEvet, kullanılıyor Tip sınıflarıEvet
Pascal* / + - = < > <> <= >= :=değil div mod ve veya içindeEvetEvetHayırEvetEvetEvetHayırHayır
Perl-> ++ -- ** ! ~ \ + - . =~ !~ * / % < > <= >= == != <=> ~~ & | ^ && || ' yazdır sırala chmod chdir rand ve xor lt gt le ge eq ne cmp xEvetEvetEvetEvetEvetEvetEvetHayır
Raku++ -- ** ! ~ ~~ * / + - . < > <= >= == != <=> & | ^ && || // [7]yazdır sırala chmod chdir rand ve xor lt gt le ge eq ne leg cmp x xxEvetEvetEvetEvetEvetEvetEvetEvet[8]
PHP[] ** ++ -- ~ @![9] * / % + - . << >> < <= > >= == != === !== <> <=> & ^ | && || ?? ?: = += -= *= **= /= .= %= &= |= ^= <<= >>=yeni ayarlanmayan yazdırma yankısı issetini klonla örneği ve veya XorEvetEvetEvetEvetEvetHayırHayırHayır
PL / I( ) -> + - * / ** > ¬> >= = ¬= <= < ¬< ¬ & | ||EvetEvetHayırEvetEvetHayırHayırHayır
Prolog:- ?- ; , . =.. = \= < =< >= > == \== - + / *casus nospy mod değilEvetEvetEvetEvetEvetHayırHayırEvet
Tohum7{} [] -> ** ! + - * / << >> & >< | = <> > >= < <= <& := +:= -:= *:= /:= <<:= >>:= &:= @:=conv varConv ayrıştırma birleşik div rem mdiv mod kere çoklu değil ve veya rakamlar lpad rpad lpad0EvetEvetEvetEvetEvetEvetEvetEvet
Smalltalk(evet - İki karaktere kadar[10])Alfasayısal semboller, anahtar kelimeden sonra iki nokta üst üste koymalıdırHayırEvetEvetHayırHayırEvetEvetEvet
SwiftDışında herhangi bir Unicode sembol dizesi ., dahil olmak üzere ! ~ + - * / % =+ =- =* =/ =% &+ &- &* =&+ =&- =&* && || << >> & | ^ == != < <= > >= ?? ... ..< standart kitaplıktagibi mi?EvetEvetEvetEvet (öncelik gruplarında kısmi sıra olarak tanımlanır)Evet (öncelik gruplarının parçası olarak tanımlanmıştır)EvetEvetEvet
Visual Basic .NET() . ! ?() ?. ?! + - * / \ & << >> < <= > >= ^ <> = += -= *= /= \= &= ^= <<= >>=IsNot Değil AndAlso Veya OrElse Xor If (..., ...) If (..., ..., ...) GetXmlNamespace (...) GetType (...) NameOf ( ...) TypeOf ... Is TypeOf ... IsNot DirectCast (..., ...) TryCast (..., ...) CType (..., ...) CBool ​​(...) CByte (...) CChar (...) CDate (...) CDec (...) CDbl (...) CInt (...) CLng (...) CObj (...) CSByte ( ...) CShort (...) CSng (...) CStr (...) CUInt (...) CULng (...) CUShort (...)
LINQ: Toplamadan ... Farklı Nerede Seçmeye ... [Artan | Azalan] Al <Take While> Atla <Skip While> Grupla ... Tarafından ... Katılmaya ...
EvetEvetEvetEvetEvetEvetEvetHayır

Ayrıca bakınız

Notlar

  1. ^ Bunun tersine, daha nadir olsa da, doğru argümanı olan sağ ilişkisel bir operatör.
  2. ^ Yeni bir operatörün tanıtılması, sözcüksel belirtim değiştiren dilin sözcük analizi. Operatörün uyuşması ve önceliği, bu durumda, kelime öbeği düzeyi analizini değiştiren, dilin ifade sözdiziminin bir parçasıdır. Örneğin, bir operatör eklemek @ bu karakter için sözcük oluşturma ve belirteçleme gerektirir ve ifade yapısı (sözdizimi ağacı) bu işlecin niteliğine ve önceliğine bağlıdır.

Referanslar

  1. ^ "Operatör Giriş Formları — Wolfram Dil Belgeleri". reference.wolfram.com.
  2. ^ "Maxima 5.42.0 Kılavuzu: 7. Operatörler". maxima.sourceforge.net.
  3. ^ "Önek, Sonek ve Çevresel Düzeltme Operatörleri". mithryl.org.
  4. ^ "Operatörler". doc.perl6.org.
  5. ^ "SWI-Prolog - op / 3". www.swi-prolog.org.
  6. ^ "Bir operatör bildirin". seed7.sourceforge.net.
  7. ^ "Operatörler". docs.perl6.org.
  8. ^ "Fonksiyonlar". docs.perl6.org.
  9. ^ "PHP: Hata Kontrol Operatörleri - Manuel". php.net.
  10. ^ Goldberg, Adele. "Smalltalk-80: Dil ve Uygulaması, s. 27, ISBN 0-201-11371-6" (PDF).