Ayrılmış kelime - Reserved word

Bir bilgisayar dilinde , ayrılmış bir sözcük (aynı zamanda ayrılmış tanımlayıcı olarak da bilinir ), bir değişkenin, işlevin veya etiketin adı gibi bir tanımlayıcı olarak kullanılamayan bir sözcüktür - "kullanımdan ayrılmıştır". Bu sözdizimsel bir tanımdır ve ayrılmış bir kelimenin kullanıcı tanımlı bir anlamı olmayabilir.

Yakından ilişkili ve sıklıkla birleştirilen bir kavram, belirli bir bağlamda özel anlamı olan bir kelime olan bir anahtar kelimedir. Bu semantik bir tanımdır. Buna karşılık, standart bir kitaplıktaki ancak dilde yerleşik olmayan adlar, ayrılmış sözcükler veya anahtar sözcükler olarak kabul edilmez. "Ayrılmış kelime" ve "anahtar kelime" terimleri genellikle birbirinin yerine kullanılır - bir ayrılmış kelimenin "anahtar kelime olarak kullanılmak üzere ayrıldığı" söylenebilir - ve resmi kullanım dilden dile değişir; Bu makale için yukarıdaki gibi ayırıyoruz.

Genel olarak ayrılmış sözcüklerin ve anahtar sözcüklerin çakışması gerekmez, ancak çoğu modern dilde anahtar sözcükler, anahtar sözcükler tanımlayıcılarla karıştırılamayacağından ayrıştırmayı kolaylaştırdığından, ayrılmış sözcüklerin bir alt kümesidir. C veya Python gibi bazı dillerde ayrılmış sözcükler ve anahtar sözcükler çakışırken, Java gibi diğer dillerde tüm anahtar sözcükler ayrılmış sözcüklerdir, ancak bazı ayrılmış sözcükler anahtar sözcük değildir - bunlar "ileride kullanılmak üzere ayrılmıştır". Daha eski diller ALGOL , FORTRAN ve PL/I gibi diğer dillerde, anahtar sözcükler vardır, ancak ayrılmış sözcükler yoktur ve anahtar sözcükler tanımlayıcılardan başka yollarla ayırt edilir. Bu, ileriye dönük ayrıştırıcılar gerekli olduğunda ayrıştırmayı daha zor hale getirir.

ayrım

Bir dilde ayrılmış sözcük ve anahtar sözcük kümeleri genellikle çakışır veya neredeyse eşittir ve ayrım incedir, bu nedenle terimler genellikle birbirinin yerine kullanılır. Ancak dikkatli kullanımda ayırt edilirler.

Anahtar kelimeler ayrılacak kelimeleri yapma yapar Lexing karakter dizesidir açık bir şekilde bağlama bağlı olmadan, bir anahtar kelime veya bir tanımlayıcı ya olacak şekilde, daha kolay; bu nedenle anahtar kelimeler genellikle ayrılmış kelimelerin bir alt kümesidir. Ancak, ayrılmış sözcüklerin anahtar sözcük olması gerekmez - örneğin, Java'da gotoayrılmış bir sözcüktür, ancak anlamı yoktur ve dilbilgisindeki herhangi bir üretim kuralında görünmez. Bu genellikle ileriye dönük uyumluluk için yapılır , bu nedenle ayrılmış bir kelime, mevcut programları bozmadan gelecekteki bir sürümde bir anahtar kelime olabilir.

Tersine rolü bağlamdan anlaşılacaktır ile, anahtar sözcükler, kelime ayrılmış olmak zorunda değildir, ya da bu tür ile olduğu gibi, başka bir şekilde ayırt edilebilir çekme düzeltme . Örneğin, if = 1if yan tümcesinin denetim deyimi bir ile başlayamayacağından =ve bu nedenle FORTRAN gibi bazı dillerde izin verildiğinden , tümcecik çoğu dilbilgisinde nettir . Alternatif olarak, ALGOL 68'de , anahtar kelimeler kalın harflerle listelenerek katı bir dilde kısaltılmalı - bir şekilde ayırt edilmek üzere işaretlenmelidir ve bu nedenle ayrılmış kelimeler değildir. Böylece sıkı bir dilde aşağıdaki ifade cesur anahtar kelime olarak, yasal olup olmadığını sıradan tanımlayıcı ile çatışma değil if:

