Ada(프로그래밍 언어)

Ada (programming language)
아다
Ada Mascot with slogan.svg
패러다임멀티패러다임: 구조화, 필수, 객체 지향, 애스펙트 지향,[1] 동시, 어레이, 분산, 범용, 프로시저, 메타
가족파스칼
설계자
  • MIL-STD-1815, Ada 83: Jean Ichbiah
  • 에이다 95: 터커 태프트
  • Ada 2005:터커 태프트
  • Ada 2012:터커 태프트
처음 등장한1980년 2월, 42년 전(1980-02)
안정된 릴리스
Ada 2012 TC1[2][3]
타이핑 분야스태틱, strong, safe, 주격
OS멀티플랫폼 또는 크로스플랫폼
파일 이름 확장자.adb, .ads
웹 사이트www.adaic.org
주요 구현
AdaCore GNAT,[4]
Green Hills 소프트웨어 최적화 Ada 95 컴파일러,
PTC ApexAda 및 ObjectAda,[5]
MapuSoft Ada-C/C++ 체인저([6]이전에는 AdaMagic with C Intermediate)[7]
DDC-I 스코어
사투리
SPARK, Ravenscar 프로파일
영향을 받다
ALGOL 68, Pascal, Simula 67,[8] C++(Ada 95), Smalltalk(Ada 95), Modula-2(Ada 95) Java(Ada 2005), Eiffel(Ada 2012)
영향받은
C++, [9]채플, 드라고,[10] D, 에펠, [11]그리핀, 자바, , ParaSail, PL/SQL, PL/pgSQL, Python, Ruby, Seed7, SPARforte,[12] Sparkel, SQL/PSM, VHDL

에이다는 파스칼과 다른 언어에서 확장구조화, 정적 유형, 명령형, 객체 지향 고급 프로그래밍 언어입니다.계약별 설계(DbC), 매우 강력한 타이핑, 명시적 동시성, 태스크, 동기 메시지 전달, 보호된 객체 및 비결정론에 대한 내장 언어 지원을 제공합니다.Ada는 런타임 오류에 유리한 오류를 찾기 위해 컴파일러를 사용함으로써 코드 안전성과 유지관리성을 향상시킵니다.Ada는 국제표준화기구(ISO)와 국제전기표준위원회(IEC)가 공동으로 정의한 국제기술표준입니다.2020년 현재 비공식적으로 [13]Ada 2012라고 불리는 표준은 ISO/IEC 8652:[14]2012입니다.

Ada는 원래 1977년부터 1983년까지 미국 국방부(DoD)와 계약을 맺고 프랑스 컴퓨터 과학자 Jean Ichbiah가 이끄는 팀에 의해 설계되었으며,[15] 당시 국방부가 사용했던 450개 이상의 프로그래밍 언어를 대체했습니다.에이다는 최초의 [16]컴퓨터 프로그래머로 인정받은 에이다 러브레이스 (1815–1852)의 이름을 따서 지어졌다.

특징들

Ada는 원래 임베디드 및 실시간 시스템용으로 설계되었습니다.S가 설계한 Ada 95 리비전.1992년부터 1995년까지 Intermetrics의 Tucker Taft는 시스템, 수치, 재무 및 객체 지향 프로그래밍(OOP) 지원을 개선했습니다.

Ada의 특징은 강력한 타이핑, 모듈러 프로그래밍 메커니즘(패키지), 런타임 체크, 병렬 처리(태스크, 동기 메시지 전달, 보호 대상 객체 및 비결정론적 선택 문), 예외 처리 및 일반입니다.Ada 95는 동적 디스패치를 포함한 객체 지향 프로그래밍 지원을 추가했습니다.

Ada 구문에서는 기본적인 조작을 실행하는 방법의 선택을 최소한으로 억제하고 기호(' 및 &' 등)보다 영어 키워드('혹은' 및 '그 후' 등)를 선호합니다.Ada는 기본 산술 연산자 "+", "-", "*" 및 "/"를 사용하지만 다른 기호 사용은 피합니다.코드 블록은 "declare", "begin" 및 "end"와 같은 단어로 구분되며, 여기서 "end" (대부분의 경우) 뒤에 닫히는 블록 식별자가 나옵니다(예: ...인 경우). 종료 if, 루프... 엔드 루프).조건부 블록의 경우 C 또는 Java와 같은 다른 언어로 잘못 중첩된 if-표현식과 쌍을 이룰 수 있는 행잉을 방지합니다.

Ada는 매우 큰 소프트웨어 시스템을 개발하기 위해 설계되었습니다.Ada 패키지는 별도로 컴파일할 수 있습니다.Ada 패키지 사양(패키지 인터페이스)은 일관성을 확인하기 위해 구현하지 않고 별도로 컴파일할 수도 있습니다.이를 통해 설계 단계에서 구현이 시작되기 전에 문제를 조기에 발견할 수 있습니다.

다른 언어의 런타임까지 검출할 수 없거나 소스 코드에 명시적인 체크가 필요한 버그를 피하기 위해 다수의 컴파일 시간 체크가 지원됩니다.예를 들어, 이 구문에서는 엔드 토큰 불일치로 인한 오류를 방지하기 위해 명시적으로 명명된 블록 닫기가 필요합니다.강력한 입력 방식을 고수하면 컴파일 시 또는 런타임 중에 많은 일반적인 소프트웨어 오류(잘못된 매개 변수, 범위 위반, 비활성 참조, 불일치 유형 등)를 탐지할 수 있습니다.동시성은 언어 사양의 일부이기 때문에 컴파일러는 잠재적인 교착 상태를 [17]검출할 수 있습니다.컴파일러는 일반적으로 오식별자, 패키지 가시성, 중복 선언 등을 체크하여 경고 및 오류 수정 방법을 제안할 수 있습니다.

