에이다 (프로그래밍 언어)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
에이다(Ada)는 1970년대 미국 국방부 주도로 개발된 프로그래밍 언어이다. 강력한 타이핑, 모듈식 프로그래밍, 병렬 컴퓨팅, 예외 처리, 제네릭 프로그래밍 등 다양한 기능을 제공하며, 특히 런타임 검사를 통해 높은 신뢰성과 안전성을 보장한다. 에이다는 군사, 항공, 철도, 은행 등 안전이 중요한 분야에서 활용되며, 대한민국 국군에서도 K2 전차, K9 자주포, T-50 고등훈련기 등 주요 무기체계 소프트웨어 개발에 사용되고 있다.
더 읽어볼만한 페이지
- 에이다 (프로그래밍 언어) - 에이다 러브레이스
에이다 러브레이스는 영국의 귀족이자 수학자로, 찰스 배비지의 해석기관 연구를 통해 최초의 컴퓨터 프로그램으로 여겨지는 베르누이 수 계산 알고리즘을 고안하고 해석기관의 다양한 활용 가능성을 제시한 선구자이다. - 에이다 (프로그래밍 언어) - GNAT
GNAT는 GNU GPL 라이선스에 따라 배포되는 Ada 프로그래밍 언어용 자유 소프트웨어 컴파일러로, 미국 공군과 뉴욕 대학교의 계약으로 개발되어 GCC에 통합되었으며, AdaCore의 상업적 지원 버전과 특정 플랫폼을 위한 다양한 버전이 존재한다. - 프로그래밍 언어 표준 - ISO/IEC JTC 1/SC 22
ISO/IEC JTC 1/SC 22는 프로그래밍 언어, 환경 및 시스템 소프트웨어 인터페이스 분야의 표준화를 담당하는 ISO/IEC JTC 1의 하위 위원회이며, 다양한 프로그래밍 언어와 시스템 소프트웨어 인터페이스의 표준화를 목표로 1985년에 설립되었다. - 프로그래밍 언어 표준 - C99
C99는 1999년 ISO/IEC 9899:1999로 출판된 C 프로그래밍 언어의 표준으로, 인라인 함수, 가변 길이 배열, `//` 주석 등 새로운 기능들을 추가하고 IEEE 부동소수점 자료 지원을 개선했으며 C90과 하위 호환성을 가지면서 C++와의 호환성을 고려했다. - 시스템 프로그래밍 언어 - C (프로그래밍 언어)
C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다. - 시스템 프로그래밍 언어 - 스위프트 (프로그래밍 언어)
2014년 애플 세계 개발자 컨퍼런스에서 처음 공개된 스위프트는 크리스 래트너가 개발한 애플의 범용 프로그래밍 언어로서, Objective-C를 대체하며 다양한 플랫폼 지원, 모던 문법, 안정성, 인터랙티브한 개발 환경, SwiftUI 등의 특징을 가진다.
에이다 (프로그래밍 언어) - [IT 관련 정보]에 관한 문서 | |
---|---|
기본 정보 | |
![]() | |
패러다임 | 다중 패러다임: 구조적, 명령형, 객체 지향, 관점 지향, 병행, 배열, 분산, 제네릭, 절차적, 메타 |
계열 | 파스칼 |
설계자 | MIL-STD-1815, Ada 83: 장 이히비아 Ada 95: Tucker Taft Ada 2005: Tucker Taft Ada 2012: Tucker Taft |
개발자 | 해당 없음 |
타이핑 | 정적, 강한, 안전, 명목적 |
구현체 | AdaCore GNAT 그린 힐스 소프트웨어 Optimising Ada 95 컴파일러 PTC ApexAda 및 ObjectAda MapuSoft Ada-C/C++ changer, 이전 명칭 "AdaMagic with C Intermediate" DDC-I 스코어 |
방언 | SPARK Ravenscar profile |
영향 받은 언어 | C++ Chapel Drago D Eiffel Griffin Java Nim ParaSail PL/SQL PL/pgSQL Python Ruby Seed7 SPARforte Sparkel SQL/PSM VHDL |
라이선스 | 해당 없음 |
출시일 | 1980년 2월 |
최신 버전 | Ada 2022 |
최신 버전 출시일 | 2023년 5월 |
미리 보기 버전 | 해당 없음 |
미리 보기 버전 출시일 | 해당 없음 |
영향을 준 언어 | ALGOL 68 파스칼 Simula 67 C++ (Ada 95) Smalltalk (Ada 95) Modula-2 (Ada 95) Java (Ada 2005) Eiffel (Ada 2012) |
운영 체제 | 멀티 플랫폼 또는 크로스 플랫폼 |
파일 확장자 | .adb, .ads |
위키책 | Ada Programming |
명칭 | |
명명 유래 | 에이다 러브레이스 |
기타 | |
튜링 완전성 | 예 |
웹사이트 | Ada Resource Association |
2. 역사
에이다(Ada)는 1970년대 미국 국방부(DoD)가 다양한 임베디드 시스템 프로젝트에서 사용되던 여러 프로그래밍 언어의 비효율성을 해결하기 위해 주도하여 개발한 언어이다.[19] 하드웨어 의존성, 낮은 재사용성, 급증하는 개발 비용 등의 문제를 해결하고자 새로운 표준 언어 개발이 추진되었다. 이를 위해 미국 국방부와 영국 국방부는 공동으로 실무 그룹(High Order Language Working Group, HOLWG)을 결성하고 언어 요구사항('Steelman 언어 요구 사항')을 정의했다.
여러 제안서 검토와 경쟁 끝에 1979년, 프랑스 Honeywell사의 Jean Ichbiah가 이끄는 팀(Green 팀)의 설계안이 최종 채택되었다.[20] 언어의 이름은 최초의 컴퓨터 프로그래머로 알려진 에이다 러브레이스의 이름을 따 'Ada'로 명명되었으며, 1980년 12월 10일(에이다 러브레이스의 생일) 군사 표준(MIL-STD-1815)으로 제정되었다. 표준 번호 1815는 에이다 러브레이스의 출생 연도를 기념한다.
초기에는 에이다가 국방 분야를 넘어 범용 언어로 자리 잡을 것이라는 기대가 컸으나[28], 언어 자체의 복잡성으로 인해 초기 컴파일러 개발이 어려웠고 성능 문제도 겪었다.[28][23] 튜링상 수상자인 토니 호어와 같은 전문가들은 에이다의 복잡성에 대해 우려를 표하기도 했다.[21] 최초의 유효성 검사를 통과한 구현은 1983년 NYU Ada/Ed 변환기였다.[24]
1991년 미 국방부는 모든 국방 소프트웨어 개발에 에이다 사용을 의무화하는 정책(이른바 'Ada mandate')을 시행했으나[27], 예외가 자주 허용되었고 결국 1997년 상용 기성품(COTS) 기술 도입 추세에 따라 사실상 폐지되었다.[28] 다른 북대서양 조약 기구(NATO) 회원국들, 예를 들어 스웨덴, 독일, 캐나다 등에서도 국방 관련 시스템 개발에 에이다를 의무화하거나 선호 언어로 지정하기도 했다.[29]
이후 에이다는 특히 안전 필수 시스템 분야에서 강점을 보이며 널리 사용되고 있다. 항공 전자 공학, 항공 교통 관제, 상업용 로켓(Ariane 4 및 5), 위성, 철도 시스템(TGV, 파리, 런던, 홍콩, 뉴욕 등의 지하철) 등 소프트웨어 오류가 치명적인 결과를 낳을 수 있는 분야에서 중요한 역할을 담당하고 있다.[16][33] 보잉 777의 플라이 바이 와이어 시스템 소프트웨어, 유로파이터 타이푼[30], Saab Gripen[31] 등 여러 항공기의 비행 제어 시스템에도 에이다가 사용되었다. 캐나다와 영국의 항공 교통 시스템(iFACTS) 등에도 적용되었다.[32]
2. 1. 개발 배경
1970년대 미국 국방부(DoD)는 수많은 임베디드 시스템 프로젝트에서 각기 다른 프로그래밍 언어를 사용하여 발생하는 문제에 직면하였다. 하드웨어에 대한 의존성이 높고, 소프트웨어 재사용이 거의 불가능했으며, 이로 인해 소프트웨어 개발 및 유지보수 비용이 급증했다.[19] 이러한 문제를 해결하고자 1974년 미 육·해·공군은 시스템 통합을 위한 새로운 고급 프로그래밍 언어 개발을 제안했다.1975년, 미국 국방부와 영국 국방부는 공동으로 언어 표준화를 위한 실무 그룹(High Order Language Working Group, HOLWG)을 결성했다. HOLWG는 새로운 언어가 갖춰야 할 요구사항을 담은 'Steelman 언어 요구 사항' 문서를 작성했다. 여러 기존 언어를 검토했지만, 1977년에는 요구사항을 만족하는 언어가 없다는 결론에 도달했다.