Eğer varsa 0 sonra 1 fi

Bununla birlikte, ALGOL 68'de, anahtar kelimelerin ayrılmış kelimeler olduğu, bu farklı kavramların sıklıkla nasıl örtüştüğünün bir örneği olan bir ayırma rejimi de vardır; Bu, birçok modern dilde izlenir.

Sözdizimi

Ayrılmış bir kelime, normal bir kelimeye "benzeyen" ancak normal bir kelime olarak kullanılmasına izin verilmeyen bir kelimedir. Resmi olarak bu , tanımlayıcıların olağan sözcüksel sözdizimini (kelimelerin sözdizimini) karşıladığı anlamına gelir - örneğin, bir harf dizisidir - ancak tanımlayıcıların kullanıldığı yerlerde kullanılamaz. Örneğin, sözcük ifgenellikle ayrılmış bir sözcüktür, ancak xgenellikle böyle değildir, bu nedenle x = 1geçerli bir atamadır, ancak if = 1değildir.

Anahtar kelimelerin çeşitli kullanımları vardır, ancak öncelikle birkaç sınıfa girerler: dilbilgisi ifadesinin bir parçası (özellikle terminal olmayan sembollere sahip bir üretim kuralı ), çeşitli anlamlara sahip, çoğu prosedürel dilde olduğu gibi genellikle kontrol akışı için kullanılır . a koşullu ve tümceleri alır (terminal olmayan semboller); bir tür sistemini destekleyen bir dilde ilkel türlerin adları , örneğin ; Boolean true gibi ilkel değişmez değerler ; veya bazen gibi özel komutlar . Anahtar kelimelerin kelime öbeklerindeki diğer kullanımları, örneğin . ifinttrueexitprint

Bir dil bir lexer ve çözümleyici bir kombinasyonu ile analiz edilir ve dil sözdizimi tarafından üretilen zaman farklı tanımları açık sözcük dilbilgisi kelimeleri ve serbest içerik bir üretim kurallarının ifadeler için. Bu, modern dillerin analizinde yaygındır ve bu durumda anahtar sözcükler, sözcük düzeyindeki tanımlayıcılardan (dolayısıyla ayrılmış sözcükler) ayırt edilmeleri gerektiğinden, sözcük öbeği düzeyinde (anahtar sözcükler olarak) sözdizimsel olarak farklı şekilde analiz edilmeleri gerektiğinden, ayrılmış sözcüklerin bir alt kümesidir.

Bu durumda, ayrılmış sözcükler sözcüksel dilbilgisinin bir parçası olarak tanımlanır ve her biri tanımlayıcılardan farklı olarak ayrı bir tür olarak simgeleştirilir. Geleneksel gösterimde, ayrılmış sözcükler ifve thenörneğin , sırasıyla türler IFve THEN, while xve yher ikisi de tür olarak simgeleştirilir Identifier.

Buna karşılık, anahtar kelimeler sözdizimsel olarak dilbilgisi tümcesinde terminal sembolleri olarak görünür . Örneğin, koşullu bir ifade için üretim kuralı olabilir IF Expression THEN Expression. Bu durumda IFve THENterminal sembolleridir, yani " sırasıyla IFveya türünde bir belirteç" anlamına gelir THEN– ve sözcüksel dilbilgisi nedeniyle bu, dize ifveya thenorijinal kaynakta anlamına gelir . İlkel sabit değere bir örnek olarak, true"true" boole değerini temsil eden bir anahtar kelime olabilir; bu durumda BinaryExpression, örneğin , üretimin olası bir genişlemesi olarak dilbilgisinde görünmelidir .

Ayrılmış aralıklar

Bazı diller, belirli sözcük listelerini ayırmanın ötesinde, gelecekteki dil sürümleri, farklı lehçeler, derleyici satıcıya özel uzantılar için özel alanlar olarak veya bir derleyici tarafından dahili kullanım için, özellikle ad değiştirmede olmak üzere tüm sözcük aralıklarını ayırır .

