Eiffel

Eiffel (Ейфель) - об'єктно-орієнтована мова програмування з алголоподобним синтаксисом, розроблений Бертраном Мейером. У цій мові вперше був реалізований метод контрактного програмування.

Існують компілятори Ейфеля для Windows, DOS, OS / 2 і UNIX. Більшість реалізацій Eiffel генерує код Сі, тобто є своєрідним препроцесором. Далі цей код компілюється за допомогою компілятора Сі. Однак є системи, які породжують і безпосередньо машинний код. Наприклад, Visual Eiffel. [3]


1. Ключові особливості

  • Об'єктно-орієнтована програмна структура, в якій клас виступає в якості основної одиниці декомпозиції.
  • Дизайн за контрактом тісно інтегрований з іншими мовними конструкціями.
  • Автоматичне керування пам'яттю, як правило, здійснюється в процесі збірки сміття.
  • Спадкування, в тому числі множинне спадкування, перейменування, перевизначення, конструкція select ("вибір"), спадкування без поліморфізму, і інші механізми, покликані зробити спадкування безпечним.
  • Обмежене і необмежене узагальнене програмування.
  • Єдина система типів, що використовує механізми як значущих, так і посилальних типів даних, у яких всі типи, включаючи базові, наприклад, INTEGER, є класами.
  • Типо-безпеку ( статична типізація).
  • Статична захист від викликів по порожній посиланню, використовуючи механізм прикріплення типів ( англ. attached-types mechanism ).
  • Агенти - об'єкти, згортати обчислення всередині себе, - тісно пов'язані з механізмами замикань і лямбда-виразів.
  • "Одноразові" ( англ. once ) Процедури або процедури виконуються тільки один раз, для спільного використання об'єкта та децентралізованої ініціалізації.
  • Традиційний синтаксис на основі ключових слів мов Алгол і Паскаль, але без використання сепаратора (крапка з комою в кінці інструкції не є обов'язковою).
  • Нечутливість до регістру.

1.1. Перевизначення операцій

Для підпрограм доступний синтаксис операцій. Тобто інфіксний оператор + є псевдонімом для методу plus, а * - для product :

 class  INTEGER  feature  ...  feature  plus  alias  "+"  (  other  :  like  Current  )  :  like  Current  do  ...  end  product  alias  "*"  (  other  :  like  Current  )  :  like  Current  do  ...  end  ...  end 

Даний синтаксис є розвитком способу перевизначення операцій в мові Клу. На відміну від С + + і Клу, Eiffel дозволяє також визначення вільних операцій, знаки яких можуть складатися з одного або більше символів з ​​наступного набору

 : \? = ~ /! # $% & * + - / <> @ ^ `| 

за умови, що цей символ або комбінація символів не зайняті в синтаксисі Eiffel для інших цілей. Ось приклади можливих вільних операцій:

 ! -! @ |> <| - | -> <- | - ==> <== + + 

2. Hello, world!

Коротко:

 class  HELLO  create  make  feature  make  do  print  (  "Hello World  % N  "  )  end  end 

або розгорнуто, дотримуючись стиль написання:

 note description  :  "Програма Здрастуй, світ!"  author  :  "Elizabeth W.Brown"  class  HELLO  create  make  feature  make  - Надрукувати просте повідомлення.  do  print  (  "Hello World  % N  "  )  end  end 

3. Приклади коду та особливості мови

Приклад оголошення класу на Eiffel:

 class  КВАДРАТ  inherit  ПРЯМОКУТНИК  - КВАДРАТ - підклас прямокутника  - Може бути вказано більше одного блоку inherit.  - Для кожного батьківського класу може бути вказаний список наслідуваних методів.  - Таким чином вирішується проблема конфліктів множинного спадкоємства.  create  - Перелік імен конструкторів  feature  - Властивості, описувані тут, є видимими для всіх клієнтів.  - Більш точно такий запис еквівалентна запису feature {ANY} -  - Що означає, що властивості, визначені у цьому розділі,  - Доступні класу ANY і всім його спадкоємцям.  - А так як клас ANY є батьком всіх класів (витоком графа класів),  - У яких в явному вигляді не задані батьківські класи,  - То це означає доступність для використання будь-яким класом  feature  {  CHILD  }  - Властивості, описувані тут, є доступними для використання для класу CHILD і його спадкоємців  feature  {  NONE  }  - Властивості, описувані тут, є прихованими для використання клієнтами.  - Більш точно доступні тільки для класу NONE, який є стоком графа класів  end 

де властивості - це загальна назва полів даних і методів. Тобто атрибутів ( англ. attributes ) І підпрограм ( англ. routines ) В термінології Eiffel. Підпрограми в підкласах (класах спадкоємцях) можуть заміщати (перевизначати) успадковані тільки при конформності (тобто збігу) їх сигнатур.

Ще приклад:

 class  COMPLEX  create  make  feature  real_part, imag_part  :  REAL  feature  make  (  r, i  :  REAL  )  do  real_part  : =  r imag_part  : =  i  end  end 

Опис змінної виглядає схоже з описом змінних в Паскаль-подібних мовах:

 ідентіфікатор_переменной  :  ТИП 

Наприклад:

 complex_num  :  COMPLEX 

Ініціалізація (створення) об'єкта c викликом конструктора:

 create  complex_num.  make  (  2.4  , -  3.2  ) 

Раніше використовувався дещо інший синтаксис, при якому службове слово create замінювалося на подвійний знак оклику !! :

 !!  complex_num.  make  (  2.4  , -  3.2  ) 

У мові Eiffel немає деструкторів, але є автоматичний збирач сміття. Коли на об'єкт не залишиться посилань, він буде знищений складальником сміття.

Мова Eiffel підтримує множинне спадкування (кілька розділів inherit).

Абстрактні класи визначаються додаванням зарезервованого слова deferred ("відкладений"):

 deferred  class  FIGURE  - Тіло класу  end 

"Відкладені" властивості будуть визначатися в класах спадкоємцях. Для того, щоб можна було створити об'єкт класу, він не повинен містити жодного "відкладеного" властивості.

Найбільш характерним властивістю мови Eiffel є вбудовані затвердження для створення примусового контракту між зухвалою оператором і викликуваним кодом підпрограм).