또한 Ada는 할당되지 않은 메모리, 버퍼 오버플로 오류, 범위 위반, 오프 바이 오류, 어레이 액세스 오류 및 기타 탐지 가능한 버그에 대한 액세스를 방지하기 위해 런타임 체크를 지원합니다.이러한 검사는 런타임 효율성을 위해 사용하지 않도록 설정할 수 있지만 대부분의 경우 효율적으로 컴파일할 수 있습니다.프로그램 검증을 지원하는 설비도 포함되어 있습니다.이러한 이유로 Ada는 사고, 부상 또는 심각한 재정적 손실과 같은 매우 심각한 결과를 초래할 수 있는 중요한 시스템에 널리 사용됩니다.에이다가 사용되는 시스템의 예로는 항전, 항공 교통 관제, 철도, 은행, 군사 및 우주 [18][19]기술이 있습니다.

Ada의 동적 메모리 관리는 고급이며 타입 세이프입니다.Ada에는 범용 또는 타입이 없는 포인터가 없습니다.또, 포인터 타입을 암묵적으로 선언하는 것도 아닙니다.대신 모든 다이내믹메모리 할당 및 할당 해제는 명시적으로 선언된 접근유형을 통해 이루어져야 합니다.각 액세스 유형에는 메모리 관리의 낮은 수준의 세부 사항을 처리하는 관련 스토리지 풀이 있습니다. 프로그래머는 기본 스토리지 풀을 사용하거나 새로운 스토리지 풀을 정의할 수 있습니다(특히 불균일한 메모리 액세스와 관련이 있습니다).심지어 모두 같은 유형을 지정하지만 서로 다른 스토리지 풀을 사용하는 여러 다른 액세스 유형을 선언할 수도 있습니다.또한 이 언어는 컴파일 시 및 실행 시 접근성 체크를 제공하여 접근 값이 가리키는 [20]오브젝트 유형보다 오래가지 않도록 합니다.

언어의 의미론에서는 액세스 불가능한 객체의 자동 가비지 수집이 가능하지만 실시간시스템에서 예측할 수 없는 동작을 일으키기 때문에 대부분의 구현에서는 기본적으로 지원되지 않습니다.Ada는 제한된 형식의 지역 기반 메모리 관리를 지원합니다. 또한 스토리지 풀을 창의적으로 사용하면 제한된 형식의 자동 가비지 수집을 제공할 수 있습니다. 스토리지 풀을 파괴하면 풀에 있는 모든 개체도 파괴되기 때문입니다.

대시와 유사한 이중 대시("--")는 주석 텍스트를 나타냅니다.닫히지 않은 코멘트가 실수로 소스 코드의 전체 섹션을 무효로 하는 것을 방지하기 위해 코멘트는 맨 마지막에 종료됩니다.코드 블록 전체를 비활성화하려면 각 행(또는 열)의 접두사 앞에 각각 "--"를 붙여야 합니다.페이지 아래쪽에 반복된 "--" 열로 비활성화된 코드를 명확하게 나타내지만, 큰 블록의 실험적인 비활성화/재활성화는 더 오래 걸리는 프로세스가 됩니다.

세미콜론(";")은 문의 터미네이터이며 null 또는 no-operation 문은 다음과 같습니다.null;싱글.;종료할 스테이트먼트가 없는 경우는 허용되지 않습니다.

대부분의 ISO 표준과 달리 Ada 언어 정의(Ada Reference Manual 또는 ARM 또는 LRM이라고도 함)는 자유 콘텐츠입니다.따라서, 이것은 에이다 컴파일러를 구현하는 프로그래머뿐만 아니라 에이다 프로그래머들에게도 공통적인 레퍼런스입니다.참조 매뉴얼과는 별도로 언어 설계와 다양한 언어 구조의 사용을 설명하는 광범위한 근거 문서도 있습니다.이 문서는 프로그래머에 의해서도 널리 사용되고 있습니다.언어가 개정되었을 때 새로운 근거 문서가 작성되었다.

많은 Ada 프로그래머들이 Ada 소스 코드를 작성하는 데 도움을 주기 위해 사용하는 하나의 주목할 만한 자유 소프트웨어 도구는 GNU 컴파일러 컬렉션일부인 GNAT Programming Studio입니다.

역사

1970년대에 미국 국방부(DoD)는 임베디드 컴퓨터 시스템 프로젝트에 사용되는 다양한 프로그래밍 언어의 수에 대해 우려하게 되었습니다.이들 중 대부분은 구식이거나 하드웨어에 의존하며 어느 것도 안전한 모듈러 프로그래밍을 지원하지 않았습니다.1975년, High Order Language Working Group(HOLWG; 상위 언어 작업 그룹)이라는 작업 그룹부서와 영국 국방부의 요건에 일반적으로 적합한 프로그래밍 언어를 찾거나 만들어 이 숫자를 줄이기 위해 결성되었다.스트로맨의 독창적인 제안으로 시작하는 많은 반복 끝에, 최종적인 프로그래밍 언어는 에이다라고 명명되었다.이러한 프로젝트에 사용되는 고급 프로그래밍 언어의 수는 1983년 450개 이상에서 1996년 37개로 감소했다.

HOLWG 작업 그룹은 Steelman 언어 요건을 작성했습니다.이것은 프로그래밍 언어가 충족해야 한다고 생각하는 요건을 기술한 일련의 문서입니다.많은 기존 언어들이 공식적으로 검토되었지만, 연구팀은 1977년에 규격에 부합하는 기존 언어가 없다고 결론지었다.

어거스타 아다 킹, 러브레이스 백작 부인