Bu genellikle bir önek, genellikle bir veya daha fazla alt çizgi kullanılarak yapılır . C ve C++ bu açıdan dikkate değerdir: C99, iki alt çizgi veya bir alt çizgi ile devam eden bir büyük harfle başlayan tanımlayıcıları ve ayrıca tek bir alt çizgi ile başlayan tanımlayıcıları (normal ve etiket boşluklarında) dosya kapsamında kullanım için ayırır ; C++03 ile, herhangi bir yerde çift alt çizgi içeren tanımlayıcıları daha fazla rezerve eder - bu, örneğin, ayırıcı olarak çift alt çizgi kullanımına izin verir (kullanıcı tanımlayıcılarını bağlamak için).

Python'da dahili tanımlayıcılarda çift alt çizginin sık kullanımı, dunder kısaltmasına neden oldu; bu, Mark Jackson ve bağımsız olarak Tim Hochberg tarafından, her ikisi de 2002'de aynı soruya yanıt olarak birkaç dakika içinde icat edildi .

Şartname

Bir dilde ayrılmış sözcüklerin ve anahtar sözcüklerin listesi, bir dil geliştirildiğinde tanımlanır ve her ikisi de bir dilin biçimsel belirtiminin bir parçasını oluşturur . Genel olarak, geçerli tanımlayıcı adlarını kısıtlamaktan kaçınmak için ayrılmış sözcük sayısını en aza indirmek istenir. Ayrıca, yeni ayrılmış sözcüklerin tanıtılması, o sözcüğü kullanan mevcut programları bozar (geriye dönük uyumlu değildir), bu nedenle bundan kaçınılır. Bunu önlemek ve ileriye dönük uyumluluk sağlamak için , bazen kelimeler, mevcut bir kullanıma sahip olmadan (anahtar kelime olmayan ayrılmış bir kelime) ayrılır, çünkü bu, kelimenin gelecekte mevcut programları bozmadan kullanılmasına izin verir. Alternatif olarak, yeni dil özellikleri önceden tanımlanmış olarak uygulanabilir, bunlar geçersiz kılınabilir, böylece mevcut programlar bozulmaz.

Esnekliğin nedenleri arasında, derleyici satıcılarının standart olmayan özellikler, genişletmek için farklı standart dil lehçeleri veya dilin gelecekteki sürümlerinin ek özellikler içerecek şekilde belirtimi genişletmesine izin verilmesi yer alır. Örneğin, yordamsal bir dil, gelecekteki bir sürümde veya bazı lehçelerde nesne yönelimli yetenekler eklemeyi öngörebilir , bu noktada classveya gibi anahtar kelimeler eklenebilir object. Bu olasılığı barındırmak için, mevcut belirtim, şu anda kullanılmasalar bile bu ayrılmış sözcükleri yapabilir.

Kayda değer bir örnek Java'dadır , burada constve gotoayrılmış sözcüklerdir - Java'da anlamları yoktur, ancak tanımlayıcı olarak da kullanılamazlar. Şartlar saklı tutularak, istenirse eski Java kaynak kodunu bozmadan Java'nın gelecekteki sürümlerinde uygulanabilirler. Örneğin, 1999'da constdile C++ benzeri bir constkelime eklemek için bir teklif vardı, bu kelime rezerve edilmiş ancak şu anda kullanılmadığı için kelimeyi kullanmak mümkündü ; ancak, bu teklif reddedildi - özellikle, özelliğin eklenmesi mevcut herhangi bir programı bozmasa da, onu standart kitaplıkta (özellikle koleksiyonlarda) kullanmak uyumluluğu bozacağı için reddedildi . JavaScript ayrıca özel işlevleri olmayan bir dizi ayrılmış kelime içerir; tam liste sürüme ve moda göre değişir.

Diller, yeni ayrılmış sözcükleri veya anahtar sözcükleri ne sıklıkta tanıttıklarına ve bunları nasıl adlandırdıklarına göre önemli ölçüde farklılık gösterir; bazı diller çok muhafazakardır ve mevcut programları bozmamak için nadiren veya hiç yeni anahtar sözcükler sunarken, diğer diller yeni anahtar sözcükleri daha özgürce sunarken, mevcut programları gerektirir. çakışan mevcut tanımlayıcıları değiştirmek için programlar. Bir vaka çalışması yeni anahtar kelimelere göre verilir C11 ile karşılaştırıldığında C ++ 11 2011 tarihinden itibaren her iki - hatırlama C ve C ++, bir alt çizgi ile başlar tanımlayıcılar saklıdır büyük harflerden oluşan takip ettiği:

