Eyfel (programlama dili) - Eiffel (programming language)
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
|
Önizleme sürümü |
EiffelStudio 20.11
/ 21 Aralık 2020
|
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 |
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
, STRING
ve gibi standart veri türlerinin ARRAY
tü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_attribute
yukarı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 make
için print
sistem 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, attached
anahtar kelime, l_attribute
yalnı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 öznitelika_vehicle
olabilir 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)
INTEGER
ve WORD
bu 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 STRING
kalıtsal olması durumunda geçerlidir HASHABLE
(gerçekten de tipik Eyfel kitaplıklarında olduğu gibi). Sınıfında, sahip KEY
tarafından kısıtlı HASHABLE
için bu araçlar x: KEY
o uygulamak mümkündür x
tüm özellikleri HASHABLE
olduğ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 inherit
başı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 class
yerine 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, deferred
bir do
yan 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ı rename
yan 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 t
yukarıdaki demet atanmışsa t.weight
3.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
, C
sı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_list
yazar:
my_list.do_all (agent my_action)
my_action
Yalnızca aşağıdakileri karşılayan öğeler üzerinde yürütmek için my_condition
bir sınırlama/filtre eklenebilir:
my_list.do_if (agent my_action, agent my_condition)
Bu örneklerde my_action
ve my_condition
rutinlerdir. Bunları öneklemek agent
, tüm özellikleriyle, özellikle uygun argümanlarla çağrılma yeteneğiyle ilgili rutini temsil eden bir nesne verir. Bu nedenle, a
bu nesneyi temsil ediyorsa (örneğin a
, argüman olduğu için do_all
), talimat
a.call ([x])
orijinal rutini x
doğrudan orijinal rutini çağırmışız gibi argümanla çağırır : my_action (x)
. Argümanlar call
burada 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.
x
y
?
y
agent f
agent 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_arguments
bir call
. Ribet ve ark.
Bir kez rutinler
Bir rutinin sonucu, yerine once
anahtar 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 NEWSPAPER
uyumlu olabilir PUBLICATION
, ancak INTEGER
ona 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 INTEGER
ve 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 DATE
sı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_date
bir convert
cü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 plus
ve 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 f
seç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 put
ile 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
, maKe
ve MAKE
hepsi 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 Roman
program metni blue
ile 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
- Eiffel'i tanıtan şirketin Eiffel Software web sitesi İnteraktif Yazılım Mühendisliği (ISE) idi.