새로운 프로그래밍 언어에 대한 제안서가 발행되었고, 네 명의 계약자가 Red(Benjamin Brosgol이 이끄는 인터메트릭), Green(Jean Ichbiah가 이끄는 CII Honeywell Bull),[21] Blue(John Goodenough가 이끄는 SRI) 및 Yellow(Jayzen International이 이끄는 SPI)라는 이름으로 제안서를 개발하도록 고용되었습니다.1978년 4월, 대중의 정밀 조사를 거친 후, 적색과 녹색 제안은 다음 단계로 넘어갔다.1979년 5월, CII 허니웰 불에서 장 이치비아가 디자인한 그린 프로포절(Green proposal)이 선정되었고 러브레이스 백작부인 오거스타 아다의 이름을 따 에이다라는 이름이 붙여졌다.이 제안은 Ichbiah와 그의 그룹이 1970년대에 개발한 언어 LIS의 영향을 받았다.예비 Ada 참조 매뉴얼은 1979년 6월 ACM SIGPLAN Notice에 발표되었다.군사 표준 참고 매뉴얼은 1980년 12월 10일(에이다 러브레이스 생일)에 승인되었으며, 에이다 러브레이스 탄생 연도를 기념하여 MIL-STD-1815라는 번호가 부여되었다.1981년, C. A. R. Hoare의 튜링상 연설을 이용하여 에이다가 지나치게 복잡하고 신뢰할 [22]수 없다고 비판했지만, 이후 그가 에이다 [23]교과서를 위해 쓴 서문에서 물러나는 것처럼 보였다.

에이다는 초창기에 프로그래밍계 전반에서 많은 관심을 끌었다.지원자 등은 국방 관련 [24]업무뿐만 아니라 범용 프로그래밍에서도 지배적인 언어가 될 수 있다고 전망했다.Ichbiah는 공개적으로 10년 안에 두 개의 프로그래밍 언어만 남게 될 것이라고 말했다.에이다와 [25]리스프초기 Ada 컴파일러는 크고 복잡한 언어를 구현하는데 어려움을 겪었고 컴파일 시간과 런타임 성능이 모두 느리고 툴이 [24]원시적인 경향이 있었습니다.컴파일러 벤더는 Ada 언어 작업의 [25]또 다른 새로운 기능에 필요한 대규모 언어 적합성 테스트, 정부 필수 "ACVC" 검증 스위트를 통과시키는 데 대부분의 노력을 쏟았습니다.1975-1983년에 시작된 컴퓨터 해커의 속어 사전인 The Jonesons File에이다에 대한 기사에서 다음과 같이 언급하고 있다. "그것은 정확히 예상할 수 있는 것이다. 위원회에 의해 설계되었다. 사용하기 어렵다. 그리고 전체적으로 수 십억 달러의 엄청난 돈벌이가 될 것이다.에이다 러브레이스...그 이름이 나중에 쓰이게 되면 분명 창백해질 것이다.그에 대해 가장 친절한 말은 아마도 그 거대한 코끼리 같은 몸집 안에서 빠져나오라고 외치는 좋은 작은 언어가 있다는 것이다.

최초의 Ada 실장은 1983년 4월 11일에 인정된 NYU Ada/Ed 번역기입니다.[26]NYU Ada/Ed는 고급 설정 언어 [27]SETL로 구현됩니다.Alsys, TeleSoft, DDC-I, Advanced Computer Technologies, Tartan Laboraties, Irvine Compiler, TLD Systems 및 Verdix[28]포함한 여러 상용 기업이 Ada 컴파일러 및 관련 개발 도구를 제공하기 시작했습니다.방위산업, 항공우주산업 또는 관련 산업에서 중요한 사업을 하고 있던 컴퓨터 제조업체들도 플랫폼에 Ada 컴파일러와 툴을 제공했습니다.이들 중에는 Concurrent Computer Corporation, Cray Research, Inc., Harris Computer Systems 및 Siemens Nixdorf Informations SystemE AG [28]등이 있습니다.

1991년 미국 국방부는 모든 소프트웨어에 [29]대해 Ada(Ada 명령)의 사용을 요구하기 시작했지만, 이 규칙에 대한 예외가 종종 [24]허용되었다.국방부가 상용 기성품([24]COTS) 기술을 채택하기 시작하면서 국방부의 Ada 명령은 1997년에 사실상 폐지되었습니다.다른 나토 국가에서도 유사한 요건이 존재했다.Ada는 명령과 통제 및 기타 기능을 포함하는 NATO 시스템에 필요했으며, Ada는 스웨덴, 독일 및 [30]캐나다와 같은 국가에서 국방 관련 애플리케이션에 필수 또는 선호 언어였다.

1980년대 후반과 1990년대 초반까지, 에이다 컴파일러는 성능이 향상되었지만, 대부분의 실시간 프로그래머들이 [25]익숙한 것과 다른 태스크 모델을 포함하여 에이다의 능력을 완전히 활용하는데는 여전히 장벽이 있었다.

Ada의 안전 중요 지원 기능 때문에, 현재는 군사 애플리케이션뿐만 아니라, 소프트웨어 버그가 심각한 결과를 초래할 수 있는 상업 프로젝트, 예를 들어, 아리안 4, 5같은 상업용 로켓, 위성 및 기타 우주 시스템, 철도 및 [19]은행에도 사용되고 있습니다.예를 들어, 보잉 777의 플라이 바이 와이어 시스템 소프트웨어인 비행기 정보 관리 시스템은 Ada로 [31][32]작성되었습니다.DDC-I의 컨설턴트와 협력하여 Honeywell Air Transport Systems에 의해 개발된 이 시스템은 민간 또는 [31][32]군용 에이다 프로젝트 중 가장 잘 알려진 것이 되었습니다.Canadian Automated Air Traffic System은 100만 줄의 Ada(SLOC 카운트)로 작성되었다.고급 분산 처리, 분산 Ada 데이터베이스 및 객체 지향 설계를 특징으로 했습니다.Ada는 다른 항공 교통 시스템에도 사용된다. 예를 들어 영국의 차세대 iFACT([33]Interim Future Area Control Tools Support) 항공 교통 제어 시스템은 SPARK Ada를 사용하여 설계 및 구현된다.또한 TGV 고속철도의 프랑스 TVM 차내 신호 전달 시스템 및 파리, 런던, 홍콩 및 뉴욕의 [19][34]지하철 교외 열차에도 사용됩니다.

