에펠(프로그래밍 언어)

Eiffel (programming language)
에펠
Eiffel logo
패러다임객체 지향, 클래스 기반, 범용, 동시
설계자베르트랑 마이어
개발자에펠 소프트웨어
처음 등장한1986년[1]
안정된 릴리스
에펠 스튜디오 22.05[2] / 2022년 5월 30일, 2개월 전(2022-05-30)
프리뷰 릴리즈
에펠 스튜디오 22.05[3] / 2022년 5월 30일, 2개월 전(2022-05-30)
타이핑 분야정적인
구현 언어에펠
플랫폼크로스 플랫폼
OSFreeBSD, Linux, Mac OS X, OpenBSD, Solaris, Windows
면허증.듀얼 및 엔터프라이즈
파일 이름 확장자.e
웹 사이트www.eiffel.org
주요 구현
Eiffel Studio, LibertyEifel, SmartEifel, Visual Eiffel, Gobo Eiffel, "Eiffel 컴파일러" tecomp
영향을 받다
아다, 시뮬라, Z
영향받은
Ada 2012, Albatross, C#, D, Java, Racket, Ruby,[4] Sather, Scala

Effel은 객체 지향 소프트웨어 구축저자이자 객체 지향 소프트웨어 제안자인 Bertrand Meyer가 설계한 객체 지향 프로그래밍 언어입니다.Meyer는 1985년에 상용 소프트웨어 [5]개발의 신뢰성을 높이기 위해 이 언어를 구상했습니다.첫 번째 버전은 1986년에 출시되었습니다.2005년에 에펠은 ISO 표준 언어가 되었다.

언어의 디자인은 에펠 프로그래밍 방식과 밀접하게 연관되어 있다.둘 다 계약에 의한 설계, 명령-쿼리 분리, 균일한 접근 원칙, 단일 선택 원칙, 개방-폐쇄 원칙 및 옵션-연산자 분리포함한 일련의 원칙에 기초한다.

에펠에 의해 처음 소개된 많은 개념들은 나중에 자바, C#, 그리고 다른 [citation needed]언어들에 적용되었다.특히 Ecma/ISO 표준화 프로세스를 통해 새로운 언어 설계 아이디어가 에펠 언어에 계속 통합되고 있습니다.

특성.

에펠어의 주요 특징은 다음과 같습니다.

  • 클래스가 분해의 기본 단위로 기능하는 객체 지향 프로그램 구조입니다.
  • 다른 언어 구조와 긴밀하게 통합된 계약에 의한 설계.
  • 자동 메모리 관리. 일반적으로 가비지 컬렉션에 의해 구현됩니다.
  • 상속(복수 상속, 이름 변경, 재정의, "선택", 부적합 상속 및 상속을 안전하게 하기 위한 기타 메커니즘 포함)
  • 제약과 제약이 없는 범용 프로그래밍
  • INTEGER 등의 기본 유형을 포함한 모든 유형이 클래스 기반인 값과 참조 의미를 모두 처리하는 균일한 유형 시스템입니다.
  • 정적 타이핑
  • 접속형 메커니즘을 통해 늘 참조 콜에 대한 안전 또는 정적 보호 기능을 무효화한다.
  • 계산을 랩하는 에이전트 또는 개체로, 클로저 및 람다 미적분과 밀접하게 연결되어 있습니다.
  • 객체 공유 및 분산형 초기화에 대해 한 번만 루틴 또는 루틴이 평가됩니다.
  • ALGOL/Pascal 전통의 키워드 기반 구문. 단 세미콜론은 옵션이며 연산자 구문은 루틴에 사용할 수 있습니다.
  • 대소문자를 구분하지 않음
  • Simple Concurrent Object-Oriented Programming(SCOOUP)은 이러한 차량의 특정 세부 사항 이상의 추상화 수준에서 여러 개의 활성 실행 차량을 쉽게 생성할 수 있습니다(예: 특정 뮤텍스 관리 없이 여러 스레드).

설계 목표

에펠은 절차 코드보다 선언적인 진술을 강조하고 부기 지시가 필요하지 않게 하려고 한다.

Eiffel은 컴파일러에 대한 최적화 힌트로 의도된 코딩 트릭 또는 코딩 기술을 사용하지 않습니다.목적은 코드를 보다 읽기 쉽게 만드는 것뿐만 아니라 프로그래머가 구현 세부 사항에 얽매이지 않고 프로그램의 중요한 측면에 집중할 수 있도록 하는 것입니다.Effel의 심플함은 컴퓨팅 문제에 대한 심플하고 확장 가능하며 재사용 가능하며 신뢰할 수 있는 답변을 촉진하기 위한 것입니다.Effel로 작성된 컴퓨터 프로그램용 컴파일러는 프로그래머의 최적화 부담을 일부 덜어주는 자동 인라인 등의 광범위한 최적화 기술을 제공합니다.

배경

에펠은 원래 베르트랑 마이어가 설립한 회사인 에펠 소프트웨어에 의해 개발되었다.객체 지향 소프트웨어 구축은 에펠 [6]설계를 이끈 객체 기술의 개념과 이론을 자세히 다루고 있습니다.

에펠 언어, 라이브러리 및 프로그래밍 방법 뒤에 있는 설계 목표는 프로그래머가 신뢰할 수 있고 재사용 가능한 소프트웨어 모듈을 만들 수 있도록 하는 것입니다.Effel은 다중 상속, 생성, 다형성, 캡슐화, 유형 안전 변환 및 매개 변수 공분산을 지원합니다.소프트웨어 엔지니어링에 대한 Eiffel의 가장 중요한 공헌은 계약에 의한 설계(DbC)입니다.이 설계에서는 어소션, 전제조건, 사후조건클래스 불변수가 채용되어 효율성의 저하 없이 프로그램의 정확성을 보증합니다.

에펠의 설계는 객체 지향 프로그래밍 이론에 기초하고 있으며, 다른 패러다임의 영향이나 레거시 코드의 지원에 대한 우려는 미미합니다.에펠은 공식적으로 추상 데이터 유형을 지원합니다.Effel의 설계에서는 소프트웨어 텍스트는 텍스트 자체에서 "추상 데이터 유형"의 정식 구현을 사용하여 설계 문서를 복제할 수 있어야 합니다.

