Modula-2
1. 개요
1. 개요
모듈라-2는 니클라우스 비르트가 설계한 절차적 프로그래밍 언어이다. 1978년에 발표된 이 언어는 비르트의 이전 언어인 파스칼과 모듈라의 후속작으로 개발되었다. 주로 릴리스 개인 워크스테이션의 운영체제 및 응용 소프트웨어를 작성하기 위한 목적으로 만들어졌으나, 이후 다양한 환경에서의 프로그래밍에도 사용되었다.
이 언어의 핵심 설계 철학은 모듈성과 정보 은닉을 강조하는 것이다. 명령형 프로그래밍과 구조적 프로그래밍 패러다임을 따르며, 병행 컴퓨팅을 위한 기능도 포함하고 있다. 자료형 체계는 정적 타입을 채택하여 타입 안전성을 보장한다.
주요 구현체로는 니클라우스 비르트가 작성한 ETH 컴파일러, GNU Modula-2, 그리고 ADW Modula-2 등이 있다. 모듈라-2는 이후 모듈라-3와 오베론 같은 언어에 직접적인 영향을 미쳤으며, 에이다와 포트란 90 등의 언어 설계에도 기여했다.
2. 역사와 배경
2. 역사와 배경
모듈라-2는 1978년 스위스의 컴퓨터 과학자 니클라우스 비르트가 설계하여 발표한 프로그래밍 언어이다. 비르트는 이 언어를 자신이 이전에 개발한 파스칼과 모듈라의 후속 언어로 구상했다. 언어 개발의 주요 동기는 당시 비르트가 주도하던 릴리스라는 개인용 워크스테이션 프로젝트에서 시스템 소프트웨어와 응용 프로그램을 작성하기 위한 실용적인 도구가 필요했기 때문이다. 이 워크스테이션은 AMD 2901 비트-슬라이스 프로세서를 기반으로 했으며, 모듈라-2는 그 핵심 개발 언어로 채택되었다.
이 언어는 구조적 프로그래밍 원칙을 계승하면서도, 특히 대규모 소프트웨어 개발을 위한 모듈성과 정보 은닉을 강력히 지원하는 데 중점을 두었다. 또한, 병행 컴퓨팅을 언어 수준에서 직접 지원하는 것이 중요한 설계 목표 중 하나였다. 모듈라-2의 개발은 취리히 연방 공과대학교(ETH)에서 진행되었으며, 초기 주요 구현체는 비르트 자신이 작성한 ETH 컴파일러였다. 이 언어는 이후 운영체제 개발을 넘어 다양한 플랫폼의 일반적인 프로그래밍에도 널리 사용되게 된다.
3. 언어 설계와 특징
3. 언어 설계와 특징
3.1. 모듈 시스템
3.1. 모듈 시스템
모듈라-2의 핵심 설계 철학은 모듈성에 있다. 이 언어는 소프트웨어 공학에서 중요한 개념인 정보 은닉과 명확한 인터페이스를 언어 차원에서 강력하게 지원하기 위해 고안된 모듈 시스템을 도입했다. 이 시스템은 프로그램을 논리적으로 독립된 단위로 구성할 수 있게 하여, 대규모 소프트웨어 개발의 복잡성을 관리하는 데 기여했다.
모듈라-2의 모듈 시스템은 크게 정의 모듈(DEFINITION MODULE)과 구현 모듈(IMPLEMENTATION MODULE)로 구분된다. 정의 모듈은 모듈의 공개 인터페이스를 선언하는 역할을 한다. 여기에는 외부에 공개할 상수, 자료형, 변수, 프로시저의 원형만을 기술한다. 반면, 구현 모듈은 정의 모듈에서 선언된 프로시저들의 실제 구현 코드와 모듈 내부에서만 사용되는 비공개 요소들을 포함한다. 이렇게 인터페이스와 구현을 엄격히 분리함으로써, 사용자는 구현의 세부 사항을 알 필요 없이 명확히 정의된 인터페이스만을 통해 모듈을 사용할 수 있으며, 이는 코드 재사용과 유지 보수성을 크게 향상시킨다.
모듈 간의 상호작용은 IMPORT와 EXPORT 지시어를 통해 제어된다. 한 모듈이 다른 모듈에서 제공하는 기능을 사용하려면 해당 모듈의 정의 모듈을 IMPORT 해야 한다. 이는 네임스페이스를 관리하고 의존성을 명시적으로 만들어 준다. 또한, 모듈은 자신의 내부 상태를 유지하는 지역 변수를 가질 수 있으며, 초기화 코드를 포함할 수 있어 복잡한 자료 구조의 생성과 관리를 캡슐화하는 데 유용하다.
이러한 모듈 시스템은 파스칼의 단위(Unit) 개념을 발전시킨 것이며, 이후 에이다, 모듈라-3, 오베론과 같은 언어들의 모듈 설계에 직접적인 영향을 미쳤다. 또한, C 언어의 헤더 파일과 소스 파일의 분리 개념보다 더 형식적이고 안전한 체계를 제공한다고 평가받는다.
3.2. 자료형 체계
3.2. 자료형 체계
모듈라-2의 자료형 체계는 정적이며 안전한 타입 시스템을 기반으로 한다. 이는 설계자 니클라우스 비르트의 이전 언어인 파스칼에서 발전한 개념으로, 컴파일 시점에 모든 변수의 타입이 결정되고 검사된다. 이러한 접근 방식은 프로그램 실행 전에 많은 오류를 미리 발견할 수 있게 하여 소프트웨어의 신뢰성을 높이는 데 기여한다. 타입 안전성은 잘못된 타입의 데이터가 연산에 사용되는 것을 방지함으로써 메모리 접근 오류와 같은 심각한 버그를 예방한다.
이 언어는 풍부한 내장 자료형을 제공한다. 기본적인 정수형(INTEGER), 실수형(REAL), 논리형(BOOLEAN), 문자형(CHAR)을 포함하며, 이들은 모두 범위가 명확하게 정의되어 있다. 또한 프로그래머가 새로운 타입을 생성할 수 있는 강력한 메커니즘을 지원한다. TYPE 선언을 통해 기존 타입에서 파생된 서브타입을 정의하거나, 열거형을 생성할 수 있다. 특히 CARDINAL이라는 비음수 정수 타입은 시스템 프로그래밍과 하드웨어 제어에 유용하게 설계되었다.
구조화된 데이터를 위해 배열과 레코드를 제공한다. 배열은 동일한 타입의 요소들을 순서대로 저장하며, 인덱스 범위가 타입의 일부로 명시된다. 레코드는 파스칼의 그것과 유사하게, 서로 다른 타입의 필드들을 하나의 논리적 단위로 묶는 구조체를 정의한다. 또한 포인터 타입을 지원하여 동적 메모리 할당과 복잡한 자료구조를 구현할 수 있게 하되, 타입 안전성을 해치지 않는 방식으로 관리한다.
모듈라-2의 타입 시스템은 강력한 타입 검사를 수행하면서도 필요한 경우 유연성을 제공한다. 대부분의 연산은 동일한 타입 사이에서만 허용되지만, 명시적 타입 변환 절차를 통해 제어된 변환을 수행할 수 있다. 이는 언어의 설계 철학인 간결함과 안전성, 효율성을 반영하며, 특히 운영체제와 같은 시스템 소프트웨어 개발에 적합한 기반을 마련했다.
3.3. 병행 프로그래밍 지원
3.3. 병행 프로그래밍 지원
모듈라-2는 병행 컴퓨팅을 언어 설계의 핵심 요소로 통합한 최초의 주요 프로그래밍 언어 중 하나이다. 니클라우스 비르트는 병행성을 지원하기 위해 모듈과 프로세스 개념을 결합한 명시적인 기능을 언어에 도입했다. 이는 운영체제와 실시간 시스템과 같은 병렬 처리가 필요한 응용 프로그램을 작성하는 데 중요한 진전이었다.
병행 프로그래밍의 핵심은 PROCESS, SIGNAL, WAIT, SEND와 같은 키워드로 구현된 코루틴 기반의 경량 프로세스 모델이다. 프로그래머는 PROCESS 유형을 선언하고, 프로세스 간 동기화는 SIGNAL과 WAIT 연산을 통해 이루어진다. 또한, 모니터 개념을 구현한 특수한 종류의 모듈인 MONITOR 모듈을 제공하여, 공유 자원에 대한 상호 배제 접근을 보장하고 교착 상태를 방지하는 구조를 언어 수준에서 지원했다.
이러한 설계는 멀티태스킹과 병렬 처리를 위한 견고한 기초를 제공했으며, 이후 모듈라-3와 오베론 같은 후속 언어에 영향을 미쳤다. 모듈라-2의 병행성 지원은 시스템 프로그래밍 분야에서 그 실용성을 증명했으며, 특히 임베디드 시스템과 같은 제한된 자원 환경에서 효율적인 병행 프로그램 작성에 기여했다.
4. 구문과 예시
4. 구문과 예시
모듈라-2의 구문은 그 설계자인 니클라우스 비르트의 이전 언어인 파스칼에서 강한 영향을 받아 명료하고 구조적이다. 프로그램은 하나의 주 모듈로 구성되며, MODULE과 END 키워드로 둘러싸인다. 모듈의 본문은 선언부와 명령문부로 나뉘는데, 선언부에는 상수, 자료형, 변수, 프로시저 등을 정의하고, 명령문부는 BEGIN과 END 사이에 실행될 문장들을 순차적으로 나열한다. 외부 모듈의 기능을 사용하기 위해서는 FROM ... IMPORT 문을 사용하여 필요한 프로시저나 자료형을 명시적으로 가져와야 한다는 점이 특징이다.
간단한 예시로, "Hello World" 프로그램을 살펴볼 수 있다. 이 프로그램은 표준 텍스트 입출력을 담당하는 STextIO 모듈로부터 WriteString 프로시저를 가져와 문자열을 출력한다.
```modula2
MODULE Hello;
FROM STextIO IMPORT WriteString;
BEGIN
WriteString("Hello World!")
END Hello.
```
모듈라-2는 구조적 프로그래밍 원칙을 충실히 반영하여 IF, CASE, WHILE, REPEAT, FOR와 같은 제어 구조를 제공한다. 또한, 병행 프로그래밍을 위한 PROCESS, SIGNAL, WAIT, SEND와 같은 키워드를 언어 차원에서 지원한다. 자료형 시스템은 강력하고 안전하며, 사용자 정의 열거형, 부분 범위 형, 배열, 레코드, 포인터, 프로시저 형 등을 정의할 수 있어 높은 수준의 추상화를 가능하게 한다.
5. 주요 구현체 및 방언
5. 주요 구현체 및 방언
모듈라-2의 주요 구현체는 설계자 니클라우스 비르트가 직접 개발한 ETH 컴파일러에서 시작된다. 이 컴파일러는 원래 릴리스(Lilith) 워크스테이션을 위해 작성되었으며, 모듈라-2 언어의 참조 구현으로 간주된다. 이후 다양한 플랫폼으로의 이식과 확장을 통해 여러 구현체가 등장했다.
대표적인 현대적 구현체로는 GNU 프로젝트의 일환으로 개발된 GNU Modula-2가 있다. 이는 GCC(GNU 컴파일러 모음) 프론트엔드로 구현되어 여러 아키텍처와 운영 체제를 지원하며, 언어 표준을 준수하는 것을 목표로 한다. 또 다른 구현체인 ADW Modula-2는 도스 및 윈도우 환경을 위한 상용 컴파일러로 개발되었다.
모듈라-2는 시간이 지남에 따라 몇 가지 주요 방언(다이얼렉트)을 낳았다. 가장 널리 알려진 것은 비르트가 정의한 언어 보고서인 "PIM"(Programming in Modula-2)의 개정판에 기반한 PIM2, PIM3, PIM4이다. 이후 국제 표준화 기구(ISO)에서 모듈라-2에 대한 공식 표준을 발표하면서 ISO Modula-2 방언이 생겨났다. 이러한 방언들은 모듈 시스템의 세부 사항, 내장 프로시저의 목록, 구문의 미묘한 부분에서 차이를 보인다.
6. 영향 및 파생 언어
6. 영향 및 파생 언어
모듈라-2는 이후 프로그래밍 언어 설계에 지대한 영향을 미쳤다. 가장 직접적인 영향은 니클라우스 비르트 자신의 후속 언어인 오베론에 나타난다. 오베론은 모듈라-2의 모듈 시스템을 기반으로 하여 객체 지향 프로그래밍 기능을 추가하고 언어를 더욱 단순화한 것으로 평가받는다. 또한, 모듈라-3는 모듈라-2의 정신을 이어받아 미국 디지털 이큅먼트 코퍼레이션(DEC)과 올리베티(Olivetti)가 공동 개발했으며, 예외 처리와 가비지 컬렉션 같은 현대적 기능을 도입했다.
모듈라-2의 모듈성과 자료형 안전성 개념은 다른 여러 주요 언어에도 채택되었다. 에이다 프로그래밍 언어는 모듈라-2와 유사한 패키지 개념을 도입했으며, 포트란 90 역시 모듈 기능을 추가하는 데 영향을 받았다. 또한, 루아의 초기 설계와 씨드7의 모듈 시스템 설계에도 모듈라-2의 개념이 참고되었다.
파생 언어로는 모듈라-GM이 있다. 이는 제너럴 모터스(GM)의 자체 연구소에서 로봇 공학 및 제어 시스템 프로그래밍을 위해 모듈라-2를 확장한 방언이다. 조논(Zonnon)은 모듈라-2와 오베론의 영향을 받아 개발된 교육용 언어로, 마이크로소프트의 닷넷 프레임워크에서 동작하도록 설계되었다.