C komitesi, kullanıcı adı alanında yeni anahtar kelimeler oluşturmamayı tercih eder, çünkü genellikle her C revizyonunun eski C programlarını bozmaktan kaçınması beklenir. Karşılaştırıldığında, C++ komitesi (WG21) eski anahtar kelimeler kadar normal görünümlü yeni anahtar kelimeler yapmayı tercih ediyor. Örneğin, C++11, bir iş parçacığına yerel statik depolamayı atamak için yeni bir thread_local anahtar sözcüğü tanımlar . C11, yeni anahtar sözcüğü _Thread_local olarak tanımlar. Yeni C11 başlığında <threads.h>, normal görünen adı sağlayan bir makro tanımı vardır:

#define thread_local _Thread_local

Yani, C11, anahtar kelimeyi _Thread_localmevcut bir ayrılmış kelime grubu (belirli bir önek ile olanlar) içine soktu ve ardından herhangi bir önek olmadan yeni bir anahtar kelimeymiş gibi kullanımına izin vermek için ayrı bir tesis (makro işleme) kullandı. +11, thread_localbu mevcut bir ayrılmış kelime olmamasına rağmen, bunu kullanan programları kırarak, ancak makro işleme gerektirmeden anahtar kelimeyi tanıtıyor .

Önceden tanımlanmış adlar

Ayrılmış sözcüklerle ilgili bir kavram, önceden tanımlanmış işlevler, yöntemler, alt rutinler veya değişkenlerdir, özellikle standart kütüphaneden kütüphane rutinleri . Bunlar, temel dilin bir parçası olmaları ve benzer amaçlar için kullanılabilmeleri bakımından benzerdir. Ancak bunlar, önceden tanımlanmış bir işlevin, yöntemin veya alt rutinin adının, ayrılmış bir sözcük yerine tipik olarak bir tanımlayıcı olarak sınıflandırılması ve sözdizimsel analizde özel olarak ele alınmaması bakımından farklılık gösterir. Ayrıca, ayrılmış sözcükler programcı tarafından yeniden tanımlanmayabilir, ancak önceden tanımlanmış sözcükler genellikle bazı kapasitelerde geçersiz kılınabilir.