표준화

이 언어는 1983년에 ANSI 표준이 되었고(ANSI/MIL-STD 1815A), 프랑스어로 번역된 후 영어의 추가 변경 없이 1987년에 ISO 표준이 되었다(ISO-8652:1987).이 버전의 언어는 일반적으로 ANSI에 의해 채택된 날짜부터 Ada 83으로 알려져 있지만 ISO에 의해 채택된 날짜부터 Ada 87로 불리기도 합니다.

공동 ISO/IEC/ANSI 표준(ISO/IEC 8652:1995)인 Ada 95는 1995년 2월에 발표되었으며, Ada 95는 최초의 ISO 표준 객체 지향 프로그래밍 언어가 되었습니다.표준 개정과 향후 수용을 돕기 위해 공군GNAT 컴파일러 개발에 자금을 지원했다.현재 GNAT 컴파일러는 GNU 컴파일러 컬렉션의 일부입니다.

에이다 언어의 기술적 내용을 개선하고 업데이트하기 위한 작업이 계속되고 있습니다.Ada 95에 대한 기술 코리겐덤은 2001년 10월에 발표되었으며, 주요 개정판인 ISO/IEC 8652:1995/Amd 1:2007이 2007년 3월 9일에 발표되었다.

스톡홀름에서 개최된 2012 Ada-Europe 회의에서 Ada Resource Association(ARA)과 Ada-Europe는 최신 버전의 Ada 언어 설계 완료와 국제기구국제기구(ISO)의 ISO/IEC JTC 1/SC 22/WG 9에 레퍼런스 매뉴얼 제출을 발표했습니다.위원회(IEC)의 승인을 받습니다.ISO/IEC 8652:2012는 2012년 [14]12월에 발행되었습니다.

기타 관련 표준에는 ISO/IEC 8651-3:1988 정보처리 시스템-컴퓨터 그래픽스-그래픽 커널 시스템(GKS) 언어 바인딩-파트 3:Ada포함됩니다.

언어 구성

Ada는 ALGOL과 같은 프로그래밍 언어로 if, then, else, while, for 등과 같은 예약된 단어를 가진 제어 구조를 특징으로 합니다.그러나 Ada는 원본 ALGOL 60에 포함되지 않은 많은 데이터 구조화 기능 및 유형 정의, 레코드, 포인터, 열거같은 다른 추상화도 가지고 있습니다.그러한 건축물은 부분적으로 파스칼로부터 물려받거나 파스칼로부터 영감을 받았다.

아다어로 "안녕, 세상아!"

언어 구문의 일반적인 예는 Hello world 프로그램입니다(hello.adb).

와 함께 Ada.텍스트_입출력; 사용하다 Ada.텍스트_입출력; 절차. 안녕  시작한다.    Put_Line(풋_라인) ("안녕, 세상아!"); 끝. 안녕; 

이 프로그램은 자유롭게 사용할 수 있는 오픈 소스 컴파일러 GNAT를 사용하여 컴파일할 수 있습니다.

gnatmake hello.adb

데이터형

에이다의 타입 시스템은 미리 정의된 프리미티브 타입의 세트를 기반으로 하지 않지만 사용자가 자신의 타입을 선언할 수 있습니다.또한 이 선언은 유형의 내부 표현에 기초하지 않고 달성해야 할 목표를 기술하는 데 기초한다.이를 통해 컴파일러는 유형에 적합한 메모리 크기를 결정하고 컴파일 시 및 실행 시 유형 정의 위반(범위 위반, 버퍼 오버런, 유형 일관성 등)을 확인할 수 있습니다.Ada는 범위, 모듈로 유형, 집계 유형(레코드 및 배열) 및 열거 유형에 의해 정의된 숫자 유형을 지원합니다.액세스 유형은 지정된 유형의 인스턴스에 대한 참조를 정의합니다.입력되지 않은 포인터는 허용되지 않습니다.언어에서 제공되는 특수 유형은 작업 유형 및 보호 유형입니다.

예를 들어, 날짜는 다음과 같이 나타낼 수 있습니다.

유형 day_type(일형)    범위    1 ..   31; 유형 Month_type(월형)  범위    1 ..   12; 유형 Year_type(년형)   범위 1800 .. 2100; 유형 몇시간.  모드 24; 유형 평일  (월요일., 화요일., 수요일, 목요일., 금요일., 토요일에 하려고요., 일요일.);  유형 날짜.     기록.      요일   : day_type(일형);       : Month_type(월형);      연도  : Year_type(년형);    종료 레코드; 

유형은 하위 유형을 선언하여 조정할 수 있습니다.

서브타입 동작_몇시간.  몇시간. 범위 0 .. 12;            -- 하루 최대 12시간 근무 서브타입 작업_일  평일 범위 월요일. .. 금요일.;   -- 근무일수  작업_로드: 일정한 배열(작업_일)  동작_몇시간.  -- 암묵적 유형 선언    := (금요일. => 6, 월요일. => 4, 다른이들 => 10);           -- 초기화 작업시간 조회 테이블 