구현 및 환경

Effel Studio는 오픈 소스 또는 상용 라이선스로 이용 가능한 통합 개발 환경입니다.소프트웨어 엔지니어링을 위한 객체 지향 환경을 제공합니다.EiffelEnvision은 Microsoft Visual Studio IDE 내에서 Eiffel 프로젝트를 편집, 컴파일 및 디버깅할 수 있는 Microsoft Visual Studio용 플러그인입니다.기타 5가지 오픈 소스 구현이 있습니다.「Eiffel 컴파일러」 tecomp, Gobo Eiffel, 구버전을 기반으로 한 GNU 구현, SmartEiffel 컴파일러를 기반으로 한 LibertyEifel, Visual Eiffel입니다.

몇몇 다른 프로그래밍 언어들은 에펠에서 처음 도입된 요소들을 포함하고 있다.를 들어, Sather는 원래 에펠에 기반을 두었으나 이후 분산되어 현재는 몇 가지 기능적 프로그래밍 기능을 포함하고 있습니다.블루J의 전신인 인터랙티브 언어 블루도 에펠에 기반을 두고 있다.Apple Media Tool에는 에펠 기반의 Apple Media Language가 포함되어 있습니다.

사양 및 표준

에펠 언어의 정의는 ISO의 국제 표준입니다. 표준은 ECMA International에 의해 개발되었으며, 2005년 6월 21일 표준 ECMA-367, 에펠: 분석, 설계 및 프로그래밍 언어로 처음 승인되었습니다.2006년 6월에 ECMA와 ISO는 두 번째 버전을 채택했습니다.2006년 11월에 ISO가 그 버전을 최초로 발표했습니다.이 표준은 ECMA [7]사이트에서 무료로 찾을 수 있습니다.ISO[8] 버전은 포맷을 제외한 모든 면에서 동일합니다.

Effel Software, "Effel Compiler" tecomp 및 Effel-Library-developer Gobo는 표준을 구현하기 위해 노력하고 있습니다.Effel Software의 Effel Studio 6.1 및 "Effel Compiler" tecomp은 특히 인라인 에이전트, 할당자 명령어, 괄호 표기법, 첨부 유형 등 주요 새로운 메커니즘을 구현하고 있습니다.SmartEiffel 팀은 에펠의 원래 스타일에 더 가깝다고 믿는 그들만의 언어 버전을 만들기 위해 이 표준을 외면했다.오브젝트 툴은 Eiffel 컴파일러의 향후 버전이 표준을 준수하는지 여부를 공개하지 않았습니다.LibertyEiffelSmartEiffel 언어와 표준어 사이의 어딘가에 사투리를 구현합니다.

이 표준은 다음과 같은 이전 에펠 언어 사양을 인용합니다.

  • 베르트랑 마이어: 에펠:언어, 프렌티스 홀, 두 번째 인쇄, 1992년 (첫 번째 인쇄: 1991년)
  • Bertrand Meyer: 스탠다드 에펠(이전 항목 개정), 1997-현재, Bertrand Meyer의 ETL3 페이지에 게재되어 있습니다.
  • Bertrand Meyer: 객체 지향 소프트웨어 구축, 프렌티스 홀: 초판, 1988년, 제2판, 1997년.
  • 베르트랑 마이어:Touch of Class: 객체 및 계약에 의한 프로그램 기능 학습, Springer-Verlag, 2009 ISBN978-3-540-92144-8 lxiv + 876 페이지 풀컬러 인쇄, 다수의 컬러 사진

2006년 6월 현재 버전의 표준에는 몇 가지 불일치가 있다(예: 공변량 [citation needed]재정의).ECMA 위원회는 불일치를 어떻게 해결할지에 대한 일정과 방향을 아직 발표하지 않았다.

구문 및 의미론

전체적인 구조

에펠 "시스템" 또는 "프로그램"은 수업의 집합체이다.클래스 레벨 이상으로 Eiffel은 본질적으로 클래스 그룹이며 하위 클러스터(내스트 클러스터) 수 있는 클러스터를 정의합니다.클러스터는 통사적인 언어 구조가 아니라 표준적인 조직 규약입니다.일반적으로 Eiffel 프로그램은 각 클래스로 별도의 파일로 구성되며 각 클러스터는 클래스 파일이 포함된 디렉토리로 구성됩니다.이 조직에서는 서브클러스터는 서브디렉토리입니다예를 들어, 표준 조직 및 케이스 규칙에 따르면x.eX라는 클래스를 정의하는 파일의 이름일 수 있습니다.

클래스에는 다른 객체 지향 프로그래밍 언어의 "routines", "members", "attributes" 또는 "methods"와 유사한 기능이 포함되어 있습니다.클래스에는 불변수도 정의되며 문서 및 메타데이터에 대한 "notes" 섹션과 같은 다른 속성도 포함됩니다.다음과 같은 에펠의 표준 데이터 유형INTEGER,STRING그리고.ARRAY모두 클래스입니다.

모든 시스템에는 "root"로 지정된 클래스와 "root procedure"로 지정된 생성 절차 중 하나가 있어야 합니다.시스템 실행은 루트 클래스의 인스턴스를 만들고 해당 루트 프로시저를 실행하는 것으로 구성됩니다.일반적으로 이렇게 하면 새로운 오브젝트가 생성되거나 새로운 기능이 호출되는 등의 작업이 수행됩니다.

Effel에는 할당, 객체 생성, 루틴 호출, 조건 및 반복의 5가지 기본 실행 명령이 있습니다.에펠의 제어 구조는 구조화된 프로그래밍을 시행하는 데 엄격합니다. 각 블록에는 정확히 하나의 입구와 정확히 하나의 출구가 있습니다.

범위 설정

많은 객체 지향 언어와는 달리 Smalltalk와 마찬가지로 Eiffel은 객체의 특성 내를 제외하고 객체 속성에 대한 할당을 허용하지 않습니다. 이는 정보 숨기기 또는 데이터 추상화 원리의 실제 적용이며 데이터 변환을 위해 정식 인터페이스가 필요합니다.다른 객체 지향 프로그래밍 언어로 표현하려면 모든 Effel 속성이 "보호"되고 클라이언트 객체가 값을 수정하려면 "설정기"가 필요합니다.이것의 결론은 "설정자"가 에펠이 구문을 제공하는 불변수를 구현할 수 있고, 일반적으로 구현할 수 있다는 것입니다.

