CINXE.COM

Eiffel (programming language) - Wikipedia

<!DOCTYPE html> <html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-enabled skin-theme-clientpref-day vector-toc-available" lang="en" dir="ltr"> <head> <meta charset="UTF-8"> <title>Eiffel (programming language) - Wikipedia</title> <script>(function(){var className="client-js vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-enabled skin-theme-clientpref-day vector-toc-available";var cookie=document.cookie.match(/(?:^|; )enwikimwclientpreferences=([^;]+)/);if(cookie){cookie[1].split('%2C').forEach(function(pref){className=className.replace(new RegExp('(^| )'+pref.replace(/-clientpref-\w+$|[^\w-]+/g,'')+'-clientpref-\\w+( |$)'),'$1'+pref+'$2');});}document.documentElement.className=className;}());RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy", "wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgRequestId":"d311ba9b-3944-4bd2-81aa-4c90e3dc28f6","wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"Eiffel_(programming_language)","wgTitle":"Eiffel (programming language)","wgCurRevisionId":1257513399,"wgRevisionId":1257513399,"wgArticleId":9838,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Articles with short description","Short description is different from Wikidata","All articles with unsourced statements","Articles with unsourced statements from October 2010","Articles with unsourced statements from March 2021","Class-based programming languages","Formal specification languages","High Integrity Programming Language","Object-oriented programming languages","Programming languages created in 1986", "Programming languages with an ISO standard","Statically typed programming languages"],"wgPageViewLanguage":"en","wgPageContentLanguage":"en","wgPageContentModel":"wikitext","wgRelevantPageName":"Eiffel_(programming_language)","wgRelevantArticleId":9838,"wgIsProbablyEditable":true,"wgRelevantPageIsProbablyEditable":true,"wgRestrictionEdit":[],"wgRestrictionMove":[],"wgNoticeProject":"wikipedia","wgCiteReferencePreviewsActive":false,"wgFlaggedRevsParams":{"tags":{"status":{"levels":1}}},"wgMediaViewerOnClick":true,"wgMediaViewerEnabledByDefault":true,"wgPopupsFlags":0,"wgVisualEditor":{"pageLanguageCode":"en","pageLanguageDir":"ltr","pageVariantFallbacks":"en"},"wgMFDisplayWikibaseDescriptions":{"search":true,"watchlist":true,"tagline":false,"nearby":true},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":50000,"wgRelatedArticlesCompat":[],"wgCentralAuthMobileDomain":false,"wgEditSubmitButtonLabelPublish":true,"wgULSPosition":"interlanguage","wgULSisCompactLinksEnabled": false,"wgVector2022LanguageInHeader":true,"wgULSisLanguageSelectorEmpty":false,"wgWikibaseItemId":"Q732089","wgCheckUserClientHintsHeadersJsApi":["brands","architecture","bitness","fullVersionList","mobile","model","platform","platformVersion"],"GEHomepageSuggestedEditsEnableTopics":true,"wgGETopicsMatchModeEnabled":false,"wgGEStructuredTaskRejectionReasonTextInputEnabled":false,"wgGELevelingUpEnabledForUser":false};RLSTATE={"ext.globalCssJs.user.styles":"ready","site.styles":"ready","user.styles":"ready","ext.globalCssJs.user":"ready","user":"ready","user.options":"loading","ext.cite.styles":"ready","ext.pygments":"ready","skins.vector.search.codex.styles":"ready","skins.vector.styles":"ready","skins.vector.icons":"ready","jquery.makeCollapsible.styles":"ready","ext.wikimediamessages.styles":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","ext.uls.interlanguage":"ready","wikibase.client.init":"ready","ext.wikimediaBadges":"ready"};RLPAGEMODULES=[ "ext.cite.ux-enhancements","ext.pygments.view","site","mediawiki.page.ready","jquery.makeCollapsible","mediawiki.toc","skins.vector.js","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.gadget.ReferenceTooltips","ext.gadget.switcher","ext.urlShortener.toolbar","ext.centralauth.centralautologin","mmv.bootstrap","ext.popups","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.echo.centralauth","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.interface","ext.cx.eventlogging.campaigns","ext.cx.uls.quick.actions","wikibase.client.vector-2022","ext.checkUser.clientHints","ext.growthExperiments.SuggestedEditSession","wikibase.sidebar.tracking"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.impl(function(){return["user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"}); }];});});</script> <link rel="stylesheet" href="/w/load.php?lang=en&amp;modules=ext.cite.styles%7Cext.pygments%2CwikimediaBadges%7Cext.uls.interlanguage%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediamessages.styles%7Cjquery.makeCollapsible.styles%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles%7Cwikibase.client.init&amp;only=styles&amp;skin=vector-2022"> <script async="" src="/w/load.php?lang=en&amp;modules=startup&amp;only=scripts&amp;raw=1&amp;skin=vector-2022"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=en&amp;modules=site.styles&amp;only=styles&amp;skin=vector-2022"> <meta name="generator" content="MediaWiki 1.44.0-wmf.4"> <meta name="referrer" content="origin"> <meta name="referrer" content="origin-when-cross-origin"> <meta name="robots" content="max-image-preview:standard"> <meta name="format-detection" content="telephone=no"> <meta name="viewport" content="width=1120"> <meta property="og:title" content="Eiffel (programming language) - Wikipedia"> <meta property="og:type" content="website"> <link rel="preconnect" href="//upload.wikimedia.org"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//en.m.wikipedia.org/wiki/Eiffel_(programming_language)"> <link rel="alternate" type="application/x-wiki" title="Edit this page" href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit"> <link rel="apple-touch-icon" href="/static/apple-touch/wikipedia.png"> <link rel="icon" href="/static/favicon/wikipedia.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/w/rest.php/v1/search" title="Wikipedia (en)"> <link rel="EditURI" type="application/rsd+xml" href="//en.wikipedia.org/w/api.php?action=rsd"> <link rel="canonical" href="https://en.wikipedia.org/wiki/Eiffel_(programming_language)"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en"> <link rel="alternate" type="application/atom+xml" title="Wikipedia Atom feed" href="/w/index.php?title=Special:RecentChanges&amp;feed=atom"> <link rel="dns-prefetch" href="//meta.wikimedia.org" /> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject mw-editable page-Eiffel_programming_language rootpage-Eiffel_programming_language skin-vector-2022 action-view"><a class="mw-jump-link" href="#bodyContent">Jump to content</a> <div class="vector-header-container"> <header class="vector-header mw-header"> <div class="vector-header-start"> <nav class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-dropdown" class="vector-dropdown vector-main-menu-dropdown vector-button-flush-left vector-button-flush-right" > <input type="checkbox" id="vector-main-menu-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-main-menu-dropdown" class="vector-dropdown-checkbox " aria-label="Main menu" > <label id="vector-main-menu-dropdown-label" for="vector-main-menu-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-menu mw-ui-icon-wikimedia-menu"></span> <span class="vector-dropdown-label-text">Main menu</span> </label> <div class="vector-dropdown-content"> <div id="vector-main-menu-unpinned-container" class="vector-unpinned-container"> <div id="vector-main-menu" class="vector-main-menu vector-pinnable-element"> <div class="vector-pinnable-header vector-main-menu-pinnable-header vector-pinnable-header-unpinned" data-feature-name="main-menu-pinned" data-pinnable-element-id="vector-main-menu" data-pinned-container-id="vector-main-menu-pinned-container" data-unpinned-container-id="vector-main-menu-unpinned-container" > <div class="vector-pinnable-header-label">Main menu</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-main-menu.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-main-menu.unpin">hide</button> </div> <div id="p-navigation" class="vector-menu mw-portlet mw-portlet-navigation" > <div class="vector-menu-heading"> Navigation </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mainpage-description" class="mw-list-item"><a href="/wiki/Main_Page" title="Visit the main page [z]" accesskey="z"><span>Main page</span></a></li><li id="n-contents" class="mw-list-item"><a href="/wiki/Wikipedia:Contents" title="Guides to browsing Wikipedia"><span>Contents</span></a></li><li id="n-currentevents" class="mw-list-item"><a href="/wiki/Portal:Current_events" title="Articles related to current events"><span>Current events</span></a></li><li id="n-randompage" class="mw-list-item"><a href="/wiki/Special:Random" title="Visit a randomly selected article [x]" accesskey="x"><span>Random article</span></a></li><li id="n-aboutsite" class="mw-list-item"><a href="/wiki/Wikipedia:About" title="Learn about Wikipedia and how it works"><span>About Wikipedia</span></a></li><li id="n-contactpage" class="mw-list-item"><a href="//en.wikipedia.org/wiki/Wikipedia:Contact_us" title="How to contact Wikipedia"><span>Contact us</span></a></li> </ul> </div> </div> <div id="p-interaction" class="vector-menu mw-portlet mw-portlet-interaction" > <div class="vector-menu-heading"> Contribute </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-help" class="mw-list-item"><a href="/wiki/Help:Contents" title="Guidance on how to use and edit Wikipedia"><span>Help</span></a></li><li id="n-introduction" class="mw-list-item"><a href="/wiki/Help:Introduction" title="Learn how to edit Wikipedia"><span>Learn to edit</span></a></li><li id="n-portal" class="mw-list-item"><a href="/wiki/Wikipedia:Community_portal" title="The hub for editors"><span>Community portal</span></a></li><li id="n-recentchanges" class="mw-list-item"><a href="/wiki/Special:RecentChanges" title="A list of recent changes to Wikipedia [r]" accesskey="r"><span>Recent changes</span></a></li><li id="n-upload" class="mw-list-item"><a href="/wiki/Wikipedia:File_upload_wizard" title="Add images or other media for use on Wikipedia"><span>Upload file</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> <a href="/wiki/Main_Page" class="mw-logo"> <img class="mw-logo-icon" src="/static/images/icons/wikipedia.png" alt="" aria-hidden="true" height="50" width="50"> <span class="mw-logo-container skin-invert"> <img class="mw-logo-wordmark" alt="Wikipedia" src="/static/images/mobile/copyright/wikipedia-wordmark-en.svg" style="width: 7.5em; height: 1.125em;"> <img class="mw-logo-tagline" alt="The Free Encyclopedia" src="/static/images/mobile/copyright/wikipedia-tagline-en.svg" width="117" height="13" style="width: 7.3125em; height: 0.8125em;"> </span> </a> </div> <div class="vector-header-end"> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-collapses vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <a href="/wiki/Special:Search" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only search-toggle" title="Search Wikipedia [f]" accesskey="f"><span class="vector-icon mw-ui-icon-search mw-ui-icon-wikimedia-search"></span> <span>Search</span> </a> <div class="vector-typeahead-search-container"> <div class="cdx-typeahead-search cdx-typeahead-search--show-thumbnail cdx-typeahead-search--auto-expand-width"> <form action="/w/index.php" id="searchform" class="cdx-search-input cdx-search-input--has-end-button"> <div id="simpleSearch" class="cdx-search-input__input-wrapper" data-search-loc="header-moved"> <div class="cdx-text-input cdx-text-input--has-start-icon"> <input class="cdx-text-input__input" type="search" name="search" placeholder="Search Wikipedia" aria-label="Search Wikipedia" autocapitalize="sentences" title="Search Wikipedia [f]" accesskey="f" id="searchInput" > <span class="cdx-text-input__icon cdx-text-input__start-icon"></span> </div> <input type="hidden" name="title" value="Special:Search"> </div> <button class="cdx-button cdx-search-input__end-button">Search</button> </form> </div> </div> </div> <nav class="vector-user-links vector-user-links-wide" aria-label="Personal tools"> <div class="vector-user-links-main"> <div id="p-vector-user-menu-preferences" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-userpage" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-dropdown" class="vector-dropdown " title="Change the appearance of the page&#039;s font size, width, and color" > <input type="checkbox" id="vector-appearance-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-appearance-dropdown" class="vector-dropdown-checkbox " aria-label="Appearance" > <label id="vector-appearance-dropdown-label" for="vector-appearance-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-appearance mw-ui-icon-wikimedia-appearance"></span> <span class="vector-dropdown-label-text">Appearance</span> </label> <div class="vector-dropdown-content"> <div id="vector-appearance-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <div id="p-vector-user-menu-notifications" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-overflow" class="vector-menu mw-portlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="https://donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&amp;utm_medium=sidebar&amp;utm_campaign=C13_en.wikipedia.org&amp;uselang=en" class=""><span>Donate</span></a> </li> <li id="pt-createaccount-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:CreateAccount&amp;returnto=Eiffel+%28programming+language%29" title="You are encouraged to create an account and log in; however, it is not mandatory" class=""><span>Create account</span></a> </li> <li id="pt-login-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:UserLogin&amp;returnto=Eiffel+%28programming+language%29" title="You&#039;re encouraged to log in; however, it&#039;s not mandatory. [o]" accesskey="o" class=""><span>Log in</span></a> </li> </ul> </div> </div> </div> <div id="vector-user-links-dropdown" class="vector-dropdown vector-user-menu vector-button-flush-right vector-user-menu-logged-out" title="Log in and more options" > <input type="checkbox" id="vector-user-links-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-user-links-dropdown" class="vector-dropdown-checkbox " aria-label="Personal tools" > <label id="vector-user-links-dropdown-label" for="vector-user-links-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-ellipsis mw-ui-icon-wikimedia-ellipsis"></span> <span class="vector-dropdown-label-text">Personal tools</span> </label> <div class="vector-dropdown-content"> <div id="p-personal" class="vector-menu mw-portlet mw-portlet-personal user-links-collapsible-item" title="User menu" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport" class="user-links-collapsible-item mw-list-item"><a href="https://donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&amp;utm_medium=sidebar&amp;utm_campaign=C13_en.wikipedia.org&amp;uselang=en"><span>Donate</span></a></li><li id="pt-createaccount" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:CreateAccount&amp;returnto=Eiffel+%28programming+language%29" title="You are encouraged to create an account and log in; however, it is not mandatory"><span class="vector-icon mw-ui-icon-userAdd mw-ui-icon-wikimedia-userAdd"></span> <span>Create account</span></a></li><li id="pt-login" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:UserLogin&amp;returnto=Eiffel+%28programming+language%29" title="You&#039;re encouraged to log in; however, it&#039;s not mandatory. [o]" accesskey="o"><span class="vector-icon mw-ui-icon-logIn mw-ui-icon-wikimedia-logIn"></span> <span>Log in</span></a></li> </ul> </div> </div> <div id="p-user-menu-anon-editor" class="vector-menu mw-portlet mw-portlet-user-menu-anon-editor" > <div class="vector-menu-heading"> Pages for logged out editors <a href="/wiki/Help:Introduction" aria-label="Learn more about editing"><span>learn more</span></a> </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-anoncontribs" class="mw-list-item"><a href="/wiki/Special:MyContributions" title="A list of edits made from this IP address [y]" accesskey="y"><span>Contributions</span></a></li><li id="pt-anontalk" class="mw-list-item"><a href="/wiki/Special:MyTalk" title="Discussion about edits from this IP address [n]" accesskey="n"><span>Talk</span></a></li> </ul> </div> </div> </div> </div> </nav> </div> </header> </div> <div class="mw-page-container"> <div class="mw-page-container-inner"> <div class="vector-sitenotice-container"> <div id="siteNotice"><!-- CentralNotice --></div> </div> <div class="vector-column-start"> <div class="vector-main-menu-container"> <div id="mw-navigation"> <nav id="mw-panel" class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-pinned-container" class="vector-pinned-container"> </div> </nav> </div> </div> <div class="vector-sticky-pinned-container"> <nav id="mw-panel-toc" aria-label="Contents" data-event-name="ui.sidebar-toc" class="mw-table-of-contents-container vector-toc-landmark"> <div id="vector-toc-pinned-container" class="vector-pinned-container"> <div id="vector-toc" class="vector-toc vector-pinnable-element"> <div class="vector-pinnable-header vector-toc-pinnable-header vector-pinnable-header-pinned" data-feature-name="toc-pinned" data-pinnable-element-id="vector-toc" > <h2 class="vector-pinnable-header-label">Contents</h2> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-toc.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-toc.unpin">hide</button> </div> <ul class="vector-toc-contents" id="mw-panel-toc-list"> <li id="toc-mw-content-text" class="vector-toc-list-item vector-toc-level-1"> <a href="#" class="vector-toc-link"> <div class="vector-toc-text">(Top)</div> </a> </li> <li id="toc-Characteristics" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Characteristics"> <div class="vector-toc-text"> <span class="vector-toc-numb">1</span> <span>Characteristics</span> </div> </a> <ul id="toc-Characteristics-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Design_goals" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Design_goals"> <div class="vector-toc-text"> <span class="vector-toc-numb">2</span> <span>Design goals</span> </div> </a> <button aria-controls="toc-Design_goals-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Toggle Design goals subsection</span> </button> <ul id="toc-Design_goals-sublist" class="vector-toc-list"> <li id="toc-Background" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Background"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.1</span> <span>Background</span> </div> </a> <ul id="toc-Background-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Implementations_and_environments" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Implementations_and_environments"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.2</span> <span>Implementations and environments</span> </div> </a> <ul id="toc-Implementations_and_environments-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Specifications_and_standards" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Specifications_and_standards"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.3</span> <span>Specifications and standards</span> </div> </a> <ul id="toc-Specifications_and_standards-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Syntax_and_semantics" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#Syntax_and_semantics"> <div class="vector-toc-text"> <span class="vector-toc-numb">3</span> <span>Syntax and semantics</span> </div> </a> <button aria-controls="toc-Syntax_and_semantics-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Toggle Syntax and semantics subsection</span> </button> <ul id="toc-Syntax_and_semantics-sublist" class="vector-toc-list"> <li id="toc-Overall_structure" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Overall_structure"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.1</span> <span>Overall structure</span> </div> </a> <ul id="toc-Overall_structure-sublist" class="vector-toc-list"> <li id="toc-Scoping" class="vector-toc-list-item vector-toc-level-3"> <a class="vector-toc-link" href="#Scoping"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.1.1</span> <span>Scoping</span> </div> </a> <ul id="toc-Scoping-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-&quot;Hello,_world!&quot;" class="vector-toc-list-item vector-toc-level-3"> <a class="vector-toc-link" href="#&quot;Hello,_world!&quot;"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.1.2</span> <span>"Hello, world!"</span> </div> </a> <ul id="toc-&quot;Hello,_world!&quot;-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Design_by_contract" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Design_by_contract"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.2</span> <span>Design by contract</span> </div> </a> <ul id="toc-Design_by_contract-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Void-safe_capability" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Void-safe_capability"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.3</span> <span>Void-safe capability</span> </div> </a> <ul id="toc-Void-safe_capability-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Features:_commands_and_queries" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Features:_commands_and_queries"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.4</span> <span>Features: commands and queries</span> </div> </a> <ul id="toc-Features:_commands_and_queries-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Overloading" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Overloading"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.5</span> <span>Overloading</span> </div> </a> <ul id="toc-Overloading-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Genericity" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Genericity"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.6</span> <span>Genericity</span> </div> </a> <ul id="toc-Genericity-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Inheritance_basics" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Inheritance_basics"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.7</span> <span>Inheritance basics</span> </div> </a> <ul id="toc-Inheritance_basics-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Deferred_classes_and_features" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Deferred_classes_and_features"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.8</span> <span>Deferred classes and features</span> </div> </a> <ul id="toc-Deferred_classes_and_features-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Renaming" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Renaming"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.9</span> <span>Renaming</span> </div> </a> <ul id="toc-Renaming-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Tuples" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Tuples"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.10</span> <span>Tuples</span> </div> </a> <ul id="toc-Tuples-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Agents" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Agents"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.11</span> <span>Agents</span> </div> </a> <ul id="toc-Agents-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Once_routines" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Once_routines"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.12</span> <span>Once routines</span> </div> </a> <ul id="toc-Once_routines-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Conversions" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Conversions"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.13</span> <span>Conversions</span> </div> </a> <ul id="toc-Conversions-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Exception_handling" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Exception_handling"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.14</span> <span>Exception handling</span> </div> </a> <ul id="toc-Exception_handling-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Concurrency" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Concurrency"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.15</span> <span>Concurrency</span> </div> </a> <ul id="toc-Concurrency-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Operator_and_bracket_syntax,_assigner_commands" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Operator_and_bracket_syntax,_assigner_commands"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.16</span> <span>Operator and bracket syntax, assigner commands</span> </div> </a> <ul id="toc-Operator_and_bracket_syntax,_assigner_commands-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Lexical_and_syntax_properties" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Lexical_and_syntax_properties"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.17</span> <span>Lexical and syntax properties</span> </div> </a> <ul id="toc-Lexical_and_syntax_properties-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Style_conventions" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Style_conventions"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.18</span> <span>Style conventions</span> </div> </a> <ul id="toc-Style_conventions-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Interfaces_to_other_tools_and_languages" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Interfaces_to_other_tools_and_languages"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.19</span> <span>Interfaces to other tools and languages</span> </div> </a> <ul id="toc-Interfaces_to_other_tools_and_languages-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-References" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#References"> <div class="vector-toc-text"> <span class="vector-toc-numb">4</span> <span>References</span> </div> </a> <ul id="toc-References-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-External_links" class="vector-toc-list-item vector-toc-level-1"> <a class="vector-toc-link" href="#External_links"> <div class="vector-toc-text"> <span class="vector-toc-numb">5</span> <span>External links</span> </div> </a> <ul id="toc-External_links-sublist" class="vector-toc-list"> </ul> </li> </ul> </div> </div> </nav> </div> </div> <div class="mw-content-container"> <main id="content" class="mw-body"> <header class="mw-body-header vector-page-titlebar"> <nav aria-label="Contents" class="vector-toc-landmark"> <div id="vector-page-titlebar-toc" class="vector-dropdown vector-page-titlebar-toc vector-button-flush-left" > <input type="checkbox" id="vector-page-titlebar-toc-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-titlebar-toc" class="vector-dropdown-checkbox " aria-label="Toggle the table of contents" > <label id="vector-page-titlebar-toc-label" for="vector-page-titlebar-toc-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-listBullet mw-ui-icon-wikimedia-listBullet"></span> <span class="vector-dropdown-label-text">Toggle the table of contents</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-titlebar-toc-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Eiffel (programming language)</span></h1> <div id="p-lang-btn" class="vector-dropdown mw-portlet mw-portlet-lang" > <input type="checkbox" id="p-lang-btn-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-lang-btn" class="vector-dropdown-checkbox mw-interlanguage-selector" aria-label="Go to an article in another language. Available in 34 languages" > <label id="p-lang-btn-label" for="p-lang-btn-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--action-progressive mw-portlet-lang-heading-34" aria-hidden="true" ><span class="vector-icon mw-ui-icon-language-progressive mw-ui-icon-wikimedia-language-progressive"></span> <span class="vector-dropdown-label-text">34 languages</span> </label> <div class="vector-dropdown-content"> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li class="interlanguage-link interwiki-ar mw-list-item"><a href="https://ar.wikipedia.org/wiki/%D8%A5%D9%8A%D9%81%D9%84_(%D9%84%D8%BA%D8%A9_%D8%A8%D8%B1%D9%85%D8%AC%D8%A9)" title="إيفل (لغة برمجة) – Arabic" lang="ar" hreflang="ar" data-title="إيفل (لغة برمجة)" data-language-autonym="العربية" data-language-local-name="Arabic" class="interlanguage-link-target"><span>العربية</span></a></li><li class="interlanguage-link interwiki-an mw-list-item"><a href="https://an.wikipedia.org/wiki/Luengache_de_programaci%C3%B3n_Eiffel" title="Luengache de programación Eiffel – Aragonese" lang="an" hreflang="an" data-title="Luengache de programación Eiffel" data-language-autonym="Aragonés" data-language-local-name="Aragonese" class="interlanguage-link-target"><span>Aragonés</span></a></li><li class="interlanguage-link interwiki-az mw-list-item"><a href="https://az.wikipedia.org/wiki/Eiffel" title="Eiffel – Azerbaijani" lang="az" hreflang="az" data-title="Eiffel" data-language-autonym="Azərbaycanca" data-language-local-name="Azerbaijani" class="interlanguage-link-target"><span>Azərbaycanca</span></a></li><li class="interlanguage-link interwiki-bg mw-list-item"><a href="https://bg.wikipedia.org/wiki/Eiffel_(%D0%B5%D0%B7%D0%B8%D0%BA_%D0%B7%D0%B0_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%B8%D1%80%D0%B0%D0%BD%D0%B5)" title="Eiffel (език за програмиране) – Bulgarian" lang="bg" hreflang="bg" data-title="Eiffel (език за програмиране)" data-language-autonym="Български" data-language-local-name="Bulgarian" class="interlanguage-link-target"><span>Български</span></a></li><li class="interlanguage-link interwiki-ca mw-list-item"><a href="https://ca.wikipedia.org/wiki/Llenguatge_de_programaci%C3%B3_Eiffel" title="Llenguatge de programació Eiffel – Catalan" lang="ca" hreflang="ca" data-title="Llenguatge de programació Eiffel" data-language-autonym="Català" data-language-local-name="Catalan" class="interlanguage-link-target"><span>Català</span></a></li><li class="interlanguage-link interwiki-cs mw-list-item"><a href="https://cs.wikipedia.org/wiki/Eiffel_(programovac%C3%AD_jazyk)" title="Eiffel (programovací jazyk) – Czech" lang="cs" hreflang="cs" data-title="Eiffel (programovací jazyk)" data-language-autonym="Čeština" data-language-local-name="Czech" class="interlanguage-link-target"><span>Čeština</span></a></li><li class="interlanguage-link interwiki-da mw-list-item"><a href="https://da.wikipedia.org/wiki/Eiffel_(programmeringssprog)" title="Eiffel (programmeringssprog) – Danish" lang="da" hreflang="da" data-title="Eiffel (programmeringssprog)" data-language-autonym="Dansk" data-language-local-name="Danish" class="interlanguage-link-target"><span>Dansk</span></a></li><li class="interlanguage-link interwiki-de mw-list-item"><a href="https://de.wikipedia.org/wiki/Eiffel_(Programmiersprache)" title="Eiffel (Programmiersprache) – German" lang="de" hreflang="de" data-title="Eiffel (Programmiersprache)" data-language-autonym="Deutsch" data-language-local-name="German" class="interlanguage-link-target"><span>Deutsch</span></a></li><li class="interlanguage-link interwiki-es mw-list-item"><a href="https://es.wikipedia.org/wiki/Eiffel_(lenguaje_de_programaci%C3%B3n)" title="Eiffel (lenguaje de programación) – Spanish" lang="es" hreflang="es" data-title="Eiffel (lenguaje de programación)" data-language-autonym="Español" data-language-local-name="Spanish" class="interlanguage-link-target"><span>Español</span></a></li><li class="interlanguage-link interwiki-eo mw-list-item"><a href="https://eo.wikipedia.org/wiki/Eiffel_(programlingvo)" title="Eiffel (programlingvo) – Esperanto" lang="eo" hreflang="eo" data-title="Eiffel (programlingvo)" data-language-autonym="Esperanto" data-language-local-name="Esperanto" class="interlanguage-link-target"><span>Esperanto</span></a></li><li class="interlanguage-link interwiki-fa mw-list-item"><a href="https://fa.wikipedia.org/wiki/%D8%A7%DB%8C%D9%81%D9%84_(%D8%B2%D8%A8%D8%A7%D9%86_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%E2%80%8C%D9%86%D9%88%DB%8C%D8%B3%DB%8C)" title="ایفل (زبان برنامه‌نویسی) – Persian" lang="fa" hreflang="fa" data-title="ایفل (زبان برنامه‌نویسی)" data-language-autonym="فارسی" data-language-local-name="Persian" class="interlanguage-link-target"><span>فارسی</span></a></li><li class="interlanguage-link interwiki-fr mw-list-item"><a href="https://fr.wikipedia.org/wiki/Eiffel_(langage)" title="Eiffel (langage) – French" lang="fr" hreflang="fr" data-title="Eiffel (langage)" data-language-autonym="Français" data-language-local-name="French" class="interlanguage-link-target"><span>Français</span></a></li><li class="interlanguage-link interwiki-gl mw-list-item"><a href="https://gl.wikipedia.org/wiki/Linguaxe_de_programaci%C3%B3n_Eiffel" title="Linguaxe de programación Eiffel – Galician" lang="gl" hreflang="gl" data-title="Linguaxe de programación Eiffel" data-language-autonym="Galego" data-language-local-name="Galician" class="interlanguage-link-target"><span>Galego</span></a></li><li class="interlanguage-link interwiki-ko mw-list-item"><a href="https://ko.wikipedia.org/wiki/%EC%97%90%ED%8E%A0_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)" title="에펠 (프로그래밍 언어) – Korean" lang="ko" hreflang="ko" data-title="에펠 (프로그래밍 언어)" data-language-autonym="한국어" data-language-local-name="Korean" class="interlanguage-link-target"><span>한국어</span></a></li><li class="interlanguage-link interwiki-io mw-list-item"><a href="https://io.wikipedia.org/wiki/Eiffel_(programifo-linguo)" title="Eiffel (programifo-linguo) – Ido" lang="io" hreflang="io" data-title="Eiffel (programifo-linguo)" data-language-autonym="Ido" data-language-local-name="Ido" class="interlanguage-link-target"><span>Ido</span></a></li><li class="interlanguage-link interwiki-it mw-list-item"><a href="https://it.wikipedia.org/wiki/Eiffel_(linguaggio_di_programmazione)" title="Eiffel (linguaggio di programmazione) – Italian" lang="it" hreflang="it" data-title="Eiffel (linguaggio di programmazione)" data-language-autonym="Italiano" data-language-local-name="Italian" class="interlanguage-link-target"><span>Italiano</span></a></li><li class="interlanguage-link interwiki-he mw-list-item"><a href="https://he.wikipedia.org/wiki/%D7%90%D7%99%D7%99%D7%A4%D7%9C_(%D7%A9%D7%A4%D7%AA_%D7%AA%D7%9B%D7%A0%D7%95%D7%AA)" title="אייפל (שפת תכנות) – Hebrew" lang="he" hreflang="he" data-title="אייפל (שפת תכנות)" data-language-autonym="עברית" data-language-local-name="Hebrew" class="interlanguage-link-target"><span>עברית</span></a></li><li class="interlanguage-link interwiki-ka mw-list-item"><a href="https://ka.wikipedia.org/wiki/%E1%83%94%E1%83%98%E1%83%A4%E1%83%94%E1%83%9A%E1%83%98_(%E1%83%9E%E1%83%A0%E1%83%9D%E1%83%92%E1%83%A0%E1%83%90%E1%83%9B%E1%83%98%E1%83%A0%E1%83%94%E1%83%91%E1%83%98%E1%83%A1_%E1%83%94%E1%83%9C%E1%83%90)" title="ეიფელი (პროგრამირების ენა) – Georgian" lang="ka" hreflang="ka" data-title="ეიფელი (პროგრამირების ენა)" data-language-autonym="ქართული" data-language-local-name="Georgian" class="interlanguage-link-target"><span>ქართული</span></a></li><li class="interlanguage-link interwiki-hu mw-list-item"><a href="https://hu.wikipedia.org/wiki/Eiffel_(programoz%C3%A1si_nyelv)" title="Eiffel (programozási nyelv) – Hungarian" lang="hu" hreflang="hu" data-title="Eiffel (programozási nyelv)" data-language-autonym="Magyar" data-language-local-name="Hungarian" class="interlanguage-link-target"><span>Magyar</span></a></li><li class="interlanguage-link interwiki-ml mw-list-item"><a href="https://ml.wikipedia.org/wiki/%E0%B4%88%E0%B4%AB%E0%B5%BD_(%E0%B4%AA%E0%B5%8D%E0%B4%B0%E0%B5%8B%E0%B4%97%E0%B5%8D%E0%B4%B0%E0%B4%BE%E0%B4%AE%E0%B4%BF%E0%B4%99%E0%B5%8D_%E0%B4%AD%E0%B4%BE%E0%B4%B7)" title="ഈഫൽ (പ്രോഗ്രാമിങ് ഭാഷ) – Malayalam" lang="ml" hreflang="ml" data-title="ഈഫൽ (പ്രോഗ്രാമിങ് ഭാഷ)" data-language-autonym="മലയാളം" data-language-local-name="Malayalam" class="interlanguage-link-target"><span>മലയാളം</span></a></li><li class="interlanguage-link interwiki-nl mw-list-item"><a href="https://nl.wikipedia.org/wiki/Eiffel_(programmeertaal)" title="Eiffel (programmeertaal) – Dutch" lang="nl" hreflang="nl" data-title="Eiffel (programmeertaal)" data-language-autonym="Nederlands" data-language-local-name="Dutch" class="interlanguage-link-target"><span>Nederlands</span></a></li><li class="interlanguage-link interwiki-ja mw-list-item"><a href="https://ja.wikipedia.org/wiki/Eiffel" title="Eiffel – Japanese" lang="ja" hreflang="ja" data-title="Eiffel" data-language-autonym="日本語" data-language-local-name="Japanese" class="interlanguage-link-target"><span>日本語</span></a></li><li class="interlanguage-link interwiki-no mw-list-item"><a href="https://no.wikipedia.org/wiki/Eiffel_(programmeringsspr%C3%A5k)" title="Eiffel (programmeringsspråk) – Norwegian Bokmål" lang="nb" hreflang="nb" data-title="Eiffel (programmeringsspråk)" data-language-autonym="Norsk bokmål" data-language-local-name="Norwegian Bokmål" class="interlanguage-link-target"><span>Norsk bokmål</span></a></li><li class="interlanguage-link interwiki-pl mw-list-item"><a href="https://pl.wikipedia.org/wiki/Eiffel_(j%C4%99zyk_programowania)" title="Eiffel (język programowania) – Polish" lang="pl" hreflang="pl" data-title="Eiffel (język programowania)" data-language-autonym="Polski" data-language-local-name="Polish" class="interlanguage-link-target"><span>Polski</span></a></li><li class="interlanguage-link interwiki-pt mw-list-item"><a href="https://pt.wikipedia.org/wiki/Eiffel_(linguagem_de_programa%C3%A7%C3%A3o)" title="Eiffel (linguagem de programação) – Portuguese" lang="pt" hreflang="pt" data-title="Eiffel (linguagem de programação)" data-language-autonym="Português" data-language-local-name="Portuguese" class="interlanguage-link-target"><span>Português</span></a></li><li class="interlanguage-link interwiki-ru mw-list-item"><a href="https://ru.wikipedia.org/wiki/Eiffel" title="Eiffel – Russian" lang="ru" hreflang="ru" data-title="Eiffel" data-language-autonym="Русский" data-language-local-name="Russian" class="interlanguage-link-target"><span>Русский</span></a></li><li class="interlanguage-link interwiki-sk mw-list-item"><a href="https://sk.wikipedia.org/wiki/Eiffel_(programovac%C3%AD_jazyk)" title="Eiffel (programovací jazyk) – Slovak" lang="sk" hreflang="sk" data-title="Eiffel (programovací jazyk)" data-language-autonym="Slovenčina" data-language-local-name="Slovak" class="interlanguage-link-target"><span>Slovenčina</span></a></li><li class="interlanguage-link interwiki-sr mw-list-item"><a href="https://sr.wikipedia.org/wiki/Eiffel_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D1%98%D0%B5%D0%B7%D0%B8%D0%BA)" title="Eiffel (програмски језик) – Serbian" lang="sr" hreflang="sr" data-title="Eiffel (програмски језик)" data-language-autonym="Српски / srpski" data-language-local-name="Serbian" class="interlanguage-link-target"><span>Српски / srpski</span></a></li><li class="interlanguage-link interwiki-fi mw-list-item"><a href="https://fi.wikipedia.org/wiki/Eiffel_(ohjelmointikieli)" title="Eiffel (ohjelmointikieli) – Finnish" lang="fi" hreflang="fi" data-title="Eiffel (ohjelmointikieli)" data-language-autonym="Suomi" data-language-local-name="Finnish" class="interlanguage-link-target"><span>Suomi</span></a></li><li class="interlanguage-link interwiki-tl mw-list-item"><a href="https://tl.wikipedia.org/wiki/Eiffel_(wikang_pamprograma)" title="Eiffel (wikang pamprograma) – Tagalog" lang="tl" hreflang="tl" data-title="Eiffel (wikang pamprograma)" data-language-autonym="Tagalog" data-language-local-name="Tagalog" class="interlanguage-link-target"><span>Tagalog</span></a></li><li class="interlanguage-link interwiki-tt mw-list-item"><a href="https://tt.wikipedia.org/wiki/%D0%AD%D0%B9%D1%84%D0%B5%D0%BB%D1%8C_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D0%BB%D0%B0%D1%83_%D1%82%D0%B5%D0%BB%D0%B5)" title="Эйфель (программалау теле) – Tatar" lang="tt" hreflang="tt" data-title="Эйфель (программалау теле)" data-language-autonym="Татарча / tatarça" data-language-local-name="Tatar" class="interlanguage-link-target"><span>Татарча / tatarça</span></a></li><li class="interlanguage-link interwiki-tg mw-list-item"><a href="https://tg.wikipedia.org/wiki/%D0%AD%D0%B9%D1%84%D0%B5%D0%BB_(%D0%B7%D0%B0%D0%B1%D0%BE%D0%BD%D0%B8_%D0%B1%D0%B0%D1%80%D0%BD%D0%BE%D0%BC%D0%B0%D1%81%D0%BE%D0%B7%D3%A3)" title="Эйфел (забони барномасозӣ) – Tajik" lang="tg" hreflang="tg" data-title="Эйфел (забони барномасозӣ)" data-language-autonym="Тоҷикӣ" data-language-local-name="Tajik" class="interlanguage-link-target"><span>Тоҷикӣ</span></a></li><li class="interlanguage-link interwiki-uk mw-list-item"><a href="https://uk.wikipedia.org/wiki/Eiffel" title="Eiffel – Ukrainian" lang="uk" hreflang="uk" data-title="Eiffel" data-language-autonym="Українська" data-language-local-name="Ukrainian" class="interlanguage-link-target"><span>Українська</span></a></li><li class="interlanguage-link interwiki-zh mw-list-item"><a href="https://zh.wikipedia.org/wiki/Eiffel" title="Eiffel – Chinese" lang="zh" hreflang="zh" data-title="Eiffel" data-language-autonym="中文" data-language-local-name="Chinese" class="interlanguage-link-target"><span>中文</span></a></li> </ul> <div class="after-portlet after-portlet-lang"><span class="wb-langlinks-edit wb-langlinks-link"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q732089#sitelinks-wikipedia" title="Edit interlanguage links" class="wbc-editpage">Edit links</a></span></div> </div> </div> </div> </header> <div class="vector-page-toolbar"> <div class="vector-page-toolbar-container"> <div id="left-navigation"> <nav aria-label="Namespaces"> <div id="p-associated-pages" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-associated-pages" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-main" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Eiffel_(programming_language)" title="View the content page [c]" accesskey="c"><span>Article</span></a></li><li id="ca-talk" class="vector-tab-noicon mw-list-item"><a href="/wiki/Talk:Eiffel_(programming_language)" rel="discussion" title="Discuss improvements to the content page [t]" accesskey="t"><span>Talk</span></a></li> </ul> </div> </div> <div id="vector-variants-dropdown" class="vector-dropdown emptyPortlet" > <input type="checkbox" id="vector-variants-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-variants-dropdown" class="vector-dropdown-checkbox " aria-label="Change language variant" > <label id="vector-variants-dropdown-label" for="vector-variants-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">English</span> </label> <div class="vector-dropdown-content"> <div id="p-variants" class="vector-menu mw-portlet mw-portlet-variants emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </nav> </div> <div id="right-navigation" class="vector-collapsible"> <nav aria-label="Views"> <div id="p-views" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-views" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Eiffel_(programming_language)"><span>Read</span></a></li><li id="ca-edit" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit" title="Edit this page [e]" accesskey="e"><span>Edit</span></a></li><li id="ca-history" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=history" title="Past revisions of this page [h]" accesskey="h"><span>View history</span></a></li> </ul> </div> </div> </nav> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-dropdown" class="vector-dropdown vector-page-tools-dropdown" > <input type="checkbox" id="vector-page-tools-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-tools-dropdown" class="vector-dropdown-checkbox " aria-label="Tools" > <label id="vector-page-tools-dropdown-label" for="vector-page-tools-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">Tools</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-tools-unpinned-container" class="vector-unpinned-container"> <div id="vector-page-tools" class="vector-page-tools vector-pinnable-element"> <div class="vector-pinnable-header vector-page-tools-pinnable-header vector-pinnable-header-unpinned" data-feature-name="page-tools-pinned" data-pinnable-element-id="vector-page-tools" data-pinned-container-id="vector-page-tools-pinned-container" data-unpinned-container-id="vector-page-tools-unpinned-container" > <div class="vector-pinnable-header-label">Tools</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-page-tools.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-page-tools.unpin">hide</button> </div> <div id="p-cactions" class="vector-menu mw-portlet mw-portlet-cactions emptyPortlet vector-has-collapsible-items" title="More options" > <div class="vector-menu-heading"> Actions </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-more-view" class="selected vector-more-collapsible-item mw-list-item"><a href="/wiki/Eiffel_(programming_language)"><span>Read</span></a></li><li id="ca-more-edit" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit" title="Edit this page [e]" accesskey="e"><span>Edit</span></a></li><li id="ca-more-history" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=history"><span>View history</span></a></li> </ul> </div> </div> <div id="p-tb" class="vector-menu mw-portlet mw-portlet-tb" > <div class="vector-menu-heading"> General </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-whatlinkshere" class="mw-list-item"><a href="/wiki/Special:WhatLinksHere/Eiffel_(programming_language)" title="List of all English Wikipedia pages containing links to this page [j]" accesskey="j"><span>What links here</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/Special:RecentChangesLinked/Eiffel_(programming_language)" rel="nofollow" title="Recent changes in pages linked from this page [k]" accesskey="k"><span>Related changes</span></a></li><li id="t-upload" class="mw-list-item"><a href="/wiki/Wikipedia:File_Upload_Wizard" title="Upload files [u]" accesskey="u"><span>Upload file</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/wiki/Special:SpecialPages" title="A list of all special pages [q]" accesskey="q"><span>Special pages</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/w/index.php?title=Eiffel_(programming_language)&amp;oldid=1257513399" title="Permanent link to this revision of this page"><span>Permanent link</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=info" title="More information about this page"><span>Page information</span></a></li><li id="t-cite" class="mw-list-item"><a href="/w/index.php?title=Special:CiteThisPage&amp;page=Eiffel_%28programming_language%29&amp;id=1257513399&amp;wpFormIdentifier=titleform" title="Information on how to cite this page"><span>Cite this page</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=Special:UrlShortener&amp;url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FEiffel_%28programming_language%29"><span>Get shortened URL</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=Special:QrCode&amp;url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FEiffel_%28programming_language%29"><span>Download QR code</span></a></li> </ul> </div> </div> <div id="p-coll-print_export" class="vector-menu mw-portlet mw-portlet-coll-print_export" > <div class="vector-menu-heading"> Print/export </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="coll-download-as-rl" class="mw-list-item"><a href="/w/index.php?title=Special:DownloadAsPdf&amp;page=Eiffel_%28programming_language%29&amp;action=show-download-screen" title="Download this page as a PDF file"><span>Download as PDF</span></a></li><li id="t-print" class="mw-list-item"><a href="/w/index.php?title=Eiffel_(programming_language)&amp;printable=yes" title="Printable version of this page [p]" accesskey="p"><span>Printable version</span></a></li> </ul> </div> </div> <div id="p-wikibase-otherprojects" class="vector-menu mw-portlet mw-portlet-wikibase-otherprojects" > <div class="vector-menu-heading"> In other projects </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li class="wb-otherproject-link wb-otherproject-commons mw-list-item"><a href="https://commons.wikimedia.org/wiki/Category:Eiffel_(programming_language)" hreflang="en"><span>Wikimedia Commons</span></a></li><li id="t-wikibase" class="wb-otherproject-link wb-otherproject-wikibase-dataitem mw-list-item"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q732089" title="Structured data on this page hosted by Wikidata [g]" accesskey="g"><span>Wikidata item</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> </div> </div> </div> <div class="vector-column-end"> <div class="vector-sticky-pinned-container"> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-pinned-container" class="vector-pinned-container"> </div> </nav> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-pinned-container" class="vector-pinned-container"> <div id="vector-appearance" class="vector-appearance vector-pinnable-element"> <div class="vector-pinnable-header vector-appearance-pinnable-header vector-pinnable-header-pinned" data-feature-name="appearance-pinned" data-pinnable-element-id="vector-appearance" data-pinned-container-id="vector-appearance-pinned-container" data-unpinned-container-id="vector-appearance-unpinned-container" > <div class="vector-pinnable-header-label">Appearance</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-appearance.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-appearance.unpin">hide</button> </div> </div> </div> </nav> </div> </div> <div id="bodyContent" class="vector-body" aria-labelledby="firstHeading" data-mw-ve-target-container> <div class="vector-body-before-content"> <div class="mw-indicators"> </div> <div id="siteSub" class="noprint">From Wikipedia, the free encyclopedia</div> </div> <div id="contentSub"><div id="mw-content-subtitle"></div></div> <div id="mw-content-text" class="mw-body-content"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><div class="shortdescription nomobile noexcerpt noprint searchaux" style="display:none">Object-oriented programming language</div> <style data-mw-deduplicate="TemplateStyles:r1257001546">.mw-parser-output .infobox-subbox{padding:0;border:none;margin:-3px;width:auto;min-width:100%;font-size:100%;clear:none;float:none;background-color:transparent}.mw-parser-output .infobox-3cols-child{margin:auto}.mw-parser-output .infobox .navbar{font-size:100%}@media screen{html.skin-theme-clientpref-night .mw-parser-output .infobox-full-data:not(.notheme)>div:not(.notheme)[style]{background:#1f1f23!important;color:#f8f9fa}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .infobox-full-data:not(.notheme) div:not(.notheme){background:#1f1f23!important;color:#f8f9fa}}@media(min-width:640px){body.skin--responsive .mw-parser-output .infobox-table{display:table!important}body.skin--responsive .mw-parser-output .infobox-table>caption{display:table-caption!important}body.skin--responsive .mw-parser-output .infobox-table>tbody{display:table-row-group}body.skin--responsive .mw-parser-output .infobox-table tr{display:table-row!important}body.skin--responsive .mw-parser-output .infobox-table th,body.skin--responsive .mw-parser-output .infobox-table td{padding-left:inherit;padding-right:inherit}}</style><table class="infobox vevent"><caption class="infobox-title summary">Eiffel</caption><tbody><tr><td colspan="2" class="infobox-image"><span class="mw-default-size" typeof="mw:File/Frameless"><a href="/wiki/File:Eiffel_logo.svg" class="mw-file-description" title="Eiffel logo"><img alt="Eiffel logo" src="//upload.wikimedia.org/wikipedia/commons/thumb/6/6a/Eiffel_logo.svg/220px-Eiffel_logo.svg.png" decoding="async" width="220" height="46" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/6/6a/Eiffel_logo.svg/330px-Eiffel_logo.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/6/6a/Eiffel_logo.svg/440px-Eiffel_logo.svg.png 2x" data-file-width="512" data-file-height="106" /></a></span></td></tr><tr><th scope="row" class="infobox-label"><a href="/wiki/Programming_paradigm" title="Programming paradigm">Paradigm</a></th><td class="infobox-data"><a href="/wiki/Object-oriented_programming" title="Object-oriented programming">Object-oriented</a>, <a href="/wiki/Class-based_programming" title="Class-based programming">Class-based</a>, <a href="/wiki/Generic_programming" title="Generic programming">Generic</a>, <a href="/wiki/Concurrent_object-oriented_programming" title="Concurrent object-oriented programming">Concurrent</a></td></tr><tr><th scope="row" class="infobox-label"><a href="/wiki/Software_design" title="Software design">Designed&#160;by</a></th><td class="infobox-data"><a href="/wiki/Bertrand_Meyer" title="Bertrand Meyer">Bertrand Meyer</a></td></tr><tr><th scope="row" class="infobox-label"><a href="/wiki/Software_developer" class="mw-redirect" title="Software developer">Developer</a></th><td class="infobox-data organiser">Eiffel Software</td></tr><tr><th scope="row" class="infobox-label">First&#160;appeared</th><td class="infobox-data">1986<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">&#91;</span>1<span class="cite-bracket">&#93;</span></a></sup></td></tr><tr><td colspan="2" class="infobox-full-data"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1257001546"></td></tr><tr><th scope="row" class="infobox-label" style="white-space: nowrap;"><a href="/wiki/Software_release_life_cycle" title="Software release life cycle">Stable release</a></th><td class="infobox-data"><div style="margin:0px;"><a href="/wiki/EiffelStudio" title="EiffelStudio">EiffelStudio 24.05</a><sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">&#91;</span>2<span class="cite-bracket">&#93;</span></a></sup> / 14&#160;June 2024<span class="noprint">&#59;&#32;5 months ago</span><span style="display:none">&#160;(<span class="bday dtstart published updated">2024-06-14</span>)</span></div></td></tr><tr style="display:none"><td colspan="2"> </td></tr><tr><th scope="row" class="infobox-label"><a href="/wiki/Type_system" title="Type system">Typing discipline</a></th><td class="infobox-data"><a href="/wiki/Static_typing" class="mw-redirect" title="Static typing">static</a></td></tr><tr><th scope="row" class="infobox-label">Implementation language</th><td class="infobox-data">Eiffel</td></tr><tr><th scope="row" class="infobox-label"><a href="/wiki/Computing_platform" title="Computing platform">Platform</a></th><td class="infobox-data"><a href="/wiki/Cross-platform" class="mw-redirect" title="Cross-platform">Cross-platform</a></td></tr><tr><th scope="row" class="infobox-label"><a href="/wiki/Operating_system" title="Operating system">OS</a></th><td class="infobox-data"><a href="/wiki/FreeBSD" title="FreeBSD">FreeBSD</a>, <a href="/wiki/Linux" title="Linux">Linux</a>, <a href="/wiki/MacOS" title="MacOS">macOS</a>, <a href="/wiki/OpenBSD" title="OpenBSD">OpenBSD</a>, <a href="/wiki/Solaris_(operating_system)" class="mw-redirect" title="Solaris (operating system)">Solaris</a>, <a href="/wiki/Windows" class="mw-redirect" title="Windows">Windows</a></td></tr><tr><th scope="row" class="infobox-label"><a href="/wiki/Software_license" title="Software license">License</a></th><td class="infobox-data">dual and enterprise</td></tr><tr><th scope="row" class="infobox-label"><a href="/wiki/Filename_extension" title="Filename extension">Filename extensions</a></th><td class="infobox-data"><code>.e</code></td></tr><tr><th scope="row" class="infobox-label">Website</th><td class="infobox-data"><span class="url"><a rel="nofollow" class="external text" href="http://eiffel.org">eiffel<wbr />.org</a></span></td></tr><tr><th colspan="2" class="infobox-header" style="background-color: #eee;">Major <a href="/wiki/Programming_language_implementation" title="Programming language implementation">implementations</a></th></tr><tr><td colspan="2" class="infobox-full-data"><a href="/wiki/EiffelStudio" title="EiffelStudio">EiffelStudio</a>, <a href="/wiki/LibertyEiffel" title="LibertyEiffel">LibertyEiffel</a>, <a href="/wiki/SmartEiffel" title="SmartEiffel">SmartEiffel</a>, <a href="/wiki/Visual_Eiffel" title="Visual Eiffel">Visual Eiffel</a>, Gobo Eiffel, "The Eiffel Compiler" tecomp</td></tr><tr><th colspan="2" class="infobox-header" style="background-color: #eee;">Influenced by</th></tr><tr><td colspan="2" class="infobox-full-data"><a href="/wiki/Ada_(programming_language)" title="Ada (programming language)">Ada</a>, <a href="/wiki/Simula" title="Simula">Simula</a>, <a href="/wiki/Z_notation" title="Z notation">Z</a></td></tr><tr><th colspan="2" class="infobox-header" style="background-color: #eee;">Influenced</th></tr><tr><td colspan="2" class="infobox-full-data"><a href="/wiki/Ada_(programming_language)" title="Ada (programming language)">Ada 2012</a>, <a href="/w/index.php?title=Albatross_(programming_language)&amp;action=edit&amp;redlink=1" class="new" title="Albatross (programming language) (page does not exist)">Albatross</a>, <a href="/wiki/C_Sharp_(programming_language)" title="C Sharp (programming language)">C#</a>, <a href="/wiki/D_(programming_language)" title="D (programming language)">D</a>, <a href="/wiki/Java_(programming_language)" title="Java (programming language)">Java</a>, <a href="/wiki/Racket_(programming_language)" title="Racket (programming language)">Racket</a>, <a href="/wiki/Ruby_(programming_language)" title="Ruby (programming language)">Ruby</a>,<sup id="cite_ref-nov2pro_3-0" class="reference"><a href="#cite_note-nov2pro-3"><span class="cite-bracket">&#91;</span>3<span class="cite-bracket">&#93;</span></a></sup> <a href="/wiki/Sather" title="Sather">Sather</a>, <a href="/wiki/Scala_(programming_language)" title="Scala (programming language)">Scala</a></td></tr></tbody></table> <p><b>Eiffel</b> is an <a href="/wiki/Object-oriented_programming" title="Object-oriented programming">object-oriented</a> <a href="/wiki/Programming_language" title="Programming language">programming language</a> designed by <a href="/wiki/Bertrand_Meyer" title="Bertrand Meyer">Bertrand Meyer</a> (an object-orientation proponent and author of <i><a href="/wiki/Object-Oriented_Software_Construction" title="Object-Oriented Software Construction">Object-Oriented Software Construction</a></i>) and Eiffel Software. Meyer conceived the language in 1985 with the goal of increasing the reliability of commercial software development;<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">&#91;</span>4<span class="cite-bracket">&#93;</span></a></sup> the first version becoming available in 1986. In 2005, Eiffel became an <a href="/wiki/International_Organization_for_Standardization" title="International Organization for Standardization">ISO</a>-standardized language. </p><p>The design of the language is closely connected with the Eiffel programming method. Both are based on a set of principles, including <a href="/wiki/Design_by_contract" title="Design by contract">design by contract</a>, <a href="/wiki/Command%E2%80%93query_separation" title="Command–query separation">command–query separation</a>, the <a href="/wiki/Uniform_access_principle" title="Uniform access principle">uniform-access principle</a>, the <a href="/wiki/Single_choice_principle" class="mw-redirect" title="Single choice principle">single-choice principle</a>, the <a href="/wiki/Open%E2%80%93closed_principle" title="Open–closed principle">open–closed principle</a>, and <a href="/wiki/Option%E2%80%93operand_separation" title="Option–operand separation">option–operand separation</a>. </p><p>Many concepts initially introduced by Eiffel later found their way into <a href="/wiki/Java_(programming_language)" title="Java (programming language)">Java</a>, <a href="/wiki/C_Sharp_(programming_language)" title="C Sharp (programming language)">C#</a>, and other languages. <sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">&#91;</span>5<span class="cite-bracket">&#93;</span></a></sup> New language design ideas, particularly through the <a href="/wiki/Ecma_International" title="Ecma International">Ecma</a>/<a href="/wiki/International_Organization_for_Standardization" title="International Organization for Standardization">ISO</a> standardization process, continue to be incorporated into the Eiffel language. </p> <meta property="mw:PageProp/toc" /> <div class="mw-heading mw-heading2"><h2 id="Characteristics">Characteristics</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=1" title="Edit section: Characteristics"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>The key characteristics of the Eiffel language include: </p> <ul><li>An object-oriented program structure in which a class serves as the basic unit of decomposition.<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">&#91;</span>6<span class="cite-bracket">&#93;</span></a></sup></li> <li><a href="/wiki/Design_by_contract" title="Design by contract">Design by contract</a> tightly integrated with other language constructs.</li> <li>Automatic memory management, typically implemented by <a href="/wiki/Garbage_collection_(computer_science)" title="Garbage collection (computer science)">garbage collection</a>.<sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">&#91;</span>7<span class="cite-bracket">&#93;</span></a></sup></li> <li><a href="/wiki/Inheritance_(object-oriented_programming)" title="Inheritance (object-oriented programming)">Inheritance</a>, including <a href="/wiki/Multiple_inheritance" title="Multiple inheritance">multiple inheritance</a>, <a href="https://en.wiktionary.org/wiki/renaming" class="extiw" title="wikt:renaming">renaming</a>, <a href="/wiki/Method_overriding" title="Method overriding">redefinition</a>, "select", <a rel="nofollow" class="external text" href="http://docs.eiffel.com/book/method/et-inheritance#Non-conforming_inheritance">non-conforming inheritance</a>, and other mechanisms intended to make inheritance safe.</li> <li>Constrained and unconstrained <a href="/wiki/Generic_programming" title="Generic programming">generic programming</a><sup id="cite_ref-Claus_8-0" class="reference"><a href="#cite_note-Claus-8"><span class="cite-bracket">&#91;</span>8<span class="cite-bracket">&#93;</span></a></sup></li> <li>A uniform <a href="/wiki/Type_system" title="Type system">type system</a> handling both value and reference semantics in which all types, including basic types such as INTEGER, are class-based.</li> <li><a href="/wiki/Static_typing" class="mw-redirect" title="Static typing">Static typing</a></li> <li><a href="/wiki/Void_safety" title="Void safety">Void safety</a>, or static protection against calls on null references, through the attached-types mechanism.</li> <li>Agents, or objects that wrap computations, closely connected with <a href="/wiki/Closure_(computer_science)" class="mw-redirect" title="Closure (computer science)">closures</a> and <a href="/wiki/Lambda_calculus" title="Lambda calculus">lambda calculus</a>.</li> <li><i>Once</i> routines, or routines evaluated only once, for object sharing and decentralized initialization.</li> <li>Keyword-based syntax in the <a href="/wiki/ALGOL" title="ALGOL">ALGOL</a>/<a href="/wiki/Pascal_(programming_language)" title="Pascal (programming language)">Pascal</a> tradition but separator-free, insofar as semicolons are optional, with operator syntax available for routines.</li> <li>Case insensitivity</li> <li>Simple Concurrent Object-Oriented Programming (<a href="/wiki/SCOOP_(software)" title="SCOOP (software)">SCOOP</a>) facilitates creation of multiple, concurrently active execution vehicles at a level of abstraction above the specific details of these vehicles (e.g. multiple threads without specific mutex management).</li></ul> <div class="mw-heading mw-heading2"><h2 id="Design_goals">Design goals</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=2" title="Edit section: Design goals"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Eiffel emphasizes declarative statements over procedural code and attempts to eliminate the need for bookkeeping instructions. </p><p>Eiffel shuns coding tricks or coding techniques intended as <a href="/wiki/Optimization_(computer_science)" class="mw-redirect" title="Optimization (computer science)">optimization</a> hints to the compiler. The aim is not only to make the code more readable, but also to allow programmers to concentrate on the important aspects of a program without getting bogged down in implementation details. Eiffel's simplicity is intended to promote simple, extensible, reusable, and reliable answers to computing problems. Compilers for computer programs written in Eiffel provide extensive optimization techniques, such as automatic in-lining, that relieve the programmer of part of the optimization burden. </p> <div class="mw-heading mw-heading3"><h3 id="Background">Background</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=3" title="Edit section: Background"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Eiffel was originally developed by Eiffel Software, a company founded by <a href="/wiki/Bertrand_Meyer" title="Bertrand Meyer">Bertrand Meyer</a>. <i><a href="/wiki/Object-Oriented_Software_Construction" title="Object-Oriented Software Construction">Object-Oriented Software Construction</a></i> contains a detailed treatment of the concepts and theory of the object technology that led to Eiffel's design.<sup id="cite_ref-9" class="reference"><a href="#cite_note-9"><span class="cite-bracket">&#91;</span>9<span class="cite-bracket">&#93;</span></a></sup> </p><p>The design goal behind the Eiffel language, libraries, and programming methods is to enable programmers to create reliable, reusable software modules. Eiffel supports <a href="/wiki/Multiple_inheritance" title="Multiple inheritance">multiple inheritance</a>, <a href="/wiki/Genericity" class="mw-redirect" title="Genericity">genericity</a>, <a href="/wiki/Polymorphism_(computer_science)" title="Polymorphism (computer science)">polymorphism</a>, <a href="/wiki/Encapsulation_(computer_science)" class="mw-redirect" title="Encapsulation (computer science)">encapsulation</a>, type-safe conversions, and <a href="/wiki/Parameter_covariance" class="mw-redirect" title="Parameter covariance">parameter covariance</a>. Eiffel's most important contribution to <a href="/wiki/Software_engineering" title="Software engineering">software engineering</a> is <a href="/wiki/Design_by_contract" title="Design by contract">design by contract</a> (DbC), in which <a href="/wiki/Assertion_(computing)" class="mw-redirect" title="Assertion (computing)">assertions</a>, <a href="/wiki/Precondition" title="Precondition">preconditions</a>, <a href="/wiki/Postcondition" title="Postcondition">postconditions</a>, and <a href="/wiki/Class_invariant" title="Class invariant">class invariants</a> are employed to help ensure program correctness without sacrificing efficiency. </p><p>Eiffel's design is based on object-oriented programming theory, with only minor influence of other paradigms or concern for support of legacy code. Eiffel formally supports <a href="/wiki/Abstract_data_type" title="Abstract data type">abstract data types</a>. Under Eiffel's design, a software text should be able to reproduce its design documentation from the text itself, using a formalized implementation of the "Abstract Data Type". </p> <div class="mw-heading mw-heading3"><h3 id="Implementations_and_environments">Implementations and environments</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=4" title="Edit section: Implementations and environments"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p><a href="/wiki/EiffelStudio" title="EiffelStudio">EiffelStudio</a> is an <a href="/wiki/Integrated_development_environment" title="Integrated development environment">integrated development environment</a> available under either an <a href="/wiki/Open-source_license" title="Open-source license">open source</a> or a commercial license. It offers an object-oriented environment for <a href="/wiki/Software_engineering" title="Software engineering">software engineering</a>. EiffelEnvision is a plug-in for <a href="/wiki/Microsoft_Visual_Studio" class="mw-redirect" title="Microsoft Visual Studio">Microsoft Visual Studio</a> that allows users to edit, compile, and debug Eiffel projects from within the Microsoft Visual Studio IDE. Five other <a href="/wiki/Open-source_software" title="Open-source software">open source</a> implementations are available: "The Eiffel Compiler" tecomp; Gobo Eiffel; <a href="/wiki/SmartEiffel" title="SmartEiffel">SmartEiffel</a>, the GNU implementation, based on an older version of the language; <a href="/wiki/LibertyEiffel" title="LibertyEiffel">LibertyEiffel</a>, based on the SmartEiffel compiler; and <a href="/wiki/Visual_Eiffel" title="Visual Eiffel">Visual Eiffel</a>. </p><p>Several other programming languages incorporate elements first introduced in Eiffel. <a href="/wiki/Sather" title="Sather">Sather</a>, for example, was originally based on Eiffel but has since diverged, and now includes several <a href="/wiki/Functional_programming" title="Functional programming">functional programming</a> features. The interactive-teaching language Blue, forerunner of <a href="/wiki/BlueJ" title="BlueJ">BlueJ</a>, is also Eiffel-based. The <a href="/wiki/Apple_Media_Tool" title="Apple Media Tool">Apple Media Tool</a> includes an Eiffel-based Apple Media Language. </p> <div class="mw-heading mw-heading3"><h3 id="Specifications_and_standards">Specifications and standards</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=5" title="Edit section: Specifications and standards"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>The Eiffel language definition is an international standard of the <a href="/wiki/International_Organization_for_Standardization" title="International Organization for Standardization">ISO</a>. The standard was developed by <a href="/wiki/European_Computer_Manufacturers_Association" class="mw-redirect" title="European Computer Manufacturers Association">ECMA International</a>, which first approved the standard on 21 June 2005 as Standard ECMA-367, Eiffel: Analysis, Design and Programming Language. In June 2006, ECMA and ISO adopted the second version. In November 2006, ISO first published that version. The standard can be found and used free of charge on the ECMA site.<sup id="cite_ref-10" class="reference"><a href="#cite_note-10"><span class="cite-bracket">&#91;</span>10<span class="cite-bracket">&#93;</span></a></sup> The ISO version<sup id="cite_ref-11" class="reference"><a href="#cite_note-11"><span class="cite-bracket">&#91;</span>11<span class="cite-bracket">&#93;</span></a></sup> is identical in all respects except formatting. </p><p>Eiffel Software, "The Eiffel Compiler" tecomp and Eiffel-library-developer Gobo have committed to implementing the standard; Eiffel Software's EiffelStudio 6.1 and "The Eiffel Compiler" tecomp implement some of the major new mechanisms—in particular, inline agents, assigner commands, bracket notation, non-conforming inheritance, and attached types. The <a href="/wiki/SmartEiffel" title="SmartEiffel">SmartEiffel</a> team has turned away from this standard to create its own version of the language, which they believe to be closer to the original style of Eiffel. Object Tools has not disclosed whether future versions of its Eiffel compiler will comply with the standard. <a href="/wiki/LibertyEiffel" title="LibertyEiffel">LibertyEiffel</a> implements a dialect somewhere in between the <a href="/wiki/SmartEiffel" title="SmartEiffel">SmartEiffel</a> language and the standard. </p><p>The standard cites the following, predecessor Eiffel-language specifications: </p> <ul><li>Bertrand Meyer: <i>Eiffel: The Language</i>, Prentice Hall, second printing, 1992 (first printing: 1991)</li> <li>Bertrand Meyer: <i>Standard Eiffel</i> (revision of preceding entry), ongoing, 1997–present, at Bertrand Meyer's ETL3 page, and</li> <li>Bertrand Meyer: <i>Object-Oriented Software Construction</i>, Prentice Hall: first edition, 1988; second edition, 1997.</li> <li>Bertrand Meyer: <i>Touch of Class: Learning to Program Well with Objects and Contracts</i>, Springer-Verlag, 2009 <style data-mw-deduplicate="TemplateStyles:r1238218222">.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("//upload.wikimedia.org/wikipedia/commons/6/65/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("//upload.wikimedia.org/wikipedia/commons/d/d6/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("//upload.wikimedia.org/wikipedia/commons/a/aa/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("//upload.wikimedia.org/wikipedia/commons/4/4c/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}</style><a href="/wiki/ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-3-540-92144-8" title="Special:BookSources/978-3-540-92144-8">978-3-540-92144-8</a> lxiv + 876 pages Full-color printing, numerous color photographs</li></ul> <p>The current version of the standard from June 2006 contains some inconsistencies (e.g. covariant redefinitions)<sup class="noprint Inline-Template Template-Fact" style="white-space:nowrap;">&#91;<i><a href="/wiki/Wikipedia:Citation_needed" title="Wikipedia:Citation needed"><span title="This claim needs references to reliable sources. (October 2010)">citation needed</span></a></i>&#93;</sup>. The ECMA committee has not yet announced any timeline and direction on how to resolve the inconsistencies. </p> <div class="mw-heading mw-heading2"><h2 id="Syntax_and_semantics">Syntax and semantics</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=6" title="Edit section: Syntax and semantics"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <div class="mw-heading mw-heading3"><h3 id="Overall_structure">Overall structure</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=7" title="Edit section: Overall structure"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>An Eiffel "system" or "program" is a collection of <i>classes</i>. Above the level of classes, Eiffel defines <i>cluster</i>, which is essentially a group of classes, and possibly of <i>subclusters</i> (nested clusters). Clusters are not a syntactic <a href="/wiki/Language_construct" title="Language construct">language construct</a>, but rather a standard organizational convention. Typically an Eiffel program will be organized with each class in a separate file, and each cluster in a directory containing class files. In this organization, subclusters are subdirectories. For example, under standard organizational and casing conventions, <code>x.e</code> might be the name of a file that defines a class called X. </p><p>A class contains <i>features</i>, which are similar to "routines", "members", "attributes" or "methods" in other object-oriented programming languages. A class also defines its invariants, and contains other properties, such as a "notes" section for documentation and metadata. Eiffel's standard data types, such as <code>INTEGER</code>, <code>STRING</code> and <code>ARRAY</code>, are all themselves classes. </p><p>Every system must have a class designated as "root", with one of its creation procedures designated as "root procedure". Executing a system consists of creating an instance of the root class and executing its root procedure. Generally, doing so creates new objects, calls new features, and so on. </p><p>Eiffel has five basic executable instructions: assignment, object creation, routine call, condition, and iteration. Eiffel's control structures are strict in enforcing <a href="/wiki/Structured_programming" title="Structured programming">structured programming</a>: every block has exactly one entry and exactly one exit. </p> <div class="mw-heading mw-heading4"><h4 id="Scoping">Scoping</h4><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=8" title="Edit section: Scoping"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Unlike many object-oriented languages, but like <a href="/wiki/Smalltalk" title="Smalltalk">Smalltalk</a>, Eiffel does not permit any assignment into attributes of objects, except within the features of an object, which is the practical application of the principle of <a href="/wiki/Information_hiding" title="Information hiding">information hiding</a> or data abstraction, requiring formal interfaces for data mutation. To put it in the language of other object-oriented programming languages, all Eiffel attributes are "protected", and "setters" are needed for client objects to modify values. An upshot of this is that "setters" can and normally do, implement the invariants for which Eiffel provides syntax. </p><p>While Eiffel does not allow direct access to the features of a class by a client of the class, it does allow for the definition of an "assigner command", such as: </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span> <span class="w"> </span><span class="n">some_attribute</span><span class="p">:</span><span class="w"> </span><span class="nc">SOME_TYPE</span><span class="w"> </span><span class="kr">assign</span><span class="w"> </span><span class="n">set_some_attribute</span> <span class="w"> </span> <span class="w"> </span><span class="n">set_some_attribute</span><span class="w"> </span><span class="p">(</span><span class="n">v</span><span class="p">:</span><span class="w"> </span><span class="nc">VALUE_TYPE</span><span class="p">)</span> <span class="w"> </span><span class="c1">-- Set value of some_attribute to `v&#39;.</span> <span class="w"> </span><span class="kr">do</span> <span class="w"> </span><span class="n">some_attribute</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">v</span> <span class="w"> </span><span class="kr">end</span> </pre></div> <p>While a slight bow to the overall developer community to allow something looking like direct access (e.g. thereby breaking the Information Hiding Principle), the practice is dangerous as it hides or obfuscates the reality of a "setter" being used. In practice, it is better to redirect the call to a setter rather than implying a direct access to a feature like <code>some_attribute</code> as in the example code above.<sup class="noprint Inline-Template Template-Fact" style="white-space:nowrap;">&#91;<i><a href="/wiki/Wikipedia:Citation_needed" title="Wikipedia:Citation needed"><span title="Working fine in Delphi (Object Pascal) for 25 years. In Eiffel, if a setter is the only way to set an attribute, this must obviously be what is going on. How is that &#39;obfuscated&#39;? (March 2021)">citation needed</span></a></i>&#93;</sup> </p><p>Unlike other languages, having notions of "public", "protected", "private" and so on, Eiffel uses an exporting technology to more precisely control the scoping between client and supplier classes. Feature visibility is checked statically at compile-time. For example, (below), the "{NONE}" is similar to "protected" in other languages. Scope applied this way to a "feature set" (e.g. everything below the 'feature' keyword to either the next feature set keyword or the end of the class) can be changed in descendant classes using the "export" keyword. </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="kr">feature</span><span class="w"> </span><span class="p">{</span><span class="kr">NONE</span><span class="p">}</span><span class="w"> </span><span class="c1">-- Initialization</span> <span class="w"> </span><span class="n">default_create</span> <span class="w"> </span><span class="c1">-- Initialize a new `zero&#39; decimal instance.</span> <span class="w"> </span><span class="kr">do</span> <span class="w"> </span><span class="n">make_zero</span> <span class="w"> </span><span class="kr">end</span> </pre></div> <p>Alternatively, the lack of a {x} export declaration implies {ANY} and is similar to the "public" scoping of other languages. </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="kr">feature</span><span class="w"> </span><span class="c1">-- Constants</span> </pre></div> <p>Finally, scoping can be selectively and precisely controlled to any class in the Eiffel project universe, such as: </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="kr">feature</span><span class="w"> </span><span class="p">{</span><span class="nc">DECIMAL</span><span class="p">,</span><span class="w"> </span><span class="nc">DCM_MA_DECIMAL_PARSER</span><span class="p">,</span><span class="w"> </span><span class="nc">DCM_MA_DECIMAL_HANDLER</span><span class="p">}</span><span class="w"> </span><span class="c1">-- Access</span> </pre></div> <p>Here, the compiler will allow only the classes listed between the curly braces to access the features within the feature group (e.g. <style data-mw-deduplicate="TemplateStyles:r886049734">.mw-parser-output .monospaced{font-family:monospace,monospace}</style><span class="monospaced">DECIMAL, DCM_MA_DECIMAL_PARSER, DCM_MA_DECIMAL_HANDLER</span>). </p> <div class="mw-heading mw-heading4"><h4 id="&quot;Hello,_world!&quot;"><span id=".22Hello.2C_world.21.22"></span>"Hello, world!"</h4><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=9" title="Edit section: &quot;Hello, world!&quot;"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>A programming language's look and feel is often conveyed using a <a href="/wiki/Hello_world_program" class="mw-redirect" title="Hello world program">"Hello, world!"</a> program. Such a program written in Eiffel might be: </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="kr">class</span> <span class="w"> </span><span class="nc">HELLO_WORLD</span> <span class="kr">create</span> <span class="w"> </span><span class="n">make</span> <span class="kr">feature</span> <span class="w"> </span><span class="n">make</span> <span class="w"> </span><span class="kr">do</span> <span class="w"> </span><span class="n">print</span><span class="w"> </span><span class="p">(</span><span class="s">&quot;Hello, world!%N&quot;</span><span class="p">)</span> <span class="w"> </span><span class="kr">end</span> <span class="kr">end</span> </pre></div> <p>This program contains the class <code>HELLO_WORLD</code>. The constructor (create routine) for the class, named <code>make</code>, invokes the <code>print</code> system library routine to write a <code>"Hello,</code>&#160;<code>world!"</code> message to the output. </p> <div class="mw-heading mw-heading3"><h3 id="Design_by_contract">Design by contract</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=10" title="Edit section: Design by contract"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <style data-mw-deduplicate="TemplateStyles:r1236090951">.mw-parser-output .hatnote{font-style:italic}.mw-parser-output div.hatnote{padding-left:1.6em;margin-bottom:0.5em}.mw-parser-output .hatnote i{font-style:normal}.mw-parser-output .hatnote+link+.hatnote{margin-top:-0.5em}@media print{body.ns-0 .mw-parser-output .hatnote{display:none!important}}</style><div role="note" class="hatnote navigation-not-searchable">Main article: <a href="/wiki/Design_by_contract" title="Design by contract">Design by contract</a></div> <p>The concept of Design by Contract is central to Eiffel. The contracts assert what must be true before a routine is executed (precondition) and what must hold to be true after the routine finishes (post-condition). Class Invariant contracts define what assertions must hold true both before and after any feature of a class is accessed (both routines and attributes). Moreover, contracts codify into executable code developer and designers assumptions about the operating environment of the features of a class or the class as a whole by means of the invariant. </p><p>The Eiffel compiler is designed to include the feature and class contracts in various levels. EiffelStudio, for example, executes all feature and class contracts during execution in the "Workbench mode." When an executable is created, the compiler is instructed by way of the project settings file (e.g. ECF file) to either include or exclude any set of contracts. Thus, an executable file can be compiled to either include or exclude any level of contract, thereby bringing along continuous levels of unit and integration testing. Moreover, contracts can be continually and methodically exercised by way of the Auto-Test feature found in EiffelStudio. </p><p>The Design by Contract mechanisms are tightly integrated with the language and guide redefinition of features in inheritance: </p> <ul><li>Routine precondition: The precondition may only be weakened by inheritance; any call that meets the requirements of the ancestor meets those of the descendant.</li> <li>Routine postcondition: The postcondition can only be strengthened by inheritance; any result guaranteed by the ancestor is still provided by the descendant.</li> <li>Class invariant: Conditions that must hold true after the object's creation and after any call to an exported class routine. Because the invariant is checked so often, it makes it simultaneously the most expensive and most powerful form of condition or contract.</li></ul> <p>In addition, the language supports a "check instruction" (a kind of "assert"), loop invariants, and loop variants (which guarantee loop termination). </p> <div class="mw-heading mw-heading3"><h3 id="Void-safe_capability">Void-safe capability</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=11" title="Edit section: Void-safe capability"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1236090951"><div role="note" class="hatnote navigation-not-searchable">Main article: <a href="/wiki/Void_safety" title="Void safety">Void safety</a></div> <p>Void-safe capability, like static typing, is another facility for improving software quality. Void-safe software is protected from run time errors caused by calls to <a href="/wiki/Null_reference" class="mw-redirect" title="Null reference">void references</a>, and therefore will be more reliable than software in which calls to void targets can occur. The analogy to static typing is a useful one. In fact, void-safe capability could be seen as an extension to the type system, or a step beyond static typing, because the mechanism for ensuring void safety is integrated into the type system. </p><p>The guard against void target calls can be seen by way of the notion of attachment and (by extension) detachment (e.g. detachable keyword). The void-safe facility can be seen in a short re-work of the example code used above: </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="n">some_attribute</span><span class="p">:</span><span class="w"> </span><span class="kr">detachable</span><span class="w"> </span><span class="nc">SOME_TYPE</span> <span class="w"> </span> <span class="w"> </span><span class="n">use_some_attribute</span> <span class="w"> </span><span class="c1">-- Set value of some_attribute to `v&#39;.</span> <span class="w"> </span><span class="kr">do</span> <span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="kr">attached</span><span class="w"> </span><span class="n">some_attribute</span><span class="w"> </span><span class="kr">as</span><span class="w"> </span><span class="n">l_attribute</span><span class="w"> </span><span class="kr">then</span> <span class="w"> </span><span class="n">do_something</span><span class="w"> </span><span class="p">(</span><span class="n">l_attribute</span><span class="p">)</span> <span class="w"> </span><span class="kr">end</span> <span class="w"> </span><span class="kr">end</span> <span class="w"> </span> <span class="w"> </span><span class="n">do_something</span><span class="w"> </span><span class="p">(</span><span class="n">a_value</span><span class="p">:</span><span class="w"> </span><span class="nc">SOME_TYPE</span><span class="p">)</span> <span class="w"> </span><span class="c1">-- Do something with `a_value&#39;.</span> <span class="w"> </span><span class="kr">do</span> <span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="n">doing</span><span class="w"> </span><span class="n">something</span><span class="w"> </span><span class="n">with</span><span class="w"> </span><span class="err">`</span><span class="n">a_value</span><span class="err">&#39;</span><span class="w"> </span><span class="p">...</span> <span class="w"> </span><span class="kr">end</span> </pre></div> <p>The code example above shows how the compiler can statically address the reliability of whether <code>some_attribute</code> will be attached or detached at the point it is used. Notably, the <code>attached</code> keyword allows for an "attachment local" (e.g. <code>l_attribute</code>), which is scoped to only the block of code enclosed by the if-statement construct. Thus, within this small block of code, the local variable (e.g. <code>l_attribute</code>) can be statically guaranteed to be non-void (i.e. void safe). </p> <div class="mw-heading mw-heading3"><h3 id="Features:_commands_and_queries">Features: commands and queries</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=12" title="Edit section: Features: commands and queries"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>The primary characteristic of a class is that it defines a set of features: as a class represents a set of run-time objects, or "instances", a feature is an operation on these objects. There are two kinds of features: queries and commands. A query provides information about an instance. A command modifies an instance. </p><p>The command-query distinction is important to the Eiffel method. In particular: </p> <ul><li><a href="/wiki/Uniform-Access_Principle" class="mw-redirect" title="Uniform-Access Principle">Uniform-Access Principle</a>: from the point of view of a software client making a call to a class feature, whether a query is an attribute (field value) or a function (computed value) should not make any difference. For example, <code>a_vehicle.speed</code> could be an attribute accessed on the object <code>a_vehicle</code>, or it could be computed by a function that divides distance by time. The notation is the same in both cases, so that it is easy to change the class's implementation without affecting client software.</li> <li><a href="/wiki/Command-Query_Separation" class="mw-redirect" title="Command-Query Separation">Command-Query Separation Principle</a>: Queries must not modify the instance. This is not a language rule but a methodological principle. So in good Eiffel style, one does not find "get" functions that change something and return a result; instead there are commands (procedures) to change objects, and queries to obtain information about the object, resulting from preceding changes.</li></ul> <div class="mw-heading mw-heading3"><h3 id="Overloading">Overloading</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=13" title="Edit section: Overloading"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Eiffel does not allow argument <a href="/wiki/Method_overloading" class="mw-redirect" title="Method overloading">overloading</a>. Each feature name within a class always maps to a specific feature within the class. One name, within one class, means one thing. This design choice helps the readability of classes, by avoiding a cause of ambiguity about which routine will be invoked by a call. It also simplifies the language mechanism; in particular, this is what makes Eiffel's multiple inheritance mechanism possible.<sup id="cite_ref-12" class="reference"><a href="#cite_note-12"><span class="cite-bracket">&#91;</span>12<span class="cite-bracket">&#93;</span></a></sup> </p><p>Names can, of course, be reused in different classes. For example, the feature <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886049734"><span class="monospaced">plus</span> (along with its infix <a href="#Operator_and_bracket_syntax,_assigner_commands">alias</a> <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886049734"><span class="monospaced">"+"</span>) is defined in several classes: <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886049734"><span class="monospaced">INTEGER</span>, <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886049734"><span class="monospaced">REAL</span>, <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886049734"><span class="monospaced">STRING</span>, etc. </p> <div class="mw-heading mw-heading3"><h3 id="Genericity">Genericity</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=14" title="Edit section: Genericity"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1236090951"><div role="note" class="hatnote navigation-not-searchable">See also: <a href="/wiki/Generic_programming#Genericity_in_Eiffel" title="Generic programming">Generic programming §&#160;Genericity in Eiffel</a></div> <p>A generic class is a class that varies by type (e.g. LIST [PHONE], a list of phone numbers; ACCOUNT [G-&gt;ACCOUNT_TYPE], allowing for ACCOUNT [SAVINGS] and ACCOUNT [CHECKING], etc.). Classes can be generic, to express that they are parameterized by types. Generic parameters appear in square brackets: </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="kr">class</span><span class="w"> </span><span class="nc">LIST</span><span class="w"> </span><span class="o">[</span><span class="nc">G</span><span class="o">]</span><span class="w"> </span><span class="p">...</span> </pre></div> <p>G is known as a "formal generic parameter". (Eiffel reserves "argument" for routines, and uses "parameter" only for generic classes.) With such a declaration G represents within the class an arbitrary type; so a function can return a value of type G, and a routine can take an argument of that type: </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="n">item</span><span class="p">:</span><span class="w"> </span><span class="nc">G</span><span class="w"> </span><span class="kr">do</span><span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="kr">end</span> <span class="n">put</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="p">:</span><span class="w"> </span><span class="nc">G</span><span class="p">)</span><span class="w"> </span><span class="kr">do</span><span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="kr">end</span> </pre></div> <p>The <code>LIST [INTEGER]</code> and <code>LIST [WORD]</code> are "generic derivations" of this class. Permitted combinations (with <code>n: INTEGER</code>, <code>w: WORD</code>, <code>il: LIST [INTEGER]</code>, <code>wl: LIST [WORD]</code>) are: </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">il</span><span class="p">.</span><span class="n">item</span> <span class="n">wl</span><span class="p">.</span><span class="n">put</span><span class="w"> </span><span class="p">(</span><span class="n">w</span><span class="p">)</span> </pre></div> <p><code>INTEGER</code> and <code>WORD</code> are the "actual generic parameters" in these generic derivations. </p><p>It is also possible to have 'constrained' formal parameters, for which the actual parameter must inherit from a given class, the "constraint". For example, in </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="kr">class</span><span class="w"> </span><span class="nc">HASH_TABLE</span><span class="w"> </span><span class="o">[</span><span class="nc">G</span><span class="p">,</span><span class="w"> </span><span class="nc">KEY</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nc">HASHABLE</span><span class="o">]</span> </pre></div> <p>a derivation <code>HASH_TABLE [INTEGER, STRING]</code> is valid only if <code>STRING</code> inherits from <code>HASHABLE</code> (as it indeed does in typical Eiffel libraries). Within the class, having <code>KEY</code> constrained by <code>HASHABLE</code> means that for <code>x: KEY</code> it is possible to apply to <code>x</code> all the features of <code>HASHABLE</code>, as in <code>x.hash_code</code>. </p> <div class="mw-heading mw-heading3"><h3 id="Inheritance_basics">Inheritance basics</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=15" title="Edit section: Inheritance basics"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>To inherit from one or more others, a class will include an <code>inherit</code> clause at the beginning: </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="kr">class</span><span class="w"> </span><span class="nc">C</span><span class="w"> </span><span class="kr">inherit</span> <span class="w"> </span><span class="nc">A</span> <span class="w"> </span><span class="nc">B</span> <span class="c1">-- ... Rest of class declaration ...</span> </pre></div> <p>The class may redefine (override) some or all of the inherited features. This must be explicitly announced at the beginning of the class through a <code>redefine</code> subclause of the inheritance clause, as in </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="kr">class</span><span class="w"> </span><span class="nc">C</span><span class="w"> </span><span class="kr">inherit</span> <span class="w"> </span><span class="nc">A</span> <span class="w"> </span><span class="kr">redefine</span><span class="w"> </span><span class="n">f</span><span class="p">,</span><span class="w"> </span><span class="n">g</span><span class="p">,</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="kr">end</span> <span class="w"> </span><span class="nc">B</span> <span class="w"> </span><span class="kr">redefine</span><span class="w"> </span><span class="n">u</span><span class="p">,</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="kr">end</span> </pre></div> <p>See<sup id="cite_ref-13" class="reference"><a href="#cite_note-13"><span class="cite-bracket">&#91;</span>13<span class="cite-bracket">&#93;</span></a></sup> for a complete discussion of Eiffel inheritance. </p> <div class="mw-heading mw-heading3"><h3 id="Deferred_classes_and_features">Deferred classes and features</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=16" title="Edit section: Deferred classes and features"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Classes may be defined with <code>deferred class</code> rather than with <code>class</code> to indicate that the class may not be directly instantiated. Non-instantiatable classes are called <a href="/wiki/Abstract_class" class="mw-redirect" title="Abstract class">abstract classes</a> in some other object-oriented programming languages. In Eiffel parlance, only an "effective" class can be instantiated (it may be a descendant of a deferred class). A feature can also be deferred by using the <code>deferred</code> keyword in place of a <code>do</code> clause. If a class has any deferred features it must be declared as deferred; however, a class with no deferred features may nonetheless itself be deferred. </p><p>Deferred classes play some of the same role as <a href="/wiki/Interface_(object-oriented_programming)" title="Interface (object-oriented programming)">interfaces</a> in languages such as Java, though many object-oriented programming theorists believe interfaces are themselves largely an answer to Java's lack of multiple inheritance (which Eiffel has).<sup id="cite_ref-14" class="reference"><a href="#cite_note-14"><span class="cite-bracket">&#91;</span>14<span class="cite-bracket">&#93;</span></a></sup><sup id="cite_ref-15" class="reference"><a href="#cite_note-15"><span class="cite-bracket">&#91;</span>15<span class="cite-bracket">&#93;</span></a></sup> </p> <div class="mw-heading mw-heading3"><h3 id="Renaming">Renaming</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=17" title="Edit section: Renaming"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>A class that inherits from one or more others gets all its features, by default under their original names. It may, however, change their names through <code>rename</code> clauses. This is required in the case of multiple inheritance if there are name clashes between inherited features; without renaming, the resulting class would violate the no-overloading principle noted above and hence would be invalid. </p> <div class="mw-heading mw-heading3"><h3 id="Tuples">Tuples</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=18" title="Edit section: Tuples"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Tuples types may be viewed as a simple form of class, providing only attributes and the corresponding "setter" procedure. A typical tuple type reads </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="nc">TUPLE</span><span class="w"> </span><span class="o">[</span><span class="n">name</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">;</span><span class="w"> </span><span class="n">weight</span><span class="p">:</span><span class="w"> </span><span class="nc">REAL</span><span class="p">;</span><span class="w"> </span><span class="n">date</span><span class="p">:</span><span class="w"> </span><span class="nc">DATE</span><span class="o">]</span> </pre></div> <p>and could be used to describe a simple notion of birth record if a class is not needed. An instance of such a tuple is simply a sequence of values with the given types, given in brackets, such as </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="o">[</span><span class="s">&quot;Brigitte&quot;</span><span class="p">,</span><span class="w"> </span><span class="mf">3.5</span><span class="p">,</span><span class="w"> </span><span class="n">Last_night</span><span class="o">]</span> </pre></div> <p>Components of such a tuple can be accessed as if the tuple tags were attributes of a class, for example if <code>t</code> has been assigned the above tuple then <code>t.weight</code> has value 3.5. </p><p>Thanks to the notion of assigner command (see below), dot notation can also be used to assign components of such a tuple, as in </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="n">t</span><span class="p">.</span><span class="n">weight</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">t</span><span class="p">.</span><span class="n">weight</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mf">0.5</span> </pre></div> <p>The tuple tags are optional, so that it is also possible to write a tuple type as <code>TUPLE [STRING, REAL, DATE]</code>. (In some compilers this is the only form of tuple, as tags were introduced with the ECMA standard.) </p><p>The precise specification of e.g. <code>TUPLE [A, B, C]</code> is that it describes sequences of <i>at least</i> three elements, the first three being of types <code>A</code>, <code>B</code>, <code>C</code> respectively. As a result, <code>TUPLE [A, B, C]</code> conforms to (may be assigned to) <code>TUPLE [A, B]</code>, to <code>TUPLE [A]</code> and to <code>TUPLE</code> (without parameters), the topmost tuple type to which all tuple types conform. </p> <div class="mw-heading mw-heading3"><h3 id="Agents">Agents</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=19" title="Edit section: Agents"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Eiffel's "agent" mechanism wraps operations into objects. This mechanism can be used for iteration, <a href="/wiki/Event-driven_programming" title="Event-driven programming">event-driven programming</a>, and other contexts in which it is useful to pass operations around the program structure. Other programming languages, especially ones that emphasize <a href="/wiki/Functional_programming" title="Functional programming">functional programming</a>, allow a similar pattern using <a href="/wiki/Continuations" class="mw-redirect" title="Continuations">continuations</a>, <a href="/wiki/Closure_(computer_science)" class="mw-redirect" title="Closure (computer science)">closures</a>, or <a href="/wiki/Generator_(computer_science)" class="mw-redirect" title="Generator (computer science)">generators</a>; Eiffel's agents emphasize the language's object-oriented paradigm, and use a syntax and semantics similar to code blocks in <a href="/wiki/Smalltalk" title="Smalltalk">Smalltalk</a> and <a href="/wiki/Ruby_(programming_language)" title="Ruby (programming language)">Ruby</a>. </p><p>For example, to execute the <code>my_action</code> block for each element of <code>my_list</code>, one would write: </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="n">my_list</span><span class="p">.</span><span class="n">do_all</span><span class="w"> </span><span class="p">(</span><span class="kr">agent</span><span class="w"> </span><span class="n">my_action</span><span class="p">)</span> </pre></div> <p>To execute <code>my_action</code> only on elements satisfying <code>my_condition</code>, a limitation/filter can be added: </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="n">my_list</span><span class="p">.</span><span class="n">do_if</span><span class="w"> </span><span class="p">(</span><span class="kr">agent</span><span class="w"> </span><span class="n">my_action</span><span class="p">,</span><span class="w"> </span><span class="kr">agent</span><span class="w"> </span><span class="n">my_condition</span><span class="p">)</span> </pre></div> <p>In these examples, <code>my_action</code> and <code>my_condition</code> are routines. Prefixing them with <code>agent</code> yields an object that represents the corresponding routine with all its properties, in particular the ability to be called with the appropriate arguments. So if <code>a</code> represents that object (for example because <code>a</code> is the argument to <code>do_all</code>), the instruction </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">call</span><span class="w"> </span><span class="p">(</span><span class="o">[</span><span class="n">x</span><span class="o">]</span><span class="p">)</span> </pre></div> <p>will call the original routine with the argument <code>x</code>, as if we had directly called the original routine: <code>my_action (x)</code>. Arguments to <code>call</code> are passed as a tuple, here <code>[x]</code>. </p><p>It is possible to keep some arguments to an agent <b>open</b> and make others <b>closed</b>. The open arguments are passed as arguments to <code>call</code>: they are provided at the time of <i>agent use</i>. The closed arguments are provided at the time of agent <i>definition</i>. For example, if <code>action2</code> has two arguments, the iteration </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="n">my_list</span><span class="p">.</span><span class="n">do_all</span><span class="w"> </span><span class="p">(</span><span class="kr">agent</span><span class="w"> </span><span class="n">action2</span><span class="w"> </span><span class="p">(</span><span class="o">?</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">))</span> </pre></div> <p>iterates <code>action2 (x, y)</code> for successive values of <code>x</code>, where the second argument remains set to <code>y</code>. The question mark <code>?</code> indicates an open argument; <code>y</code> is a closed argument of the agent. Note that the basic syntax <code>agent f</code> is a shorthand for <code>agent f (?,&#160;?, ...)</code> with all arguments open. It is also possible to make the <i>target</i> of an agent open through the notation <code>{T}?</code> where <code>T</code> is the type of the target. </p><p>The distinction between open and closed operands (operands = arguments + target) corresponds to the distinction between bound and free variables in <a href="/wiki/Lambda_calculus" title="Lambda calculus">lambda calculus</a>. An agent expression such as <code>action2 (?, y)</code> with some operands closed and some open corresponds to a version of the original operation <i><a href="/wiki/Currying" title="Currying">curried</a></i> on the closed operands. </p><p>The agent mechanism also allows defining an agent without reference to an existing routine (such as <code>my_action</code>, <code>my_condition</code>, <code>action2</code>), through inline agents as in </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="n">my_list</span><span class="p">.</span><span class="n">do_all</span><span class="w"> </span><span class="p">(</span><span class="kr">agent</span><span class="w"> </span><span class="p">(</span><span class="n">s</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">)</span> <span class="w"> </span><span class="kr">require</span> <span class="w"> </span><span class="n">not_void</span><span class="p">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">/=</span><span class="w"> </span><span class="kc">Void</span> <span class="w"> </span><span class="kr">do</span> <span class="w"> </span><span class="n">s</span><span class="p">.</span><span class="n">append_character</span><span class="w"> </span><span class="p">(</span><span class="sc">&#39;,&#39;</span><span class="p">)</span> <span class="w"> </span><span class="kr">ensure</span> <span class="w"> </span><span class="n">appended</span><span class="p">:</span><span class="w"> </span><span class="n">s</span><span class="p">.</span><span class="n">count</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kr">old</span><span class="w"> </span><span class="n">s</span><span class="p">.</span><span class="n">count</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span> <span class="w"> </span><span class="kr">end</span><span class="p">)</span> </pre></div> <p>The inline agent passed here can have all the trappings of a normal routine, including precondition, postcondition, rescue clause (not used here), and a full signature. This avoids defining routines when all that's needed is a computation to be wrapped in an agent. This is useful in particular for contracts, as in an invariant clause that expresses that all elements of a list are positive: </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="n">my_list</span><span class="p">.</span><span class="n">for_all</span><span class="w"> </span><span class="p">(</span><span class="kr">agent</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="p">:</span><span class="w"> </span><span class="nc">INTEGER</span><span class="p">):</span><span class="w"> </span><span class="nc">BOOLEAN</span><span class="w"> </span><span class="kr">do</span><span class="w"> </span><span class="kc">Result</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="kr">end</span><span class="p">)</span> </pre></div> <p>The current agent mechanism leaves a possibility of run-time type error (if a routine with <i>n</i> arguments is passed to an agent expecting <i>m</i> arguments with <i>m</i> &lt; <i>n</i>). This can be avoided by a run-time check through the precondition <code>valid_arguments</code> of <code>call</code>. Several proposals for a purely static correction of this problem are available, including a language change proposal by Ribet et al.<sup id="cite_ref-16" class="reference"><a href="#cite_note-16"><span class="cite-bracket">&#91;</span>16<span class="cite-bracket">&#93;</span></a></sup> </p> <div class="mw-heading mw-heading3"><h3 id="Once_routines">Once routines</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=20" title="Edit section: Once routines"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>A routine's result can be cached using the <code>once</code> keyword in place of <code>do</code>. Non-first calls to a routine require no additional computation or resource allocation, but simply return a previously computed result. A common pattern for "once functions" is to provide shared objects; the first call will create the object, subsequent ones will return the reference to that object. The typical scheme is: </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="n">shared_object</span><span class="p">:</span><span class="w"> </span><span class="nc">SOME_TYPE</span> <span class="w"> </span><span class="kr">once</span> <span class="w"> </span><span class="kr">create</span><span class="w"> </span><span class="kc">Result</span><span class="p">.</span><span class="n">make</span><span class="w"> </span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="w"> </span><span class="c1">-- This creates the object and returns a reference to it through `Result&#39;.</span> <span class="w"> </span><span class="kr">end</span> </pre></div> <p>The returned object—<code>Result</code> in the example—can itself be mutable, but its reference remains the same. </p><p>Often "once routines" perform a required initialization: multiple calls to a library can include a call to the initialization procedure, but only the first such call will perform the required actions. Using this pattern initialization can be decentralized, avoiding the need for a special initialization module. "Once routines" are similar in purpose and effect to the <a href="/wiki/Singleton_pattern" title="Singleton pattern">singleton pattern</a> in many programming languages, and to the <a href="https://en.wikibooks.org/wiki/Computer_Science_Design_Patterns/Singleton#Python" class="extiw" title="b:Computer Science Design Patterns/Singleton">Borg pattern</a> used in Python. </p><p>By default, a "once routine" is called <i>once per thread</i>. The semantics can be adjusted to <i>once per process</i> or <i>once per object</i> by qualifying it with a "once key", e.g. <code>once ("PROCESS")</code>. </p> <div class="mw-heading mw-heading3"><h3 id="Conversions">Conversions</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=21" title="Edit section: Conversions"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Eiffel provides a mechanism to allow conversions between various types. The mechanisms coexists with inheritance and complements it. To avoid any confusion between the two mechanisms, the design enforces the following principle: </p> <dl><dd><b>(Conversion principle) A type may not both conform and convert to another.</b></dd></dl> <p>For example, <code>NEWSPAPER</code> may conform to <code>PUBLICATION</code>, but <code>INTEGER</code> converts to <code>REAL</code> (and does not inherit from it). </p><p>The conversion mechanism simply generalizes the ad hoc conversion rules (such as indeed between <code>INTEGER</code> and <code>REAL</code>) that exist in most programming languages, making them applicable to any type as long as the above principle is observed. For example, a <code>DATE</code> class may be declared to convert to <code>STRING</code>; this makes it possible to create a string from a date simply through </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="n">my_string</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">my_date</span> </pre></div> <p>as a shortcut for using an explicit object creation with a conversion procedure: </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="kr">create</span><span class="w"> </span><span class="n">my_string</span><span class="p">.</span><span class="n">make_from_date</span><span class="w"> </span><span class="p">(</span><span class="n">my_date</span><span class="p">)</span> </pre></div> <p>To make the first form possible as a synonym for the second, it suffices to list the creation procedure (constructor) <code>make_from_date</code> in a <code>convert</code> clause at the beginning of the class. </p><p>As another example, if there is such a conversion procedure listed from <code>TUPLE [day: INTEGER; month: STRING; year: INTEGER]</code>, then one can directly assign a tuple to a date, causing the appropriate conversion, as in </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="n">Bastille_day</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">[</span><span class="mi">14</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;July&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">1789</span><span class="o">]</span> </pre></div> <div class="mw-heading mw-heading3"><h3 id="Exception_handling">Exception handling</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=22" title="Edit section: Exception handling"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p><a href="/wiki/Exception_handling" title="Exception handling">Exception handling</a> in Eiffel is based on the principles of design by contract. For example, an exception occurs when a routine's caller fails to satisfy a precondition, or when a routine cannot ensure a promised postcondition. In Eiffel, exception handling is not used for <a href="/wiki/Control_flow" title="Control flow">control flow</a> or to correct data-input mistakes. </p><p>An Eiffel exception handler is defined using the <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886049734"><span class="monospaced">rescue</span> keyword. Within the <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886049734"><span class="monospaced">rescue</span> section, the <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886049734"><span class="monospaced">retry</span> keyword executes the routine again. For example, the following routine tracks the number of attempts at executing the routine, and only retries a certain number of times: </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="n">connect_to_server</span><span class="w"> </span><span class="p">(</span><span class="n">server</span><span class="p">:</span><span class="w"> </span><span class="nc">SOCKET</span><span class="p">)</span> <span class="w"> </span><span class="c1">-- Connect to a server or give up after 10 attempts.</span> <span class="w"> </span><span class="kr">require</span> <span class="w"> </span><span class="n">server</span><span class="w"> </span><span class="o">/=</span><span class="w"> </span><span class="kc">Void</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="ow">then</span><span class="w"> </span><span class="n">server</span><span class="p">.</span><span class="n">address</span><span class="w"> </span><span class="o">/=</span><span class="w"> </span><span class="kc">Void</span> <span class="w"> </span><span class="kr">local</span> <span class="w"> </span><span class="n">attempts</span><span class="p">:</span><span class="w"> </span><span class="nc">INTEGER</span> <span class="w"> </span><span class="kr">do</span> <span class="w"> </span><span class="n">server</span><span class="p">.</span><span class="n">connect</span> <span class="w"> </span><span class="kr">ensure</span> <span class="w"> </span><span class="n">connected</span><span class="p">:</span><span class="w"> </span><span class="n">server</span><span class="p">.</span><span class="n">is_connected</span> <span class="w"> </span><span class="kr">rescue</span> <span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="n">attempts</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="kr">then</span> <span class="w"> </span><span class="n">attempts</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">attempts</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span> <span class="w"> </span><span class="kr">retry</span> <span class="w"> </span><span class="kr">end</span> <span class="w"> </span><span class="kr">end</span> </pre></div> <p>This example is arguably flawed for anything but the simplest programs, however, because connection failure is to be expected. For most programs a routine name like <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886049734"><span class="monospaced">attempt_connecting_to_server</span> would be better, and the postcondition would not promise a connection, leaving it up to the caller to take appropriate steps if the connection was not opened. </p> <div class="mw-heading mw-heading3"><h3 id="Concurrency">Concurrency</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=23" title="Edit section: Concurrency"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>A number of networking and threading libraries are available, such as EiffelNet and EiffelThreads. A concurrency model for Eiffel, based on the concepts of design by contract, is <a href="/wiki/SCOOP_(software)" title="SCOOP (software)">SCOOP</a>, or <i>Simple Concurrent Object-Oriented Programming</i>, not yet part of the official language definition but available in <a href="/wiki/EiffelStudio" title="EiffelStudio">EiffelStudio</a>. CAMEO<sup id="cite_ref-17" class="reference"><a href="#cite_note-17"><span class="cite-bracket">&#91;</span>17<span class="cite-bracket">&#93;</span></a></sup> is an (unimplemented) variation of SCOOP for Eiffel. Concurrency also interacts with exceptions. Asynchronous exceptions can be troublesome (where a routine raises an exception after its caller has itself finished).<sup id="cite_ref-18" class="reference"><a href="#cite_note-18"><span class="cite-bracket">&#91;</span>18<span class="cite-bracket">&#93;</span></a></sup> </p> <div class="mw-heading mw-heading3"><h3 id="Operator_and_bracket_syntax,_assigner_commands"><span id="Operator_and_bracket_syntax.2C_assigner_commands"></span>Operator and bracket syntax, assigner commands</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=24" title="Edit section: Operator and bracket syntax, assigner commands"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Eiffel's view of computation is completely object-oriented in the sense that every operation is relative to an object, the "target". So for example an addition such as </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="n">a</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">b</span> </pre></div> <p>is conceptually understood as if it were the method call </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="n">a</span><span class="p">.</span><span class="n">plus</span><span class="w"> </span><span class="p">(</span><span class="n">b</span><span class="p">)</span> </pre></div> <p>with target <code>a</code>, feature <code>plus</code> and argument <code>b</code>. </p><p>Of course, the former is the conventional syntax and usually preferred. Operator syntax makes it possible to use either form by declaring the feature (for example in <code>INTEGER</code>, but this applies to other basic classes and can be used in any other for which such an operator is appropriate): </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="n">plus</span><span class="w"> </span><span class="kr">alias</span><span class="w"> </span><span class="s">&quot;+&quot;</span><span class="w"> </span><span class="p">(</span><span class="n">other</span><span class="p">:</span><span class="w"> </span><span class="nc">INTEGER</span><span class="p">):</span><span class="w"> </span><span class="nc">INTEGER</span> <span class="w"> </span><span class="c1">-- ... Normal function declaration...</span> <span class="w"> </span><span class="kr">end</span> </pre></div> <p>The range of operators that can be used as "alias" is quite broad; they include predefined operators such as "+" but also "free operators" made of non-alphanumeric symbols. This makes it possible to design special infix and prefix notations, for example in mathematics and physics applications. </p><p>Every class may in addition have <i>one</i> function aliased to "[]", the "bracket" operator, allowing the notation <code>a [i, ...]</code> as a synonym for <code>a.f (i, ...)</code> where <code>f</code> is the chosen function. This is particularly useful for container structures such as arrays, <a href="/wiki/Hash_table" title="Hash table">hash tables</a>, lists etc. For example, access to an element of a hash table with string keys can be written </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="n">number</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">phone_book</span><span class="w"> </span><span class="o">[</span><span class="s">&quot;JILL SMITH&quot;</span><span class="o">]</span> </pre></div> <p>"Assigner commands" are a companion mechanism designed in the same spirit of allowing well-established, convenient notation reinterpreted in the framework of object-oriented programming. Assigner commands allow assignment-like syntax to call "setter" procedures. An assignment proper can never be of the form <code>a.x&#160;:= v</code> as this violates information hiding; you have to go for a setter command (procedure). For example, the hash table class can have the function and the procedure </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="n">item</span><span class="w"> </span><span class="kr">alias</span><span class="w"> </span><span class="s">&quot;[]&quot;</span><span class="w"> </span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">):</span><span class="w"> </span><span class="nc">ELEMENT</span><span class="w"> </span><span class="o">[</span><span class="mi">3</span><span class="o">]</span> <span class="w"> </span><span class="c1">-- The element of key `key&#39;.</span> <span class="w"> </span><span class="c1">-- (&quot;Getter&quot; query)</span> <span class="w"> </span><span class="kr">do</span> <span class="w"> </span><span class="p">...</span> <span class="w"> </span><span class="kr">end</span> <span class="n">put</span><span class="w"> </span><span class="p">(</span><span class="n">e</span><span class="p">:</span><span class="w"> </span><span class="nc">ELEMENT</span><span class="p">;</span><span class="w"> </span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">)</span> <span class="w"> </span><span class="c1">-- Insert the element `e&#39;, associating it with the key `key&#39;.</span> <span class="w"> </span><span class="c1">-- (&quot;Setter&quot; command)</span> <span class="w"> </span><span class="kr">do</span> <span class="w"> </span><span class="p">...</span> <span class="w"> </span><span class="kr">end</span> </pre></div> <p>Then to insert an element you have to use an explicit call to the setter command: </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="o">[</span><span class="mi">4</span><span class="o">]</span><span class="w"> </span><span class="n">phone_book</span><span class="p">.</span><span class="n">put</span><span class="w"> </span><span class="p">(</span><span class="n">New_person</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;JILL SMITH&quot;</span><span class="p">)</span> </pre></div> <p>It is possible to write this equivalently as </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="o">[</span><span class="mi">5</span><span class="o">]</span><span class="w"> </span><span class="n">phone_book</span><span class="w"> </span><span class="o">[</span><span class="s">&quot;JILL SMITH&quot;</span><span class="o">]</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">New_person</span> </pre></div> <p>(in the same way that <code>phone_book ["JILL SMITH"]</code> is a synonym for <code>number&#160;:= phone_book.item ("JILL SMITH")</code>), provided the declaration of <code>item</code> now starts (replacement for [3]) with </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="n">item</span><span class="w"> </span><span class="kr">alias</span><span class="w"> </span><span class="s">&quot;[]&quot;</span><span class="w"> </span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">):</span><span class="w"> </span><span class="nc">ELEMENT</span><span class="w"> </span><span class="kr">assign</span><span class="w"> </span><span class="n">put</span> </pre></div> <p>This declares <code>put</code> as the assigner command associated with <code>item</code> and, combined with the bracket alias, makes [5] legal and equivalent to [4]. (It could also be written, without taking advantage of the bracket, as <code>phone_book.item ("JILL SMITH")&#160;:= New_person</code>. </p><p>Note: The argument list of a's assigner is constrained to be: (a's return type;all of a's argument list...) </p> <div class="mw-heading mw-heading3"><h3 id="Lexical_and_syntax_properties">Lexical and syntax properties</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=25" title="Edit section: Lexical and syntax properties"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Eiffel is not case-sensitive. The tokens <code>make</code>, <code>maKe</code> and <code>MAKE</code> all denote the same identifier. See, however, the "style rules" below. </p><p>Comments are introduced by <code>--</code> (two consecutive dashes) and extend to the end of the line. </p><p>The semicolon, as instruction separator, is optional. Most of the time the semicolon is just omitted, except to separate multiple instructions on a line. This results in less clutter on the program page. </p><p>There is no nesting of feature and class declarations. As a result, the structure of an Eiffel class is simple: some class-level clauses (inheritance, invariant) and a succession of feature declarations, all at the same level. </p><p>It is customary to group features into separate "feature clauses" for more readability, with a standard set of basic feature tags appearing in a standard order, for example: </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="kr">class</span><span class="w"> </span><span class="nc">HASH_TABLE</span><span class="w"> </span><span class="o">[</span><span class="nc">ELEMENT</span><span class="p">,</span><span class="w"> </span><span class="nc">KEY</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nc">HASHABLE</span><span class="o">]</span><span class="w"> </span><span class="kr">inherit</span><span class="w"> </span><span class="nc">TABLE</span><span class="w"> </span><span class="o">[</span><span class="nc">ELEMENT</span><span class="o">]</span> <span class="w"> </span><span class="kr">feature</span><span class="w"> </span><span class="c1">-- Initialization</span> <span class="w"> </span><span class="c1">-- ... Declarations of initialization commands (creation procedures/constructors) ...</span> <span class="w"> </span><span class="kr">feature</span><span class="w"> </span><span class="c1">-- Access</span> <span class="w"> </span><span class="c1">-- ... Declarations of non-Boolean queries on the object state, e.g. item ...</span> <span class="w"> </span><span class="kr">feature</span><span class="w"> </span><span class="c1">-- Status report</span> <span class="w"> </span><span class="c1">-- ... Declarations of Boolean queries on the object state, e.g. is_empty ...</span> <span class="w"> </span><span class="kr">feature</span><span class="w"> </span><span class="c1">-- Element change</span> <span class="w"> </span><span class="c1">-- ... Declarations of commands that change the structure, e.g. put ...</span> <span class="w"> </span><span class="c1">-- etc.</span> <span class="kr">end</span> </pre></div> <p>In contrast to most <a href="/wiki/Curly_bracket_programming_language" class="mw-redirect" title="Curly bracket programming language">curly bracket programming languages</a>, Eiffel makes a clear distinction between expressions and instructions. This is in line with the <a href="/wiki/Command-Query_Separation" class="mw-redirect" title="Command-Query Separation">Command-Query Separation</a> principle of the Eiffel method. </p> <div class="mw-heading mw-heading3"><h3 id="Style_conventions">Style conventions</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=26" title="Edit section: Style conventions"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Much of the documentation of Eiffel uses distinctive style conventions, designed to enforce a consistent look-and-feel. Some of these conventions apply to the code format itself, and others to the standard typographic rendering of Eiffel code in formats and publications where these conventions are possible. </p><p>While the language is case-insensitive, the style standards prescribe the use of all-capitals for class names (<code>LIST</code>), all-lower-case for feature names (<code>make</code>), and initial capitals for constants (<code>Avogadro</code>). The recommended style also suggests underscore to separate components of a multi-word identifier, as in <code>average_temperature</code>. </p><p>The specification of Eiffel includes guidelines for displaying software texts in typeset formats: keywords in bold, user-defined identifiers and constants are shown in <i><code>italics</code></i>, comments, operators, and punctuation marks in <code>Roman</code>, with program text in <code>blue</code> as in the present article to distinguish it from explanatory text. For example, the "Hello, world!" program given above would be rendered as below in Eiffel documentation: </p> <div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span></span><span class="kr">class</span> <span class="w"> </span><span class="nc">HELLO_WORLD</span> <span class="kr">create</span> <span class="w"> </span><span class="n">make</span> <span class="kr">feature</span> <span class="w"> </span><span class="n">make</span> <span class="w"> </span><span class="kr">do</span> <span class="w"> </span><span class="n">print</span><span class="w"> </span><span class="p">(</span><span class="s">&quot;Hello, world!&quot;</span><span class="p">)</span> <span class="w"> </span><span class="kr">end</span> <span class="kr">end</span> </pre></div> <div class="mw-heading mw-heading3"><h3 id="Interfaces_to_other_tools_and_languages">Interfaces to other tools and languages</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=27" title="Edit section: Interfaces to other tools and languages"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Eiffel is a purely object-oriented language but provides an <a href="/wiki/Open_architecture" title="Open architecture">open architecture</a> for interfacing with "external" software in any other programming language. </p><p>It is possible for example to program machine- and operating-system level operations in <a href="/wiki/C_(programming_language)" title="C (programming language)">C</a>. Eiffel provides a straightforward interface to C routines, including support for "inline C" (writing the body of an Eiffel routine in C, typically for short machine-level operations). </p><p>Although there is no direct connection between Eiffel and C, many Eiffel <a href="/wiki/Compiler" title="Compiler">compilers</a> (<a href="/wiki/Visual_Eiffel" title="Visual Eiffel">Visual Eiffel</a> is one exception) output C <a href="/wiki/Source_code" title="Source code">source code</a> as an <a href="/wiki/Intermediate_language" class="mw-redirect" title="Intermediate language">intermediate language</a>, to submit to a C compiler, for <a href="/wiki/Optimization_(computer_science)" class="mw-redirect" title="Optimization (computer science)">optimizing</a> and <a href="/wiki/Porting" title="Porting">portability</a>. As such, they are examples of <a href="/wiki/Transcompiler" class="mw-redirect" title="Transcompiler">transcompilers</a>. The Eiffel Compiler tecomp can execute Eiffel code directly (like an interpreter) without going via an intermediate C code or emit C code which will be passed to a C compiler in order to obtain optimized native code. On .NET, the <a href="/wiki/EiffelStudio" title="EiffelStudio">EiffelStudio</a> compiler directly generates <a href="/wiki/Common_Intermediate_Language" title="Common Intermediate Language">CIL</a> (Common Intermediate Language) code. The <a href="/wiki/SmartEiffel" title="SmartEiffel">SmartEiffel</a> compiler can also output <a href="/wiki/Java_bytecode" title="Java bytecode">Java bytecode</a>. </p> <div class="mw-heading mw-heading2"><h2 id="References">References</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=28" title="Edit section: References"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <style data-mw-deduplicate="TemplateStyles:r1239543626">.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}</style><div class="reflist"> <div class="mw-references-wrap mw-references-columns"><ol class="references"> <li id="cite_note-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://archive.eiffel.com/eiffel/nutshell.html">"Eiffel in a Nutshell"</a>. <i>archive.eiffel.com</i><span class="reference-accessdate">. Retrieved <span class="nowrap">24 August</span> 2017</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=unknown&amp;rft.jtitle=archive.eiffel.com&amp;rft.atitle=Eiffel+in+a+Nutshell&amp;rft_id=https%3A%2F%2Farchive.eiffel.com%2Feiffel%2Fnutshell.html&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AEiffel+%28programming+language%29" class="Z3988"></span></span> </li> <li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.eiffel.org/blog/eiffelstudio_24_05">"EiffelStudio 24.05 is available!"</a>. <i>Eiffel.org</i>. 14 June 2024.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=unknown&amp;rft.jtitle=Eiffel.org&amp;rft.atitle=EiffelStudio+24.05+is+available%21&amp;rft.date=2024-06-14&amp;rft_id=https%3A%2F%2Fwww.eiffel.org%2Fblog%2Feiffelstudio_24_05&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AEiffel+%28programming+language%29" class="Z3988"></span></span> </li> <li id="cite_note-nov2pro-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-nov2pro_3-0">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFCooper2009" class="citation book cs1">Cooper, Peter (2009). <i>Beginning Ruby: From Novice to Professional</i>. Beginning from Novice to Professional (2nd&#160;ed.). Berkeley: APress. p.&#160;101. <a href="/wiki/ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-1-4302-2363-4" title="Special:BookSources/978-1-4302-2363-4"><bdi>978-1-4302-2363-4</bdi></a>. <q>To a lesser extent, Python, LISP, Eiffel, Ada, and C++ have also influenced Ruby.</q></cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=book&amp;rft.btitle=Beginning+Ruby%3A+From+Novice+to+Professional&amp;rft.place=Berkeley&amp;rft.series=Beginning+from+Novice+to+Professional&amp;rft.pages=101&amp;rft.edition=2nd&amp;rft.pub=APress&amp;rft.date=2009&amp;rft.isbn=978-1-4302-2363-4&amp;rft.aulast=Cooper&amp;rft.aufirst=Peter&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AEiffel+%28programming+language%29" class="Z3988"></span></span> </li> <li id="cite_note-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-4">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.berenddeboer.net/eiffel/archive/halstenbach_eiffel_history.html">"Eiffel&#160;&#8211;&#32; the Language"</a>. <i>berenddeboer.net</i><span class="reference-accessdate">. Retrieved <span class="nowrap">6 July</span> 2016</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=unknown&amp;rft.jtitle=berenddeboer.net&amp;rft.atitle=Eiffel+%26ndash%3B%26%2332%3B+the+Language&amp;rft_id=http%3A%2F%2Fwww.berenddeboer.net%2Feiffel%2Farchive%2Fhalstenbach_eiffel_history.html&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AEiffel+%28programming+language%29" class="Z3988"></span></span> </li> <li id="cite_note-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-5">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFMeyer2009" class="citation book cs1">Meyer, Bertrand (2009-08-28). <a rel="nofollow" class="external text" href="https://books.google.com/books?id=6yupzA8JZjQC&amp;dq=Many+concepts+initially+introduced+by+Eiffel+later+found+their+way+into+Java,+C&amp;pg=PR37"><i>Touch of Class: Learning to Program Well with Objects and Contracts</i></a>. Springer Science &amp; Business Media. <a href="/wiki/ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-3-540-92144-8" title="Special:BookSources/978-3-540-92144-8"><bdi>978-3-540-92144-8</bdi></a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=book&amp;rft.btitle=Touch+of+Class%3A+Learning+to+Program+Well+with+Objects+and+Contracts&amp;rft.pub=Springer+Science+%26+Business+Media&amp;rft.date=2009-08-28&amp;rft.isbn=978-3-540-92144-8&amp;rft.aulast=Meyer&amp;rft.aufirst=Bertrand&amp;rft_id=https%3A%2F%2Fbooks.google.com%2Fbooks%3Fid%3D6yupzA8JZjQC%26dq%3DMany%2Bconcepts%2Binitially%2Bintroduced%2Bby%2BEiffel%2Blater%2Bfound%2Btheir%2Bway%2Binto%2BJava%2C%2BC%26pg%3DPR37&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AEiffel+%28programming+language%29" class="Z3988"></span></span> </li> <li id="cite_note-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-6">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://courses.cs.vt.edu/~cs3304/Spring02/lectures/lect12.pdf">"Programming Languages - Eiffel"</a> <span class="cs1-format">(PDF)</span>. <i>Department of Computer Science, Virginia Tech</i><span class="reference-accessdate">. Retrieved <span class="nowrap">25 March</span> 2023</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=unknown&amp;rft.jtitle=Department+of+Computer+Science%2C+Virginia+Tech&amp;rft.atitle=Programming+Languages+-+Eiffel&amp;rft_id=https%3A%2F%2Fcourses.cs.vt.edu%2F~cs3304%2FSpring02%2Flectures%2Flect12.pdf&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AEiffel+%28programming+language%29" class="Z3988"></span></span> </li> <li id="cite_note-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-7">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFCarl_Friess" class="citation web cs1">Carl Friess. <a rel="nofollow" class="external text" href="https://eiffel-guide.com/">"Eiffel Syntax Guide"</a>. <i>Eiffel Syntax Guide</i><span class="reference-accessdate">. Retrieved <span class="nowrap">25 March</span> 2023</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=unknown&amp;rft.jtitle=Eiffel+Syntax+Guide&amp;rft.atitle=Eiffel+Syntax+Guide&amp;rft.au=Carl+Friess&amp;rft_id=https%3A%2F%2Feiffel-guide.com%2F&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AEiffel+%28programming+language%29" class="Z3988"></span></span> </li> <li id="cite_note-Claus-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-Claus_8-0">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFClaus_Brabrand" class="citation web cs1">Claus Brabrand. <a rel="nofollow" class="external text" href="http://www.itu.dk/people/brabrand/GSD-2013/Eiffel.pdf">"The E I F F E L Programming Language"</a> <span class="cs1-format">(PDF)</span>. <i>IT University of Copenhagen</i><span class="reference-accessdate">. Retrieved <span class="nowrap">25 March</span> 2023</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=unknown&amp;rft.jtitle=IT+University+of+Copenhagen&amp;rft.atitle=The+E+I+F+F+E+L+Programming+Language&amp;rft.au=Claus+Brabrand&amp;rft_id=http%3A%2F%2Fwww.itu.dk%2Fpeople%2Fbrabrand%2FGSD-2013%2FEiffel.pdf&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AEiffel+%28programming+language%29" class="Z3988"></span></span> </li> <li id="cite_note-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-9">^</a></b></span> <span class="reference-text"><i>Object-Oriented Software Construction</i>, Second Edition, by <a href="/wiki/Bertrand_Meyer" title="Bertrand Meyer">Bertrand Meyer</a>, Prentice Hall, 1997, <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><a href="/wiki/ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&#160;<a href="/wiki/Special:BookSources/0-13-629155-4" title="Special:BookSources/0-13-629155-4">0-13-629155-4</a></span> </li> <li id="cite_note-10"><span class="mw-cite-backlink"><b><a href="#cite_ref-10">^</a></b></span> <span class="reference-text">ECMA International: Standard ECMA-367&#160;&#8211;&#32; Eiffel: Analysis, Design and Programming Language 2nd edition (June 2006); available online at <a rel="nofollow" class="external text" href="https://ecma-international.org/publications-and-standards/standards/ecma-367/">https://ecma-international.org/publications-and-standards/standards/ecma-367/</a></span> </li> <li id="cite_note-11"><span class="mw-cite-backlink"><b><a href="#cite_ref-11">^</a></b></span> <span class="reference-text">International Organization for Standardization: Standard ISO/IEC DIS 25436, available online at <a rel="nofollow" class="external autonumber" href="http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=42924&amp;ICS1=35&amp;ICS2=60&amp;ICS3=">[1]</a></span> </li> <li id="cite_note-12"><span class="mw-cite-backlink"><b><a href="#cite_ref-12">^</a></b></span> <span class="reference-text">Bertrand Meyer: Overloading vs Object Technology, in Journal of Object-Oriented Programming (JOOP), vol. 14, no. 4, October–November 2001, available <a rel="nofollow" class="external text" href="http://se.ethz.ch/~meyer/publications/joop/overloading.pdf">online</a></span> </li> <li id="cite_note-13"><span class="mw-cite-backlink"><b><a href="#cite_ref-13">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://archive.eiffel.com/doc/online/eiffel50/intro/language/tutorial-10.html">"9 INHERITANCE"</a>. Archive.eiffel.com. 1997-03-23<span class="reference-accessdate">. Retrieved <span class="nowrap">2013-07-08</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=unknown&amp;rft.btitle=9+INHERITANCE&amp;rft.pub=Archive.eiffel.com&amp;rft.date=1997-03-23&amp;rft_id=http%3A%2F%2Farchive.eiffel.com%2Fdoc%2Fonline%2Feiffel50%2Fintro%2Flanguage%2Ftutorial-10.html&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AEiffel+%28programming+language%29" class="Z3988"></span></span> </li> <li id="cite_note-14"><span class="mw-cite-backlink"><b><a href="#cite_ref-14">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.artima.com/intv/abcs.html">"Multiple Inheritance and Interfaces"</a>. Artima.com. 2002-12-16<span class="reference-accessdate">. Retrieved <span class="nowrap">2013-07-08</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=unknown&amp;rft.btitle=Multiple+Inheritance+and+Interfaces&amp;rft.pub=Artima.com&amp;rft.date=2002-12-16&amp;rft_id=http%3A%2F%2Fwww.artima.com%2Fintv%2Fabcs.html&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AEiffel+%28programming+language%29" class="Z3988"></span></span> </li> <li id="cite_note-15"><span class="mw-cite-backlink"><b><a href="#cite_ref-15">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://c2.com/cgi/wiki?MultipleInheritanceIsNotEvil">"Multiple Inheritance Is Not Evil"</a>. C2.com. 2007-04-28<span class="reference-accessdate">. Retrieved <span class="nowrap">2013-07-08</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=unknown&amp;rft.btitle=Multiple+Inheritance+Is+Not+Evil&amp;rft.pub=C2.com&amp;rft.date=2007-04-28&amp;rft_id=https%3A%2F%2Fc2.com%2Fcgi%2Fwiki%3FMultipleInheritanceIsNotEvil&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AEiffel+%28programming+language%29" class="Z3988"></span></span> </li> <li id="cite_note-16"><span class="mw-cite-backlink"><b><a href="#cite_ref-16">^</a></b></span> <span class="reference-text">Philippe Ribet, Cyril Adrian, Olivier Zendra, Dominique Colnet: <i>Conformance of agents in the Eiffel language</i>, in <i><a href="/wiki/JOT:_Journal_of_Object_Technology" class="mw-redirect" title="JOT: Journal of Object Technology">Journal of Object Technology</a></i>, vol. 3, no. 4, April 2004, Special issue: TOOLS USA 2003, pp. 125-143. Available on line from the <a rel="nofollow" class="external text" href="http://www.jot.fm/issues/issue_2004_04/article7">JOT article page</a></span> </li> <li id="cite_note-17"><span class="mw-cite-backlink"><b><a href="#cite_ref-17">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFBrookeRichard_Paige2008" class="citation journal cs1">Brooke, Phillip; Richard Paige (2008). <a rel="nofollow" class="external text" href="https://hal.archives-ouvertes.fr/hal-00534917/file/PEER_stage2_10.1007%252Fs00165-008-0096-1.pdf">"Cameo: An Alternative Model of Concurrency for Eiffel"</a> <span class="cs1-format">(PDF)</span>. <i>Formal Aspects of Computing</i>. <b>21</b> (4). Springer: 363–391. <a href="/wiki/Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1007%2Fs00165-008-0096-1">10.1007/s00165-008-0096-1</a>. <a href="/wiki/S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a>&#160;<a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:18336088">18336088</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=article&amp;rft.jtitle=Formal+Aspects+of+Computing&amp;rft.atitle=Cameo%3A+An+Alternative+Model+of+Concurrency+for+Eiffel&amp;rft.volume=21&amp;rft.issue=4&amp;rft.pages=363-391&amp;rft.date=2008&amp;rft_id=info%3Adoi%2F10.1007%2Fs00165-008-0096-1&amp;rft_id=https%3A%2F%2Fapi.semanticscholar.org%2FCorpusID%3A18336088%23id-name%3DS2CID&amp;rft.aulast=Brooke&amp;rft.aufirst=Phillip&amp;rft.au=Richard+Paige&amp;rft_id=https%3A%2F%2Fhal.archives-ouvertes.fr%2Fhal-00534917%2Ffile%2FPEER_stage2_10.1007%25252Fs00165-008-0096-1.pdf&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AEiffel+%28programming+language%29" class="Z3988"></span></span> </li> <li id="cite_note-18"><span class="mw-cite-backlink"><b><a href="#cite_ref-18">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFBrookeRichard_Paige2007" class="citation journal cs1">Brooke, Phillip; Richard Paige (2007). <a rel="nofollow" class="external text" href="http://www.jot.fm/issues/issue_2007_11/article4/">"Exceptions in Concurrent Eiffel"</a>. <i>Journal of Object Technology</i>. <b>6</b> (10): 111–126. <a href="/wiki/Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://doi.org/10.5381%2Fjot.2007.6.10.a4">10.5381/jot.2007.6.10.a4</a></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=article&amp;rft.jtitle=Journal+of+Object+Technology&amp;rft.atitle=Exceptions+in+Concurrent+Eiffel&amp;rft.volume=6&amp;rft.issue=10&amp;rft.pages=111-126&amp;rft.date=2007&amp;rft_id=info%3Adoi%2F10.5381%2Fjot.2007.6.10.a4&amp;rft.aulast=Brooke&amp;rft.aufirst=Phillip&amp;rft.au=Richard+Paige&amp;rft_id=http%3A%2F%2Fwww.jot.fm%2Fissues%2Fissue_2007_11%2Farticle4%2F&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AEiffel+%28programming+language%29" class="Z3988"></span></span> </li> </ol></div></div> <div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Eiffel_(programming_language)&amp;action=edit&amp;section=29" title="Edit section: External links"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li><a rel="nofollow" class="external text" href="http://www.eiffel.com/">Eiffel Software</a> web site of the company that introduced Eiffel, was Interactive Software Engineering (ISE).</li> <li><a rel="nofollow" class="external text" href="https://www.liberty-eiffel.org/">LibertyEiffel</a> web site of the free GNU Eiffel development system.</li></ul> <div class="navbox-styles"><style data-mw-deduplicate="TemplateStyles:r1129693374">.mw-parser-output .hlist dl,.mw-parser-output .hlist ol,.mw-parser-output .hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li{display:none}.mw-parser-output .hlist dt::after{content:": "}.mw-parser-output .hlist dd::after,.mw-parser-output .hlist li::after{content:" · ";font-weight:bold}.mw-parser-output .hlist dd:last-child::after,.mw-parser-output .hlist dt:last-child::after,.mw-parser-output .hlist li:last-child::after{content:none}.mw-parser-output .hlist dd dd:first-child::before,.mw-parser-output .hlist dd dt:first-child::before,.mw-parser-output .hlist dd li:first-child::before,.mw-parser-output .hlist dt dd:first-child::before,.mw-parser-output .hlist dt dt:first-child::before,.mw-parser-output .hlist dt li:first-child::before,.mw-parser-output .hlist li dd:first-child::before,.mw-parser-output .hlist li dt:first-child::before,.mw-parser-output .hlist li li:first-child::before{content:" (";font-weight:normal}.mw-parser-output .hlist dd dd:last-child::after,.mw-parser-output .hlist dd dt:last-child::after,.mw-parser-output .hlist dd li:last-child::after,.mw-parser-output .hlist dt dd:last-child::after,.mw-parser-output .hlist dt dt:last-child::after,.mw-parser-output .hlist dt li:last-child::after,.mw-parser-output .hlist li dd:last-child::after,.mw-parser-output .hlist li dt:last-child::after,.mw-parser-output .hlist li li:last-child::after{content:")";font-weight:normal}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li::before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child::before,.mw-parser-output .hlist dt ol>li:first-child::before,.mw-parser-output .hlist li ol>li:first-child::before{content:" ("counter(listitem)"\a0 "}</style><style data-mw-deduplicate="TemplateStyles:r1236075235">.mw-parser-output .navbox{box-sizing:border-box;border:1px solid #a2a9b1;width:100%;clear:both;font-size:88%;text-align:center;padding:1px;margin:1em auto 0}.mw-parser-output .navbox .navbox{margin-top:0}.mw-parser-output .navbox+.navbox,.mw-parser-output .navbox+.navbox-styles+.navbox{margin-top:-1px}.mw-parser-output .navbox-inner,.mw-parser-output .navbox-subgroup{width:100%}.mw-parser-output .navbox-group,.mw-parser-output .navbox-title,.mw-parser-output .navbox-abovebelow{padding:0.25em 1em;line-height:1.5em;text-align:center}.mw-parser-output .navbox-group{white-space:nowrap;text-align:right}.mw-parser-output .navbox,.mw-parser-output .navbox-subgroup{background-color:#fdfdfd}.mw-parser-output .navbox-list{line-height:1.5em;border-color:#fdfdfd}.mw-parser-output .navbox-list-with-group{text-align:left;border-left-width:2px;border-left-style:solid}.mw-parser-output tr+tr>.navbox-abovebelow,.mw-parser-output tr+tr>.navbox-group,.mw-parser-output tr+tr>.navbox-image,.mw-parser-output tr+tr>.navbox-list{border-top:2px solid #fdfdfd}.mw-parser-output .navbox-title{background-color:#ccf}.mw-parser-output .navbox-abovebelow,.mw-parser-output .navbox-group,.mw-parser-output .navbox-subgroup .navbox-title{background-color:#ddf}.mw-parser-output .navbox-subgroup .navbox-group,.mw-parser-output .navbox-subgroup .navbox-abovebelow{background-color:#e6e6ff}.mw-parser-output .navbox-even{background-color:#f7f7f7}.mw-parser-output .navbox-odd{background-color:transparent}.mw-parser-output .navbox .hlist td dl,.mw-parser-output .navbox .hlist td ol,.mw-parser-output .navbox .hlist td ul,.mw-parser-output .navbox td.hlist dl,.mw-parser-output .navbox td.hlist ol,.mw-parser-output .navbox td.hlist ul{padding:0.125em 0}.mw-parser-output .navbox .navbar{display:block;font-size:100%}.mw-parser-output .navbox-title .navbar{float:left;text-align:left;margin-right:0.5em}body.skin--responsive .mw-parser-output .navbox-image img{max-width:none!important}@media print{body.ns-0 .mw-parser-output .navbox{display:none!important}}</style></div><div role="navigation" class="navbox" aria-labelledby="Standards_of_Ecma_International" style="padding:3px"><table class="nowraplinks mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="3"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1129693374"><style data-mw-deduplicate="TemplateStyles:r1239400231">.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:left;text-align:left}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-right:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-left:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar a>span,.mw-parser-output .navbar a>abbr{text-decoration:inherit}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}html.skin-theme-clientpref-night .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}}@media print{.mw-parser-output .navbar{display:none!important}}</style><div class="navbar plainlinks hlist navbar-mini"><ul><li class="nv-view"><a href="/wiki/Template:Ecma_International_Standards" title="Template:Ecma International Standards"><abbr title="View this template">v</abbr></a></li><li class="nv-talk"><a href="/wiki/Template_talk:Ecma_International_Standards" title="Template talk:Ecma International Standards"><abbr title="Discuss this template">t</abbr></a></li><li class="nv-edit"><a href="/wiki/Special:EditPage/Template:Ecma_International_Standards" title="Special:EditPage/Template:Ecma International Standards"><abbr title="Edit this template">e</abbr></a></li></ul></div><div id="Standards_of_Ecma_International" style="font-size:114%;margin:0 4em">Standards of <a href="/wiki/Ecma_International" title="Ecma International">Ecma International</a></div></th></tr><tr><th scope="row" class="navbox-group" style="width:1%">Application interfaces</th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/ANSI_escape_code" title="ANSI escape code">ANSI escape code</a></li> <li><a href="/wiki/Application_Programming_Interface_for_Windows" title="Application Programming Interface for Windows">APIW</a></li> <li><a href="/wiki/Common_Language_Infrastructure" title="Common Language Infrastructure">Common Language Infrastructure</a></li> <li><a href="/wiki/Office_Open_XML" title="Office Open XML">Office Open XML</a></li> <li><a href="/wiki/Open_XML_Paper_Specification" title="Open XML Paper Specification">OpenXPS</a></li></ul> </div></td><td class="noviewer navbox-image" rowspan="7" style="width:1px;padding:0 0 0 2px"><div><span typeof="mw:File"><a href="/wiki/File:Ecma_International_Logo.svg" class="mw-file-description"><img src="//upload.wikimedia.org/wikipedia/commons/thumb/0/04/Ecma_International_Logo.svg/100px-Ecma_International_Logo.svg.png" decoding="async" width="100" height="27" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/0/04/Ecma_International_Logo.svg/150px-Ecma_International_Logo.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/0/04/Ecma_International_Logo.svg/200px-Ecma_International_Logo.svg.png 2x" data-file-width="201" data-file-height="54" /></a></span></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">File systems (tape)</th><td class="navbox-list-with-group navbox-list navbox-even hlist" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Advanced_Intelligent_Tape" title="Advanced Intelligent Tape">Advanced Intelligent Tape</a></li> <li><a href="/wiki/Digital_Data_Storage" title="Digital Data Storage">DDS</a></li> <li><a href="/wiki/Digital_Linear_Tape" title="Digital Linear Tape">DLT</a></li> <li><a href="/wiki/Digital_Linear_Tape" title="Digital Linear Tape">Super DLT</a></li> <li><a href="/wiki/Linear_Tape-Open" title="Linear Tape-Open">Linear Tape-Open</a> (Ultrium-1)</li> <li><a href="/wiki/VXA" title="VXA">VXA</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">File systems (disk)</th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/CD-ROM" title="CD-ROM">CD-ROM</a></li> <li><a href="/wiki/ISO_9660" title="ISO 9660">CD File System</a> (CDFS)</li> <li><a href="/wiki/File_Allocation_Table" title="File Allocation Table">FAT</a> <ul><li><a href="/wiki/FAT12" class="mw-redirect" title="FAT12">FAT12</a></li> <li><a href="/wiki/FAT16" class="mw-redirect" title="FAT16">FAT16</a></li> <li><a href="/wiki/FAT16B" class="mw-redirect" title="FAT16B">FAT16B</a></li></ul></li> <li><a href="/wiki/Floppy_disk" title="Floppy disk">FD</a></li> <li><a href="/wiki/Universal_Disk_Format" title="Universal Disk Format">UDF</a></li> <li><a href="/wiki/Ultra_Density_Optical" title="Ultra Density Optical">Ultra Density Optical</a></li> <li><a href="/wiki/Universal_Media_Disc" title="Universal Media Disc">Universal Media Disc</a></li> <li><a href="/wiki/Holographic_Versatile_Disc" title="Holographic Versatile Disc">Holographic Versatile Disc</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Graphics</th><td class="navbox-list-with-group navbox-list navbox-even hlist" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Universal_3D" title="Universal 3D">Universal 3D</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Programming languages</th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/C%2B%2B/CLI" title="C++/CLI">C++/CLI</a></li> <li><a href="/wiki/C_Sharp_(programming_language)" title="C Sharp (programming language)">C#</a></li> <li><a class="mw-selflink selflink">Eiffel</a></li> <li><a href="/wiki/JavaScript" title="JavaScript">JavaScript</a> (<a href="/wiki/ECMAScript_for_XML" title="ECMAScript for XML">E4X</a>, <a href="/wiki/ECMAScript" title="ECMAScript">ECMAScript</a>)</li> <li><a href="/wiki/Dart_(programming_language)" title="Dart (programming language)">Dart</a></li> <li><a href="/wiki/Minimal_BASIC" title="Minimal BASIC">Minimal BASIC</a></li> <li><a href="/wiki/Full_BASIC" title="Full BASIC">Full BASIC</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Radio link interfaces</th><td class="navbox-list-with-group navbox-list navbox-even hlist" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Near-field_communication" title="Near-field communication">NFC</a></li> <li><a href="/wiki/Ultra-wideband" title="Ultra-wideband">UWB</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Other</th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/ISO/IEC_2022" title="ISO/IEC 2022">ECMA-35</a></li> <li><a href="/wiki/JSON" title="JSON">JSON</a></li></ul> </div></td></tr><tr><td class="navbox-abovebelow" colspan="3"><div><a href="/wiki/List_of_Ecma_standards" title="List of Ecma standards">List of Ecma standards</a> (1961 – present)</div></td></tr></tbody></table></div> <div class="navbox-styles"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1129693374"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1236075235"></div><div role="navigation" class="navbox authority-control" aria-labelledby="Authority_control_databases_frameless&amp;#124;text-top&amp;#124;10px&amp;#124;alt=Edit_this_at_Wikidata&amp;#124;link=https&amp;#58;//www.wikidata.org/wiki/Q732089#identifiers&amp;#124;class=noprint&amp;#124;Edit_this_at_Wikidata" style="padding:3px"><table class="nowraplinks hlist mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="2"><div id="Authority_control_databases_frameless&amp;#124;text-top&amp;#124;10px&amp;#124;alt=Edit_this_at_Wikidata&amp;#124;link=https&amp;#58;//www.wikidata.org/wiki/Q732089#identifiers&amp;#124;class=noprint&amp;#124;Edit_this_at_Wikidata" style="font-size:114%;margin:0 4em"><a href="/wiki/Help:Authority_control" title="Help:Authority control">Authority control databases</a> <span class="mw-valign-text-top noprint" typeof="mw:File/Frameless"><a href="https://www.wikidata.org/wiki/Q732089#identifiers" title="Edit this at Wikidata"><img alt="Edit this at Wikidata" src="//upload.wikimedia.org/wikipedia/en/thumb/8/8a/OOjs_UI_icon_edit-ltr-progressive.svg/10px-OOjs_UI_icon_edit-ltr-progressive.svg.png" decoding="async" width="10" height="10" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/en/thumb/8/8a/OOjs_UI_icon_edit-ltr-progressive.svg/15px-OOjs_UI_icon_edit-ltr-progressive.svg.png 1.5x, //upload.wikimedia.org/wikipedia/en/thumb/8/8a/OOjs_UI_icon_edit-ltr-progressive.svg/20px-OOjs_UI_icon_edit-ltr-progressive.svg.png 2x" data-file-width="20" data-file-height="20" /></a></span></div></th></tr><tr><th scope="row" class="navbox-group" style="width:1%">International</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"><ul><li><span class="uid"><a rel="nofollow" class="external text" href="http://id.worldcat.org/fast/904024/">FAST</a></span></li></ul></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">National</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em"><ul><li><span class="uid"><a rel="nofollow" class="external text" href="https://d-nb.info/gnd/4280526-0">Germany</a></span></li><li><span class="uid"><a rel="nofollow" class="external text" href="https://id.loc.gov/authorities/sh91003967">United States</a></span></li><li><span class="uid"><a rel="nofollow" class="external text" href="https://catalogue.bnf.fr/ark:/12148/cb12366791q">France</a></span></li><li><span class="uid"><a rel="nofollow" class="external text" href="https://data.bnf.fr/ark:/12148/cb12366791q">BnF data</a></span></li><li><span class="uid"><a rel="nofollow" class="external text" href="http://olduli.nli.org.il/F/?func=find-b&amp;local_base=NLX10&amp;find_code=UID&amp;request=987007532216805171">Israel</a></span></li></ul></div></td></tr></tbody></table></div> <!-- NewPP limit report Parsed by mw‐web.codfw.main‐f69cdc8f6‐2ms4s Cached time: 20241122142959 Cache expiry: 2592000 Reduced expiry: false Complications: [vary‐revision‐sha1, show‐toc] CPU time usage: 0.616 seconds Real time usage: 0.846 seconds Preprocessor visited node count: 3101/1000000 Post‐expand include size: 62108/2097152 bytes Template argument size: 5686/2097152 bytes Highest expansion depth: 27/100 Expensive parser function count: 44/500 Unstrip recursion depth: 1/20 Unstrip post‐expand size: 98011/5000000 bytes Lua time usage: 0.357/10.000 seconds Lua memory usage: 6602736/52428800 bytes Number of Wikibase entities loaded: 1/400 --> <!-- Transclusion expansion time report (%,ms,calls,template) 100.00% 737.569 1 -total 20.13% 148.475 1 Template:Reflist 19.26% 142.091 2 Template:Infobox 14.04% 103.590 1 Template:Short_description 13.08% 96.456 9 Template:Cite_web 12.59% 92.836 1 Template:Infobox_programming_language 12.54% 92.525 1 Template:Ecma_International_Standards 12.27% 90.493 1 Template:Navbox 9.15% 67.461 2 Template:Citation_needed 9.02% 66.504 2 Template:Pagetype --> <!-- Saved in parser cache with key enwiki:pcache:idhash:9838-0!canonical and timestamp 20241122142959 and revision id 1257513399. Rendering was triggered because: page-view --> </div><!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" width="1" height="1" style="border: none; position: absolute;"></noscript> <div class="printfooter" data-nosnippet="">Retrieved from "<a dir="ltr" href="https://en.wikipedia.org/w/index.php?title=Eiffel_(programming_language)&amp;oldid=1257513399">https://en.wikipedia.org/w/index.php?title=Eiffel_(programming_language)&amp;oldid=1257513399</a>"</div></div> <div id="catlinks" class="catlinks" data-mw="interface"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/wiki/Help:Category" title="Help:Category">Categories</a>: <ul><li><a href="/wiki/Category:Class-based_programming_languages" title="Category:Class-based programming languages">Class-based programming languages</a></li><li><a href="/wiki/Category:Formal_specification_languages" title="Category:Formal specification languages">Formal specification languages</a></li><li><a href="/wiki/Category:High_Integrity_Programming_Language" title="Category:High Integrity Programming Language">High Integrity Programming Language</a></li><li><a href="/wiki/Category:Object-oriented_programming_languages" title="Category:Object-oriented programming languages">Object-oriented programming languages</a></li><li><a href="/wiki/Category:Programming_languages_created_in_1986" title="Category:Programming languages created in 1986">Programming languages created in 1986</a></li><li><a href="/wiki/Category:Programming_languages_with_an_ISO_standard" title="Category:Programming languages with an ISO standard">Programming languages with an ISO standard</a></li><li><a href="/wiki/Category:Statically_typed_programming_languages" title="Category:Statically typed programming languages">Statically typed programming languages</a></li></ul></div><div id="mw-hidden-catlinks" class="mw-hidden-catlinks mw-hidden-cats-hidden">Hidden categories: <ul><li><a href="/wiki/Category:Articles_with_short_description" title="Category:Articles with short description">Articles with short description</a></li><li><a href="/wiki/Category:Short_description_is_different_from_Wikidata" title="Category:Short description is different from Wikidata">Short description is different from Wikidata</a></li><li><a href="/wiki/Category:All_articles_with_unsourced_statements" title="Category:All articles with unsourced statements">All articles with unsourced statements</a></li><li><a href="/wiki/Category:Articles_with_unsourced_statements_from_October_2010" title="Category:Articles with unsourced statements from October 2010">Articles with unsourced statements from October 2010</a></li><li><a href="/wiki/Category:Articles_with_unsourced_statements_from_March_2021" title="Category:Articles with unsourced statements from March 2021">Articles with unsourced statements from March 2021</a></li></ul></div></div> </div> </main> </div> <div class="mw-footer-container"> <footer id="footer" class="mw-footer" > <ul id="footer-info"> <li id="footer-info-lastmod"> This page was last edited on 15 November 2024, at 09:00<span class="anonymous-show">&#160;(UTC)</span>.</li> <li id="footer-info-copyright">Text is available under the <a href="/wiki/Wikipedia:Text_of_the_Creative_Commons_Attribution-ShareAlike_4.0_International_License" title="Wikipedia:Text of the Creative Commons Attribution-ShareAlike 4.0 International License">Creative Commons Attribution-ShareAlike 4.0 License</a>; additional terms may apply. By using this site, you agree to the <a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use" class="extiw" title="foundation:Special:MyLanguage/Policy:Terms of Use">Terms of Use</a> and <a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy" class="extiw" title="foundation:Special:MyLanguage/Policy:Privacy policy">Privacy Policy</a>. Wikipedia® is a registered trademark of the <a rel="nofollow" class="external text" href="https://wikimediafoundation.org/">Wikimedia Foundation, Inc.</a>, a non-profit organization.</li> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy policy</a></li> <li id="footer-places-about"><a href="/wiki/Wikipedia:About">About Wikipedia</a></li> <li id="footer-places-disclaimers"><a href="/wiki/Wikipedia:General_disclaimer">Disclaimers</a></li> <li id="footer-places-contact"><a href="//en.wikipedia.org/wiki/Wikipedia:Contact_us">Contact Wikipedia</a></li> <li id="footer-places-wm-codeofconduct"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Universal_Code_of_Conduct">Code of Conduct</a></li> <li id="footer-places-developers"><a href="https://developer.wikimedia.org">Developers</a></li> <li id="footer-places-statslink"><a href="https://stats.wikimedia.org/#/en.wikipedia.org">Statistics</a></li> <li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement">Cookie statement</a></li> <li id="footer-places-mobileview"><a href="//en.m.wikipedia.org/w/index.php?title=Eiffel_(programming_language)&amp;mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Mobile view</a></li> </ul> <ul id="footer-icons" class="noprint"> <li id="footer-copyrightico"><a href="https://wikimediafoundation.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/static/images/footer/wikimedia-button.svg" width="84" height="29" alt="Wikimedia Foundation" loading="lazy"></a></li> <li id="footer-poweredbyico"><a href="https://www.mediawiki.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/w/resources/assets/poweredby_mediawiki.svg" alt="Powered by MediaWiki" width="88" height="31" loading="lazy"></a></li> </ul> </footer> </div> </div> </div> <div class="vector-settings" id="p-dock-bottom"> <ul></ul> </div><script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgHostname":"mw-web.codfw.main-f69cdc8f6-twlxc","wgBackendResponseTime":146,"wgPageParseReport":{"limitreport":{"cputime":"0.616","walltime":"0.846","ppvisitednodes":{"value":3101,"limit":1000000},"postexpandincludesize":{"value":62108,"limit":2097152},"templateargumentsize":{"value":5686,"limit":2097152},"expansiondepth":{"value":27,"limit":100},"expensivefunctioncount":{"value":44,"limit":500},"unstrip-depth":{"value":1,"limit":20},"unstrip-size":{"value":98011,"limit":5000000},"entityaccesscount":{"value":1,"limit":400},"timingprofile":["100.00% 737.569 1 -total"," 20.13% 148.475 1 Template:Reflist"," 19.26% 142.091 2 Template:Infobox"," 14.04% 103.590 1 Template:Short_description"," 13.08% 96.456 9 Template:Cite_web"," 12.59% 92.836 1 Template:Infobox_programming_language"," 12.54% 92.525 1 Template:Ecma_International_Standards"," 12.27% 90.493 1 Template:Navbox"," 9.15% 67.461 2 Template:Citation_needed"," 9.02% 66.504 2 Template:Pagetype"]},"scribunto":{"limitreport-timeusage":{"value":"0.357","limit":"10.000"},"limitreport-memusage":{"value":6602736,"limit":52428800}},"cachereport":{"origin":"mw-web.codfw.main-f69cdc8f6-2ms4s","timestamp":"20241122142959","ttl":2592000,"transientcontent":false}}});});</script> <script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"Article","name":"Eiffel (programming language)","url":"https:\/\/en.wikipedia.org\/wiki\/Eiffel_(programming_language)","sameAs":"http:\/\/www.wikidata.org\/entity\/Q732089","mainEntity":"http:\/\/www.wikidata.org\/entity\/Q732089","author":{"@type":"Organization","name":"Contributors to Wikimedia projects"},"publisher":{"@type":"Organization","name":"Wikimedia Foundation, Inc.","logo":{"@type":"ImageObject","url":"https:\/\/www.wikimedia.org\/static\/images\/wmf-hor-googpub.png"}},"datePublished":"2001-11-09T17:31:15Z","dateModified":"2024-11-15T09:00:35Z","headline":"programming language"}</script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10