유형에는 limited, abstract, private 등의 수식어가 있을 수 있습니다.개인 유형은 액세스만 가능하며 제한된 유형은 [35]개인 유형을 정의하는 패키지의 범위 내에서만 수정 또는 복사할 수 있습니다.Ada 95는 오브젝트 지향 타입 확장을 위한 추가 기능을 추가합니다.

제어 구조

Ada는 구조화된 프로그래밍 언어입니다. 즉, 제어의 흐름이 표준문으로 구조화됨을 의미합니다.모든 표준 구성 및 딥 레벨 조기 종료가 지원되므로 지원되는 "go to" 명령을 사용할 필요가 거의 없습니다.

-- a가 b와 같지 않은 경우 루프합니다. 하는 동안에 a /= b 고리   아다.텍스트_IO.Put_Line(풋_라인) ("대기 중"); 끝. 고리;  한다면 a > b 그리고나서   아다.텍스트_IO.Put_Line(풋_라인) ("조건 충족"); 또 다른   아다.텍스트_IO.Put_Line(풋_라인) ("조건이 충족되지 않음"); 끝. 한다면;  위해서 i  1 .. 10 고리   아다.텍스트_IO.놓다 ("반복: ");   아다.텍스트_IO.놓다 (i);   아다.텍스트_IO.Put_Line(풋_라인); 끝. 고리;  고리   a := a + 1;   퇴장 언제 a = 10; 끝. 고리;  사례. i    언제 0 => 아다.텍스트_IO.놓다 (제로);   언제 1 => 아다.텍스트_IO.놓다 ('하나');   언제 2 => 아다.텍스트_IO.놓다 ('둘');   -- 케이스 스테이트먼트는 가능한 모든 케이스에 대응해야 합니다.   언제 다른이들 => 아다.텍스트_IO.놓다 ("상기 사항 없음"); 끝. 사례.;  위해서 주중  평일'범위 고리               -- 열거를 루프합니다.    Put_Line(풋_라인) ( 평일'이미지(주중) );         -- 열거의 출력 문자열 표현    한다면 주중  작업_일 그리고나서               -- 열거의 서브타입 체크       Put_Line(풋_라인) ( "를 위해 일하다" &                동작_몇시간.'이미지 (작업_로드(주중)) ); -- 룩업 테이블에 대한 액세스    끝. 한다면; 끝. 고리; 

패키지, 절차 및 기능

에이다 프로그램의 일부에는 패키지, 절차 및 기능이 포함됩니다.

예: 패키지 사양(example.ads)

패키지        유형 번호  범위 1 .. 11;      절차. 인쇄_and_증가 (j: 나가. 번호); 끝. ; 

패키지 본문(example.adb)

와 함께 Ada.텍스트_입출력; 패키지       i : 번호 := 번호'첫번째;    절차. 인쇄_and_증가 (j: 나가. 번호)       기능. 다음 분. (k: 번호) 돌아가다 번호      시작한다.       돌아가다 k + 1;     끝. 다음 분.;    시작한다.     아다.텍스트_IO.Put_Line(풋_라인) ( "합계는 다음과 같습니다. & 번호'이미지(j) );     j := 다음 분. (j);   끝. 인쇄_and_증가;  -- 패키지가 상세하게 설명될 때 패키지의 초기화가 실행됩니다. 시작한다.   하는 동안에 i < > 번호'지난 고리     인쇄_and_증가 (i);   끝. 고리; 끝. ; 

이 프로그램은 예를 들어 자유롭게 사용할 수 있는 오픈 소스 컴파일러 GNAT를 사용하여 컴파일할 수 있습니다.

gnatmake -z 예제.adb

패키지, 프로시저 및 함수는 깊이에 구애받지 않고 논리적으로 가장 바깥쪽 블록이 될 수도 있습니다.

각 패키지, 프로시저 또는 함수는 자체 상수, 유형, 변수 및 기타 프로시저, 함수 및 패키지의 선언을 가질 수 있으며, 이들은 임의의 순서로 선언할 수 있습니다.

동시성

Ada는 태스크 기반 동시성을 위한 언어 지원을 제공합니다.Ada의 기본 동시 유닛은 태스크이며, 이는 빌트인 제한 유형입니다.태스크는 두 부분으로 구분됩니다. 태스크 선언은 태스크 인터페이스를 정의하고(타입 선언과 유사), 태스크 본체는 태스크 구현을 지정합니다.구현에 따라 Ada 태스크는 운영 체제 스레드 또는 프로세스에 매핑되거나 Ada 런타임에 따라 내부적으로 스케줄됩니다.

태스크에는 동기화 항목(동기 메시지 전달 형식)이 있을 수 있습니다.작업 항목은 작업 사양에 선언됩니다.각 태스크 항목은 태스크 본문 내에 하나 이상의 accept 문을 가질 수 있습니다.태스크의 제어 플로우가 accept 스테이트먼트에 도달하면 대응하는 엔트리가 다른 태스크에 의해 호출될 때까지 태스크는 차단됩니다( 마찬가지로 호출된 태스크는 대응하는 accept 스테이트먼트에 도달할 때까지 차단됩니다).작업 항목에는 절차와 유사한 매개 변수가 포함될 수 있으므로 작업이 데이터를 동기화할 수 있습니다.선택한 문장과 함께 accept 문장에 대한 가드를 정의할 수 있습니다(Dijkstra의 가드가드 명령과 유사).

또한 Ada는 상호 배제를 위한 보호 대상도 제공합니다.보호 오브젝트는 모니터와 같은 구성이지만 시그널링에는 조건부 변수 대신 가드를 사용합니다(조건부 크리티컬 영역과 유사).보호된 개체는 데이터 캡슐화와 모니터로부터의 안전한 상호 배제 및 조건부 중요 영역으로부터의 엔트리 가드를 결합합니다.기존 모니터에 비해 가장 큰 장점은 시그널링에 조건부 변수가 필요하지 않기 때문에 잘못된 잠금 시멘틱으로 인한 잠재적인 교착 상태를 피할 수 있다는 것입니다.작업과 마찬가지로 보호된 개체는 기본 제공 제한 유형이며 선언 부분과 본문도 있습니다.