Всі звернення до властивостей об'єктів за замовчуванням динамічні, хоча компілятори можуть розібратися, де динамічне зв'язування може бути замінене на статичну і природно роблять це. Така особливість дозволяє не вводити поняття virtual ("віртуальний"). Навпаки, вводиться поняття frozen ("заморожене"), тобто "непереопределяемое" властивість.

Мова розрізняє на рівні описів два види класів посилальні і expanded ("структурні", "розгорнуті"), що також застосовно до описів змінних. Це дозволяє мінімізувати різницю між посиланням на об'єкт і самим об'єктом. Різниця ця проявляється при присвоєнні, копіюванні і створенні об'єктів.


3.1. Причини слабкого поширення мови

Компілятори з Eiffel від автора мови дороги і не так поширені, як компілятори C / C + +, що, свого часу, і обмежило поширення цієї мови, вільних / безкоштовних альтернатив довгий час не було.

4. Стиль оформлення програм

Мова Eiffel спроектований з максимальним ухилом в простоту конструкцій мови.

Так, в ньому визначена лише одна конструкція для циклу.

 from  початкова ініціалізація  until  умова виходу з циклу  loop  тіло циклу  end 

При програмуванні на Eiffel хорошим тоном вважається дотримуватися певних правил оформлення.

Завдяки цьому, исходники читаються так, як якщо б це була документація. Додатковим стимулом дотримуватися правил є строгість самих компіляторів до оформлення. Багато хто з них (зокрема SmartEiffel [2]) не дозволяють неправильно оформляти вихідні коди, знаходячи багато відступу від стилю, виводячи попередження або навіть відмовляючись компілювати.

Ось деякі рекомендації з оформлення вихідних текстів:

  • службові слова набираються жирним (актуально для друку і виведення на сучасні монітори)
  • всі ідентифікатори - курсивом
  • на відміну від Cи-подібних мов, в Eiffel негативно ставляться до скорочень. Замість drvMngr прийнято писати driver_manager
  • всі класи пишуться прописними буквами
 class  LIST 
  • змінні пишуться малими літерами
 count_of_sheeps  :  INTEGER 
  • константи завжди починаються з прописної
 Gravity  :  REAL  =  9.81 
  • рекомендується використовувати немоношірінний шрифт
  • на початку кожного класу бажано вставляти інформацію про нього: хто написав, коли, функціональність класу. Вся ця інформація записується на самому початку файлу з класом.
 note description  :  "Опис цього класу."  author  :  "Вася Пупкін"  class  КЛАС  - Тіло класу  end 
  • після назви кожної процедури на наступному рядку бажано описувати результат її дії:
 feature  IP  :  INTEGER  - IP адреса локальної машини.  do  - Тіло запиту  end 
  • особливістю Eiffel є необов'язковість точки c комою ";" в кінці синтаксичних конструкцій.

Примітки

  1. EiffelStudio A Complete Integrated Development Environment - www.eiffel.com / products / studio
  2. 1 2 SmartEiffel, the GNU Eiffel Compiler, Tools and Libraries - smarteiffel.loria.fr /
  3. 1 2 Visual Eiffel home site - www.visual-eiffel.com
  4. Gobo Eiffel Compiler - www.gobosoft.com / eiffel / gobo / gec / index.html
  5. tecomp: The Eiffel Compiler - www.sourceforge.net / projects / tecomp

Література

  • Bertrand Meyer. Object-Oriented Software Construction. 2nd edition, Prentice Hall, 1997.
  • Bertrand Meyer. Eiffel: The Language
  • Invitation to Eiffel. From ISE.
  • Richard Paige. An Overview of Eiffel
  • Jean-Marc Jezequel. Object-Oriented Software Engineering with Eiffel