Eiffel은 클래스의 클라이언트에 의한 클래스의 기능에 대한 직접 액세스를 허용하지 않지만 다음과 같은 "할당 명령어"의 정의를 허용합니다.

     일부_부적합: 일부_타입 할당하다 set_some_displaces         set_some_displaces (v: 값_타입)                 -- some_attribute 값을 v로 설정합니다.             하다                 일부_부적합 := v             끝. 

개발자 커뮤니티 전체에 대해 직접적인 접근(예를 들어 정보 은닉 원칙 위반)을 허용하기 위해 가볍게 고개를 숙이는 한편, 이러한 관행은 "설정자"가 사용되는 현실을 숨기거나 모호하게 만들기 때문에 위험합니다.실제로는, 콜을 세터로 리다이렉트 하는 것이, 다음과 같은 기능에의 직접 액세스를 시사하는 것보다,some_attribute위의 [citation needed]코드 예시와 같습니다.

"public", "protected", "private" 등의 개념을 가진 다른 언어와 달리 Eiffel은 내보내기 기술을 사용하여 클라이언트 클래스와 공급업체 클래스 간의 범위를 보다 정확하게 제어합니다.기능의 가시성은 컴파일 시에 정적으로 체크됩니다.예를 들어 (아래 참조) "{NONE}"은 다른 언어의 "보호됨"과 유사합니다.이와 같이 "피처 세트"에 적용되는 범위(예를 들어 "피처" 키워드 아래의 모든 것을 "내보내기" 키워드를 사용하여 하위 클래스에서 변경할 수 있습니다.

특징 {없음.} -- 초기화  default_create    -- 새로운 '제로' 10진수 인스턴스를 초기화합니다.   하다    make_zero   끝. 

또는 {x} 내보내기 선언이 없다는 것은 {ANY}을(를) 의미하며 다른 언어의 "공용" 범위 지정과 유사합니다.

특징 -- 상수 

마지막으로 다음과 같은 에펠 프로젝트 환경의 모든 클래스에서 스코핑을 선택적으로 정밀하게 제어할 수 있습니다.

특징 {십진수, DCM_MA_DECIMAL_PARSER, DCM_MA_DECIMAL_HANDler} -- 액세스 

여기서 컴파일러는 중괄호 사이에 나열된 클래스만 기능 그룹 내의 기능에 액세스할 수 있도록 허용합니다(예:DECIMAL, DCM_MA_DECIMAL_PARSER, DCM_MA_DECIMAL_HANDler).

"안녕, 세상아!"

프로그래밍 언어의 모양과 느낌은 종종 "안녕하세요, 세계!" 프로그램을 사용하여 전달됩니다.에펠로 작성된 프로그램은 다음과 같습니다.

학급     헬로 월드 만들다     만들다 특징     만들다         하다             인쇄물 ("안녕, 세상아!%"%N")         끝. 끝. 

이 프로그램은 클래스를 포함합니다.HELLO_WORLD. 클래스의 생성자(루틴 만들기)입니다.이름을 지정합니다.make를 호출합니다.print시스템 라이브러리 루틴을 사용하여"Hello, world!"출력에 메시지를 보냅니다.

계약에 의한 설계

계약에 의한 설계라는 개념은 에펠의 중심이다.계약은 루틴이 실행되기 전에 참이어야 하는 것(전제조건)과 루틴이 종료된 후 참이어야 하는 것(후제조건)을 주장합니다.클래스 불변성 계약에서는 클래스의 기능에 액세스하기 전후에(루틴과 어트리뷰트 양쪽 모두) true로 유지할 필요가 있는 어사션을 정의합니다.더욱이, 계약은 불변성을 이용하여 클래스 또는 클래스 전체의 특징의 운영 환경에 관한 실행 가능한 코드 개발자와 설계자의 가정으로 분류된다.

Effel 컴파일러는 다양한 수준의 기능과 클래스 계약을 포함하도록 설계되었습니다.예를 들어 EiffelStudio는 "워크벤치 모드"에서 실행되는 동안 모든 기능 및 클래스 계약을 실행합니다.실행 파일이 생성되면 컴파일러는 프로젝트 설정 파일(ECF 파일 등)을 통해 계약 세트를 포함하거나 제외하도록 지시됩니다.따라서 실행 파일을 컴파일하여 계약 수준을 포함하거나 제외할 수 있으므로 유닛 및 통합 테스트를 지속적으로 수행할 수 있습니다.또한 계약은 에펠 스튜디오에 있는 자동 테스트 기능을 통해 지속적이고 체계적으로 행사할 수 있습니다.

계약에 의한 설계 메커니즘은 언어와 밀접하게 통합되어 상속 기능의 정의를 안내합니다.

  • 루틴 전제 조건:전제조건은 상속에 의해서만 약화될 수 있습니다.상위자 요건을 충족하는 콜은 모두 하위자 요건을 충족합니다.
  • 루틴 전제 조건:사후 조건은 상속을 통해서만 강화될 수 있으며, 상위 항목에 의해 보장된 결과는 하위 항목에 의해 제공됩니다.
  • 클래스 불변성: 객체 생성 후 및 내보낸 클래스 루틴 호출 후에 true로 유지되어야 하는 조건.불변성은 매우 자주 확인되기 때문에 가장 비싸고 가장 강력한 조건이나 계약 형태가 됩니다.

또한 이 언어는 "체크 명령"(일종의 "Assert"), 루프 불변량 및 루프 변형(루프 종단을 보장하는)"을 지원합니다.

보이드 세이프 기능

정적 타이핑과 같은 보이드 세이프 기능은 소프트웨어 품질을 향상시키는 또 다른 기능입니다.보이드 세이프 소프트웨어는 참조를 무효로 하는 호출에 의해 발생하는 런타임 오류로부터 보호되므로 타깃을 무효로 하는 호출이 발생할 수 있는 소프트웨어보다 신뢰성이 높아집니다.정적 타이핑에 비유하는 것은 유용합니다.실제로 보이드 세이프 기능은 보이드 안전성을 보장하는 메커니즘이 타입 시스템에 통합되어 있기 때문에 타입 시스템의 확장 또는 정적 타이핑 이상의 단계로 간주될 수 있다.

보이드 타깃콜에 대한 가드는 접속 개념과 (내선번호로) 분리(detachable 키워드 등)를 통해 확인할 수 있습니다.void-safe 설비는 위에서 사용한 코드 예를 짧게 재작업하면 알 수 있습니다.

   일부_부적합: 탈부착 가능한 일부_타입         use_some_modely                 -- some_attribute 값을 v로 설정합니다.             하다                 한다면 첨부된 일부_부적합 ~하듯이 l_module 그리고나서                     무엇인가 하다 (l_module)                 끝.             끝.          무엇인가 하다 (a_값: 일부_타입)                 -- 「a_value」로 작업을 실시합니다.             하다                ... 하고있다 뭔가 와 함께 `a_값' ...             끝. 

위의 코드 예는 컴파일러가 어떻게 스태틱하게 처리하는지 보여줍니다.some_attribute사용 지점에 부착 또는 분리됩니다.특히,attached키워드를 지정하면, 「메뉴먼트 로컬」(예:l_attribute)는 if-statement 구성으로 둘러싸인 코드 블록에만 범위가 지정됩니다.따라서 이 작은 코드 블록 내에서 로컬 변수(예:l_attribute)는 비침투성(즉, 보이드 세이프)을 정적으로 보증할 수 있습니다.

기능: 명령 및 쿼리

클래스의 주된 특징은 기능 세트를 정의하는 것입니다.클래스는 런타임오브젝트 세트 또는 "인스턴스"를 나타내므로 기능은 이러한 오브젝트에 대한 조작입니다.쿼리와 명령의 두 가지 기능이 있습니다.쿼리는 인스턴스에 대한 정보를 제공합니다.명령어는 인스턴스를 변경합니다.

명령어 쿼리의 구별은 에펠법에 중요하다.특히:

  • Uniform-Access Principle: 클래스 기능을 호출하는 소프트웨어 클라이언트의 관점에서 쿼리가 속성(필드 값)인지 함수(계산 값)인지에 따라 차이가 없습니다.예를들면,a_vehicle.speed오브젝트에서 액세스되는 속성일 수 있습니다.a_vehicle또는 거리를 시간으로 나누는 함수로 계산할 수 있습니다.두 경우 모두 표기법이 동일하기 때문에 클라이언트소프트웨어에 영향을 주지 않고 클래스의 구현을 쉽게 변경할 수 있습니다.
  • 명령어 쿼리 분리 원칙:쿼리는 인스턴스를 수정할 수 없습니다.이것은 언어 규칙이 아니라 방법론적인 원칙이다.따라서 좋은 에펠 스타일에서는 무언가를 변경하고 결과를 반환하는 "get" 함수를 찾을 수 없습니다.대신 객체를 변경하는 명령어(프로시저)와 객체에 대한 정보를 얻는 쿼리(이전 변경에서 비롯됨)가 있습니다.

과부하

에펠은 인수 오버로드를 허용하지 않습니다.클래스 내의 각 기능명은 항상 클래스 내의 특정 기능에 매핑됩니다.하나의 클래스 내에서 하나의 이름은 하나의 의미를 가집니다.이 설계 선택은 어떤 루틴이 콜에 의해 호출되는지에 대한 애매한 원인을 회피함으로써 클래스의 가독성에 도움이 됩니다.그것은 또한 언어 메커니즘을 단순화한다; 특히, 이것이 에펠의 다중 상속 메커니즘을 [9]가능하게 한다.

물론 이름은 다른 클래스에서 재사용할 수 있습니다.예를 들어 기능 플러스(+)는 infix 별칭 "+"와 함께 INTEGER, REAL, STRING 의 여러 클래스로 정의됩니다.

일반성

범용 클래스는 유형에 따라 다른 클래스입니다(예: LIST [PHONE], 전화번호 목록, Account [G->ACCount_TYPE], Account [SAVINGS], Account [CHECKING] 등).클래스는 유형별로 매개 변수가 지정된다는 것을 표현하기 위해 일반적일 수 있습니다.범용 파라미터는 대괄호로 둘러싸여 있습니다.

학급 목록. [G] ... 

G는 "공식 범용 파라미터"로 알려져 있습니다.(Eiffel은 루틴에 대해 "인수"를 예약하고 범용 클래스에 대해서만 "파라미터"를 사용합니다.)이러한 선언에서는 G는 클래스 내에서 임의의 유형을 나타냅니다.따라서 함수는 G 유형의 값을 반환하고 루틴은 그 유형의 인수를 취할 수 있습니다.

아이템: G 하다 ... 끝. 놓다 (x: G) 하다 ... 끝. 

LIST [INTEGER]그리고.LIST [WORD]는 이 클래스의 "유효한 파생"입니다.사용 가능한 조합(와)n: INTEGER,w: WORD,il: LIST [INTEGER],wl: LIST [WORD])는 다음과 같습니다.

n := .아이템 wl.놓다 (w) 

INTEGER그리고.WORD는 이러한 일반적인 파생상품의 "일반적인 파라미터"입니다.

또한 실제 매개변수가 주어진 클래스, 즉 "제약"에서 상속되어야 하는 '제한된' 형식 매개변수를 가질 수도 있습니다.예를 들어,

   학급 해시_탭LE [G, 열쇠 -> 해시 가능] 

파생품HASH_TABLE [INTEGER, STRING]다음 경우에만 유효합니다.STRING에서 상속하다.HASHABLE(일반적인 에펠 도서관처럼)학급 내에서,KEY에 의해 구속된.HASHABLE을 의미하다x: KEY에 적용하는 것은 가능하다x모든 특징HASHABLE와 같이x.hash_code.

상속의 기본

하나 이상의 다른 것들로부터 상속받기 위해 클래스에는 다음 항목이 포함됩니다.inherit첫 번째 절:

학급 C 상속하다    A    B  --...나머지 클래스 선언... 

클래스는 상속된 기능의 일부 또는 전부를 재정의(덮어쓰기)할 수 있습니다.이는 수업 시작 시 명시적으로 공지해야 합니다.redefine에서와 같은 상속 조항의 하위 절

학급 C 상속하다     A         재정의 f, g, h 끝.     B         재정의 u, v 끝. 

에펠의[10] 유산에 대한 자세한 내용은 를 참조하십시오.

지연된 클래스 및 기능

클래스는 다음과 같이 정의할 수 있습니다.deferred class가 아니라class클래스가 직접 인스턴스화되지 않을 수 있음을 나타냅니다.비인스턴트형 클래스는 다른 오브젝트 지향 프로그래밍 언어에서는 추상 클래스라고 불립니다.Effel 용어로 "유효한" 클래스만 인스턴스화할 수 있습니다(지연 클래스의 후손일 수 있습니다).기능을 연기할 수도 있습니다.deferred대신 키워드do절을 클릭합니다.클래스에 지연된 기능이 있는 경우 지연된 것으로 선언해야 하지만 지연된 기능이 없는 클래스 자체는 지연될 수 있습니다.

지연 클래스는 Java와 같은 언어의 인터페이스와 같은 역할을 하지만, 많은 객체 지향 프로그래밍 이론가들은 인터페이스 자체가 Java의 다중 상속 [11][12]부족에 대한 해답이라고 믿고 있습니다.

이름 바꾸기

하나 이상의 다른 클래스에서 상속하는 클래스는 기본적으로 원래 이름으로 모든 기능을 가져옵니다.그러나, 그것은 그들의 이름을 바꿀 수 있다.rename절을 참조하십시오.이는 상속된 기능 간에 이름 경합이 있는 경우 여러 상속의 경우 필요합니다.이름 변경을 하지 않으면 위의 no-overload 원칙에 위배되므로 무효가 됩니다.

튜플

튜플 유형은 속성 및 대응하는 "세터" 프로시저만 제공하는 단순한 형식의 클래스로 볼 수 있습니다.일반적인 태플 타입의 판독치

   태플 [이름.: 스트링; 체중: 진짜; 날짜.: 날짜.] 

그리고 수업이 필요하지 않은 경우 출생 기록에 대한 간단한 개념을 설명하는 데 사용될 수 있다.이러한 태플의 인스턴스는 다음과 같이 괄호로 둘러싸인 특정 유형의 값 시퀀스에 불과합니다.

   ["브리짓", 3.5, Last_night] 

이러한 태플의 컴포넌트는 예를 들어 다음과 같이 태플 태그가 클래스의 속성인 것처럼 액세스할 수 있습니다.t그럼 위의 태플이 할당되어 있습니다.t.weight값은 3.5 입니다.

assigner 명령어 개념(아래 참조) 덕분에 도트 표기법은 다음과 같이 이러한 태플의 컴포넌트를 할당하기 위해서도 사용할 수 있습니다.

   t.체중 := t.체중 + 0.5 

태플 태그는 옵션입니다.따라서 태플 타입을 다음과 같이 쓸 수도 있습니다.TUPLE [STRING, REAL, DATE](일부 컴파일러에서는 태그가 ECMA 표준으로 도입되었기 때문에 이것이 유일한 형태의 튜플입니다.)

의 정확한 사양(예: TUPLE [A, B, C]적어도 가지 요소의 시퀀스를 기술하는 것입니다. 처음 세 가지 요소는 유형입니다.A,B,C각각 다음과 같다.결과적으로.TUPLE [A, B, C](할당할 수 있다)에 준거하다TUPLE [A, B],로.TUPLE [A]및 에 대해서TUPLE(파라미터 없음), 모든 태플타입에 준거하는 최상위 태플타입.

에이전트

에펠의 "에이전트" 메커니즘은 작업을 물체로 포장합니다.이 메커니즘은 반복, 이벤트 구동 프로그래밍 및 프로그램 구조 주위에 연산을 전달하는 데 유용한 기타 컨텍스트에 사용할 수 있습니다.다른 프로그래밍 언어들, 특히 기능적 프로그래밍을 강조하는 언어들은 연속, 폐쇄 또는 생성기사용하여 유사한 패턴을 허용합니다. 에펠의 에이전트는 언어의 객체 지향 패러다임을 강조하며 Smalltalk와 Ruby코드 블록과 유사한 구문과 의미론을 사용합니다.

예를 들어, 다음과 같은 경우my_action각 요소의 블록my_list, 다음과 같이 쓸 수 있습니다.

   my_list.모든 것을 하다 (대리인 my_action) 

실행하다my_action만족시키는 요소에만my_condition, 제한/필터를 추가할 수 있습니다.

   my_list.do_if (대리인 my_action, 대리인 my_conditions(상태)) 

이 예에서는,my_action그리고.my_condition루틴입니다.프레픽스에 부가하다agent는 모든 속성, 특히 적절한 인수를 사용하여 호출할 수 있는 기능을 가진 대응하는 루틴을 나타내는 객체를 생성합니다.그래서 만약에a그 오브젝트를 나타냅니다(예를 들어a에 대한 논의입니다.do_all)의 설명

   a.불러 ([x]) 

인수로 원래의 루틴을 호출합니다.x마치 우리가 직접 원래의 루틴을 호출한 것처럼:my_action (x)에 대한 인수call여기서 태플이라고 하면[x].

에이전트에 대한 일부 인수는 열린 상태로 유지하고 다른 인수는 닫힌 상태로 둘 수 있습니다.open 인수들은 인수로서 전달된다.call: 에이전트 사용 시 제공됩니다.closed 인수는 에이전트 정의 시 제공됩니다.예를 들어,action2에는 2개의 인수, 즉 반복이 있습니다.

   my_list.모든 것을 하다 (대리인 액션 2 (?, y)) 

반복하다action2 (x, y)연속적인 가치를 위해x여기서 두 번째 인수는 로 설정되어 있습니다.y물음표?오픈 인수를 나타냅니다.y는 에이전트의 닫힌 인수입니다.기본 구문은agent f의 줄임말이다agent f (?, ?, ...)모든 인수가 열려 있습니다.또한 표기를 통해 에이전트의 타깃을 열 수 있습니다.{T}?어디에T는 타겟의 타입입니다.

열린 피연산자와 닫힌 피연산자(operands = 인수 + 목표값)의 구별은 람다 미적분학의 한계 변수와 자유 변수 간의 구별에 해당합니다.다음과 같은 에이전트 표현식action2 (?, y)일부 오퍼랜드가 닫히고 일부 오퍼랜드가 열린 경우 닫힌 오퍼랜드에서 큐링된 원래 오퍼랜드의 버전에 해당합니다.

에이전트 메커니즘에서는 기존 루틴을 참조하지 않고 에이전트를 정의할 수도 있습니다(예:my_action,my_condition,action2에서와 같이 인라인 에이전트를 통해

my_list.모든 것을 하다 (대리인 (s: 스트링)      요구하다          하지 않다: s /= 무효      하다          s.append_캐릭터 (',')      확신해주다          부가된: s.세어보세요 = 늙은 s.세어보세요 + 1      끝.) 

여기서 전달되는 인라인에이전트에는 전제조건, 사후조건, rescue 절(여기에서는 사용되지 않음), 풀시그니처 등 통상적인 루틴의 모든 데코레이션을 포함할 수 있습니다.이렇게 하면 에이전트에 랩할 계산만 필요한 경우 루틴을 정의할 필요가 없습니다.이는 목록의 모든 요소가 양수임을 나타내는 불변조항과 같이 계약에 특히 유용하다.

   my_list.모두 (대리인 (x: 정수): 부울 하다 결과 := (x > 0) 끝.) 

현재 에이전트 메커니즘에서는 런타임유형 오류가 발생할 가능성이 있습니다(n개의 인수를 가진 루틴이 m <n인수를 갖는 m개의 인수를 기대하는 에이전트에 전달되는 경우).이는 사전 조건을 통한 런타임 체크를 통해 방지할 수 있습니다.valid_argumentscallRibet 등의 [13]언어 변경 제안을 포함하여 이 문제의 순수 정적 수정을 위한 몇 가지 제안을 이용할 수 있다.

원스 루틴

루틴의 결과는 다음 명령을 사용합니다.once대신 키워드do. 루틴에 대한 첫 번째 호출이 아닌 호출에서는 추가 계산이나 리소스 할당이 필요하지 않고 이전에 계산된 결과를 반환하기만 하면 됩니다."Once functions"의 일반적인 패턴은 공유 객체를 제공하는 것입니다.첫 번째 호출은 객체를 생성하고 이후 호출은 해당 객체에 대한 참조를 반환합니다.일반적인 스킴은 다음과 같습니다.

shared_object(공유 객체): 일부_타입     한번만         만들다 결과.만들다 (args)              -- 이렇게 하면 객체가 생성되고 'Result'를 통해 객체에 대한 참조가 반환됩니다.     끝. 

반환된 오브젝트:Result이 예에서는, 그 자체는 변경할 수 있습니다만, 그 참조는 그대로입니다.

대부분의 경우, 「일회 루틴」이 필요한 초기화를 실행합니다.라이브러리에 대한 복수의 콜에 초기화 프로시저에 대한 콜이 포함될 수 있지만, 이러한 콜의 첫 번째만이 필요한 액션을 수행합니다.이 패턴 초기화를 사용하면 특별한 초기화 모듈이 필요하지 않도록 분산화할 수 있습니다."Once runtes"는 많은 프로그래밍 언어의 싱글톤 패턴과 목적과 효과가 유사하며 파이썬에서 사용되는 Borg 패턴과 유사합니다.

기본적으로 "Once 루틴"은 스레드당 한 번 호출됩니다.의미론은 프로세스당 1회 또는 오브젝트당 1회로 조정할 수 있습니다.예를 들어, 예를 들어 "Once key"를 사용하여 수식합니다.once ("PROCESS").

변환

에펠은 다양한 종류의 변환을 가능하게 하는 메커니즘을 제공한다.그 메커니즘은 상속과 공존하고 그것을 보완한다.두 메커니즘 간의 혼동을 방지하기 위해 설계에서는 다음 원칙을 적용합니다.

(변환원리) 타입은 적합하지 않고 다른 타입으로 변환할 수 없습니다.

예를들면,NEWSPAPER적합할 수 있다PUBLICATION,그렇지만INTEGER로 변환하다.REAL(또한 상속되지 않습니다).

변환 메커니즘은 단순히 애드혹 변환 규칙을 일반화할 뿐입니다(예를 들어,INTEGER그리고.REAL)는 대부분의 프로그래밍 언어에 존재하기 때문에 위의 원칙을 준수하는 한 모든 유형에 적용할 수 있습니다.예를 들어,DATE클래스가 로 변환되도록 선언될 수 있습니다.STRING; 이를 통해 날짜에서 문자열 생성이 가능합니다.

   my_string := my_date 

변환 절차와 함께 명시적 객체 작성을 사용하기 위한 바로 가기입니다.

   만들다 my_string.make_from_date (my_date) 

첫 번째 형식을 두 번째와 동의어로 사용하려면 생성 절차(시공자)를 나열하는 것으로 충분하다.make_from_date에 있어서convert수업의 첫머리에 있는 절

또 하나의 예로서 다음과 같은 변환 순서가 리스트 되어 있는 경우,TUPLE [day: INTEGER; month: STRING; year: INTEGER]그러면 태플을 날짜에 직접 할당하여 다음과 같이 적절한 변환을 할 수 있습니다.

      바스티유_일 := [14, "7월", 1789] 

예외 처리

에펠에서의 예외 처리는 계약에 의한 설계 원칙에 기초한다.예를 들어, 루틴의 호출자가 사전 조건을 충족하지 못하거나 루틴이 약속된 사전 조건을 보장할 수 없는 경우 예외가 발생합니다.에펠에서는 예외 처리는 제어 흐름이나 데이터 입력 오류 수정에 사용되지 않습니다.

Effel 예외 핸들러는 rescue 키워드를 사용하여 정의합니다.retry 키워드를 지정하면 retry 섹션 내에서 루틴이 다시 실행됩니다.예를 들어, 다음 루틴은 루틴 실행 시도 횟수를 추적하고 특정 횟수만 재시도합니다.

connect_to_서버 (서버: 소켓)       -- 서버에 연결하거나 10회 시도 후 포기합니다.     요구하다         서버 /= 무효 그리고 나서. 서버.주소. /= 무효     현지의         시도: 정수     하다         서버.연결하다     확신해주다       연결된: 서버.접속되어 있다     구조.         한다면 시도 <> 10 그리고나서             시도 := 시도 + 1             재시도         끝.     끝. 

단, 이 예에서는 접속 장애가 예상되기 때문에 가장 단순한 프로그램을 제외한 모든 프로그램에 결함이 있을 수 있습니다.대부분의 프로그램에서는 attempt_connecting_to_server와 같은 루틴 이름이 더 낫고 사후 조건이 연결을 약속하지 않으므로 연결이 열리지 않은 경우 적절한 절차를 수행하도록 발신자에게 맡깁니다.

동시성

EffelNet 및 EffelThreads와 같은 많은 네트워킹 및 스레드 라이브러리를 사용할 수 있습니다.계약에 의한 설계 개념에 근거한 에펠의 동시성 모델은 SPOCUP(Simple Concurrent Object-Oriented Programming)로, 아직 공식 언어 정의의 일부는 아니지만 에펠 스튜디오에서 이용할 수 있습니다.CAMEO는[14] Effel을 위한 SPOOK의 (실장되지 않은) 변형입니다.동시성은 예외와도 상호 작용합니다.비동기 예외는 귀찮을 수 있습니다(발신자 자신이 [15]종료한 후에 루틴이 예외를 발생시킵니다).

연산자 및 괄호 구문, assigner 명령어

에펠의 계산 관점은 모든 연산이 대상인 대상과 상대적이라는 점에서 완전히 객체 지향적이다.예를 들어 다음과 같은 추가가 있습니다.

a + b 

개념적으로는 메서드 호출인 것처럼 이해됩니다.

a.플러스 (b) 

겨냥하여a,특징plus및 인수b.

물론 전자는 일반적인 구문이며 일반적으로 선호됩니다.연산자 구문을 사용하면 기능을 선언함으로써 두 형식을 모두 사용할 수 있습니다(예:INTEGER단, 이는 다른 기본 클래스에 적용되며 해당 연산자가 적합한 다른 클래스에서 사용할 수 있습니다.

플러스 에일리어스 "+" (다른.: 정수): 정수         --...정상 함수 선언...     끝. 

"에일리어스"로 사용할 수 있는 연산자의 범위는 매우 넓습니다. "+"와 같은 사전 정의된 연산자는 물론 영숫자가 아닌 기호로 만들어진 "자유 연산자"도 포함됩니다.이것에 의해, 예를 들면 수학이나 물리 애플리케이션에서의 특수한 infix 및 prefix 표기를 설계할 수 있습니다.

또한 모든 클래스는 "브래킷" 연산자인 "[]"에 별칭을 붙여진 함수를 하나 가질 수 있으며, 이를 통해 기호가 허용됩니다.a [i, ...]와 동의어로서a.f (i, ...)어디에f는 선택된 기능입니다.이는 배열, 해시 테이블, 목록 등의 컨테이너 구조에 특히 유용합니다.예를 들어 문자열 키를 사용하여 해시 테이블의 요소에 액세스할 수 있습니다.

   번호 := phone_book ['질 스미스'] 

"Assigner 명령어"는 객체 지향 프로그래밍의 프레임워크에서 재해석된 잘 확립된 편리한 표기법을 가능하게 하는 것과 같은 정신으로 설계된 보조 메커니즘입니다.Assigner 명령어를 사용하면 할당과 같은 구문을 사용하여 "setter" 프로시저를 호출할 수 있습니다.적절한 할당은 결코 형식이 될 수 없습니다.a.x := v이는 정보 숨김을 위반하기 때문에 setter 명령어(setter 명령어)를 사용해야 합니다.예를 들어 해시 테이블클래스는 함수와 프로시저를 가질 수 있습니다.

아이템 에일리어스 "[]" (열쇠: 스트링): 요소         [3]       -- 키 「key」의 요소.       --("Getter" 쿼리)     하다         ...     끝.  놓다 (e: 요소; 열쇠: 스트링)       -- 요소 「e」를 삽입해, 키 「key」와 관련짓습니다.       --("Setter" 명령어)     하다         ...     끝. 

다음으로 요소를 삽입하려면 setter 명령에 대한 명시적 호출을 사용해야 합니다.

   [4] phone_book.놓다 (신규_인물, '질 스미스') 

이것을 다음과 같이 쓸 수 있다.

   [5] phone_book ['질 스미스'] := 신규_인물 

(와 같은 방법으로)phone_book ["JILL SMITH"]와 동의어이다.number := phone_book.item ("JILL SMITH"))는, 다음의 선언을 실시했습니다.item([3]의 치환)이 시작됩니다.

   아이템 에일리어스 "[]" (열쇠: 스트링): 요소 할당하다 놓다 

이것은 선언합니다.put관련지어져 있는 할당자 명령어로서item괄호 별칭과 결합하면 [5]가 합법적이고 [4]와 동등합니다.(브래킷을 사용하지 않고 다음과 같이 쓸 수도 있습니다.phone_book.item ("JILL SMITH") := New_person.

주의: 할당자의 인수 목록은 다음과 같이 제한됩니다(A의 반환 유형, 모든 인수 목록...).

어휘 및 구문 속성

에펠은 대소문자를 구분하지 않는다.토큰make,maKe그리고.MAKEall은 동일한 식별자를 나타냅니다.그러나 아래의 "스타일 규칙"을 참조하십시오.

코멘트는, 에 의해서 도입됩니다.--(2개의 연속된 대시) 및 행의 마지막까지 확장합니다.

세미콜론은 명령 구분 기호로서 옵션입니다.대부분의 경우 세미콜론은 생략되어 있습니다.단, 한 줄에 여러 개의 명령어가 있는 경우는 제외됩니다.이것에 의해, 프로그램 페이지의 번잡함이 경감됩니다.

기능 및 클래스 선언의 네스트는 없습니다.그 결과, Eiffel 클래스의 구조는 심플합니다.즉, 일부 클래스 레벨의 절(상속, 불변)과 일련의 기능 선언이 모두 같은 레벨에 있습니다.

읽기 쉽도록 기능을 개별 "feature 구"로 그룹화하는 것이 일반적입니다.기본 기능 태그의 표준 세트는 다음과 같이 표준 순서로 표시됩니다.

학급 해시_탭LE [요소, 열쇠 -> 해시 가능] 상속하다 테이블 [요소]      특징 -- 초기화          --... 초기화 명령 선언(작성 절차/시공자)...      특징 -- 액세스          --... 객체 상태에 대한 비부울 쿼리의 선언(예: 항목...)      특징 -- 상태 보고서          --... 객체 상태에 대한 부울 쿼리 선언(예: is_empty...)      특징 -- 요소 변경          --... 구조를 변경하는 명령어 선언(예: put...)      --등 끝. 

대부분의 곱슬 괄호 프로그래밍 언어와 달리 에펠은 표현과 명령어를 명확하게 구분합니다.이는 에펠법의 명령어-쿼리 분리 원칙에 부합한다.

스타일 표기법

에펠의 문서 대부분은 독특한 스타일의 규약을 사용하며, 일관된 외관과 느낌을 적용하도록 설계되어 있습니다.이러한 표기법 중 일부는 코드 형식 자체에 적용되며 다른 일부는 이러한 표기법이 가능한 형식 및 출판물의 표준 인쇄 형식 렌더링에 적용됩니다.

언어는 대소문자를 구분하지 않지만, 스타일 기준은 클래스 이름에 올캐피털을 사용하도록 규정하고 있습니다.LISTall-lower-case(기능명의 경우)make상수의 첫 번째 대문자(Avogadro권장되는 스타일은 여러 단어 식별자의 컴포넌트를 구분하기 위한 밑줄도 제시합니다.average_temperature.

Effel 사양에는 소프트웨어 텍스트를 활자 집합 형식으로 표시하기 위한 가이드라인이 포함되어 있습니다. 굵은 글씨로 표시된 키워드와 사용자 정의 식별자 및 상수는 에, 주석, 연산자 및 구두점은 에 표시됩니다.Roman프로그램 텍스트 포함blue설명문과 구별하기 위해 본 기사와 같이.예를 들어 위에 제시된 "Hello, world!" 프로그램은 에펠 문서에서 다음과 같이 렌더링됩니다.

학급     헬로 월드 만들다     만들다 특징     만들다        하다           인쇄물 ("안녕, 세상아!")        끝. 끝. 

다른 도구 및 언어에 대한 인터페이스

에펠은 순수하게 객체 지향적인 언어이지만 다른 프로그래밍 언어로 "외부" 소프트웨어와 인터페이스하기 위한 개방형 아키텍처를 제공합니다.

예를 들어 C에서 기계 및 운영 체제 수준의 작동을 프로그래밍할 수 있습니다.Eiffel은 "인라인 C"를 지원하는 등 C 루틴에 대한 간단한 인터페이스를 제공합니다(일반적으로 짧은 기계 수준 작업을 위해 Eiffel 루틴의 본문을 C로 씁니다).

에펠과 C는 직접 연결되어 있지 않지만 많은 에펠 컴파일러(Visual Effel은 예외)는 최적화휴대성을 위해 C 소스 코드를 중간 언어로 출력합니다.이와 같이 이들은 트랜스 컴파일러의 예입니다.Eiffel 컴파일러 tecomp는 중간 C 코드를 거치지 않고 직접(인터프리터처럼) Eiffel 코드를 실행하거나 C 컴파일러에 전달되는 C 코드를 내보낼 수 있습니다..NET에서는 EiffelStudio 컴파일러가 CIL(Common Intermediate Language) 코드를 직접 생성합니다.SmartEiffel 컴파일러는 Java 바이트 코드도 출력할 수 있습니다.

레퍼런스

  1. ^ "Eiffel in a Nutshell". archive.eiffel.com. Retrieved 24 August 2017.
  2. ^ "EiffelStudio 22.05 is available!". Eiffel.org. 30 May 2022.
  3. ^ "EiffelStudio 22.05 Releases". Eiffel.org.
  4. ^ Cooper, Peter (2009). Beginning Ruby: From Novice to Professional. Beginning from Novice to Professional (2nd ed.). Berkeley: APress. p. 101. ISBN 978-1-4302-2363-4. To a lesser extent, Python, LISP, Eiffel, Ada, and C++ have also influenced Ruby.
  5. ^ "Eiffel – the Language". Retrieved 6 July 2016.
  6. ^ 오브젝트 지향 소프트웨어 구축, 제2판, 프렌티스 홀, 베르트랑 마이어, 1997, ISBN 0-13-629155-4
  7. ^ ECMA International:표준 ECMA-367 – Effel: 분석, 설계 및 프로그래밍 언어 제2판 (2006년 6월), 온라인 www.ecma-international.org/publications/standards/Ecma-367.htm 에서 구할 수 있습니다.
  8. ^ 국제 표준화 기구:표준 ISO/IEC DIS 25436, 온라인 [1]에서 입수 가능
  9. ^ 베르트랑 마이어:JOP(Journal of Object-Oriented Programming) 제14권, No.4권, 2001년 10월~11월, 오버로드 vs 객체 테크놀로지 온라인 이용 가능
  10. ^ "9 INHERITANCE". Archive.eiffel.com. 1997-03-23. Retrieved 2013-07-08.
  11. ^ "Multiple Inheritance and Interfaces". Artima.com. 2002-12-16. Retrieved 2013-07-08.
  12. ^ "Multiple Inheritance Is Not Evil". C2.com. 2007-04-28. Retrieved 2013-07-08.
  13. ^ Philippe Ribet, Cyril Adrian, Olivier Zendra, Dominoinique Colnet: 객체 테크놀로지 저널, 2004년 4월호, 특별호: TOULS USA 2003, 페이지 125-143에서 에펠어에이전트의 적합성.JOT 기사 페이지에서 온라인으로 이용 가능
  14. ^ Brooke, Phillip; Richard Paige (2008). "Cameo: An Alternative Model of Concurrency for Eiffel" (PDF). Formal Aspects of Computing. Springer. 21 (4): 363–391. doi:10.1007/s00165-008-0096-1. S2CID 18336088.
  15. ^ Brooke, Phillip; Richard Paige (2007). "Exceptions in Concurrent Eiffel". Journal of Object Technology. 6 (10): 111–126. doi:10.5381/jot.2007.6.10.a4.

외부 링크

  • Effel을 소개한 회사의 Effel Software 웹사이트는 Interactive Software Engineering(ISE)이었습니다.
  • 무료 GNU Eiffel 개발 시스템의 LibertyEifel 웹사이트.