보호된 개체는 캡슐화된 개인 데이터(보호 대상 개체 내에서만 액세스할 수 있음)와 상호 배타성이 보장되는 절차, 함수 및 엔트리로 구성됩니다(부작용이 없어야 하므로 다른 기능과 동시에 실행할 수 있는 유일한 기능 제외).동일한 보호된 개체 내에서 다른 작업이 현재 실행되고 있는 경우 보호된 개체를 호출하는 작업이 차단되고 이 다른 작업이 보호된 개체를 벗어날 때 해제됩니다.차단된 작업은 도착 시간별로 정렬된 보호된 개체에 대기됩니다.

보호 객체 엔트리는 절차와 유사하지만 가드가 추가로 있습니다.가드가 false로 평가되면 호출 태스크는 차단되어 해당 엔트리의 큐에 추가됩니다.현재 보호대상 객체 내에서 실행되고 있는 태스크가 없기 때문에 다른 태스크를 보호대상 객체에 허용할 수 있습니다.가드에 대한 평가가 변경될 수 있는 유일한 시점이기 때문에 작업이 보호 객체를 벗어날 때마다 가드를 재평가합니다.

엔트리에 대한 콜은 같은 시그니처를 가진 다른 엔트리에 큐잉할 수 있습니다.큐잉된 작업은 차단되어 타깃엔트리의 큐에 추가됩니다.즉, 보호된 오브젝트가 해방되어 다른 작업을 허용할 수 있습니다.

Ada의 select 문을 사용하여 논블로킹엔트리 콜을 구현하고 엔트리의 비결정적 선택(가드도 포함), 타임아웃 및 중단을 받아들일 수 있습니다.

다음 예시는 Ada에서의 동시 프로그래밍의 몇 가지 개념을 보여 줍니다.