Diller, neyin anahtar kelime olarak sağlandığına ve neyin önceden tanımlandığına göre değişir. Örneğin bazı diller, giriş/çıkış işlemleri için anahtar sözcükler sağlarken, diğerlerinde bunlar kitaplık rutinleridir. In Python (sürümleri önceki 3,0'dan daha) ve daha birçok TEMEL lehçeler, printbir anahtar kelimedir. Buna karşılık, C, Lisp ve Python 3.0 eşdeğer printf, formatve printstandart kütüphanede fonksiyonlardır. Benzer şekilde, 3.0'dan önce Python'da None, True, ve Falseönceden tanımlanmış değişkenlerdi, ancak ayrılmış sözcükler değillerdi, ancak Python 3.0'da bunlar ayrılmış sözcüklere dönüştürüldü.

Tanım

Bazıları "anahtar kelime" ve "ayrılmış kelime" terimlerini birbirinin yerine kullanır, diğerleri ise kullanımı ayırt eder, örneğin "anahtar kelime"yi yalnızca belirli bağlamlarda özel olan bir kelimeyi, ancak "ayrılmış kelimeyi" kullanılamayan özel bir kelimeyi ifade etmek için kullanarak. kullanıcı tanımlı bir ad olarak. Anahtar kelimelerin anlamı - ve aslında, anahtar kelime kavramının anlamı - dilden dile büyük farklılıklar gösterir. Somut olarak, ALGOL 68'de, anahtar kelimeler kısaltılmıştır (katı dilde, kalın harflerle yazılmıştır) ve ayrılmış kelimeler değildir - kısaltılmamış kelime sıradan bir tanımlayıcı olarak kullanılabilir.

" Java Dil Belirtimi", "anahtar kelime" terimini kullanır. C programlama dili için ISO 9899 standardı "anahtar kelime" terimini kullanır.

C gibi birçok dilde ve C++ gibi benzer ortamlarda , bir anahtar kelime , sözdizimsel bir formu tanımlayan ayrılmış bir kelimedir. Kullanılan kelimeler denetim akışı gibi yapılarla, eğer , thenve elseanahtar kelimelerdir. Bu dillerde, anahtar kelimeler değişkenlerin veya işlevlerin adı olarak da kullanılamaz.

ALGOL ve Algol 68 gibi bazı dillerde, anahtar sözcükler kelimesi kelimesine yazılamaz, ancak kısaltılmalıdır . Bu, anahtar kelimelerin bir şekilde işaretlenmesi gerektiği anlamına gelir. Örneğin, alıntı yaparak veya önlerine özel bir karakter ekleyerek. Sonuç olarak, anahtar kelimeler ayrılmış kelimeler değildir ve bu nedenle aynı kelime normal bir tanımlayıcı olarak kullanılabilir. Bununla birlikte, bir ayırma rejimi, anahtar kelimeleri kısaltmamak ve bunun yerine sadece ayrılmış kelimeler olmasını sağlamaktı.

PostScript gibi bazı diller, bu yaklaşımda son derece liberaldir ve temel anahtar kelimelerin belirli amaçlar için yeniden tanımlanmasına izin verir.

In Common Lisp , dönem "anahtar kelime" (veya "anahtar kelime simgesi") özel bir tür için kullanılan sembol veya tanımlayıcı. Genellikle değişkenler veya fonksiyonlar için durmak diğer semboller, farklı olarak anahtar kelimeler öz vardır alıntı ve kendini değerlendirerek : 98 ve edilir enterne içinde KEYWORD paketinde. Anahtar sözcükler genellikle işlevlere göre adlandırılmış bağımsız değişkenleri etiketlemek ve sembolik değerleri temsil etmek için kullanılır. COMMON-LISP adlı pakette fonksiyonları, değişkenleri, özel formları ve makroları isimlendiren semboller temelde rezerve edilmiş kelimelerdir. Bunları yeniden tanımlamanın etkisi ANSI Common Lisp'te tanımlanmamıştır. Onları bağlamak mümkündür. Örneğin (if if case or), ifyerel bir değişken olduğunda ifade mümkündür . En soldaki operatöre ifatıfta bulunur if; kalan semboller değişken isimleri olarak yorumlanır. Fonksiyonlar ve değişkenler için ayrı bir ad alanı ifolduğundan, yerel bir değişken olabilir. Ancak Common Lisp'te anahtar kelime paketinde olmayan iki özel sembol vardır: semboller tve nil. İfadeler olarak değerlendirildiğinde kendilerine göre değerlendirirler. İşlev veya değişken adları olarak kullanılamazlar, bu nedenle fiilen saklıdırlar. (let ((t 42)))iyi biçimlendirilmiş bir ifadedir, ancak letoperatör kullanıma izin vermeyecektir.

Tipik olarak, bir programcı bir değişken veya fonksiyon adı için bir anahtar kelime kullanmaya çalıştığında, bir derleme hatası tetiklenir. Çoğu modern editörde, anahtar kelimeler, programcılara anahtar kelimeler olduklarını hatırlatmak veya bilgilendirmek için otomatik olarak belirli bir metin rengine sahip olacak şekilde ayarlanır.

Makrolu veya tembel değerlendirmeli dillerde, ifmakrolar veya işlevler gibi kontrol akışı yapıları uygulanabilir. Bu ifade özellikleri olmayan dillerde genellikle anahtar kelimelerdir.

Dillere göre karşılaştırma

Tüm diller aynı sayıda ayrılmış kelimeye sahip değildir. Örneğin, Java (ve diğer C türevleri) oldukça seyrek ayrılmış sözcükler tümlecine sahiptir (yaklaşık 50), COBOL ise yaklaşık 400'e sahiptir. Spektrumun diğer ucunda saf Prolog ve PL/I'de hiç yoktur.

Bir dildeki ayrılmış kelimelerin sayısının, bir dilin ne kadar “güçlü” olduğuyla pek ilgisi yoktur. COBOL, 1950'lerde bir iş dili olarak tasarlandı ve fiiller, yan tümceler, cümleler, bölümler ve bölümler gibi İngilizce benzeri yapısal öğeler kullanılarak kendi kendini belgeleyecek şekilde yapıldı. C ise çok özlü (sözdizimsel olarak) ve ekranda daha fazla metin almak için yazılmıştır. Örneğin, haftalık kazancı hesaplamak için C ve COBOL'den gelen eşdeğer kod bloklarını karşılaştırın:

      // Calculation in C:
      
      if (salaried)
              amount = 40 * payrate;
      else
              amount = hours * payrate;
      *> Calculation in COBOL:
      
      IF Salaried THEN
              MULTIPLY Payrate BY 40 GIVING Amount
      ELSE
              MULTIPLY Payrate BY Hours GIVING Amount
      END-IF.
      *> Other example of calculation in COBOL:
      
      IF Salaried 
              COMPUTE Amount = Payrate * 40
      ELSE
              COMPUTE Amount = hours * payrate
      END-IF.

Pure Prolog mantığı, ilişkiler açısından ifade edilir ve bu ilişkiler üzerinde sorgular çalıştırılarak yürütme tetiklenir. Döngüler gibi yapılar, özyinelemeli ilişkiler kullanılarak uygulanır.

Bu dillerin üçü de farklı sayıda ayrılmış sözcüklere sahip olsalar bile aynı türdeki "sorunları" çözebilir. Bu “güç”, Turing-tamamlanmış diller grubuna ait olmaları ile ilgilidir .

Dezavantajları

Bir dilde ayrılmış kelimelerin tanımlanması sorunları ortaya çıkarmaktadır. Tanımlayıcı olarak kullanılamayan, ezberlenmesi gereken uzun bir ayrılmış kelimeler listesi nedeniyle dili yeni kullanıcıların öğrenmesi zor olabilir. Dili genişletmek zor olabilir çünkü yeni özellikler için ayrılmış sözcüklerin eklenmesi mevcut programları geçersiz kılabilir veya tersine, mevcut ayrılmış sözcüklerin yeni anlamlarla "aşırı yüklenmesi" kafa karıştırıcı olabilir. Programları taşımak sorunlu olabilir, çünkü bir sistem/derleyici tarafından ayrılmayan bir kelime başka bir sistem tarafından rezerve edilebilir.

Ayrılmış kelimeler ve dil bağımsızlığı

Microsoft'un .NET Ortak Dil Altyapısı (CLI) özelliği , 40'tan fazla farklı programlama dilinde yazılmış kodun nihai bir üründe birleştirilmesine olanak tanır. Bu nedenle, bir dilde uygulanan kod başka bir dilde yazılmış kodu yürütmeye çalıştığında tanımlayıcı/ayrılmış sözcük çakışmaları meydana gelebilir. Örneğin, bir Visual Basic.NET kitaplığı aşağıdaki gibi bir sınıf tanımı içerebilir :

' Class Definition of This in Visual Basic.NET:

Public Class this
        ' This class does something...
End Class

Bu, bir araç kutusunun parçası olarak derlenir ve dağıtılırsa, “ ” türünde bir değişken tanımlamak isteyen bir C# programcısı thisbir sorunla karşılaşır: 'this'C#'da ayrılmış bir kelimedir. Bu nedenle, aşağıdakiler C#'da derlenmeyecektir:

// Using This Class in C#:

this x = new this();  // Won't compile!

Üyelere erişirken, sanal yöntemleri geçersiz kılarken ve ad alanlarını tanımlarken benzer bir sorun ortaya çıkar .

Bu, çömelme ile çözülür . Bu soruna geçici bir çözüm bulmak için, belirtim, programcının (C# dilinde ) at-işaretini , derleyici tarafından ayrılmış bir sözcük yerine bir tanımlayıcı olarak değerlendirilmeye zorlayan tanımlayıcının önüne yerleştirmesine olanak tanır :

// Using This Class in C#:

@this x = new @this();  // Will compile!

Tutarlılık için bu kullanıma yerel değişkenler, parametre adları ve özel üyeler gibi genel olmayan ayarlarda da izin verilir.

Ayrıca bakınız

Referanslar