Eyfel (programlama dili) - Eiffel (programming language)

Eyfel
Eyfel logosu
paradigma Nesneye yönelik , Sınıf tabanlı , Genel , Eşzamanlı
Tarafından tasarlandı Bertrand Meyer
geliştirici Eyfel Yazılım
İlk ortaya çıktı 1986
kararlı sürüm
EiffelStudio 20.11 / 21 Aralık 2020 ; 9 ay önce ( 2020-12-21 )
Önizleme sürümü
EiffelStudio 20.11 / 21 Aralık 2020 ; 9 ay önce ( 2020-12-21 )
Yazma disiplini statik
uygulama dili Eyfel
Platformu Çapraz platform
işletim sistemi FreeBSD , Linux , Mac OS X , OpenBSD , Solaris , Windows
Lisans ikili ve kurumsal
Dosya adı uzantıları .e
İnternet sitesi www .eyfel .org
Başlıca uygulamalar
EiffelStudio , LibertyEiffel , SmartEiffel , Visual Eiffel , Gobo Eiffel, "The Eiffel Compiler" tecomp
Tarafından etkilenmiş
Ada , Simula , Z
Etkilenen
Ada 2012 , Albatros , C# , D , Java , Raket , Ruby , Sather , Scala

Eiffel , Bertrand Meyer (nesne yönelimi savunucusu ve Object-Oriented Software Construction'ın yazarı ) ve Eiffel Software tarafından tasarlanan nesne yönelimli bir programlama dilidir . Meyer, dili 1985 yılında ticari yazılım geliştirmenin güvenilirliğini artırmak amacıyla tasarladı; ilk versiyonu 1986'da kullanıma sunuldu. 2005'te Eiffel, ISO standartlaştırılmış bir dil haline geldi .

Dilin tasarımı, Eyfel programlama yöntemiyle yakından bağlantılıdır. Her ikisi de sözleşmeye göre tasarım , komut-sorgu ayrımı , tek tip erişim ilkesi , tek seçim ilkesi , açık-kapalı ilkesi ve seçenek-işlenen ayrımı dahil olmak üzere bir dizi ilkeye dayanmaktadır .

Başlangıçta Eiffel tarafından tanıtılan birçok kavram daha sonra Java , C# ve diğer dillerde yerini buldu. Özellikle Ecma / ISO standardizasyon süreci aracılığıyla yeni dil tasarım fikirleri, Eyfel diline dahil edilmeye devam ediyor.

özellikleri

Eyfel dilinin temel özellikleri şunları içerir:

  • Bir sınıfın temel ayrıştırma birimi olarak hizmet ettiği nesne yönelimli bir program yapısı.
  • Sözleşmeye göre tasarım , diğer dil yapılarıyla sıkı bir şekilde entegre edilmiştir.
  • Genellikle çöp toplama tarafından uygulanan otomatik bellek yönetimi .
  • Kalıtım dahil çoklu kalıtım , yeniden adlandırma , yeniden tanımlanması , "select", uygun olmayan miras ve diğer mekanizmalar miras kasa yapmak niyetindeydi.
  • Kısıtlı ve kısıtlamasız genel programlama
  • INTEGER gibi temel türler de dahil olmak üzere tüm türlerin sınıf tabanlı olduğu, hem değeri hem de referans semantiğini işleyen tek tip bir tür sistemi .
  • Statik yazma
  • Ekli türler mekanizması aracılığıyla boş başvurulardaki çağrılara karşı güvenlik veya statik korumayı geçersiz kılın.
  • Kapanışlar ve lambda hesabı ile yakından bağlantılı, hesaplamaları saran aracılar veya nesneler .
  • Bir kez rutinler veya rutinler, nesne paylaşımı ve merkezi olmayan başlatma için yalnızca bir kez değerlendirilir.
  • ALGOL / Pascal geleneğinde anahtar kelime tabanlı sözdizimi, ancak noktalı virgül isteğe bağlı olduğu sürece ayırıcı içermez, rutinler için operatör sözdizimi mevcuttur.
  • Büyük/küçük harf duyarlılığı
  • Basit Eşzamanlı Nesneye Yönelik Programlama ( SCOOP ), bu araçların belirli ayrıntılarının üzerinde bir soyutlama düzeyinde birden çok, eşzamanlı olarak etkin yürütme araçlarının oluşturulmasını kolaylaştırır (örneğin, belirli muteks yönetimi olmayan birden çok iş parçacığı).

Tasarım hedefleri

Eiffel, prosedür kuralları yerine bildirimsel ifadeleri vurgular ve defter tutma talimatlarına olan ihtiyacı ortadan kaldırmaya çalışır.

Eiffel , derleyiciye optimizasyon ipuçları olarak tasarlanan kodlama hilelerinden veya kodlama tekniklerinden kaçınır . Amaç sadece kodu daha okunabilir kılmak değil, aynı zamanda programcıların uygulama detaylarında boğulmadan programın önemli yönlerine konsantre olmalarını sağlamaktır. Eiffel'in sadeliği, bilgi işlem sorunlarına basit, genişletilebilir, yeniden kullanılabilir ve güvenilir yanıtlar vermeyi amaçlamaktadır. Eyfel'de yazılmış bilgisayar programları için derleyiciler, programcıyı optimizasyon yükünün bir kısmından kurtaran otomatik satır içi gibi kapsamlı optimizasyon teknikleri sağlar.

Arka plan

Eiffel, ilk olarak Bertrand Meyer tarafından kurulan bir şirket olan Eiffel Software tarafından geliştirildi . Nesneye Yönelik Yazılım Yapısı , Eiffel'in tasarımına yol açan nesne teknolojisinin kavram ve teorisinin ayrıntılı bir incelemesini içerir.

Eyfel dilinin, kitaplıklarının ve programlama yöntemlerinin arkasındaki tasarım amacı, programcıların güvenilir, yeniden kullanılabilir yazılım modülleri oluşturmasını sağlamaktır. Eiffel, çoklu kalıtımı , jenerikliği , polimorfizmi , kapsüllemeyi , tür güvenli dönüşümleri ve parametre kovaryansını destekler . İçin Eiffel'in en önemli katkısı yazılım mühendisliği olan sözleşme ile tasarım (DBC), hangi iddialar , ön şartlar , Hedefşartlar ve sınıf değişmezleri verimliliği ödün vermeden programı doğruluğunu sağlamak yardım için istihdam edilmektedir.

Eiffel'in tasarımı, diğer paradigmaların yalnızca küçük etkisi veya eski kodun desteklenmesi endişesiyle nesne yönelimli programlama teorisine dayanmaktadır. Eiffel, soyut veri türlerini resmi olarak destekler . Eiffel'in tasarımı altında, bir yazılım metni, "Soyut Veri Türü"nün resmileştirilmiş bir uygulamasını kullanarak tasarım belgelerini metnin kendisinden yeniden üretebilmelidir.

Uygulamalar ve ortamlar

EiffelStudio , açık kaynak veya ticari lisans altında kullanılabilen entegre bir geliştirme ortamıdır . Yazılım mühendisliği için nesne yönelimli bir ortam sunar . EiffelEnvision, kullanıcıların Eiffel projelerini Microsoft Visual Studio IDE içinden düzenlemesine, derlemesine ve hatalarını ayıklamasına olanak tanıyan bir Microsoft Visual Studio eklentisidir . Beş diğer açık kaynak uygulaması mevcuttur: "Eyfel Derleyicisi" tecomp; Gobo Eyfel; SmartEiffel , dilin daha eski bir sürümüne dayanan GNU uygulaması; SmartEiffel derleyicisine dayalı LibertyEiffel ; ve Görsel Eyfel .

Diğer birçok programlama dili, ilk olarak Eyfel'de tanıtılan öğeleri içerir. Örneğin Sather , başlangıçta Eiffel'e dayanıyordu, ancak o zamandan beri farklılaştı ve şimdi birkaç işlevsel programlama özelliği içeriyor. BlueJ'in öncüsü olan etkileşimli öğretim dili Blue da Eyfel merkezlidir. Elma Medya Aracı Eyfel tabanlı Apple Medya Dili içerir.

Özellikler ve standartlar

Eyfel dil tanımı, ISO'nun uluslararası bir standardıdır . Standart, standardı ilk kez 21 Haziran 2005'te Standart ECMA-367, Eiffel: Analiz, Tasarım ve Programlama Dili olarak onaylayan ECMA International tarafından geliştirilmiştir . Haziran 2006'da ECMA ve ISO ikinci versiyonu kabul etti. Kasım 2006'da ISO bu versiyonu ilk kez yayınladı. Standart, ECMA sitesinde ücretsiz olarak bulunabilir ve kullanılabilir. ISO sürümü, biçimlendirme dışında her açıdan aynıdır.

Eiffel Software, "The Eiffel Compiler" tecomp ve Eiffel-library-developer Gobo, standardı uygulamayı taahhüt etti; Eiffel Software'in EiffelStudio 6.1 ve "The Eiffel Compiler" tecomp'u, özellikle satır içi aracılar, atama komutları, köşeli ayraç gösterimi, uygun olmayan miras ve ekli türler gibi bazı önemli yeni mekanizmaları uygular. SmartEiffel ekip daha yakın Eiffel özgün tarzına olduğuna inandığımız dil, kendi versiyonunu oluşturmak için bu standardın uzak döndü. Object Tools, Eiffel derleyicisinin gelecekteki sürümlerinin standarda uyup uymayacağını açıklamadı. LibertyEiffel , SmartEiffel dili ile standart arasında bir yerde bir lehçe uygular .

Standart, aşağıdaki, önceki Eyfel dili spesifikasyonlarına atıfta bulunur:

  • Bertrand Meyer: Eiffel: The Language, Prentice Hall, ikinci baskı, 1992 (ilk baskı: 1991)
  • Bertrand Meyer: Standard Eiffel (önceki girişin revizyonu), devam ediyor, 1997'den günümüze, Bertrand Meyer'in ETL3 sayfasında ve
  • Bertrand Meyer: Nesneye Yönelik Yazılım İnşaatı, Prentice Hall: ilk baskı, 1988; ikinci baskı, 1997.
  • Bertrand Meyer: Sınıfın Dokunuşu: Nesneler ve Sözleşmelerle İyi Programlamayı Öğrenmek, Springer-Verlag, 2009 ISBN  978-3-540-92144-8 lxiv + 876 sayfa Tam renkli baskı, çok sayıda renkli fotoğraf

Standardın Haziran 2006'daki mevcut versiyonu bazı tutarsızlıklar içermektedir (örneğin, kovaryant yeniden tanımlamalar). ECMA komitesi henüz tutarsızlıkların nasıl çözüleceğine dair herhangi bir zaman çizelgesi ve yön açıklamadı.

Sözdizimi ve anlambilim

Genel yapı

Bir Eyfel "sistemi" veya "programı", bir sınıflar topluluğudur . Eiffel, sınıfların seviyesinin üzerinde , esasen bir sınıflar grubu ve muhtemelen alt kümelerden (iç içe kümeler) oluşan kümeyi tanımlar . Kümeler, sözdizimsel bir dil yapısı değil, standart bir organizasyon kuralıdır. Tipik olarak bir Eyfel programı, her sınıf ayrı bir dosyada ve her küme, sınıf dosyalarını içeren bir dizinde düzenlenecektir. Bu kuruluşta, alt kümeler alt dizinlerdir. Örneğin, standart organizasyon ve büyük/küçük harf kullanım kuralları altında, X adlı bir sınıfı tanımlayan bir dosyanın adı olabilir. x.e

Bir sınıf, diğer nesne yönelimli programlama dillerindeki "rutinler", "üyeler", "öznitelikler" veya "yöntemler"e benzer özellikler içerir . Bir sınıf ayrıca değişmezlerini tanımlar ve belgeler ve meta veriler için "notlar" bölümü gibi diğer özellikleri içerir. Eiffel'in INTEGER, STRINGve gibi standart veri türlerinin ARRAYtümü sınıflardır.

Her sistem, "root" olarak belirlenmiş bir sınıfa sahip olmalıdır ve yaratma prosedürlerinden biri "kök prosedürü" olarak belirlenmiş olmalıdır. Bir sistemi yürütmek, kök sınıfın bir örneğini oluşturmak ve onun kök prosedürünü yürütmekten oluşur. Genel olarak, bunu yapmak yeni nesneler yaratır, yeni özellikleri çağırır vb.

Eiffel'in beş temel yürütülebilir talimatı vardır: atama, nesne oluşturma, rutin çağrı, koşul ve yineleme. Eiffel'in kontrol yapıları, yapılandırılmış programlamanın uygulanmasında katıdır: her bloğun tam olarak bir girişi ve tam olarak bir çıkışı vardır.

Kapsam belirleme

Birçok nesne yönelimli dilden farklı olarak, ancak Smalltalk gibi , Eiffel, bilgi gizleme veya veri soyutlama ilkesinin pratik uygulaması olan, veri için resmi arayüzler gerektiren bir nesnenin özellikleri dışında, nesnelerin niteliklerine herhangi bir atamaya izin vermez. mutasyon. Diğer nesne yönelimli programlama dillerinin diline koymak için, tüm Eiffel öznitelikleri "korunur" ve istemci nesnelerinin değerleri değiştirmesi için "ayarlayıcılara" ihtiyaç vardır. Bunun bir sonucu, "ayarlayıcıların", Eiffel'in sözdizimi sağladığı değişmezleri uygulayabilmesi ve normalde yapmasıdır.

Eyfel, sınıfın bir istemcisi tarafından bir sınıfın özelliklerine doğrudan erişime izin vermese de, aşağıdaki gibi bir "atama komutu" tanımına izin verir:

 
   some_attribute: SOME_TYPE assign set_some_attribute
    
   set_some_attribute (v: VALUE_TYPE)
                -- Set value of some_attribute to `v'.
            do
                some_attribute := v
            end

Doğrudan erişim gibi görünen bir şeye izin vermek için genel geliştirici topluluğuna hafif bir selam olsa da (örneğin, Bilgi Gizleme İlkesini ihlal ederek), bu uygulama, kullanılan bir "ayarlayıcı" gerçeğini gizlediği veya kararttığı için tehlikelidir. Pratikte, some_attributeyukarıdaki örnek koddaki gibi bir özelliğe doğrudan erişim ima etmek yerine çağrıyı bir ayarlayıcıya yönlendirmek daha iyidir .

Diğer dillerden farklı olarak, "genel", "korumalı", "özel" vb. kavramlara sahip olan Eiffel, müşteri ve tedarikçi sınıfları arasındaki kapsamı daha kesin olarak kontrol etmek için bir dışa aktarma teknolojisi kullanır. Özellik görünürlüğü, derleme zamanında statik olarak kontrol edilir. Örneğin, (aşağıda) "{NONE}", diğer dillerdeki "korumalı"ya benzer. Bir "özellik kümesine" bu şekilde uygulanan kapsam (örneğin, bir sonraki özellik kümesi anahtar sözcüğüne veya sınıfın sonuna 'özellik' anahtar sözcüğünün altındaki her şey), "dışa aktarma" anahtar sözcüğü kullanılarak alt sınıflarda değiştirilebilir.

feature {NONE} -- Initialization
	default_create
			-- Initialize a new `zero' decimal instance.
		do
			make_zero
		end

Alternatif olarak, bir {x} ihracat bildiriminin olmaması {ANY} anlamına gelir ve diğer dillerin "genel" kapsamına benzer.

feature -- Constants

Son olarak, kapsam belirleme, Eyfel proje evrenindeki herhangi bir sınıf için seçici ve hassas bir şekilde kontrol edilebilir, örneğin:

feature {DECIMAL, DCM_MA_DECIMAL_PARSER, DCM_MA_DECIMAL_HANDLER} -- Access

Burada derleyici, özellik grubu içindeki özelliklere erişmek için yalnızca küme parantezleri arasında listelenen sınıflara izin verir (örn. DECIMAL, DCM_MA_DECIMAL_PARSER, DCM_MA_DECIMAL_HANDLER ).

"Selam Dünya!"

Bir programlama dilinin görünümü ve hissi genellikle bir "Merhaba dünya!" kullanılarak iletilir . programı. Eyfel'de yazılmış böyle bir program şöyle olabilir:

class
    HELLO_WORLD
create
    make
feature
    make
        do
            print ("Hello, world!%N")
        end
end

Bu program sınıfı içerir HELLO_WORLD. Sınıfın yapıcısı (yaratma yordamı) , çıktıya bir mesaj yazmak makeiçin printsistem kitaplığı yordamını çağırır "Hello, world!".

Sözleşmeye göre tasarım

Sözleşmeye Göre Tasarım kavramı Eiffel'in merkezinde yer alır. Sözleşmeler, bir rutin yürütülmeden önce neyin doğru olması gerektiğini (ön koşul) ve rutin bittikten sonra neyin doğru olması gerektiğini (son koşul) belirtir. Sınıf Değişmeyen sözleşmeleri, bir sınıfın herhangi bir özelliğine erişilmeden önce ve sonra (hem rutinler hem de nitelikler) hangi iddiaların doğru olması gerektiğini tanımlar. Ayrıca, sözleşmeler, bir sınıfın veya bir bütün olarak sınıfın özelliklerinin çalışma ortamı hakkındaki varsayımları değişmez aracılığıyla yürütülebilir kod geliştiricisine ve tasarımcılarına kodlar.

Eiffel derleyicisi, çeşitli seviyelerde özellik ve sınıf sözleşmelerini içerecek şekilde tasarlanmıştır. Örneğin EiffelStudio, "Çalışma Tezgahı modunda" yürütme sırasında tüm özellik ve sınıf sözleşmelerini yürütür. Bir yürütülebilir dosya oluşturulduğunda, derleyiciye proje ayarları dosyası (örn. ECF dosyası) aracılığıyla herhangi bir sözleşme setini dahil etmesi veya hariç tutması talimatı verilir. Bu nedenle, yürütülebilir bir dosya, herhangi bir sözleşme düzeyini içerecek veya hariç tutacak şekilde derlenebilir ve böylece sürekli birim ve entegrasyon testi düzeylerini beraberinde getirir. Ayrıca, EiffelStudio'da bulunan Otomatik Test özelliği aracılığıyla sözleşmeler sürekli ve metodik olarak uygulanabilir.

Sözleşmeye Göre Tasarım mekanizmaları, dil ile sıkı bir şekilde bütünleştirilmiştir ve kalıtımdaki özelliklerin yeniden tanımlanmasına rehberlik eder:

  • Rutin önkoşul: Önkoşul yalnızca kalıtım yoluyla zayıflatılabilir; atanın gereksinimlerini karşılayan herhangi bir çağrı, soyundan gelenin gereksinimlerine uygundur.
  • Rutin sonkoşul: Sonkoşul yalnızca kalıtım yoluyla güçlendirilebilir; ata tarafından garanti edilen herhangi bir sonuç, yine de torun tarafından sağlanır.
  • Sınıf değişmezi: Nesnenin oluşturulmasından sonra ve dışa aktarılan bir sınıf rutinine yapılan herhangi bir çağrıdan sonra doğru olması gereken koşullar. Değişmez çok sık kontrol edildiğinden, onu aynı anda en pahalı ve en güçlü koşul veya sözleşme biçimi yapar.

Ek olarak, dil bir "kontrol talimatını" (bir tür "iddia"), döngü değişmezlerini ve döngü değişkenlerini (döngü sonlandırmasını garanti eden) destekler.

Void-safe özelliği

Statik yazma gibi boşluk güvenliği özelliği, yazılım kalitesini artırmaya yönelik başka bir olanaktır. Void-safe yazılım, void referanslarına yapılan çağrıların neden olduğu çalışma zamanı hatalarından korunur ve bu nedenle, void hedeflerine yapılan çağrıların meydana gelebileceği yazılımlardan daha güvenilir olacaktır. Statik yazmaya benzetme kullanışlıdır. Aslında, boşluk emniyeti yeteneği, tip sistemine bir uzantı veya statik tiplemenin ötesinde bir adım olarak görülebilir, çünkü boşluk güvenliğini sağlamaya yönelik mekanizma tip sistemine entegre edilmiştir.

Geçersiz hedef çağrılarına karşı koruma, ek kavramı ve (uzantı ile) ayrılma (örn. ayrılabilir anahtar kelime) yoluyla görülebilir. Void-safe tesisi, yukarıda kullanılan örnek kodun kısa bir yeniden çalışmasında görülebilir:

   some_attribute: detachable SOME_TYPE
    
   use_some_attribute
                -- Set value of some_attribute to `v'.
            do
                if attached some_attribute as l_attribute then
                    do_something (l_attribute)
                end
            end
    
    do_something (a_value: SOME_TYPE)
                -- Do something with `a_value'.
            do
               ... doing something with `a_value' ...
            end

Yukarıdaki kod örneği, derleyicinin some_attribute, kullanıldığı noktada takılıp takılmayacağının veya ayrılacağının güvenilirliğini statik olarak nasıl ele alabileceğini gösterir . Özellikle, attachedanahtar kelime, l_attributeyalnızca if-ifadesi yapısı tarafından çevrelenen kod bloğunun kapsamına giren bir "yerel ek"e (örn. ) izin verir . Bu nedenle, bu küçük kod bloğu içinde, yerel değişkenin (örn. l_attribute) geçersiz olmadığı (yani, geçersiz olduğu) statik olarak garanti edilebilir.

Özellikler: komutlar ve sorgular

Bir sınıfın birincil özelliği, bir dizi özelliği tanımlamasıdır: bir sınıf, bir dizi çalışma zamanı nesnesini veya "örneği" temsil ettiğinden, bir özellik bu nesneler üzerinde bir işlemdir. İki tür özellik vardır: sorgular ve komutlar. Bir sorgu, bir örnek hakkında bilgi sağlar. Bir komut bir örneği değiştirir.

Eiffel yöntemi için komut-sorgu ayrımı önemlidir. Özellikle:

  • Tekdüzen Erişim İlkesi : bir sınıf özelliğine çağrı yapan bir yazılım istemcisi açısından, sorgunun bir öznitelik (alan değeri) veya bir işlev (hesaplanan değer) olup olmadığı herhangi bir fark yaratmamalıdır. Örneğin a_vehicle.speed, nesne üzerinde erişilen bir öznitelik a_vehicleolabilir veya mesafeyi zamana bölen bir fonksiyon tarafından hesaplanabilir. Notasyon her iki durumda da aynıdır, böylece istemci yazılımını etkilemeden sınıfın uygulamasını değiştirmek kolaydır.
  • Komut-Sorgu Ayırma İlkesi : Sorgular, örneği değiştirmemelidir. Bu bir dil kuralı değil, metodolojik bir ilkedir. Bu nedenle, iyi bir Eyfel stilinde, bir şeyi değiştiren ve bir sonuç döndüren "get" işlevleri bulunmaz; bunun yerine nesneleri değiştirmek için komutlar (prosedürler) ve önceki değişikliklerden kaynaklanan nesne hakkında bilgi almak için sorgular vardır.

Aşırı yükleme

Eyfel, argümanın aşırı yüklenmesine izin vermez . Bir sınıf içindeki her bir özellik adı, her zaman sınıf içindeki belirli bir özellikle eşlenir. Bir sınıf içindeki bir isim, tek bir anlama gelir. Bu tasarım seçimi, bir çağrı tarafından hangi rutinin çağrılacağı konusunda bir belirsizlik nedeninden kaçınarak sınıfların okunabilirliğine yardımcı olur. Ayrıca dil mekanizmasını da basitleştirir; özellikle, Eyfel'in çoklu kalıtım mekanizmasını mümkün kılan şey budur.

İsimler elbette farklı sınıflarda tekrar kullanılabilir. Örneğin, plus özelliği (infix takma adı "+" ile birlikte ) birkaç sınıfta tanımlanmıştır: INTEGER , REAL , STRING , vb.

jenerik

Genel bir sınıf, türe göre değişen bir sınıftır (örneğin, LİSTE [TELEFON], telefon numaralarının bir listesi; HESAP [G->HESAP_TÜRÜ], HESAP [TASARRUF] ve HESAP [KONTROL], vb.). Sınıflar, türlere göre parametrelendirildiklerini ifade etmek için genel olabilir. Genel parametreler köşeli parantez içinde görünür:

class LIST [G] ...

G, "resmi genel parametre" olarak bilinir. (Eiffel "argüman"ı rutinler için saklı tutar ve "parametre"yi yalnızca genel sınıflar için kullanır.) Böyle bir bildirimle G, sınıf içinde keyfi bir türü temsil eder; böylece bir işlev G türünde bir değer döndürebilir ve bir rutin bu türden bir argüman alabilir:

item: G do ... end
put (x: G) do ... end

LIST [INTEGER]Ve LIST [WORD]bu sınıfın "jenerik türevleri" dir. İzin verilen kombinasyonlar ( n: INTEGER, w: WORD, il: LIST [INTEGER], wl: LIST [WORD]) şunlardır:

n := il.item
wl.put (w)

INTEGERve WORDbu jenerik türevlerdeki "gerçek jenerik parametreler"dir.

Gerçek parametrenin belirli bir sınıftan, "kısıtlama"dan miras alması gereken 'kısıtlı' biçimsel parametrelere sahip olmak da mümkündür. Örneğin,

   class HASH_TABLE [G, KEY -> HASHABLE]

türetme HASH_TABLE [INTEGER, STRING], yalnızca STRINGkalıtsal olması durumunda geçerlidir HASHABLE(gerçekten de tipik Eyfel kitaplıklarında olduğu gibi). Sınıfında, sahip KEYtarafından kısıtlı HASHABLEiçin bu araçlar x: KEYo uygulamak mümkündür xtüm özellikleri HASHABLEolduğu gibi x.hash_code.

Kalıtımla ilgili temel bilgiler

Bir veya daha fazla diğerlerinden miras almak için, bir sınıf inheritbaşında bir yan tümce içerecektir :

class C inherit
   A
   B

-- ... Rest of class declaration ...

Sınıf, devralınan özelliklerin bir kısmını veya tamamını yeniden tanımlayabilir (geçersiz kılabilir). Bu, sınıfın başında redefine, aşağıdaki gibi, miras maddesinin bir alt maddesi aracılığıyla açıkça bildirilmelidir .

class C inherit
    A
        redefine f, g, h end
    B
        redefine u, v end

Eyfel mirasının tam bir tartışması için bakınız.

Ertelenmiş sınıflar ve özellikler

Sınıflar , sınıfın doğrudan somutlaştırılamayacağını belirtmek için ile deferred classyerine ile tanımlanabilir class. Örneklenemeyen sınıflara diğer bazı nesne yönelimli programlama dillerinde soyut sınıflar denir . Eyfel dilinde, yalnızca "etkili" bir sınıf somutlaştırılabilir (ertelenmiş bir sınıfın soyundan gelebilir). Bir özellik, deferredbir doyan tümce yerine anahtar kelime kullanılarak da ertelenebilir . Bir sınıfın ertelenmiş özellikleri varsa, ertelenmiş olarak bildirilmelidir; ancak, ertelenmiş özellikleri olmayan bir sınıfın kendisi yine de ertelenebilir.

Ertelenmiş sınıflar , Java gibi dillerde arayüzlerle aynı rolü oynar , ancak birçok nesne yönelimli programlama teorisyeni, arayüzlerin büyük ölçüde Java'nın (Eiffel'in sahip olduğu) çoklu kalıtım eksikliğine bir cevap olduğuna inanır.

yeniden adlandırma

Bir veya daha fazla diğerlerinden miras alan bir sınıf, tüm özelliklerini varsayılan olarak orijinal adları altında alır. Bununla birlikte, adlarını renameyan tümceler yoluyla değiştirebilir . Miras alınan özellikler arasında ad çakışmaları varsa, çoklu kalıtım durumunda bu gereklidir; yeniden adlandırma olmadan, sonuçta ortaya çıkan sınıf, yukarıda belirtilen aşırı yüklenmeme ilkesini ihlal edecek ve dolayısıyla geçersiz olacaktır.

demetler

Tuples türleri, yalnızca öznitelikleri ve karşılık gelen "ayarlayıcı" prosedürünü sağlayan basit bir sınıf biçimi olarak görülebilir. Tipik bir demet türü okur

   TUPLE [name: STRING; weight: REAL; date: DATE]

ve bir sınıfa ihtiyaç yoksa, basit bir doğum kaydı kavramını tanımlamak için kullanılabilir. Böyle bir demetin bir örneği, basitçe, parantez içinde verilen, verilen türlere sahip bir değerler dizisidir, örneğin:

   ["Brigitte", 3.5, Last_night]

Böyle bir demetin bileşenlerine, demet etiketleri bir sınıfın öznitelikleriymiş gibi erişilebilir, örneğin tyukarıdaki demet atanmışsa t.weight3.5 değerine sahiptir.

Atanan komut kavramı sayesinde (aşağıya bakınız), nokta gösterimi, aşağıdaki gibi bir tanımlama grubunun bileşenlerini atamak için de kullanılabilir.

   t.weight := t.weight + 0.5

Tuple etiketleri isteğe bağlıdır, böylece bir tanımlama grubu tipini TUPLE [STRING, REAL, DATE]. (Bazı derleyicilerde, etiketler ECMA standardı ile tanıtıldığından, bu tek tanımlama grubu biçimidir.)

Örneğin hassas özellikleri TUPLE [A, B, C]bu dizilerini tarif eder ki , en az üç elementin, tip ilk üç varlık A, B, Csırasıyla. Sonuç olarak, tüm tanımlama gruplarının uyduğu en üstteki tanımlama grubu türüne ( TUPLE [A, B, C]atanabilir) TUPLE [A, B], TUPLE [A]ve TUPLE(parametresiz) ile uyumludur.

Temsilciler

Eiffel'in "aracı" mekanizması, işlemleri nesnelere sarar. Bu mekanizma, yineleme, olay güdümlü programlama ve program yapısı çevresinde işlemleri aktarmanın yararlı olduğu diğer bağlamlar için kullanılabilir. Diğer programlama dilleri, vurgulamak özellikle olanlar fonksiyonel programlama kullanılarak benzer bir model izin devamlılık , kapanışları , ya jeneratörleri ; Eiffel'in aracıları dilin nesne yönelimli paradigmasını vurgular ve Smalltalk ve Ruby'deki kod bloklarına benzer bir sözdizimi ve anlambilim kullanır .

Örneğin, my_actionöğesinin her bir öğesi için bloğu yürütmek için biri şunu my_listyazar:

   my_list.do_all (agent my_action)

my_actionYalnızca aşağıdakileri karşılayan öğeler üzerinde yürütmek için my_conditionbir sınırlama/filtre eklenebilir:

   my_list.do_if (agent my_action, agent my_condition)

Bu örneklerde my_actionve my_conditionrutinlerdir. Bunları öneklemek agent, tüm özellikleriyle, özellikle uygun argümanlarla çağrılma yeteneğiyle ilgili rutini temsil eden bir nesne verir. Bu nedenle, abu nesneyi temsil ediyorsa (örneğin a, argüman olduğu için do_all), talimat

   a.call ([x])

orijinal rutini xdoğrudan orijinal rutini çağırmışız gibi argümanla çağırır : my_action (x). Argümanlar callburada bir demet olarak iletilir [x].

Bir aracıya bazı argümanları açık tutmak ve diğerlerini kapalı yapmak mümkündür . Açık argümanlar, argüman olarak iletilir call: bunlar, aracı kullanımı sırasında sağlanır . Kapalı argümanlar, etmen tanımı sırasında sağlanır . Örneğin action2, iki argüman varsa , yineleme

   my_list.do_all (agent action2 (?, y))

ikinci bağımsız değişkenin olarak ayarlı kaldığı action2 (x, y)ardışık değerleri için yinelenir . Soru işareti açık bir argümanı gösterir; vekilin kapalı bir argümanıdır. Temel sözdiziminin , tüm bağımsız değişkenlerin açık olduğu bir kısayol olduğunu unutmayın . Aynı yapmak da mümkündür hedef notasyonu aracılığıyla bir ajan açık artırmalı hedefin türüdür. xy?yagent fagent f (?, ?, ...){T}?T

Açık ve kapalı işlenenler (işlenenler = argümanlar + hedef) arasındaki ayrım, lambda hesabındaki bağlı ve serbest değişkenler arasındaki ayrıma karşılık gelir . action2 (?, y)Bazı işlenenlerin kapalı ve bazılarının açık olduğu gibi bir aracı ifadesi , kapalı işlenenlerde kıvrılan orijinal işlemin bir versiyonuna karşılık gelir .

Aracı mekanizması ayrıca, aşağıdaki gibi satır içi ajanlar aracılığıyla mevcut bir rutine ( my_action, my_condition, gibi action2) referans olmaksızın bir ajanın tanımlanmasına izin verir .

my_list.do_all (agent (s: STRING)
     require
         not_void: s /= Void
     do
         s.append_character (',')
     ensure
         appended: s.count = old s.count + 1
     end)

Buraya aktarılan satır içi aracı, ön koşul, son koşul, kurtarma maddesi (burada kullanılmaz) ve tam bir imza dahil olmak üzere normal bir rutinin tüm tuzaklarına sahip olabilir. Bu, gerekli olan tek şey bir aracıya sarılacak bir hesaplama olduğunda rutinleri tanımlamaktan kaçınır. Bu, bir listenin tüm öğelerinin pozitif olduğunu ifade eden değişmez bir maddede olduğu gibi, özellikle sözleşmeler için yararlıdır:

   my_list.for_all (agent (x: INTEGER): BOOLEAN do Result := (x > 0) end)

Mevcut madde mekanizması yaprakları (bir rutin, çalışma zamanı tip bir hata olasılığı , n bağımsız değişken bekliyor bir madde geçirilir m ile bağımsız değişkenleri m < n ). Bu ön koşul üzerinden bir çalışma zamanı çek ile önlenebilir valid_argumentsbir call. Ribet ve ark.

Bir kez rutinler

Bir rutinin sonucu, yerine onceanahtar sözcük kullanılarak önbelleğe alınabilir do. Bir rutine yapılan ilk olmayan çağrılar, ek hesaplama veya kaynak tahsisi gerektirmez, ancak yalnızca önceden hesaplanmış bir sonucu döndürür. "Bir kez işlevler" için ortak bir kalıp, paylaşılan nesneler sağlamaktır; ilk çağrı nesneyi yaratacak, sonraki çağrılar o nesneye referansı döndürecektir. Tipik şema:

shared_object: SOME_TYPE
    once
        create Result.make (args)
             -- This creates the object and returns a reference to it through `Result'.
    end

ResultÖrnekte döndürülen nesnenin kendisi değiştirilebilir olabilir, ancak referansı aynı kalır.

Genellikle "bir kez rutinleri" gerekli bir başlatmayı gerçekleştirir: bir kitaplığa yapılan birden fazla çağrı, başlatma prosedürüne bir çağrı içerebilir, ancak yalnızca bu tür ilk çağrı gerekli eylemleri gerçekleştirir. Bu modelin kullanılması, özel bir başlatma modülüne duyulan ihtiyaçtan kaçınarak merkezi olmayan bir şekilde başlatılabilir. "Bir kez rutinleri", birçok programlama dilindeki singleton modeline ve Python'da kullanılan Borg modeline amaç ve etki bakımından benzerdir .

Varsayılan olarak, iş parçacığı başına bir "bir kez rutin" çağrılır . Semantik, bir "bir kez anahtarı" ile nitelenerek, işlem başına bir kez veya nesne başına bir kez olarak ayarlanabilir , örn once ("PROCESS").

Dönüşümler

Eiffel, çeşitli türler arasında dönüşümlere izin veren bir mekanizma sağlar. Mekanizmalar kalıtımla bir arada bulunur ve onu tamamlar. İki mekanizma arasında herhangi bir karışıklığı önlemek için tasarım aşağıdaki prensibi uygular:

(Dönüştürme ilkesi) Bir tür hem uyumlu hem de diğerine dönüşmeyebilir.

Örneğin, ile NEWSPAPERuyumlu olabilir PUBLICATION, ancak INTEGERona dönüşür REAL(ve ondan miras almaz).

Dönüştürme mekanizması , çoğu programlama dilinde mevcut olan geçici dönüştürme kurallarını (aslında INTEGERve gibi REAL) basitçe genelleştirir ve yukarıdaki ilkeye uyulduğu sürece bunları herhangi bir türe uygulanabilir hale getirir. Örneğin, bir DATEsınıfa dönüştürüleceği bildirilebilir STRING; bu, basitçe bir tarihten bir dize oluşturmayı mümkün kılar

   my_string := my_date

bir dönüştürme prosedürüyle açık bir nesne oluşturmayı kullanmak için bir kısayol olarak:

   create my_string.make_from_date (my_date)

Birinci formun ikincinin eş anlamlısı olmasını sağlamak için, oluşturma prosedürünü (constructor) sınıfın başındaki make_from_datebir convertcümlede listelemek yeterlidir .

Başka bir örnek olarak, 'den listelenen böyle bir dönüştürme prosedürü varsa TUPLE [day: INTEGER; month: STRING; year: INTEGER], o zaman bir tarihe doğrudan bir tanımlama grubu atayabilir ve aşağıdaki gibi uygun dönüştürmeye neden olabilir.

      Bastille_day := [14, "July", 1789]

İstisna işleme

Eyfel'de istisna işleme , sözleşmeye göre tasarım ilkelerine dayanmaktadır. Örneğin, bir rutinin arayanı bir ön koşulu yerine getiremediğinde veya bir rutin vaat edilen bir son koşulu sağlayamadığında bir istisna oluşur. Eyfel'de istisna işleme, kontrol akışı veya veri girişi hatalarını düzeltmek için kullanılmaz .

Bir Eiffel istisna işleyicisi, kurtarma anahtar sözcüğü kullanılarak tanımlanır . İçinde kurtarma bölümünde, yeniden deneme anahtar kelime tekrar rutinini uygular. Örneğin, aşağıdaki yordam, yordamı yürütme girişimlerinin sayısını izler ve yalnızca belirli sayıda yeniden dener:

connect_to_server (server: SOCKET)
      -- Connect to a server or give up after 10 attempts.
    require
        server /= Void and then server.address /= Void
    local
        attempts: INTEGER
    do
        server.connect
    ensure
      connected: server.is_connected
    rescue
        if attempts < 10 then
            attempts := attempts + 1
            retry
        end
    end

Bununla birlikte, bu örnek, en basit programlar dışında herhangi bir şey için tartışmalıdır, çünkü bağlantı hatası beklenebilir. Çoğu program için try_connecting_to_server gibi bir rutin ad daha iyi olurdu ve son koşul bir bağlantı vaat etmez, bağlantı açılmadıysa uygun adımları atmayı arayana bırakır.

eşzamanlılık

EiffelNet ve EiffelThreads gibi bir dizi ağ ve iş parçacığı kitaplığı mevcuttur. Eiffel için sözleşmeye göre tasarım kavramlarına dayanan bir eşzamanlılık modeli, SCOOP veya Basit Eşzamanlı Nesneye Yönelik Programlamadır , henüz resmi dil tanımının bir parçası değildir, ancak EiffelStudio'da mevcuttur . CAMEO, Eiffel için SCOOP'un (uygulanmamış) bir varyasyonudur. Eşzamanlılık ayrıca istisnalarla etkileşime girer. Zaman uyumsuz istisnalar sorunlu olabilir (burada bir rutin, arayanın kendisi bittikten sonra bir istisna oluşturur).

Operatör ve parantez sözdizimi, atama komutları

Eiffel'in hesaplama görüşü, her işlemin bir nesneye, "hedefe" göre olması anlamında tamamen nesne yönelimlidir. Yani örneğin gibi bir ekleme

a + b

kavramsal olarak yöntem çağrısıymış gibi anlaşılır

a.plus (b)

hedef a, özellik plusve argüman ile b.

Tabii ki, birincisi geleneksel sözdizimidir ve genellikle tercih edilir. Operatör sözdizimi, özelliği bildirerek her iki formun da kullanılmasını mümkün kılar (örneğin in INTEGER, ancak bu diğer temel sınıflar için geçerlidir ve böyle bir operatörün uygun olduğu herhangi bir başka formda kullanılabilir):

plus alias "+" (other: INTEGER): INTEGER
        -- ... Normal function declaration...
    end

"Takma ad" olarak kullanılabilecek operatörlerin aralığı oldukça geniştir; "+" gibi önceden tanımlanmış operatörleri ve ayrıca alfasayısal olmayan sembollerden oluşan "serbest operatörleri" içerirler. Bu, örneğin matematik ve fizik uygulamalarında özel ek ve önek notasyonları tasarlamayı mümkün kılar.

Her sınıf ek olarak var olabilir , bir gösterim sağlayan "[]", "dirsek" operatöre işlevi diğer adı a [i, ...]ile eşanlamlı olarak a.f (i, ...)burada fseçilmiş bir fonksiyondur. Bu, özellikle diziler, karma tablolar , listeler vb. gibi kap yapıları için kullanışlıdır . Örneğin, bir karma tablonun bir öğesine dize anahtarlarıyla erişim yazılabilir.

   number := phone_book ["JILL SMITH"]

"Atanan komutları", nesne yönelimli programlama çerçevesinde yeniden yorumlanan iyi kurulmuş, uygun gösterimlere izin verme ruhuyla tasarlanmış eşlik eden bir mekanizmadır. Atanan komutları, atama benzeri sözdiziminin "ayarlayıcı" prosedürlerini çağırmasına izin verir. Uygun bir atama asla formda olamaz, a.x := vçünkü bu bilgi gizlemeyi ihlal eder; bir ayarlayıcı komutu (prosedür) için gitmeniz gerekir. Örneğin, karma tablo sınıfı, işleve ve prosedüre sahip olabilir.

item alias "[]" (key: STRING): ELEMENT         [3]
      -- The element of key `key'.
      -- ("Getter" query)
    do
        ...
    end

put (e: ELEMENT; key: STRING)
      -- Insert the element `e', associating it with the key `key'.
      -- ("Setter" command)
    do
        ...
    end

Ardından bir öğe eklemek için setter komutuna açık bir çağrı kullanmanız gerekir:

   [4] phone_book.put (New_person, "JILL SMITH")

Bunu eşdeğer olarak şu şekilde yazmak mümkündür:

   [5] phone_book ["JILL SMITH"] := New_person

(aynı şekilde ile phone_book ["JILL SMITH"]eşanlamlı number := phone_book.item ("JILL SMITH")), itemşimdi bildiriminin ([3] yerine) ile başlaması şartıyla

   item alias "[]" (key: STRING): ELEMENT assign put

Bu , parantez takma adı ile birlikte [5]'i yasal ve [4]'e eşdeğer hale getiren ve putile ilişkili atanan komutu olarak bildirir item. (Ayrıca, köşeli ayraçtan yararlanmadan phone_book.item ("JILL SMITH") := New_person.

Not: a'yı atayan argüman listesi şu şekilde sınırlandırılmıştır: (a'nın dönüş türü; a'nın tüm argüman listesi...)

Sözcüksel ve sözdizimi özellikleri

Eyfel büyük/küçük harfe duyarlı değildir. Belirteçleri make, maKeve MAKEhepsi aynı tanımlayıcı belirtir. Bununla birlikte, aşağıdaki "stil kuralları"na bakın.

Yorumlar --(arka arkaya iki tire) ile girilir ve satırın sonuna kadar uzatılır.

Noktalı virgül, talimat ayırıcı olarak isteğe bağlıdır. Bir satırdaki birden çok talimatı ayırmak dışında, çoğu zaman noktalı virgül atlanır. Bu, program sayfasında daha az dağınıklığa neden olur.

Özellik ve sınıf bildirimlerinin yuvalanması yoktur. Sonuç olarak, bir Eiffel sınıfının yapısı basittir: bazı sınıf düzeyinde yan tümceler (kalıtım, değişmez) ve hepsi aynı düzeyde ardışık özellik bildirimleri.

Daha fazla okunabilirlik için özellikleri ayrı "özellik yan tümceleri" halinde gruplamak gelenekseldir; standart bir düzende görünen standart bir temel özellik etiketi seti ile örneğin:

class HASH_TABLE [ELEMENT, KEY -> HASHABLE] inherit TABLE [ELEMENT]

    feature -- Initialization
         -- ... Declarations of initialization commands (creation procedures/constructors) ...

    feature -- Access
         -- ... Declarations of non-boolean queries on the object state, e.g. item ...

    feature -- Status report
         -- ... Declarations of boolean queries on the object state, e.g. is_empty ...

    feature -- Element change
         -- ... Declarations of commands that change the structure, e.g. put ...

    -- etc.
end

Çoğu küme parantez programlama dilinin aksine , Eiffel ifadeler ve talimatlar arasında net bir ayrım yapar. Bu, Eiffel yönteminin Komut-Sorgu Ayırma ilkesiyle uyumludur .

Stil kuralları

Eyfel belgelerinin çoğu, tutarlı bir görünüm ve hissi sağlamak için tasarlanmış farklı stil kuralları kullanır. Bu sözleşmelerden bazıları, kod formatının kendisi için ve diğerleri, bu sözleşmelerin mümkün olduğu formatlarda ve yayınlarda Eyfel kodunun standart tipografik sunumu için geçerlidir.

Dil büyük/küçük harfe duyarlı olmasa da, stil standartları, sınıf adları ( LIST) için tamamı büyük, özellik adları ( make) için tümü küçük harf ve sabitler ( Avogadro) için ilk büyük harflerin kullanılmasını öngörür . Önerilen stil ayrıca, örneğinde olduğu gibi, çok kelimeli bir tanımlayıcının bileşenlerini ayırmak için alt çizgi önerir average_temperature.

Eiffel'in belirtimi, yazılım metinlerini dizgi biçimlerinde görüntülemek için yönergeler içerir: kalın harflerle yazılmış anahtar sözcükler, kullanıcı tanımlı tanımlayıcılar ve sabitler içinde gösterilir italics, yorumlar, işleçler ve noktalama işaretleri içinde gösterilir ve bu makalede olduğu gibi Romanprogram metni blueile ayırt edilir. açıklayıcı metin Örneğin, "Merhaba dünya!" Yukarıda verilen program, Eyfel belgelerinde aşağıdaki gibi gösterilecektir:

class
    HELLO_WORLD
create
    make
feature
    make
       do
          print ("Hello, world!")
       end
end

Diğer araçlara ve dillere arayüzler

Eiffel tamamen nesne yönelimli bir dildir, ancak diğer herhangi bir programlama dilinde "harici" yazılımla arabirim oluşturmak için açık bir mimari sağlar .

Örneğin, makine ve işletim sistemi düzeyindeki işlemleri C dilinde programlamak mümkündür . Eiffel, "satır içi C" desteği de dahil olmak üzere C rutinleri için basit bir arabirim sağlar (tipik olarak kısa makine düzeyindeki işlemler için bir Eyfel rutininin gövdesini C'de yazmak).

Eyfel ve C arasında doğrudan bir bağlantı olmamasına rağmen, birçok Eiffel derleyicisi ( Visual Eiffel bir istisnadır) optimizasyon ve taşınabilirlik için bir C derleyicisine göndermek üzere bir ara dil olarak C kaynak kodunu çıkarır . Bunun gibi, onlar örnekleridir transcompilers . Eiffel Compiler tecomp, Eiffel kodunu bir ara C kodundan geçmeden doğrudan (bir yorumlayıcı gibi) yürütebilir veya optimize edilmiş yerel kod elde etmek için bir C derleyicisine geçirilecek olan C kodunu yayabilir. .NET'te EiffelStudio derleyicisi doğrudan CIL (Common Intermediate Language) kodunu oluşturur. SmartEiffel derleyici da çıkış yapabilirsiniz Java baytkodu .

Referanslar

Dış bağlantılar