와 함께 Ada.텍스트_입출력; 사용하다 Ada.텍스트_입출력;  절차. 교통.      유형 비행기_아이디  범위 1..10;             -- 비행기 10대     작업 유형 비행기 (아이디:비행기_아이디);        -- 초기화 매개변수로 ID를 사용하여 비행기를 나타내는 작업    유형 비행기_접근  접근 비행기;     -- 비행기 참조 유형     보호되고 있다 유형 런웨이                      -- 공유 활주로(동시 접근을 허용하도록 보호됨)       엔트리 Assign_Aircraft(할당_항공기) (아이디:비행기_아이디);  -- 모든 엔트리는 상호 배타적으로 보증됩니다.       엔트리 Cleared_Runway (아이디:비행기_아이디);       엔트리 Wait_For_Clear(대기);    사적인       분명한: 부울 := 진실의;                   -- 보호되는 개인 데이터 - 일반적으로 플래그만 있는 것이 아니라...    끝. 런웨이;    유형 활주로_접근  접근 모든. 런웨이;     -- 항공 교통 관제사 업무는 이착륙 요청을 받는다.    작업 유형 컨트롤러 (마이_런웨이:활주로_접근)        -- 동기 메시지 전달 태스크 항목       엔트리 요청_벗다 (아이디: 비행기_아이디; 벗다:나가. 활주로_접근);       엔트리 요청_접근(아이디: 비행기_아이디; 접근:나가. 활주로_접근);    끝. 컨트롤러;     -- 인스턴스 할당    활주로 1    : 에일리어스 런웨이;              -- 활주로를 인스턴스화하다    컨트롤러 1: 컨트롤러 (활주로 1'접근); -- 및 이를 관리하기 위한 컨트롤러     ------상기 타입의 실장 ---------    보호되고 있다  런웨이        엔트리 Assign_Aircraft(할당_항공기) (아이디:비행기_아이디)  언제 분명한    -- 엔트리 가드 - 조건이 true가 될 때까지 호출 태스크는 차단됩니다.       시작한다.        분명한 := 거짓의;        Put_Line(풋_라인) (비행기_ID'이미지 (ID) & "활주로에");       끝.;        진입 Cleared_Runway (ID:Airplane_ID)  언제 것은 아니다. 분명한        시작한다.          분명한 := 진실의;          Put_Line (Airplane_ID'이미지 (ID) & "활주로 해제");       끝.;        엔트리 Wait_For_Clear(대기)  언제 분명한        시작한다.          무효;      -- 여기서 아무것도 할 필요가 없습니다. - 태스크는 "Clear"가 참일 경우에만 입력할 수 있습니다.       끝.;    끝. 런웨이;     작업  컨트롤러     시작한다.       고리          마이_런웨이.Wait_For_Clear(대기);   -- 활주로를 이용할 수 있을 때까지 기다립니다(호출).          선택한다.                      -- 두 가지 유형의 요청을 기다립니다(먼저 실행 가능).             언제 요청_접근'세어보세요 = 0 =>  -- guard 문 - Request_Access에 대기 중인 태스크가 없는 경우에만 수락합니다.              받아들이다 요청_벗다 (아이디:  비행기_아이디; 벗다: 나가. 활주로_접근)              하다                                 -- 동기화된 부품의 시작                마이_런웨이.Assign_Aircraft(할당_항공기) (아이디);  -- 예비 활주로(보호 객체가 비지 상태이거나 엔트리 가드가 false일 경우 콜을 차단합니다)                벗다 := 마이_런웨이;            -- "out" 매개 변수 값을 할당하여 어느 활주로에 있는지 비행기에 알립니다.              끝. 요청_벗다;               -- 동기화된 부품의 끝          또는             받아들이다 요청_접근 (아이디:  비행기_아이디; 접근: 나가. 활주로_접근) 하다                마이_런웨이.Assign_Aircraft(할당_항공기) (아이디);                접근 := 마이_런웨이;             끝. 요청_접근;          또는                          -- 호출할 수 있는 태스크가 남아 있지 않으면 종료합니다.             종료하다;          끝. 선택한다.;       끝. 고리;    끝.;     작업  비행기        르위 : 활주로_접근;    시작한다.       컨트롤러 1.요청_벗다 (아이디, 르위); -- 이 콜은 컨트롤러 태스크가 승인 블록을 받아들여 완료할 때까지 차단됩니다.       Put_Line(풋_라인) (비행기_아이디'이미지 (아이디) & 이륙...");       지연시키다 2.0;       르위.Cleared_Runway (아이디);               -- Rwy의 "Clear"가 false가 되어 다른 태스크가 보호대상 오브젝트 내에 있으면 안 되기 때문에 콜은 차단되지 않습니다.       지연시키다 5.0; --조금씩 날아다닌다...       고리          선택한다.   -- 활주로를 요청하려고 합니다.             컨트롤러 1.요청_접근 (아이디, 르위); --이것은 블로킹콜입니다.- accept block에 도달하는 컨트롤러에서 실행되며 완료 시 반환됩니다.             퇴장; - 호출이 다시 오면 착륙할 수 있습니다 - 블록을 선택하고 계속 진행...          또는             지연시키다 3.0;  -- timeout - 3초 이내에 응답이 없으면 다른 작업을 수행합니다(다음 블록의 모든 작업).             Put_Line(풋_라인) (비행기_아이디'이미지 (아이디) & "유지 패턴");  -- 메시지를 인쇄하기만 하면 됩니다.          끝. 선택한다.;       끝. 고리;       지연시키다 4.0;  --착륙 접근...       Put_Line(풋_라인) (비행기_아이디'이미지 (아이디) & "터치 다운!);       르위.Cleared_Runway (아이디);  활주로에 우리가 끝났다고 알린다.    끝.;     New_Airplane(신규_비행기): 비행기_접근;  시작한다.    위해서 I  비행기_아이디'범위 고리  -- 몇 가지 비행기 작업을 만듭니다.       New_Airplane(신규_비행기) := 신규 비행기 (I); --작성 후 바로 실행이 시작됩니다.       지연시키다 4.0;    끝. 고리; 끝. 교통.; 

프래그마

플러그마는 컴파일러에 정보를 전달하여 컴파일된 [36]출력을 특정 조작할 수 있도록 하는 컴파일러 명령어입니다.특정 [37]플러그마는 언어에 내장되어 있는 반면 다른 플러그마는 구현에 고유합니다.

컴파일러 플러그마의 일반적인 사용 예로는 런타임타입 체크나 어레이의 서브스크립트 경계 체크 등의 특정 기능을 비활성화하거나 함수 호출 대신 오브젝트 코드를 삽입하도록 컴파일러에 지시하는 것이 있습니다(C/C++가 인라인 함수에서 하는 경우).

범용

아다는 1977년부터 1980년까지 처음 디자인된 이래 제네릭스를 가지고 있다.표준 라이브러리는 제네릭스를 사용하여 많은 서비스를 제공합니다.Ada 2005는 C++의 표준 템플릿 라이브러리에서 영감을 얻은 포괄적인 범용 컨테이너 라이브러리를 표준 라이브러리에 추가합니다.

범용 유닛은 하나 이상의 일반적인 형식 파라미터를 사용하는 패키지 또는 하위 프로그램입니다.

범용 형식 파라미터는 값, 변수, 상수, 유형, 서브프로그램 또는 다른 지정된 범용 유닛의 인스턴스입니다.일반적인 형식 유형의 경우 구문은 이산, 부동 소수점, 고정 소수점, 액세스(포인터) 유형 등을 구분합니다.일부 형식 매개 변수에는 기본값을 지정할 수 있습니다.

범용 유닛을 인스턴스화하기 위해 프로그래머는 각 포멀의 실제 파라미터를 전달합니다.그러면 일반 인스턴스는 다른 유닛과 동일하게 동작합니다.루프 내부 등 런타임에 범용 유닛을 인스턴스화할 수 있습니다.

「 」를 참조해 주세요.

  • APSE – Ada에서 소프트웨어 개발을 지원하는 프로그래밍 환경 사양
  • Ravenscar 프로파일– 안전에 중요한 하드 실시간 컴퓨팅용으로 설계된 Ada 태스크 기능의 서브셋
  • SPARK(프로그래밍 언어) – Ada의 매우 제한된 서브셋으로 구성된 프로그래밍 언어로, 바람직한 컴포넌트 동작 및 개별 런타임 요건을 설명하는 메타 정보가 주석을 달았습니다.

레퍼런스

  1. ^ "Ada2012 Rationale" (PDF). adacore.com. Archived (PDF) from the original on 18 April 2016. Retrieved 5 May 2018.
  2. ^ "Technical Corrigendum for Ada 2012 published by ISO". Ada Resource Association. 2016-01-29. Retrieved 2016-02-23.
  3. ^ "Consolidated Ada 2012 Language Reference Manual". Ada Conformity Assessment Authority. Archived from the original on 2016-03-03. Retrieved 2016-02-23.
  4. ^ 무료 다운로드 : https://www.adacore.com/download)
  5. ^ "PTC ObjectAda". PTC.com. Retrieved 2014-01-27.
  6. ^ "MapuSoft Ada-C/C++ changer". 16 April 2019.
  7. ^ "AdaMagic with C Intermediate certificate".
  8. ^ Ada Regonics, 1986, 페이지 23, 70, 110–114, 137, 165, 236
  9. ^ "Chapel spec (Acknowledgements)" (PDF). Cray Inc. 2015-10-01. Retrieved 2016-01-14.
  10. ^ "Drago". Archived from the original on 2020-09-14. Retrieved 2018-08-06.
  11. ^ "Griffin".
  12. ^ "SPARforte".
  13. ^ Ganssle, Jack (2013-05-29). "Ada Resource Association – News and resource for the Ada programming language". Adaic.org. Retrieved 2013-06-14.
  14. ^ a b "ISO/IEC 8652:2012 Information technology – Programming languages – Ada". International Organization for Standardization. Retrieved 2012-12-23.
  15. ^ "The Ada Programming Language". University of Mich. Archived from the original on 2016-05-22. Retrieved 27 May 2016.
  16. ^ Fuegi, J; Francis, J (2003). "Lovelace & Babbage and the creation of the 1843 'notes'". IEEE Annals of the History of Computing. 25 (4): 16–26. doi:10.1109/MAHC.2003.1253887. S2CID 40077111.
  17. ^ "Concurrency - Chapter 6 - Ada 95 QUALITY AND STYLE Guide". adaic.org. Retrieved November 5, 2021.
  18. ^ Taft, S. Tucker; Olsen, Florence (1999-06-30). "Ada helps churn out less-buggy code". Government Computer News. pp. 2–3. Retrieved 2010-09-14.
  19. ^ a b c Feldman, Michael. "Who's using Ada?". SIGAda Education Working Group.
  20. ^ ADA에서의 안전한 동적 메모리 관리 없음: Safe Rust에서의 Linux 커널 모듈 쓰기 - Geoffrey Thomas & Alex Gaynor, Linux Foundation, 2019-10-02
  21. ^ "John Goodenough SEI Staff Profile". Sei.cmu.edu. Retrieved 2014-01-27.
  22. ^ C.A.R., Hoare (1981). "The Emperor's Old Clothes" (PDF). Communications of the ACM. Association for Computing Machinery. 24 (2): 75–83. doi:10.1145/358549.358561. S2CID 97895.
  23. ^ Watt, D.A.; Wichmann, B.A.; Findlay, W. (1987). Ada: Language and Methodology. Prentice-Hall.
  24. ^ a b c d Sward, Ricky E. (November 2010). "The rise, fall and persistence of Ada". SIGAda '10: Proceedings of the ACM SIGAda annual international conference on SIGAda. pp. 71–74. doi:10.1145/1879063.1879081.
  25. ^ a b c Rosen, J-P. (August 2009). "The Ada Paradox(es)". Ada Letters. ACM SIGAda. 24 (2): 28–35. doi:10.1145/1620593.1620597. S2CID 608405.
  26. ^ SofTech Inc. (1983-04-11). "Ada Compiler Validation Summary Report: NYU Ada/ED, Version 19.7 V-001". Waltham, MA. Archived from the original on 2012-03-12. Retrieved 2010-12-16.
  27. ^ Dewar, Robert B. K.; Fisher, Gerald A. Jr.; Schonberg, Edmond; Froelich, Robert; Bryant, Stephen; Goss, Clinton F.; Burke, Michael (November 1980). "The NYU Ada Translator and Interpreter". ACM SIGPLAN Notices – Proceedings of the ACM-SIGPLAN Symposium on the Ada Programming Language. 15 (11): 194–201. doi:10.1145/948632.948659. ISBN 0-89791-030-3. S2CID 10586359.
  28. ^ a b "Ada Validated Compilers List". Ada Information Clearinghouse. July 1, 1992. pp. 1–36.
  29. ^ Ada Information Clearinghouse (1983-04-11). "The Congressional Ada Mandate". Archived from the original on 2016-03-04. Retrieved 2015-06-07.
  30. ^ Babiak, Nicholas J. (1989). Ada, the New DoD Weapon System Computer Language – Panacea or Calamity (PDF). Air University (United States Air Force). pp. 39–40. Archived (PDF) from the original on December 15, 2019.
  31. ^ a b Rehmer, Karl (2009). "The HADS Team". In Stellman, Andrew; Greene, Jennifer (eds.). Beautiful Teams: Inspiring and Cautionary Tales from Veteran Team Leaders. Sebastopol, California: O'Reilly. pp. 299–312.
  32. ^ a b Wolfe, Alexander (October 2004). "There's Still Some Life Left in Ada". ACM Queue. 2 (7): 28–31. doi:10.1145/1035594.1035608.
  33. ^ AdaCore. "GNAT Pro Chosen for UK's Next Generation ATC System". Archived from the original on 2010-12-24. Retrieved 2011-03-01.
  34. ^ AdaCore. "Look Who's Using Ada". Archived from the original on 2010-12-24. Retrieved 2011-03-01.
  35. ^ "Ada Syntax Card" (PDF). Archived from the original (PDF) on 6 July 2011. Retrieved 28 February 2011.
  36. ^ "Ada 83 LRM, Sec 2.8: Pragmas". Archive.adaic.com. Retrieved 2014-01-27.
  37. ^ "Ada 83 LRM, Appendix/Annex B: Predefined Language Pragmas". Archive.adaic.com. Archived from the original on 2012-02-06. Retrieved 2014-01-27.

국제 표준

근거

이 문서들은 인쇄물을 포함한 다양한 형태로 출판되었습니다.

책들

아카이브

  • Ada Programming Language Materials, 1981~1990.미네소타 대학교 찰스 배비지 연구소입니다Ada 언어용으로 설계된 소프트웨어 제품 관련 자료, Ada 9X 프로젝트 보고서, 기술 보고서, 작업 문서, 뉴스레터 및 사용자 그룹 정보를 포함한 미국 정부 간행물.

외부 링크