이에 따라 새로운 언어 개발을 위한 경쟁 입찰이 진행되었다. 네 개의 팀(Red, Green, Blue, Yellow)이 제안서를 제출했고, 공개 검토를 거쳐 1979년 5월 프랑스 Honeywell사의 Jean Ichbiah가 이끄는 Green 팀의 설계안이 최종 채택되었다.[20] 이 언어는 최초의 컴퓨터 프로그래머로 알려진 에이다 러브레이스(Augusta Ada King, Countess of Lovelace)의 이름을 따 '에이다(Ada)'로 명명되었다. Green 팀의 설계는 Ichbiah가 이전에 개발했던 LIS의 영향을 받았다.
에이다의 예비 참조 매뉴얼은 1979년 6월 ACM SIGPLAN Notices에 게재되었고, 공식 군사 표준(MIL-STD-1815)은 에이다 러브레이스의 생일인 1980년 12월 10일에 승인되었다. 초기에는 튜링상 수상자인 토니 호어와 같은 일부 전문가들이 언어의 복잡성에 대한 우려를 표하기도 했으나[21], 에이다는 국방 분야를 넘어 범용 프로그래밍 언어로 자리 잡을 것이라는 기대를 받았다.[28]
그러나 초기 에이다 컴파일러 개발은 순탄치 않았다. 언어 자체가 크고 복잡했으며, 컴파일 속도와 실행 성능이 느렸고 관련 개발 도구도 부족했다.[28] 또한, 정부가 요구하는 엄격한 Ada 컴파일러 유효성 검사 기능(ACVC) 테스트를 통과하는 데 많은 노력이 필요했다.[23] 최초로 유효성 검사를 통과한 것은 1983년 4월 NYU Ada/Ed 변환기였다.[24] 이후 Alsys, TeleSoft, DDC-I 등 여러 상업 회사가 에이다 컴파일러와 개발 도구를 제공하기 시작했다.[26]
1991년 미국 국방부는 모든 국방 소프트웨어 개발에 에이다 사용을 의무화하는 정책(이른바 'Ada mandate')을 시행했으나[27], 예외가 자주 허용되었고 결국 1997년 상용 기성품(COTS) 기술 도입 추세에 따라 사실상 폐지되었다.[28] 다른 북대서양 조약 기구(NATO) 회원국들, 예를 들어 스웨덴, 독일, 캐나다 등에서도 국방 관련 시스템 개발에 에이다를 의무화하거나 선호 언어로 지정하기도 했다.[29]
2. 2. 발전 과정
1970년대 미국 국방부(DoD)는 다양한 임베디드 시스템 프로젝트에 사용되는 프로그래밍 언어가 너무 많고, 대부분 구식이거나 하드웨어에 종속적이며, 안전한 모듈식 프로그래밍을 지원하지 못하는 문제점을 인식했다. 이를 해결하기 위해 1975년, 미국 국방부와 영국 국방부는 공동으로 실무 그룹(High Order Language Working Group, HOLWG)을 결성하여 요구 사항에 맞는 언어를 찾거나 새로 개발하기로 했다. HOLWG는 Steelman 언어 요구 사항이라는 문서를 통해 필요한 기능들을 명시했지만, 1977년 검토 결과 기존 언어 중에는 이를 만족하는 언어가 없다고 결론 내렸다.[19]이에 따라 새로운 언어 개발을 위한 제안 요청이 있었고, 4개의 계약자(Red(Intermetrics), Green(Honeywell), Blue(SofTech), Yellow(SRI International))가 제안서를 개발했다.[20] 1978년 공개 검토를 거쳐 Red와 Green 제안서가 다음 단계로 진출했고, 1979년 5월 Honeywell의 Jean Ichbiah가 이끄는 Green 팀의 제안서가 최종 선택되었다. 이 새로운 언어는 최초의 프로그래머로 알려진 에이다 러브레이스(Augusta Ada King, Countess of Lovelace)의 이름을 따 'Ada'로 명명되었다. 이 설계는 Ichbiah 팀이 이전에 개발했던 LIS (프로그래밍 언어)의 영향을 받았다. 예비 Ada 참조 매뉴얼은 1979년 6월 ACM SIGPLAN Notices에 게재되었고, 군사 표준 참조 매뉴얼(MIL-STD-1815)은 에이다 러브레이스의 생일인 1980년 12월 10일에 승인되었다. 표준 번호 1815는 그녀의 출생 연도를 기념한다. 토니 호어는 1981년 튜링상 연설에서 Ada의 복잡성을 비판했으나,[21] 이후 Ada 교과서 서문에서 자신의 비판을 철회하는 듯한 태도를 보였다.[22]
Ada는 초기에 프로그래밍 커뮤니티로부터 큰 관심을 받았다. 지지자들은 Ada가 국방 분야뿐만 아니라 일반 프로그래밍에서도 주요 언어가 될 것으로 예측했다.[28] Jean Ichbiah는 10년 안에 Ada와 Lisp만이 살아남을 것이라고 공언하기도 했다.[23] 그러나 초기 Ada 컴파일러는 언어의 복잡성 때문에 개발이 어려웠고, 컴파일 시간과 실행 성능이 느렸으며 관련 도구들도 부족했다.[28] 컴파일러 개발사들은 정부가 요구하는 엄격한 Ada 컴파일러 유효성 검사 기능(ACVC) 테스트를 통과하는 데 많은 노력을 기울여야 했다.[23]
최초로 유효성 검사를 통과한 Ada 구현은 1983년 4월 11일에 인증된 NYU Ada/Ed 변환기였다.[24] 이 변환기는 고급 집합 언어인 SETL로 구현되었다.[25] 이후 Alsys, TeleSoft, DDC-I, Advanced Computer Techniques, Tartan Laboratories, Irvine Compiler, TLD Systems, Verdix 등 여러 상업 회사가 Ada 컴파일러와 개발 도구를 제공하기 시작했다.[26] Concurrent Computer Corporation, Cray Research, Inc., Digital Equipment Corporation, Harris Computer Systems, Siemens Nixdorf Informationssysteme AG와 같은 주요 컴퓨터 제조사들도 자사 플랫폼용 Ada 도구를 제공했다.[26]
1991년 미 국방부는 모든 국방 소프트웨어 개발에 Ada 사용을 의무화('Ada mandate'라고 함)했지만, 예외가 자주 허용되었다.[27][28] 이 의무화 정책은 국방부가 상용 기성품(COTS) 기술을 도입하면서 1997년에 사실상 폐지되었다.[28] 다른 북대서양 조약 기구(NATO) 회원국들에서도 유사한 요구 사항이 있었으며, 스웨덴, 독일, 캐나다 등에서는 국방 관련 응용 프로그램에 Ada를 의무 또는 권장 언어로 지정하기도 했다.[29]
1980년대 후반과 1990년대 초반에 Ada 컴파일러 성능은 개선되었지만, Ada의 모든 기능을 활용하는 데에는 여전히 어려움이 따랐다. 특히 Ada의 태스킹 모델은 많은 실시간 프로그래머들에게 익숙하지 않았다.[23]
Ada는 안전 필수 시스템 개발에 강점을 보여, 군사 분야 외에도 소프트웨어 오류가 치명적인 결과를 초래할 수 있는 다양한 상업 분야에서 널리 사용된다. 예를 들어, 항공 전자 공학 및 항공 교통 관제, 상업용 로켓(Ariane 4 및 5), 위성 및 기타 우주 시스템, 철도 운송 및 금융 시스템 등에서 활용되고 있다.[16] 구체적인 사례로는 보잉 777의 항공기 비행 제어 시스템인 주 비행 제어 시스템, 플라이 바이 와이어 시스템 소프트웨어, 공기역학적으로 불안정한 유로파이터 타이푼,[30] Saab Gripen,[31] 록히드 마틴 F-22 랩터 및 Grumman F-14 Tomcat의 DFCS 교체 비행 제어 시스템 등이 Ada로 작성되었다. 캐나다 자동 항공 교통 시스템은 100만 줄의 Ada(소스 코드 라인(SLOC))로 작성되었다. 이 시스템은 고급 분산 처리, 분산 Ada 데이터베이스 및 객체 지향 설계를 특징으로 했다. Ada는 또한 다른 항공 교통 시스템에서도 사용된다. 예를 들어, 영국의 차세대 Interim Future Area Control Tools Support (iFACTS) 항공 교통 관제 시스템은 SPARK (프로그래밍 언어) Ada를 사용하여 설계 및 구현되었다.[32] 또한 프랑스의 TVM 차내 신호 시스템에서 TGV 고속 철도 시스템과 파리, 런던, 홍콩 및 뉴욕시의 지하철 통근 열차에도 사용된다.[16][33]
=== 표준화 ===
Ada 언어는 여러 차례 개정을 거쳐 발전해왔다. 각 표준 버전은 이전 버전의 기능을 개선하고 새로운 기능을 추가했다.
연도 | 비공식 명칭 | ANSI 표준 | ISO/IEC 표준 |
---|---|---|---|
1980 | 에이다 | MIL-STD 1815 | 해당 없음 |
1983 | 에이다 83/87 | MIL-STD 1815A | 8652:1987 |
1995 | 에이다 95 | 해당 없음 | 8652:1995 |
2007 | 에이다 2005 | 해당 없음 | 8652:1995/Amd 1:2007 |
2012 | 에이다 2012 | 해당 없음 | 8652:2012 |
2023 | 에이다 2022 | 해당 없음 | 8652:2023 |
- Ada 83/87: 최초의 표준은 1980년 ANSI 표준(ANSI/'''MIL-STD 1815''')으로 제정되었다. 이 최초 버전은 많은 오류와 불일치를 포함하고 있었기 때문에[35] 수정된 판이 1983년 ANSI/MIL-STD 1815A로 출판되었다. 더 이상의 변경 없이 1987년 ISO 표준(ISO/IEC 8652:1987)이 되었다.[36] 이 언어 버전은 ANSI의 채택일에서 따와 일반적으로 '''에이다 83'''으로 알려져 있지만, ISO의 채택일에서 따와 '''에이다 87'''이라고도 불린다.[37]
- Ada 95: 1990년대 초반부터 태스킹 기능 개선과 객체 지향 프로그래밍 도입을 목표로 개정 작업이 시작되었다. 1995년 2월, 공동 ISO/IEC/ANSI 표준 ISO/IEC 8652:1995[38][39]로 출판되었으며, 이는 최초의 ISO 표준 객체 지향 프로그래밍 언어가 되었다. 표준 개정 및 향후 수용을 돕기 위해 미국 공군은 GNAT 컴파일러 개발을 지원했다. 현재 GNAT 컴파일러는 GNU 컴파일러 모음의 일부이다. Ada 95는 객체 지향 기능 외에도 다른 언어(C/FORTRAN/COBOL)와의 상호 운용 인터페이스와 분산 처리(RPC) 사양도 표준화되었다. 2000년에 기술 수정 사항(ISO/IEC 8652:1995/COR1:2000)이 발행되었다.[40][41]
- Ada 2005: Ada 95에 대한 기술적 내용 개선 및 업데이트 작업이 계속 진행되었다. 주요 개정안 ISO/IEC 8652:1995/Amd 1:2007[42][43]은 2007년 3월 9일에 출판되었으며, 일반적으로 '''에이다 2005'''로 알려져 있다.
- Ada 2012: 스톡홀름에서 열린 Ada-Europe 2012 컨퍼런스에서 Ada Resource Association (ARA)과 Ada-Europe는 최신 버전의 에이다 언어 설계를 완료하고 국제 표준화 기구 (ISO) 및 국제 전기 기술 위원회 (IEC)의 ISO/IEC JTC 1/SC 22/WG 9에 참조 매뉴얼을 제출하여 승인을 받았다고 발표했다. ISO/IEC 8652:2012[44] (https://www.adaic.org/resources/add_content/standards/12rm/html/RM-TTL.html Ada 2012 RM)는 2012년 12월에 출판되었으며, '''에이다 2012'''로 알려져 있다. 기술 수정 사항인 ISO/IEC 8652:2012/COR 1:2016이 출판되었다.[45](http://www.ada-auth.org/standards/rm12_w_tc1/html/RM-TTL.html RM 2012 with TC 1).
- Ada 2022: 2023년 5월 2일, 에이다 커뮤니티는 프로그래밍 언어 표준의 '''에이다 2022''' 에디션 출판에 대한 공식적인 승인을 받았다.[11]
Ada 83, 95 등과 같은 이름에도 불구하고 법적으로는 마지막 ISO/IEC 표준인 하나의 에이다 표준만 존재한다. 새로운 표준 버전이 승인되면 이전 버전은 철회된다. 다른 이름들은 특정 에디션을 참조하는 비공식적인 이름일 뿐이다.
기타 관련 표준으로는 ISO/IEC 8651-3:1988 ''정보 처리 시스템—컴퓨터 그래픽스—그래픽 커널 시스템(GKS) 언어 바인딩—파트 3: 에이다''가 있다.
3. 특징
Ada는 원래 임베디드 시스템과 실시간 컴퓨팅 시스템을 위해 설계된 프로그래밍 언어이다. 1979년, 미국 국방부는 신뢰성과 유지보수성이 뛰어난 언어를 개발하기 위해 국제 경쟁 입찰을 실시했고, 프랑스 팀의 설계안(코드명 GREEN)이 최종 채택되었다. 개발 과정에서 언어 사양은 Strawman, Woodenman, Tinman, Ironman, Steelman의 5개 버전을 거치며 구체화되었다.
Ada는 대규모 개발과 장기적인 유지보수성을 고려하여 코딩 효율보다는 가독성을 중시하고, 프리프로세서 매크로 기능을 포함하지 않는 등의 특징적인 요구사항을 가지고 설계되었다. 당시로서는 진보적인 여러 기능[50](강력한 형식 검사, 패키지를 이용한 모듈화, 제네릭 프로그래밍, 병렬 컴퓨팅 지원, 예외 처리 등)을 포함하고 있으며, 이러한 구체적인 기능과 장단점은 아래 하위 섹션에서 자세히 설명한다.
언어 정의 문서인 Ada 참조 매뉴얼(ARM 또는 LRM)은 다른 ISO 표준과 달리 자유 콘텐츠로 제공되어, 컴파일러 개발자뿐만 아니라 일반 Ada 프로그래머에게도 중요한 참고 자료가 된다. 언어 설계 및 기능 사용법을 설명하는 근거 문서 또한 널리 활용된다.
Ada 소스 코드 작성을 지원하는 주요 자유 소프트웨어 도구로는 GNU 컴파일러 모음의 일부인 GNAT과 GNAT 프로그래밍 스튜디오가 있으며, 패키지 및 툴체인 관리 도구로는 ''Alire''가 있다.[18]
다음은 Ada로 작성된 간단한 헬로 월드 프로그램 예시이다.
(hello.adb)
with Ada.Text_IO;
procedure Hello is
begin
Ada.Text_IO.Put_Line ("Hello, world!");
end Hello;
이 프로그램은 GNAT 컴파일러를 사용하여 다음과 같이 컴파일할 수 있다.
gnatmake hello.adb
3. 1. 주요 특징
Ada는 강력한 타이핑, 모듈식 프로그래밍 메커니즘(패키지), 런타임 검사, 병렬 컴퓨팅(태스크, 동기 메시지 전달, 보호된 객체, 비결정적 선택문), 예외 처리, 제네릭 프로그래밍 등 다양한 기능을 제공한다. 특히 1992년에서 1995년 사이에 개정된 Ada 95는 시스템, 수치, 금융 분야 지원을 강화하고 동적 디스패치를 포함한 객체 지향 프로그래밍(OOP) 지원을 추가했다.Ada의 구문은 가독성을 중시하여, 기호 대신 영어 키워드("or else", "and then" 등)를 선호하며 기본적인 산술 연산자(+, -, *, /) 외의 기호 사용을 최소화한다. 코드 블록은 "declare", "begin", "end"와 같은 명확한 키워드로 구분되며, "end" 뒤에는 해당 블록의 종류를 명시(예: `if ... end if`, `loop ... end loop`)하여 dangling else와 같은 오류를 방지한다.
대규모 소프트웨어 시스템 개발을 염두에 두고 설계되었기 때문에, Ada 패키지는 개별적으로 컴파일할 수 있다. 패키지 명세(인터페이스)만 따로 컴파일하여 구현 전에 설계 단계에서 일관성을 검증하고 문제를 조기에 발견할 수 있도록 지원한다.
Ada는 컴파일 타임에 엄격한 검사를 수행하여 다른 언어에서는 런타임에 발견되거나 별도의 검사 코드가 필요한 버그를 사전에 방지한다. 예를 들어, 명시적인 블록 닫기를 요구하여 토큰 불일치 오류를 막고, 강력한 타이핑을 통해 잘못된 매개변수 전달, 범위 위반, 잘못된 참조, 타입 불일치 등 많은 일반적인 오류를 컴파일 시점이나 런타임에 감지할 수 있다. 언어 자체에 동시성 기능이 내장되어 있어, 컴파일러가 잠재적인 데드락을 감지하는 경우도 있다.[14] 컴파일러는 철자 오류, 가시성 문제, 중복 선언 등을 확인하고 수정 제안을 제공하기도 한다.
또한, 런타임 시스템 검사를 통해 할당되지 않은 메모리 접근, 버퍼 오버플로우, 범위 위반, 오류, 배열 접근 오류 등 감지 가능한 버그를 방지한다. 이러한 검사는 성능을 위해 비활성화할 수도 있지만, 효율적인 컴파일이 가능하다. 이러한 특징들 덕분에 Ada는 항공 전자 공학, 항공 교통 관제, 철도 운송, 은행, 군사, 우주 기술 등 오류가 심각한 결과를 초래할 수 있는 고신뢰성 시스템 개발에 널리 사용된다.[15][16]
Ada의 타입 시스템은 미리 정의된 원시 타입에 의존하지 않고 사용자가 직접 타입을 정의할 수 있게 한다. 타입 선언은 내부 표현이 아닌 달성 목표를 중심으로 이루어지며, 컴파일러는 이를 바탕으로 적절한 메모리 크기를 결정하고 타입 정의 위반(범위 초과, 버퍼 오버런, 타입 불일치 등)을 컴파일 및 런타임에 검사한다. Ada는 범위 지정 숫자 타입, 모듈러 타입, 집합 타입(레코드, 배열), 열거형 타입을 지원한다. 접근 타입(Access types)은 특정 타입의 인스턴스를 가리키는 참조를 정의하며, 타입 없는 포인터는 허용되지 않는다. 태스크 타입과 보호 타입은 동시성 프로그래밍을 위한 특수 타입이다.
예를 들어, 날짜 관련 타입을 다음과 같이 정의할 수 있다:
```ada
type Day_type is range 1 .. 31;
type Month_type is range 1 .. 12;
type Year_type is range 1800 .. 2100;
type Hours is mod 24;
type Weekday is (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);
type Date is
record
Day : Day_type;
Month : Month_type;
Year : Year_type;
end record;
```
여기서 `Day_type`, `Month_type`, `Year_type`, `Hours`는 서로 호환되지 않는 타입이므로, 예를 들어 `Day_type` 변수와 `Month_type` 변수를 직접 더하는 것은 허용되지 않는다. 타입은 서브타입 선언을 통해 더 세분화할 수 있다.
```ada
subtype Working_Hours is Hours range 0 .. 12; -- 하루 최대 12시간 근무
subtype Working_Day is Weekday range Monday .. Friday; -- 근무일
Work_Load: constant array(Working_Day) of Working_Hours -- 암시적 타입 선언
:= (Friday => 6, Monday => 4, others => 10); -- 초기화를 사용한 근무 시간 조회 테이블
```
타입에는 `limited`, `abstract`, `private` 등의 수식어를 붙여 특성을 제한할 수 있다. `Private` 타입은 내부 구조를 감추고, `limited` 타입의 객체는 복사할 수 없다.[46]
동적 메모리 관리는 명시적으로 선언된 접근 타입(access types)과 연관된 저장소 풀(storage pool)을 통해 이루어진다. 타입 없는 포인터나 암시적 포인터 타입 선언은 없다. 프로그래머는 기본 저장소 풀을 사용하거나 필요에 따라 새로운 풀을 정의할 수 있다(비균일 메모리 접근 등에 유용). 언어는 컴파일 및 런타임에 접근성 검사(accessibility check)를 수행하여, 접근 값(포인터 역할)이 가리키는 객체보다 오래 살아남지 못하도록 보장한다.[17] 자동 가비지 수집은 언어 의미론상 허용되지만, 실시간 시스템에서의 예측 불가능성 때문에 대부분의 구현에서 기본적으로 지원하지 않는다. 대신 영역 기반 메모리 관리와 유사한 제한적인 형태를 지원하며, 저장소 풀을 파괴하면 해당 풀의 모든 객체가 함께 소멸되는 방식으로 제한적인 자동 메모리 관리가 가능하다.
주석은 이중 대시(`--`)로 시작하며 줄 끝까지만 유효하다. 여러 줄에 걸친 주석 형식이 없어 실수로 코드 일부가 주석 처리되는 것을 방지한다. 문장 종결자는 세미콜론(`;`)이며, 아무 동작도 하지 않는 문장은 `null;`이다.
Ada는 또한 다음과 같은 특징을 가진다.
- 프리프로세서 부재: 코드 가독성과 유지보수성을 위해 매크로와 같은 프리프로세서 기능을 지원하지 않는다.
- 자동 빌드: 모듈 간의 의존성을 분석하여 재컴파일 필요 여부를 자동으로 판정하므로, Makefile과 같은 별도의 빌드 스크립트가 필요 없다.
- 컴파일러 인증 제도: Ada 표준 준수 여부를 검증하는 테스트 스위트(ACVC)를 통과해야만 "Ada 컴파일러"로 인정받을 수 있다.
이러한 엄격함과 기능의 풍부함 때문에, 앤터니 호어와 같은 일부 컴퓨터 과학자들은 언어 사양의 거대함과 복잡성이 오히려 고신뢰성이 요구되는 시스템 개발에 위험 요소가 될 수 있다는 우려를 표하기도 했다.[51][52]
3. 2. 장점
에이다는 높은 신뢰성과 유지보수성을 목표로 설계된 언어이다. 이는 특히 미국 국방부가 임베디드 시스템과 같이 오류가 치명적인 결과를 초래할 수 있는 분야에 사용될 언어를 요구했기 때문이다.[15][16] 이러한 목표를 달성하기 위해 에이다는 다음과 같은 장점을 가진다.=== 높은 신뢰성 및 안전성 ===
에이다는 소프트웨어 오류를 최소화하고 시스템의 안정성을 높이기 위한 다양한 기능을 내장하고 있다.
- 강력한 타입 검사: 컴파일 타임과 런타임 모두에서 엄격한 타입 검사를 수행한다. 이를 통해 잘못된 매개변수 전달, 타입 불일치, 범위 초과 등 많은 일반적인 프로그래밍 오류를 사전에 감지하고 방지할 수 있다.
- 런타임 검사: 프로그램 실행 중 발생할 수 있는 오류를 감지하기 위한 검사 기능을 지원한다. 할당되지 않은 메모리에 대한 접근 시도, 버퍼 오버플로우, 배열 접근 오류 등을 감지하여 프로그램의 비정상적인 종료나 예측 불가능한 동작을 막는다.[14] 이러한 런타임 검사는 필요에 따라 비활성화할 수도 있지만, 효율적으로 컴파일될 수 있도록 설계되었다.
- 안전한 메모리 관리: 에이다는 포인터를 직접 사용하지 않고, 명시적으로 선언된 '액세스 타입'(access typeeng)을 통해 동적 메모리를 관리한다. 이는 타입 안전성을 보장하며, '접근성 검사'를 통해 메모리 누수나 잘못된 메모리 참조와 같은 오류를 방지한다.[17]
- 병렬 컴퓨팅 지원: 언어 자체에서 태스크, 동기 메시지 전달, 보호된 객체 등 병렬 처리를 위한 기능을 명세에 포함하고 있어, 컴파일러가 잠재적인 데드락과 같은 동시성 문제를 감지하는 데 도움을 줄 수 있다.[14]
- 예외 처리: 예상치 못한 오류가 발생했을 때 프로그램이 안전하게 대응하고 복구할 수 있도록 정형화된 예외 처리 메커니즘을 제공한다.
- 소프트웨어 검증 지원: 소프트웨어의 정확성을 수학적으로 검증하는 데 도움이 되는 기능들을 포함하고 있다.
이러한 특징들 덕분에 에이다는 항공 전자 공학, 항공 교통 관제, 철도 운송, 금융, 군사 및 우주 기술과 같이 아주 작은 오류도 허용되지 않는 안전 필수 시스템(safety-critical systemeng) 개발에 널리 사용된다.[15][16] 또한, 에이다 컴파일러는 미국 국방부가 규정한 엄격한 검증 절차(ACVC 테스트)를 통과해야만 공식적으로 "Ada 컴파일러"로 인정받을 수 있는 컴파일러 인증 제도를 통해 언어 표준 준수와 컴파일러의 품질을 보증한다.
=== 가독성 및 유지보수성 ===
에이다는 대규모 소프트웨어 시스템을 장기간에 걸쳐 개발하고 유지보수하는 것을 염두에 두고 설계되었으며, 코드의 가독성을 높이는 데 중점을 둔다.
- 명확한 구문: 기호보다는 영어 키워드("or else", "and then" 등)를 사용하여 코드의 의미를 쉽게 파악할 수 있도록 한다. 코드 블록은 `begin`, `end`, `loop`, `end loop`, `if`, `end if` 와 같이 명시적인 키워드로 시작하고 끝나도록 하여 코드 구조를 명확히 하고, 다른 언어에서 발생할 수 있는 dangling else와 같은 모호함을 방지한다.
- 모듈식 프로그래밍 (패키지): 패키지라는 강력한 모듈화 기능을 제공한다. 패키지는 관련된 타입, 데이터, 서브프로그램 등을 하나의 단위로 묶어 관리할 수 있게 해주며, 인터페이스(사양)와 구현부를 분리할 수 있다. 패키지 사양은 구현 없이도 개별적으로 컴파일하여 인터페이스의 일관성을 검사할 수 있으므로, 소프트웨어 설계 단계에서 오류를 조기에 발견하고 수정하는 데 유용하다. 이는 특히 여러 개발자가 협업하는 대규모 프로젝트에서 효과적이다.
- 안전한 주석: 주석은 이중 대시(`--`)로 시작하여 해당 줄의 끝까지만 유효하다. 여러 줄에 걸친 블록 주석 형식이 없어, 실수로 주석 처리를 잘못하여 코드의 일부가 의도치 않게 비활성화되는 것을 방지한다.
- 자동 빌드: 여러 모듈 간의 의존성을 컴파일러가 자동으로 파악하여 필요한 부분만 재컴파일하는 기능을 내장하고 있다. 이는 개발자가 Makefile과 같은 별도의 빌드 스크립트를 관리해야 하는 부담을 줄여준다.
이 외에도 에이다는 제네릭 프로그래밍과 객체 지향 프로그래밍(Ada 95 이후)을 지원하여 코드 재사용성과 확장성을 높이는 데 기여한다.
3. 3. 단점
에이다는 언어 사양이 방대하고 엄격하며, 강력한 타이핑, 병렬 컴퓨팅 지원, 예외 처리 등 당시로서는 진보적인 고급 기능을 다수 포함하고 있다.[50] 이러한 특징 때문에 다른 프로그래밍 언어에 비해 배우고 능숙하게 사용하기까지 상대적으로 많은 시간과 노력이 필요하다는 지적이 있다. 언어 설계 과정에서 기능이 계속 추가되어 사양이 매우 거대해졌는데, 이는 저명한 컴퓨터 과학자인 앤터니 호어가 1980년 튜링상 수상 강연에서 에이다의 복잡성에 대한 우려를 표명하는 배경이 되기도 했다.[51][52]또한, 에이다는 초기 컴파일러 구현에 미니컴퓨터나 워크스테이션 수준의 높은 컴퓨팅 자원을 필요로 했다. 이로 인해 1980년대 당시 보급되던 16비트 개인용 컴퓨터 환경에서는 시장성 문제로 컴파일러 구현이 거의 이루어지지 않았다. 결과적으로 에이다는 항공우주 산업, 국방, 철도 운송 등 극도의 신뢰성과 장기적인 유지보수성이 요구되는 특정 산업 분야[15][16]를 중심으로 사용되었고, 범용적인 개발 언어로서의 대중적인 생태계를 구축하는 데는 한계가 있었다. 이는 C/C++ 등 다른 주류 언어에 비해 상대적으로 개발자 커뮤니티 규모가 작고 이용 가능한 라이브러리나 개발 도구가 부족하게 되었다.
4. 언어 구성 요소
에이다는 본래 임베디드 시스템과 실시간 컴퓨팅 시스템 개발을 목표로 설계되었다. 1995년에 발표된 Ada 95 개정판은 객체 지향 프로그래밍(OOP)을 비롯하여 시스템 프로그래밍, 수치 계산, 금융 분야에 대한 지원을 강화했다.
에이다 언어의 주요 특징으로는 강력한 타이핑, 모듈식 프로그래밍을 위한 패키지(package) 기능, 런타임 검사, 병렬 컴퓨팅 지원(태스크, 동기 메시지 전달, 보호 객체, 비결정적 선택문), 예외 처리, 제네릭 프로그래밍 등이 있다. Ada 95에서는 동적 디스패치를 포함한 객체 지향 프로그래밍 지원이 추가되었다. 이러한 특징들은 특히 고신뢰성이 요구되는 시스템 개발에 적합하다.
에이다의 구문은 가독성을 중시하여, 기호보다는 영어 키워드("or else", "and then" 등) 사용을 선호한다. 기본 산술 연산자(+, -, *, /) 외의 다른 기호 사용은 최소화한다. 코드 블록은 `declare`, `begin`, `end`와 같은 키워드로 명확히 구분하며, `if ... end if`, `loop ... end loop`처럼 블록의 끝을 명시적으로 표시하여 댕글링 엘스와 같은 오류 가능성을 줄인다. 제어 구조에 대한 자세한 내용은 하위 섹션에서 다룬다.
에이다는 매우 큰 규모의 소프트웨어 시스템 개발을 염두에 두고 설계되었다. 핵심적인 모듈식 프로그래밍 메커니즘인 패키지는 관련된 요소들을 묶어 관리하며, 개별적으로 컴파일될 수 있다. 특히 패키지의 인터페이스 부분(사양)만 먼저 컴파일하여 시스템 전체의 일관성을 검사할 수 있어, 설계 단계에서 문제를 조기에 발견하는 데 도움을 준다.[14] 패키지에 대한 자세한 내용은 하위 섹션에서 다룬다.
또한 에이다는 다양한 컴파일 타임 검사와 런타임 검사를 통해 소프트웨어의 안정성을 높인다. 강력한 타이핑은 타입 불일치 오류를 방지하며, 런타임 검사는 메모리 관련 오류(할당되지 않은 메모리 접근, 버퍼 오버플로우 등)나 범위 초과, 배열 접근 오류 등을 감지한다. 이러한 검사 기능은 소프트웨어 검증을 용이하게 하며, 오류 발생 시 심각한 결과를 초래할 수 있는 항공 전자 공학, 항공 교통 관제, 철도 운송, 은행, 군사, 우주 기술 등 중요 시스템에 에이다가 사용되는 주된 이유이다.[15][16] 자료형과 관련된 상세 내용은 하위 섹션에서 다룬다.
에이다의 동적 메모리 관리는 타입 안전성을 보장하며, 명시적으로 선언된 '액세스 타입(access type)'과 연관된 '저장소 풀(storage pool)'을 통해 이루어진다. 이는 비균일 메모리 접근 환경 등에서 유연한 메모리 관리를 가능하게 하고, '접근성 검사'를 통해 메모리 참조 오류를 방지한다.[17] 자동 가비지 수집은 언어 명세상 허용되나 실시간 시스템 제약으로 인해 제한적으로 사용되며, 영역 기반 메모리 관리나 저장소 풀을 활용한 방식이 주로 쓰인다. 메모리 관리에 대한 자세한 내용은 하위 섹션에서 다룬다.
주석은 이중 대시(`--`)로 시작하며 줄 끝까지 유효하다. 여러 줄 주석 기능은 의도적으로 배제되어 실수로 인한 코드 비활성화를 방지한다. 문 종료자는 세미콜론(`;`)이며, 아무 작업도 하지 않는 문은 `null;`이다.
대부분의 ISO 표준과 달리, 에이다 언어 정의서(Ada Reference Manual, ARM 또는 Language Reference Manual, LRM)는 자유 콘텐츠로 제공되어 개발자와 사용자 모두에게 중요한 참조 자료가 된다. 언어 설계 배경과 기능 사용법을 설명하는 근거 문서(Rationale)도 함께 제공된다.
에이다 개발을 위한 자유 소프트웨어 도구로는 GNU 컴파일러 모음의 일부인 GNAT 컴파일러와 GNAT 프로그래밍 스튜디오(GPS)가 있으며, `Alire`는 에이다를 위한 패키지 및 툴체인 관리 도구이다.[18]
다음은 에이다의 기본적인 구문을 보여주는 헬로 월드 프로그램 예제이다.
(hello.adb)
```ada
with Ada.Text_IO;
procedure Hello is
begin
Ada.Text_IO.Put_Line ("Hello, world!");
end Hello;
```
이 프로그램은 GNAT 컴파일러를 사용하여 다음과 같이 컴파일할 수 있다.
```bash
gnatmake hello.adb
```
에이다는 `pragma`라는 컴파일러 지시어를 통해 컴파일러에게 특정 정보를 전달하여 컴파일 결과를 제어할 수 있다.[48] 일부 프라그마는 언어 표준에 정의되어 있으며,[49] 다른 것들은 컴파일러 구현에 따라 다르다. 프라그마는 주로 특정 검사 기능 비활성화나 코드 최적화(인라인 함수와 유사) 등에 사용된다.
4. 1. 자료형
에이다는 강력한 타이핑 시스템을 특징으로 한다. 이는 컴파일 타임이나 런타임 중에 많은 일반적인 소프트웨어 오류(잘못된 매개변수, 범위 위반, 잘못된 참조, 일치하지 않는 유형 등)를 감지하는 데 도움을 준다. 특히, 소스 코드에 명시적인 검사를 추가하지 않아도 되는 다양한 컴파일 타임 검사를 지원하여, 다른 언어에서는 런타임까지 발견되지 않을 수 있는 버그를 미리 방지한다.또한, 에이다는 할당되지 않은 메모리에 대한 접근, 버퍼 오버플로우 오류, 범위 위반, 오류, 배열 접근 오류 및 기타 감지 가능한 버그를 방지하기 위해 런타임 검사를 지원한다. 이러한 검사는 런타임 효율성을 위해 비활성화할 수도 있지만, 종종 효율적으로 컴파일될 수 있다. 이러한 강력한 검사 기능 덕분에 에이다는 항공 전자 공학, 항공 교통 관제, 철도 운송, 은행, 군사 및 우주 기술과 같이 소프트웨어 오류가 심각한 결과를 초래할 수 있는 중요한 시스템에 널리 사용된다.[15][16]
사용자는 다음과 같이 직접 자료형을 정의할 수 있다. 예를 들어, 날짜를 나타내는 레코드 타입을 정의할 수 있다.
type Day is range 1 .. 31;
type Month is range 1 .. 12;
type Year is range 1800 .. 2100;
type Date is
record
Day : Day;
Month : Month;
Year : Year;
end record;
에이다의 동적 메모리 관리는 고급 기능이며 유형 안전하다. 제네릭 포인터나 타입이 없는 포인터는 존재하지 않으며, 포인터 타입을 암시적으로 선언하지도 않는다. 대신, 모든 동적 메모리 할당 및 해제는 명시적으로 선언된 ''액세스 타입(access types)''을 통해 이루어진다. 각 액세스 타입에는 메모리 관리의 세부 사항을 처리하는 연관된 ''저장소 풀(storage pool)''이 있다. 프로그래머는 기본 저장소 풀을 사용하거나 새로운 저장소 풀을 정의할 수 있다. 이는 비균일 메모리 접근(NUMA) 환경에서 특히 유용하다. 동일한 타입을 가리키지만 다른 저장소 풀을 사용하는 여러 액세스 타입을 선언하는 것도 가능하다. 또한, 에이다는 컴파일 시간과 런타임 모두에서 ''접근성 검사(accessibility checks)''를 제공하여, 액세스 값이 가리키는 객체의 타입보다 오래 지속될 수 없도록 보장한다.[17]
언어의 의미론은 접근 불가능한 객체에 대한 자동 가비지 수집을 허용하지만, 실시간 시스템에서 예측 불가능한 동작을 유발할 수 있으므로 대부분의 구현에서는 기본적으로 지원하지 않는다. 에이다는 영역 기반 메모리 관리의 제한된 형태를 지원하며, 저장소 풀을 창의적으로 사용하여 풀이 파괴될 때 해당 풀의 모든 객체도 함께 파괴되는 방식의 제한적인 자동 가비지 수집을 구현할 수도 있다.
4. 2. 제어 구조
에이다는 구조적 프로그래밍을 위한 표준적인 제어 구조를 제공한다. 코드 블록은 `begin`, `end`와 같은 키워드로 명확하게 구분하며, 특히 `if`나 `loop` 같은 제어 구조의 끝에는 `end if`, `end loop`처럼 해당 구조를 명시하여 코드의 가독성을 높이고 오류 가능성을 줄인다.=== 조건문 ===
조건에 따라 코드 실행 흐름을 제어하기 위해 `if` 문을 사용한다. `then`, `else` 키워드와 함께 사용하며, `end if`로 블록을 명확히 닫아 댕글링 엘스 문제를 방지한다.
if a > b then
Ada.Text_IO.Put_Line ("Condition met");
else
Ada.Text_IO.Put_Line ("Condition not met");
end if;
=== 반복문 ===
다양한 형태의 반복문을 지원한다.
- '''while 루프''': 특정 조건(`a /= b`)이 참인 동안 반복 실행한다.
while a /= b loop
Ada.Text_IO.Put_Line ("Waiting");
end loop;
- '''for 루프''': 지정된 범위(`1 .. 10`) 내에서 변수 `i`를 증가시키며 반복 실행한다.
for i in 1 .. 10 loop
Ada.Text_IO.Put ("Iteration: ");
Ada.Text_IO.Put (i);
Ada.Text_IO.Put_Line;
end loop;
- '''loop 문''': 기본적인 무한 루프를 만들며, `exit when` 조건을 사용하여 특정 조건(`a = 10`)에서 반복을 탈출할 수 있다.
loop
a := a + 1;
exit when a = 10;
end loop;
=== 선택문 ===
여러 경우의 수 중 하나를 선택하여 실행하기 위해 `case` 문을 사용한다. 변수 `i`의 값에 따라 다른 동작을 수행한다.
case i is
when 0 => Ada.Text_IO.Put("zero");
when 1 => Ada.Text_IO.Put("one");
when 2 => Ada.Text_IO.Put("two");
- - 예시에는 0, 1, 2 외의 다른 값에 대한 처리는 포함되지 않음
end case;
이 외에도 에이다는 goto 문의 사용을 최소화하도록 설계되었으며, 구조적인 제어 흐름을 강조한다. 또한, 프로그램 실행 중 발생할 수 있는 오류 상황에 효과적으로 대응하기 위한 예외 처리 메커니즘을 언어 차원에서 지원한다.
4. 3. 패키지, 프로시저, 함수
에이다 프로그램은 기본적으로 패키지, 프로시저, 함수라는 구성 요소로 이루어져 있다.패키지는 에이다의 핵심적인 모듈식 프로그래밍 메커니즘이다. 관련된 자료형, 변수, 프로시저, 함수 등을 하나의 단위로 묶어 관리하는 데 사용된다. 이는 특히 규모가 큰 소프트웨어 시스템을 개발할 때 유용하다.[14] 에이다의 패키지는 다음과 같은 특징을 가진다.
- 개별 컴파일: 각 패키지는 독립적으로 컴파일될 수 있다.
- 인터페이스와 구현 분리: 패키지는 사양(Specification, 인터페이스)과 본문(Body, 구현)으로 나뉠 수 있다. 패키지 사양만 먼저 컴파일하여 프로그램의 전체적인 구조와 일관성을 검사할 수 있다. 이를 통해 실제 구현 코드를 작성하기 전, 설계 단계에서 미리 오류를 발견하고 수정할 수 있다.[14]
프로시저는 특정 작업을 수행하는 코드 블록이며, 함수는 작업을 수행한 후 특정 값을 반환하는 코드 블록이다.
아래는 패키지, 프로시저, 함수의 사용 예를 보여주는 간단한 에이다 코드이다.
with Ada.Text_IO; -- 외부 패키지 Ada.Text_IO를 사용함을 선언
package Mine is -- 'Mine'이라는 이름의 패키지 선언 시작
type Integer is range 1 .. 11; -- 'Integer'라는 이름의 정수 타입을 1부터 11까지의 범위로 정의
i : Integer := Integer'First; -- 'Integer' 타입의 변수 'i'를 선언하고 초기값으로 타입의 첫 번째 값(1)을 할당
procedure Print (j: in out Integer); -- 'Print'라는 이름의 프로시저 선언 (파라미터 j는 입출력용)
end Mine; -- 패키지 'Mine'의 선언 종료
package body Mine is -- 'Mine' 패키지의 구현 시작
procedure Print (j: in out Integer) is -- 'Print' 프로시저의 구현 시작
function Next (k: in Integer) return Integer is -- 'Print' 프로시저 내부에 'Next'라는 이름의 함수 정의 시작 (파라미터 k는 입력용, 반환 타입은 Integer)
begin -- 'Next' 함수의 실행 코드 시작
return k + 1; -- 입력받은 k에 1을 더한 값을 반환
end Next; -- 'Next' 함수의 구현 종료
begin -- 'Print' 프로시저의 실행 코드 시작
Ada.Text_IO.Put_Line ("The total is: " & Integer'Image(j)); -- 콘솔에 "The total is: "와 현재 j의 값을 문자열로 변환하여 출력
j := Next (j); -- 변수 j에 'Next' 함수를 호출하여 얻은 결과(j+1)를 다시 할당
end Print; -- 'Print' 프로시저의 구현 종료
begin -- 패키지 'Mine'의 초기화 코드 시작 (패키지가 사용될 때 실행됨)
while i < Integer'Last loop -- 변수 i가 'Integer' 타입의 마지막 값(11)보다 작을 동안 반복
Print (i); -- 'Print' 프로시저를 호출하여 i 값을 출력하고 1 증가시킴
end loop; -- 반복문 종료
end Mine; -- 패키지 'Mine'의 구현 종료
위 코드에서 `Mine`은 패키지이고, `Print`는 프로시저이며, `Next`는 함수이다. `Mine` 패키지는 `Integer` 타입, 변수 `i`, 프로시저 `Print`를 포함하며, `Print` 프로시저 내부에 `Next` 함수가 정의되어 있다. `with Ada.Text_IO;` 구문은 표준 입출력 기능을 제공하는 외부 패키지를 사용하겠다는 선언이다.
4. 4. 제네릭 프로그래밍
에이다는 언어의 주요 특징 중 하나로 제네릭 프로그래밍( genericseng )을 지원한다.[14] 이는 프로그래머가 특정 자료형에 구애받지 않고 보다 일반화된 형태로 코드를 작성할 수 있게 해주는 기능이다.제네릭 기능을 활용하면, 예를 들어 하나의 제네릭 패키지나 서브프로그램(프로시저 또는 함수)을 정의한 뒤, 이를 다양한 종류의 자료형에 적용하여 동일한 알고리즘이나 로직을 재사용할 수 있다. 이러한 방식은 코드의 재사용성을 높여 개발 효율성을 증진시키는 장점을 가진다.
5. 활용 사례
에이다는 프로그램의 신뢰성과 유지보수성이 중요하게 요구되는 시스템 개발에 주로 사용되어 왔다. 특히 국방, 항공 우주, 철도 시스템과 같이 안전이 최우선시되는 분야에서 그 활용 사례를 찾아볼 수 있다.
5. 1. 국방 및 항공 우주
에이다는 높은 신뢰성이 요구되는 국방 및 항공 우주 분야에서 사용되어 왔다. F-22 전투기의 비행 제어 시스템이나 97식 어뢰 개발이 대표적인 사례이다. 민간 항공 분야에서는 보잉 777과 같은 항공기의 제어 소프트웨어에도 에이다가 이용되었다.그러나 최근에는 F-35 전투기 개발처럼 C++ 등 다른 프로그래밍 언어로 전환하는 경향도 나타나고 있다.
5. 2. 철도 및 교통
(작성할 내용 없음)5. 3. 기타
언어의 구문의 일반적인 예는 헬로 월드 프로그램이다.(hello.adb)
```ada
with Ada.Text_IO;
procedure Hello is
begin
Ada.Text_IO.Put_Line ("Hello, world!");
end Hello;
```
이 프로그램은 자유롭게 사용할 수 있는 오픈 소스 컴파일러인 GNAT을 사용하여 컴파일할 수 있으며, 다음을 실행한다.
```bash
gnatmake hello.adb
참조
[1]
웹사이트
Ada2012 Rationale
http://www.adacore.c[...]
2018-05-05
[2]
웹사이트
Commercial software solutions for Ada, C and C++
https://www.adacore.[...]
2023-04-04
[3]
뉴스
PTC ObjectAda
http://www.ptc.com/d[...]
PTC.com
2014-01-27
[4]
웹사이트
MapuSoft Ada-C/C++ changer
https://www.mapusoft[...]
2019-04-16
[5]
웹사이트
Ada 95 Certified Processors List – Details
http://ada-auth.org/[...]
2023-04-04
[6]
웹사이트
Chapel spec (Acknowledgements)
http://chapel.cray.c[...]
Cray Inc
2015-10-01
[7]
웹사이트
Drago
http://www.iuma.ulpg[...]
2018-08-06
[8]
웹사이트
The Griffin Project
https://cs.nyu.edu/~[...]
2023-04-04
[9]
웹사이트
SparForte Programming Language
https://www.sparfort[...]
2023-04-04
[10]
서적
Ada Rationale
1986
[11]
간행물
From the Editor's Desk
https://dl.acm.org/a[...]
Association for Computing Machinery
2023-06
[12]
웹사이트
The Ada Programming Language
http://groups.engin.[...]
2016-05-27
[13]
간행물
Lovelace & Babbage and the creation of the 1843 'notes'
[14]
웹사이트
Concurrency – Chapter 6 – Ada 95 QUALITY AND STYLE Guide
https://www.adaic.or[...]
2021-11-05
[15]
웹사이트
Ada helps churn out less-buggy code
http://gcn.com/Artic[...]
Government Computer News
1999-06-30
[16]
웹사이트
Who's Using Ada? Real-World Projects Powered by the Ada Programming Language November 2014
https://www2.seas.gw[...]
SIGAda Education Working Group
[17]
Youtube
no safe dynamic memory management in ADA
https://youtube.com/[...]
[18]
웹사이트
Alire - Homepage
https://alire.ada.de[...]
Adacore
2024-12-09
[19]
웹사이트
DoD – Strawman Requirements – April 1975
http://iment.com/mai[...]
2023-04-04
[20]
웹사이트
John Goodenough | SEI Staff Profile
http://www.sei.cmu.e[...]
Sei.cmu.edu
2014-01-27
[21]
간행물
The Emperor's Old Clothes
http://zoo.cs.yale.e[...]
Association for Computing Machinery
1981
[22]
서적
Ada: Language and Methodology
Prentice-Hall
1987
[23]
간행물
The Ada Paradox(es)
ACM SIGAda
2009-08
[24]
웹사이트
Ada Compiler Validation Summary Report: NYU Ada/ED, Version 19.7 V-001
http://oai.dtic.mil/[...]
1983-04-11
[25]
서적
Proceeding of the ACM-SIGPLAN symposium on Ada programming language – SIGPLAN '80
1980-11
[26]
뉴스
Ada Validated Compilers List
Ada Information Clearinghouse
1992-07-01
[27]
웹사이트
The Congressional Ada Mandate
http://archive.adaic[...]
1983-04-11
[28]
conference
SIGAda '10: Proceedings of the ACM SIGAda annual international conference on SIGAda
http://dl.acm.org/ci[...]
2010-11
[29]
서적
Ada, the New DoD Weapon System Computer Language – Panacea or Calamity
http://apps.dtic.mil[...]
Air University (United States Air Force)
1989
[30]
웹사이트
Agile thinking
https://www.flightgl[...]
1999-06-16
[31]
웹사이트
Usage of Ada in the Gripen Flight Control System
https://www.sigada.o[...]
[32]
웹사이트
GNAT Pro Chosen for UK's Next Generation ATC System
http://www.adacore.c[...]
[33]
웹사이트
Look Who's Using Ada
http://www.adacore.c[...]
[34]
웹사이트
ACM Sigplan Notices
https://dl.acm.org/d[...]
1979-06
[35]
문서
Summary of Ada Language Changes
https://dl.acm.org/d[...]
[36]
웹사이트
ISO 8652:1987
https://www.iso.org/[...]
2024-01-19
[37]
웹사이트
Ada 83 LRM, Front Page
http://archive.adaic[...]
2024-01-19
[38]
웹사이트
ISO/IEC 8652:1995
https://www.iso.org/[...]
2024-01-19
[39]
웹사이트
Ada 95 Language Reference Manual (original) – Ada Resource Association
https://www.adaic.or[...]
2024-01-19
[40]
웹사이트
ISO/IEC 8652:1995/Corr 1:2001
https://www.iso.org/[...]
[41]
웹사이트
Ada 95 RM with TC 1
http://www.adaic.org[...]
[42]
웹사이트
ISO/IEC 8652:1995/Amd 1:2007
https://www.iso.org/[...]
2024-01-19
[43]
웹사이트
Ada Reference Manual, ISO/IEC 8652:2007(E) Ed. 3
https://www.adaic.or[...]
2024-01-19
[44]
웹사이트
ISO/IEC 8652:2012
https://www.iso.org/[...]
2024-01-19
[45]
웹사이트
ISO/IEC 8652:2012/Cor 1:2016
https://www.iso.org/[...]
2024-01-19
[46]
웹사이트
Ada Syntax Card
http://www.digilife.[...]
2024-01-19
[47]
웹사이트
Subprograms
https://learn.adacor[...]
AdaCore
2024-04-14
[48]
웹사이트
Ada 83 LRM, Sec 2.8: Pragmas
http://archive.adaic[...]
Archive.adaic.com
2014-01-27
[49]
웹사이트
Ada 83 LRM, Appendix/Annex B: Predefined Language Pragmas
http://archive.adaic[...]
Archive.adaic.com
2014-01-27
[50]
문서
先進的ということは、言い換えれば「こなれていない」ということであり、兵器のようなシステムでは冒険的過ぎると言えなくもない。
[51]
웹사이트
C. Antony R. Hoare - A.M. Turing Award Laureate
http://amturing.acm.[...]
[52]
문서
この講演は、2通りのソフトウェアの設計構築法について述べた ''"One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies."''; 「ひとつめの方法は'''あきらかに'''欠陥が無いようにso simpleにするというもので、もうひとつの方法は'''あきらかな'''欠陥が無いようにso complicatedにするというものである」という文章でも知られる。
[53]
웹인용
PTC ObjectAda
http://www.ptc.com/d[...]
PTC.com
2014-01-27
[54]
웹인용
AdaMagic with C Intermediate certificate
http://ada-auth.org/[...]
[55]
웹인용
Chapel spec (Acknowledgements)
http://chapel.cray.c[...]
Cray Inc
2016-01-14
[56]
웹인용
Technical Corrigendum for Ada 2012 published by ISO
http://www.adaic.org[...]
Ada Resource Association
2016-02-23
[57]
웹인용
Consolidated Ada 2012 Language Reference Manual
http://www.ada-auth.[...]
Ada Conformity Assessment Authority
2016-02-23
[58]
웹인용
Technical Corrigendum 1 for Ada 2012
http://www.ada-auth.[...]
Ada Conformity Assessment Authority
2016-02-23
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com