맨위로가기

모듈라-3

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

모듈라-3는 1986년 시작된 모리스 윌크스와 니클라우스 비르트의 아이디어를 기반으로 개발된 프로그래밍 언어이다. 모듈, 인터페이스, 안전하지 않은 코드의 명시적 표시, 제네릭, 가비지 컬렉션, 강력한 타입 지정, 객체, 예외 처리, 스레드 등의 특징을 가지고 있으며, 표준 라이브러리를 통해 다양한 기능을 제공한다. 교육용 언어로 사용되었지만 산업적으로 널리 채택되지는 않았으며, 현재는 주로 비교 프로그래밍 언어 과정에서 가르쳐지고 있다. 이 언어는 자바, 파이썬, 님 등 다른 언어에 영향을 미쳤으며, SPIN 운영체제, CVSup 소프트웨어 저장소 동기화 프로그램, 오블릭 언어 등 관련 프로젝트에도 활용되었다.

더 읽어볼만한 페이지

  • 1988년 개발된 프로그래밍 언어 - Tcl
    Tcl은 존 오스터하우트가 개발한 명령어 기반의 프로그래밍 언어로, Tk 툴킷과 결합하여 GUI 스크립팅 환경으로 발전했으며, 다양한 운영체제에서 사용 가능하고 C, C++, Java 등 다른 언어와의 인터페이스를 지원한다.
  • 1988년 개발된 프로그래밍 언어 - 울프럼 언어
    울프럼 언어는 울프럼 리서치에서 개발한 기호 계산 프로그래밍 언어로서, 매스매티카에 처음 소개된 후 3차원 모델링, 데이터 분석, 이미지 처리 등의 기능이 추가되어 과학, 공학, 금융, 데이터 과학 등 다양한 분야에서 활용되고 있으며, 특히 라즈베리 파이 버전 무료 제공으로 대중적으로 알려졌다.
  • 시스템 프로그래밍 언어 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • 시스템 프로그래밍 언어 - 스위프트 (프로그래밍 언어)
    2014년 애플 세계 개발자 컨퍼런스에서 처음 공개된 스위프트는 크리스 래트너가 개발한 애플의 범용 프로그래밍 언어로서, Objective-C를 대체하며 다양한 플랫폼 지원, 모던 문법, 안정성, 인터랙티브한 개발 환경, SwiftUI 등의 특징을 가진다.
  • 객체 지향 프로그래밍 언어 - 터보 파스칼
    필립 칸이 개발하고 안데르스 헤일스베르그가 기반을 다진 터보 파스칼은 저렴한 가격, 빠른 컴파일, 사용하기 쉬운 IDE를 특징으로 1980년대 PC 프로그래밍에 혁신을 가져왔으며, 여러 기능 추가를 거쳐 델파이 등장 후 레거시 기술이 되었고 일부 버전은 프리웨어로 배포된다.
  • 객체 지향 프로그래밍 언어 -
    펄은 래리 월이 개발한 텍스트 조작에 강점을 가진 다목적 프로그래밍 언어이며, 1987년 펄 1.0이 처음 공개된 이후 여러 버전 업데이트를 거쳐 객체 지향 프로그래밍과 유니코드 지원 기능을 추가했고, 현재 펄 5가 널리 사용되며 CPAN을 통해 방대한 모듈 생태계를 제공한다.
모듈라-3 - [IT 관련 정보]에 관한 문서
개요
이름모듈라-3
모듈라-3 로고
모듈라-3 로고
개발 시작1988년
특징
프로그래밍 패러다임명령형
구조적
절차적
모듈성
병행
객체 지향
제네릭
타입 시스템강한
정적
안전 또는 명시적으로 안전하게 격리된 경우 안전하지 않음
변수 범위어휘적
설계 및 개발
계열니클라우스 비르트/모듈라
설계자Luca Cardelli
James Donahue
Lucille Glassman
Mick Jordan
Bill Kalsow
Greg Nelson
개발자DEC
Olivetti
elego Software Solutions GmbH
최신 안정화 버전5.8.6
최신 안정화 버전 출시일2010년 7월 14일
미리보기 버전5.8.6
미리보기 버전 출시일2010년 7월 14일
구현체SRC Modula-3
CM3
PM3
EZM3
M3/PC Klagenfurt
영향
영향을 준 언어ALGOL
Euclid
Mesa
Modula-2
Modula-2+
Oberon
Pascal
영향을 받은 언어C#
Java
Nim
OCaml
Rust
파이썬
시스템
플랫폼IA-32
x86-64
PowerPC
SPARC
운영 체제크로스 플랫폼:
FreeBSD
리눅스
Darwin
SunOS
외부 링크
웹사이트모듈라-3 공식 웹사이트

2. 역사적 배경

모듈라-3는 1980년대 후반 DEC올리베티에서 모듈라-2의 후속으로 개발한 절차적 프로그래밍 언어이다. 객체 지향 프로그래밍 기능을 일부 지원한다.

1990년대에 교육용 언어로 인기를 얻었으나, 산업계에서는 널리 사용되지 못했다. 주된 이유는 주요 후원사였던 DEC가 Compaq에 인수되면서 지원이 중단되었기 때문이다. 단순하고 강력했지만, 당시 절차적 컴파일 언어에 대한 수요가 적었고, 객체 지향 프로그래밍의 제한적인 지원도 한계로 작용했다.

메사, 시더, 오브젝트 파스칼, 오베론, 유클리드 등 다양한 언어의 영향을 받았다.[9]

현재 모듈라-3는 주로 대학교의 비교 프로그래밍 언어 수업에서 다루어지고 있으며, 관련 교재는 절판되었다.

2. 1. 개발 배경

1986년 11월, 모리스 윌크스니클라우스 비르트에게 새로운 버전의 모듈라에 대한 아이디어를 담아 편지를 쓰면서 모듈라-3 프로젝트가 시작되었다. 윌크스는 이 시점 직전까지 DEC에서 일했고, 영국으로 돌아와 올리베티의 연구 전략 위원회에 합류했다. 비르트는 이미 오베론으로 옮겨갔지만, 윌크스의 팀이 모듈라라는 이름으로 개발을 계속하는 데는 아무런 문제가 없었다.[9] 언어 정의는 1988년 8월에 완료되었고, 1989년 1월에 업데이트된 버전이 나왔다. 곧 DEC와 올리베티에서 컴파일러가 나왔고, 그 이후에 3rd party 구현이 이어졌다.

이 언어의 설계는 당시 SRC와 Acorn Computers 연구 센터(ARC, 나중에 올리베티가 아콘을 인수한 후 ORC)에서 사용되던 모듈라-2+ 언어에 큰 영향을 받았다. 모듈라-2+는 DEC Firefly 멀티프로세서 VAX 워크스테이션용 운영 체제가 작성된 언어였으며, ARM 기반 Acorn Archimedes 컴퓨터 제품군을 위한 ARC의 Acorn C 및 모듈라 실행 라이브러리(CAMEL)를 위한 아콘 컴파일러가 작성된 언어였다. 개정된 모듈라-3 보고서에서 언급했듯이, 이 언어는 메사, 시더, 오브젝트 파스칼, 오베론, 유클리드와 같은 다른 언어의 영향을 받았다.[9]

2. 2. 초기 개발

모듈라-3 프로젝트는 1986년 11월, 모리스 윌크스니클라우스 비르트에게 새로운 버전의 모듈라에 대한 아이디어를 담아 편지를 쓰면서 시작되었다.[9] 윌크스는 이 시점 직전까지 DEC에서 일했고, 영국으로 돌아와 올리베티의 연구 전략 위원회에 합류했다. 비르트는 이미 오베론으로 옮겨갔지만, 윌크스의 팀이 모듈라라는 이름으로 개발을 계속하는 데는 아무런 문제가 없었다.[9] 언어 정의는 1988년 8월에 완료되었고, 1989년 1월에 업데이트된 버전이 나왔다.[9] 곧 DEC와 올리베티에서 컴파일러가 나왔고, 그 이후에 제3자 구현이 이어졌다.[9]

이 언어의 설계는 당시 SRC와 Acorn Computers 연구 센터(ARC, 나중에 올리베티가 아콘을 인수한 후 ORC)에서 사용되던 모듈라-2+ 언어에 큰 영향을 받았다.[9] 모듈라-2+는 DEC Firefly 멀티프로세서 VAX 워크스테이션용 운영 체제가 작성된 언어였으며, ARM 기반 Acorn Archimedes 컴퓨터 제품군을 위한 ARC의 Acorn C 및 모듈라 실행 라이브러리(CAMEL)를 위한 아콘 컴파일러가 작성된 언어였다.[9] 개정된 모듈라-3 보고서에서 언급했듯이, 이 언어는 메사, 시더, 오브젝트 파스칼, 오베론, 유클리드와 같은 다른 언어의 영향을 받았다.[9]

2. 3. 공식 발표 및 발전

모듈라-3 프로젝트는 1986년 11월, 모리스 윌크스니클라우스 비르트에게 새로운 버전의 모듈라에 대한 아이디어를 담아 편지를 쓰면서 시작되었다.[9] 윌크스는 이 시점 직전까지 DEC에서 일했고, 영국으로 돌아와 올리베티의 연구 전략 위원회에 합류했다. 비르트는 이미 오베론으로 옮겨갔지만, 윌크스의 팀이 모듈라라는 이름으로 개발을 계속하는 데는 아무런 문제가 없었다. 언어 정의는 1988년 8월에 완료되었고, 1989년 1월에 업데이트된 버전이 나왔다. 곧 DEC와 올리베티에서 컴파일러가 나왔고, 그 이후에 3rd party 구현이 이어졌다.

이 언어의 설계는 당시 SRC와 Acorn Computers 연구 센터(ARC, 나중에 올리베티가 아콘을 인수한 후 ORC)에서 사용되던 모듈라-2+ 언어에 큰 영향을 받았다. 모듈라-2+는 DEC Firefly 멀티프로세서 VAX 워크스테이션용 운영 체제가 작성된 언어였으며, ARM 기반 Acorn Archimedes 컴퓨터 제품군을 위한 ARC의 Acorn C 및 모듈라 실행 라이브러리(CAMEL)를 위한 아콘 컴파일러가 작성된 언어였다. 개정된 모듈라-3 보고서에서 언급했듯이, 이 언어는 메사, 시더, 오브젝트 파스칼, 오베론, 유클리드와 같은 다른 언어의 영향을 받았다.[9]

1990년대 동안 모듈라-3는 교육용 언어로 상당한 인기를 얻었지만, 산업용으로는 널리 채택되지 않았다. 이에 기여한 요인으로는 모듈라-3의 주요 지지자였던 DEC의 몰락(특히 DEC가 1998년 Compaq에 매각되기 전까지 효과적으로 유지 관리를 중단한 시점)이 있을 수 있다.

2. 4. 쇠퇴와 유산

모듈라-3 프로젝트는 1986년 11월 모리스 윌크스니클라우스 비르트에게 새로운 버전의 모듈라에 대한 아이디어를 담아 편지를 쓰면서 시작되었다.[9] 윌크스는 이 시점 직전까지 DEC에서 일했고, 영국으로 돌아와 올리베티의 연구 전략 위원회에 합류했다. 비르트는 이미 오베론으로 옮겨갔지만, 윌크스의 팀이 모듈라라는 이름으로 개발을 계속하는 데는 아무런 문제가 없었다. 언어 정의는 1988년 8월에 완료되었고, 1989년 1월에 업데이트된 버전이 나왔다. 곧 DEC와 올리베티에서 컴파일러가 나왔고, 그 이후에 3rd party 구현이 이어졌다.

이 언어의 설계는 당시 SRC와 Acorn Computers 연구 센터(ARC, 나중에 올리베티가 아콘을 인수한 후 ORC)에서 사용되던 모듈라-2+ 언어에 큰 영향을 받았다. 모듈라-2+는 DEC Firefly 멀티프로세서 VAX 워크스테이션용 운영 체제가 작성된 언어였으며, ARM 기반 Acorn Archimedes 컴퓨터 제품군을 위한 ARC의 Acorn C 및 모듈라 실행 라이브러리(CAMEL)를 위한 아콘 컴파일러가 작성된 언어였다. 개정된 모듈라-3 보고서에서 언급했듯이, 이 언어는 메사, 시더, 오브젝트 파스칼, 오베론, 유클리드와 같은 다른 언어의 영향을 받았다.[9]

1990년대 동안 모듈라-3는 교육용 언어로 상당한 인기를 얻었지만, 산업용으로는 널리 채택되지 않았다. 이에 기여한 요인으로는 모듈라-3의 주요 지지자였던 DEC의 몰락(특히 DEC가 1998년 Compaq에 매각되기 전까지 효과적으로 유지 관리를 중단한 시점)이 있을 수 있다. 어떤 경우든, 모듈라-3의 단순성과 강력함에도 불구하고, 절차적 컴파일 언어에 대한 수요가 적었고, 객체 지향 프로그래밍의 구현이 제한적이었다. 한때, DEC SRC에서 CM3라는 상용 컴파일러가 주요 개발자 중 한 명에 의해 유지되었으며, DEC가 Compaq에 매각되기 전에 고용되었고, Reactor라는 통합 개발 환경 (IDE) 및 확장 가능한 자바 가상 머신이 Critical Mass, Inc.에서 제공되었지만, 해당 회사는 2000년에 활동을 중단하고 제품의 일부 소스 코드를 elego Software Solutions GmbH에 넘겼다. 현재 모듈라-3는 주로 비교 프로그래밍 언어 과정에서 대학에서 가르치고 있으며, 교재는 절판되었다. 기본적으로 모듈라-3의 유일한 기업 지지자는 elego인데, Critical Mass로부터 소스를 상속받아 CM3 시스템의 여러 릴리스를 소스 및 바이너리 코드로 제공해 왔다. Reactor IDE는 몇 년 동안 오픈 소스로 릴리스되지 않다가 CM3-IDE라는 새로운 이름으로 오픈 소스로 릴리스되었다. 2002년 3월, elego는 또한 당시 몬트리올 폴리텍 대학교에서 유지 관리되던 다른 활성 모듈라-3 배포판인 PM3의 저장소를 인수했으며, 이후 HM3에 대한 작업이 이어졌고, 수년에 걸쳐 개선되었지만 결국 구식이 되었다.

3. 문법

모듈라-3 언어의 구문의 일반적인 예시는 "Hello, World!" 프로그램이다.

모듈라-3의 모든 프로그램은 적어도 하나의 모듈 파일을 가지며, 대부분은 클라이언트가 모듈에서 데이터에 접근하는 데 사용되는 인터페이스 파일도 포함한다. 다른 언어와 마찬가지로 모듈라-3 프로그램은 Main 모듈을 내보내야 하며, 이는 Main.m3라는 파일이거나 `EXPORT`를 호출하여 Main 모듈을 내보낼 수 있다.

모듈 파일 이름은 소스 코드의 이름과 동일하게 하는 것이 좋다. 그렇지 않은 경우 컴파일러는 경고만 표시한다.

인터페이스에서 내보낸 유형을 `T`로 명명하는 규칙이 있는데, 유형은 일반적으로 전체 이름으로 한정되므로 Foo라는 모듈 내의 유형 `T`는 `Foo.T`로 명명된다. 이는 가독성에 도움이 된다. 이와 비슷한 규칙으로, 공용 객체를 `Public`으로 명명하는 것이 있다.

3. 1. 기본 구조

모듈라-3의 모든 프로그램은 적어도 하나의 모듈 파일을 가지며, 대부분은 클라이언트가 모듈에서 데이터에 접근하는 데 사용되는 인터페이스 파일도 포함한다. 다른 언어와 마찬가지로 모듈라-3 프로그램은 Main 모듈을 내보내야 하며, 이는 Main.m3라는 파일이거나 다음 코드처럼 EXPORT를 호출하여 Main 모듈을 내보낼 수 있다.

```modula3

MODULE Foo EXPORTS Main

```

모듈 파일 이름은 소스 코드의 이름과 동일하게 하는 것이 좋다. 그렇지 않은 경우 컴파일러는 경고만 표시한다.

인터페이스에서 내보낸 유형을 `T`로 명명하는 규칙이 있는데, 유형은 일반적으로 전체 이름으로 한정되므로 Foo라는 모듈 내의 유형 `T`는 `Foo.T`로 명명된다. 이는 가독성에 도움이 된다. 또 다른 유사한 규칙은 공용 객체를 `Public`으로 명명하는 것이다.

"Hello, World!" 프로그램 예시는 다음과 같다.

```modula3

MODULE Main;

IMPORT IO;

BEGIN

IO.Put("Hello World\n")

END Main.

3. 2. "Hello, World!" 프로그램

modula-3

MODULE Main;

IMPORT IO;

BEGIN

IO.Put("Hello World\n")

END Main.

```

모듈라-3의 모든 프로그램은 적어도 하나의 모듈 파일을 가지며, 대부분은 클라이언트가 모듈에서 데이터에 접근하는 데 사용되는 인터페이스 파일도 포함한다. 다른 언어와 마찬가지로 모듈라-3 프로그램은 Main 모듈을 내보내야 하며, 이는 Main.m3라는 파일이거나 `EXPORT`를 호출하여 Main 모듈을 내보낼 수 있다.

```modula-3

MODULE Foo EXPORTS Main

```

모듈 파일 이름은 소스 코드의 이름과 동일하게 하는 것이 좋다. 그렇지 않은 경우 컴파일러는 경고만 표시한다.

인터페이스에서 내보낸 유형을 `T`로 명명하는 규칙이 있는데, 유형은 일반적으로 전체 이름으로 한정되므로 Foo라는 모듈 내의 유형 `T`는 `Foo.T`로 명명된다. 이는 가독성에 도움이 된다. 이와 비슷한 규칙으로, 아래의 객체 지향 프로그래밍 예제에서처럼 공용 객체를 `Public`으로 명명하는 것이 있다.

4. 언어 특징

모듈라-3는 다음과 같은 특징을 가진 프로그래밍 언어이다.


  • 모듈성: 모듈라-3의 컴파일 단위는 `INTERFACE`와 `MODULE`로 나뉜다. `INTERFACE`는 상수, 타입, 변수, 예외, 프로시저 등을 정의하고, `MODULE`은 실제 코드를 포함하며 인터페이스 구현에 필요한 추가적인 요소들을 제공한다. 구현 모듈은 기본적으로 같은 이름의 인터페이스를 구현하지만, `EXPORT`를 통해 다른 이름의 모듈로 내보낼 수 있다.
  • 안전성: C 언어와의 인터페이스 등 결과의 일관성을 보장할 수 없는 일부 기능은 안전하지 않은 것으로 간주된다. `UNSAFE` 키워드를 사용하여 이러한 기능을 활성화할 수 있다. 안전하지 않은 모듈을 가져오는 인터페이스는 안전하지 않아야 하며, 안전하지 않은 구현 모듈에서 안전한 인터페이스를 내보낼 수 있다.
  • 제네릭 프로그래밍: `GENERIC` 키워드를 사용하여 제네릭 인터페이스와 모듈을 정의할 수 있다. 이는 C++ 템플릿과 유사하게 추상 자료형을 정의하고 사용하는 데 사용되지만, 모듈 수준의 세분성을 가진다. 제네릭 인터페이스는 다른 인터페이스를 인수로 받아 구체적인 모듈을 생성한다.[1] 예를 들어, `GenericStack`을 정의하고 `IntegerElem`과 같은 인터페이스로 인스턴스화할 수 있다.[1]
  • 가비지 컬렉션: 모듈라-3는 런타임에 데이터 할당을 지원하며, `TRACED`와 `UNTRACED` 두 종류의 메모리를 제공한다. `NEW()` 함수를 사용하여 데이터를 할당하고, `UNSAFE` 모듈에서는 `DISPOSE`를 사용하여 추적되지 않는 메모리를 해제할 수 있다.
  • 객체 지향 프로그래밍: 모듈라-3에서는 객체 지향 프로그래밍 기법을 사용할 수 있지만 필수는 아니다. 객체 타입은 `OBJECT` 선언으로 도입되며, RECORD와 유사하지만 참조 타입이다. 내보낸 타입은 관례적으로 `T`로 명명되며, 메서드와 데이터를 노출하기 위해 별도의 `Public` 타입을 생성한다.[10] `REVEAL` 구성을 통해 구현 세부 정보를 숨길 수 있으며, `BRANDED` 키워드를 사용하여 객체를 고유하게 만들 수 있다.[10]
  • 예외 처리: 예외 처리는 `TRY`...`EXCEPT` 블록 시스템을 기반으로 한다. `LOOP`...`EXIT`...`END` 구문도 지원하며, 이는 `TRY`...`EXCEPT` 절 내의 간단한 루프와 동일한 구조이다.
  • 다중 스레딩: 모듈라-3는 다중 스레딩 사용과 스레드 간 동기화를 지원한다. 표준 모듈 `Thread`는 다중 스레드 애플리케이션 개발을 지원하며, MUTEX를 사용하여 스레드를 동기화하고 데이터 구조를 보호할 수 있다. `LOCK` 문은 뮤텍스가 잠기는 블록을 도입한다.

4. 1. 모듈성

모듈라-3에서 컴파일된 유닛은 `INTERFACE` 또는 구현 `MODULE` 중 하나이다. `INTERFACE`로 시작하는 인터페이스는 상수, 유형, 변수, 예외 및 프로시저를 정의한다. `MODULE`로 시작하는 구현 모듈은 코드를 제공하며, 인터페이스 구현에 필요한 추가 상수, 유형 또는 변수를 제공한다. 기본적으로 구현 모듈은 같은 이름의 인터페이스를 구현하지만, 모듈은 명시적으로 `EXPORT`를 통해 다른 이름의 모듈로 내보낼 수 있다. 예를 들어, 메인 프로그램은 Main 인터페이스에 대한 구현 모듈을 내보낸다.

```modula2

MODULE HelloWorld EXPORTS Main;

IMPORT IO;

BEGIN

IO.Put("Hello World\n")

END HelloWorld.

```

모든 컴파일된 유닛은 다른 인터페이스를 `IMPORT` 할 수 있지만, 순환 import는 금지된다. 이는 구현 `MODULE`에서 import를 수행하여 해결할 수 있다. `FROM Module IMPORT Item [, Item]*` 구문을 사용하여 import된 모듈 내의 엔티티를 모듈 이름만 import하는 대신 import할 수 있다.

```modula2

MODULE HelloWorld EXPORTS Main;

FROM IO IMPORT Put;

BEGIN

Put("Hello World\n")

END HelloWorld.

```

일반적으로 인터페이스만 import하고 '점' 표기법을 사용하여 인터페이스 내의 항목에 접근한다(레코드 내의 필드에 접근하는 것과 유사). 일반적인 사용 사례는 지원 프로시저와 함께 인터페이스당 하나의 자료 구조(레코드 또는 객체)를 정의하는 것이다. 여기서 메인 유형은 'T'라는 이름을 얻고 `MyModule.T`와 같이 사용한다.

import된 모듈과 모듈 내의 다른 엔티티 간에 이름 충돌이 발생하는 경우, `AS` 예약어를 `IMPORT CollidingModule AS X;`와 같이 사용할 수 있다.

4. 2. 안전성

일부 기능은 컴파일러가 결과의 일관성을 더 이상 보장할 수 없을 때, 예를 들어 C 언어와 인터페이스할 때 안전하지 않은 것으로 간주된다. UNSAFE 키워드는 INTERFACE 또는 MODULE 앞에 붙어 컴파일러에게 언어의 특정 하위 수준 기능을 활성화하도록 지시하는 데 사용될 수 있다. 예를 들어, 안전하지 않은 연산은 정수의 비트를 부동 소수점 REAL 숫자로 복사하기 위해 LOOPHOLE을 사용하여 타입 시스템을 우회하는 것이다.

안전하지 않은 모듈을 가져오는 인터페이스도 안전하지 않아야 한다. 안전하지 않은 구현 모듈에서 안전한 인터페이스를 내보낼 수 있다. 이는 외부 라이브러리와 인터페이스할 때 일반적인 사용 사례이며, 두 개의 인터페이스가 구축된다. 하나는 안전하지 않고 다른 하나는 안전하다.

4. 3. 제네릭 프로그래밍

GENERIC 키워드를 INTERFACE 또는 MODULE 키워드 앞에 붙이고 다른 인터페이스를 형식 인수로 사용하여 제네릭 인터페이스와 해당 제네릭 모듈을 정의한다. 이를 통해 C++ 템플릿처럼 추상 자료형을 쉽게 정의하고 사용할 수 있다. 그러나 C++와 달리 모듈 수준의 세분성을 가진다. 인터페이스는 제네릭 인터페이스와 구현 모듈에 인수로 전달되며, 컴파일러는 구체적인 모듈을 생성한다.[1]

예를 들어, `GenericStack`을 정의한 다음 `IntegerElem`, `RealElem` 또는 객체에 대한 인터페이스와 같은 인터페이스로 인스턴스화할 수 있다. 단, 각 인터페이스가 제네릭 모듈에 필요한 속성을 정의하는 경우이다.[1]

`INTEGER` 또는 `REAL`과 같은 베어 타입은 모듈이 아니므로 사용할 수 없다. 제네릭 시스템은 모듈을 인수로 사용하는 것을 기반으로 하기 때문이다. 반면 C++ 템플릿에서는 베어 타입을 사용한다.[1]

'''파일: IntegerElem.i3'''



INTERFACE IntegerElem;

CONST Name = "Integer";

TYPE T = INTEGER;

PROCEDURE Format(x: T): TEXT;

PROCEDURE Scan(txt: TEXT; VAR x: T): BOOLEAN;

END IntegerElem.



'''파일: GenericStack.ig'''



GENERIC INTERFACE GenericStack(Element);

(* 여기에서 Element.T는 제네릭 스택에 저장할 타입입니다. *)

TYPE

T = Public OBJECT;

Public = OBJECT

METHODS

init(): TStack;

format(): TEXT;

isEmpty(): BOOLEAN;

count(): INTEGER;

push(elm: Element.T);

pop(VAR elem: Element.T): BOOLEAN;

END;

END GenericStack.



'''파일: GenericStack.mg'''



GENERIC MODULE GenericStack(Element);

< ... 제네릭 구현 세부 정보... >

PROCEDURE Format(self: T): TEXT =

VAR

str: TEXT;

BEGIN

str := Element.Name & "Stack{";

FOR k := 0 TO self.n -1 DO

IF k > 0 THEN str := str & ", "; END;

str := str & Element.Format(self.arr[k]);

END;

str := str & "};";

RETURN str;

END Format;

< ... 더 많은 제네릭 구현 세부 정보... >

END GenericStack.



'''파일: IntegerStack.i3'''



INTERFACE IntegerStack = GenericStack(IntegerElem) END IntegerStack.



'''파일: IntegerStack.m3'''



MODULE IntegerStack = GenericStack(IntegerElem) END IntegerStack.


4. 4. 가비지 컬렉션

모듈라-3는 런타임에 데이터 할당을 지원한다. 할당할 수 있는 메모리에는 `TRACED`와 `UNTRACED`의 두 종류가 있으며, 이들의 차이점은 가비지 컬렉터가 해당 메모리를 볼 수 있는지 여부에 있다. `NEW()`는 이 두 종류의 메모리 클래스 중 하나에 데이터를 할당하는 데 사용된다. `UNSAFE` 모듈에서는 추적되지 않는 메모리를 해제하기 위해 `DISPOSE`를 사용할 수 있다.

4. 5. 객체 지향 프로그래밍

모듈라-3에서는 객체 지향 프로그래밍 기법을 사용할 수 있지만, 필수는 아니다. 모듈, 제네릭과 같은 다른 기능들이 객체 지향의 역할을 대신할 수 있다. 객체 지원은 의도적으로 가장 단순한 형태로 유지된다. 객체 타입(다른 객체 지향 언어에서는 "클래스"라고 함)은 `OBJECT` 선언으로 도입되며, 이는 본질적으로 `RECORD` 선언과 동일한 구문을 갖는다. 하지만 객체 타입은 참조 타입인 반면, 모듈라-3의 `RECORD`는 그렇지 않다(C의 구조체와 유사하다). 내보낸 타입은 관례적으로 T로 명명되며, 메서드와 데이터를 노출하기 위해 별도의 "Public" 타입을 생성한다.[10]

4. 5. 1. 객체 타입 선언

모듈라-3에서는 객체 지향 프로그래밍 기법을 사용할 수 있지만, 필수는 아니다. 모듈라-3에서 제공되는 다른 많은 기능(모듈, 제네릭)이 객체 지향의 역할을 대신할 수 있다.

객체 지원은 의도적으로 가장 단순한 형태로 유지된다. 객체 타입(다른 객체 지향 언어에서는 "클래스"라고 함)은 `OBJECT` 선언으로 도입되며, 이는 본질적으로 `RECORD` 선언과 동일한 구문을 갖는다. 하지만 객체 타입은 참조 타입인 반면, 모듈라-3의 `RECORD`는 그렇지 않다(C의 구조체와 유사). 내보낸 타입은 관례적으로 일반적으로 T로 명명되며, 메서드와 데이터를 노출하기 위해 별도의 "Public" 타입을 생성한다. 예를 들어 다음과 같다.

```modula2

INTERFACE Person;

TYPE T <: Public;

Public = OBJECT

METHODS

getAge(): INTEGER;

init(name: TEXT; age: INTEGER): T;

END;

END Person.

```

이것은 두 개의 타입 `T`와 `Public`을 가진 인터페이스 Person을 정의하며, `Public`은 `getAge()`와 `init()` 두 개의 메서드를 가진 객체로 정의된다. `T`는 `<:` 연산자를 사용하여 `Public`의 하위 타입으로 정의된다.

새로운 `Person.T` 객체를 생성하려면 내장 프로시저 `NEW`를 메서드 `init()`과 함께 사용한다.

```modula2

VAR jim := NEW(Person.T).init("Jim", 25);

4. 5. 2. 메서드

모듈라-3에서는 객체 지향 프로그래밍 기법을 사용할 수 있지만, 필수는 아니다. 모듈라-3에서 제공되는 다른 많은 기능(모듈, 제네릭)이 객체 지향의 역할을 대신할 수 있다.

객체 지원은 의도적으로 가장 단순한 형태로 유지된다. 객체 타입(다른 객체 지향 언어에서는 "클래스"라고 함)은 `OBJECT` 선언으로 도입되며, 이는 본질적으로 `RECORD` 선언과 동일한 구문을 갖는다. 하지만 객체 타입은 참조 타입인 반면, 모듈라-3의 RECORD는 그렇지 않다(C의 구조체와 유사). 내보낸 타입은 관례적으로 일반적으로 T로 명명되며, 메서드와 데이터를 노출하기 위해 별도의 "Public" 타입을 생성한다. 예를 들어 다음과 같다.

```modula2

INTERFACE Person;

TYPE T <: Public;

Public = OBJECT

METHODS

getAge(): INTEGER;

init(name: TEXT; age: INTEGER): T;

END;

END Person.

```

이것은 두 개의 타입 `T`와 `Public`을 가진 인터페이스 `Person`을 정의하며, `Public`은 `getAge()`와 `init()` 두 개의 메서드를 가진 객체로 정의된다. `T`는 `<:` 연산자를 사용하여 `Public`의 하위 타입으로 정의된다.

새로운 `Person.T` 객체를 생성하려면 내장 프로시저 `NEW`를 메서드 `init()`과 함께 사용한다.

```modula2

VAR jim := NEW(Person.T).init("Jim", 25);

4. 5. 3. 정보 은닉

모듈라-3에서는 객체 지향 프로그래밍 기법을 사용할 수 있지만 필수는 아니다. 모듈, 제네릭과 같은 다른 기능들이 객체 지향의 역할을 대신할 수 있다. 객체 타입(다른 객체 지향 언어에서는 "클래스"라고 함)은 `OBJECT` 선언으로 도입되며, `RECORD` 선언과 동일한 구문을 갖지만 객체 타입은 참조 타입인 반면 `RECORD`는 그렇지 않다(C의 구조체와 유사하다).[10]

내보낸 타입은 관례적으로 `T`로 명명되며, 메서드와 데이터를 노출하기 위해 별도의 "Public" 타입을 생성한다. 예를 들어, 다음과 같이 `Person` 인터페이스를 정의할 수 있다.[10]

```modula2

INTERFACE Person;

TYPE T <: Public;

Public = OBJECT

METHODS

getAge(): INTEGER;

init(name: TEXT; age: INTEGER): T;

END;

END Person.

```

위 코드는 `getAge()`와 `init()` 두 개의 메서드를 가진 `Public` 객체 타입을 정의한다. `T`는 `<:` 연산자를 사용하여 `Public`의 하위 타입으로 정의된다. 새로운 `Person.T` 객체를 생성하려면 `NEW` 프로시저를 `init()` 메서드와 함께 사용한다. (예: `VAR jim := NEW(Person.T).init("Jim", 25);`)[10]

모듈라-3의 `REVEAL` 구성은 구현 세부 정보를 숨기는 강력한 메커니즘을 제공하며, 여러 수준의 "프렌들리함"을 제공한다. `REVEAL T = V` 형태의 전체 공개는 `Person` 인터페이스의 전체 구현을 보여주는 데 사용될 수 있다. `REVEAL T <: V` 형태의 부분 공개는 T에 대한 추가 정보를 공개하지 않고 T가 V의 상위 유형임을 공개한다.[10]

`BRANDED` 키워드는 구조적 등가성을 피하기 위해 객체를 "브랜딩"하여 고유하게 만든다. `BRANDED`는 문자열을 인수로 사용할 수 있지만, 생략하면 고유한 문자열이 자동 생성된다.[10]

모듈라-3은 모듈 외부 참조가 엄격하게 정규화되어야 하는 몇 안 되는 언어 중 하나이다. 즉, 모듈 `A`에서 모듈 `B`의 객체 `x`를 참조하려면 `B.x` 형식을 사용해야 한다. 모듈에서 "내보낸 모든 이름"을 가져오는 것은 불가능하다.[10]

이러한 이름 정규화 및 메서드 오버라이딩 요구 사항 덕분에 인터페이스에 새 선언을 추가해도 작동하는 프로그램을 망가뜨리지 않는다. 따라서 프로그래머는 명명 충돌 걱정 없이 대규모 프로그램을 동시에 편집하고, 핵심 언어 라이브러리를 편집할 수 있다.[10]

4. 6. 예외 처리

예외 처리는 `TRY`...`EXCEPT` 블록 시스템을 기반으로 하며, 이는 이후 널리 사용되게 되었다. 델파이, 파이썬, 스칼라, Visual Basic.NET과 같은 다른 언어에서는 `EXCEPT` 구문이 각 가능한 예외를 자체 EXCEPT 절의 경우로 사용하는 일종의 switch 문을 정의했다는 점이 주목할 만하다. 모듈라-3은 또한 `EXIT`가 발생할 때까지 루프를 반복하는 `LOOP`...`EXIT`...`END` 구문을 지원하며, 이는 `TRY`...`EXCEPT` 절 내의 간단한 루프와 동일한 구조이다.

4. 7. 다중 스레딩

모듈라-3는 다중 스레딩 사용과 스레드 간 동기화를 지원한다.

런타임 라이브러리(`m3core`)에는 다중 스레드 애플리케이션 사용을 지원하는 Thread라는 표준 모듈이 있다. 모듈라-3 런타임은 가비지 컬렉션 같은 내부 작업을 위해 별도 스레드를 사용할 수 있다.

내장된 자료 구조인 뮤텍스(`MUTEX`)는 여러 스레드를 동기화하고, 잠재적인 손상이나 경합 상태로부터 자료 구조를 보호하는 데 사용된다. `LOCK` 문은 뮤텍스가 잠기는 블록을 도입한다. `MUTEX` 해제는 코드 실행 위치가 블록을 벗어남으로써 암시적으로 이루어진다. `MUTEX`는 객체이므로, 다른 객체가 파생될 수 있다.

예를 들어, 라이브러리 `libm3`의 입출력(I/O) 섹션에서 리더와 라이터(Rd.T 및 Wr.T)는 MUTEX에서 파생되며, 버퍼와 같은 내부 데이터에 접근하거나 수정하기 전에 자체적으로 잠금을 건다.

5. 표준 라이브러리

C 언어에서 시작된 추세를 이어받아, 실제 프로그램을 작성하는 데 필요한 많은 기능들이 언어 정의에서 제외되고 대신 표준 라이브러리 집합을 통해 제공되었다.[11]

표준 라이브러리는 필수적인 표준 인터페이스와 권장 인터페이스로 구분된다.

구분기능설명
필수적인 표준 인터페이스텍스트`TEXT`라고 하는 변경 불가능한 문자열 참조에 대한 연산
스레드`MUTEX`, 조건 변수 및 스레드 일시 중지를 포함한 스레딩 관련 연산. 스레딩 라이브러리는 선점형 스레드 전환을 제공한다.
워드부호 없는 정수(또는 기계 워드)에 대한 비트 단위 연산. 일반적으로 컴파일러에 의해 직접 구현된다.
부동 소수점 인터페이스
권장 인터페이스Lex숫자 및 기타 데이터를 구문 분석하기 위한 모듈
Fmt출력을 위해 다양한 데이터 유형을 서식 지정
Pkl(또는 Pickle)가비지 수집기에 의해 접근 가능한 모든 참조 유형의 객체 직렬화
Table맵을 위한 일반 모듈



C와 마찬가지로 I/O는 Modula-3에서는 `Rd`와 `Wr`이라고 하는 라이브러리를 통해 제공된다. Rd(리더) 및 Wr(라이터) 라이브러리의 객체 지향 설계는 Greg Nelson의 책에서 자세히 다루고 있다. Modula-3의 흥미로운 측면은 표준 라이브러리가 잠금 버그를 포함한 다양한 유형의 버그를 포함하지 않도록 공식적으로 검증된 몇 안 되는 프로그래밍 언어 중 하나라는 것이다. 이것은 DEC 시스템 연구 센터의 Larch/Modula-3(Larch family)[12] 및 확장된 정적 검사[13] 프로젝트의 후원하에 수행되었다.

5. 1. 핵심 인터페이스

C 언어에서 시작된 추세를 이어받아, 실제 프로그램을 작성하는 데 필요한 많은 기능들이 언어 정의에서 제외되고 대신 표준 라이브러리 집합을 통해 제공되었다. 아래 인터페이스의 대부분은 [11]에 자세히 설명되어 있다.

표준 라이브러리는 다음 기능을 제공한다. 이것들은 표준 인터페이스라고 불리며 언어에서 필수적이다(제공되어야 한다).

  • 텍스트: `TEXT`라고 하는 변경 불가능한 문자열 참조에 대한 연산
  • 스레드: `MUTEX`, 조건 변수 및 스레드 일시 중지를 포함한 스레딩 관련 연산. 스레딩 라이브러리는 선점형 스레드 전환을 제공한다.
  • 워드: 부호 없는 정수(또는 기계 워드)에 대한 비트 단위 연산. 일반적으로 컴파일러에 의해 직접 구현된다.
  • 부동 소수점 인터페이스


사용 가능한 구현에서 구현되지만 필수는 아닌 권장 인터페이스는 다음과 같다.

  • Lex: 숫자 및 기타 데이터를 구문 분석하기 위한 모듈
  • Fmt: 출력을 위해 다양한 데이터 유형을 서식 지정
  • Pkl (또는 Pickle): 가비지 수집기에 의해 접근 가능한 모든 참조 유형의 객체 직렬화
  • Table: 맵을 위한 일반 모듈


C와 마찬가지로 I/O는 Modula-3에서는 `Rd`와 `Wr`이라고 하는 라이브러리를 통해 제공된다. Rd (리더) 및 Wr (라이터) 라이브러리의 객체 지향 설계는 Greg Nelson의 책에서 자세히 다루고 있다. Modula-3의 흥미로운 측면은 표준 라이브러리가 잠금 버그를 포함한 다양한 유형의 버그를 포함하지 않도록 공식적으로 검증된 몇 안 되는 프로그래밍 언어 중 하나라는 것이다. 이것은 DEC 시스템 연구 센터의 Larch/Modula-3 (Larch family)[12] 및 확장된 정적 검사[13] 프로젝트의 후원하에 수행되었다.

5. 2. 추가 인터페이스

C 언어에서 시작된 추세를 이어받아, 실제 프로그램을 작성하는 데 필요한 많은 기능들이 언어 정의에서 제외되고 대신 표준 라이브러리 집합을 통해 제공되었다. 아래 인터페이스의 대부분은 [11]에 자세히 설명되어 있다.

표준 라이브러리는 다음 기능을 제공한다. 이것들은 표준 인터페이스라고 불리며 언어에서 필수적이다(제공되어야 한다).

  • 텍스트: `TEXT`라고 하는 변경 불가능한 문자열 참조에 대한 연산
  • 스레드: `MUTEX`, 조건 변수 및 스레드 일시 중지를 포함한 스레딩 관련 연산. 스레딩 라이브러리는 선점형 스레드 전환을 제공한다.
  • 워드: 부호 없는 정수(또는 기계 워드)에 대한 비트 단위 연산. 일반적으로 컴파일러에 의해 직접 구현된다.
  • 부동 소수점 인터페이스


사용 가능한 구현에서 구현되지만 필수는 아닌 권장 인터페이스는 다음과 같다.

  • Lex: 숫자 및 기타 데이터를 구문 분석하기 위한 모듈
  • Fmt: 출력을 위해 다양한 데이터 유형을 서식 지정
  • Pkl(또는 Pickle): 가비지 수집기에 의해 접근 가능한 모든 참조 유형의 객체 직렬화
  • Table: 맵을 위한 일반 모듈


C와 마찬가지로 I/O는 Modula-3에서는 `Rd`와 `Wr`이라고 하는 라이브러리를 통해 제공된다. Rd(리더) 및 Wr(라이터) 라이브러리의 객체 지향 설계는 Greg Nelson의 책에서 자세히 다루고 있다. Modula-3의 흥미로운 측면은 표준 라이브러리가 잠금 버그를 포함한 다양한 유형의 버그를 포함하지 않도록 공식적으로 검증된 몇 안 되는 프로그래밍 언어 중 하나라는 것이다. 이것은 DEC 시스템 연구 센터의 Larch/Modula-3(Larch family)[12] 및 확장된 정적 검사[13] 프로젝트의 후원하에 수행되었다.

6. 구현체

몇몇 컴파일러가 있으며, 대부분 오픈 소스이다.


  • DEC-SRC M3, 원본이다.[14]
  • 올리베티 연구 센터(ORC) Modula-3 툴킷, 원래 컴파일러였으나 현재 Modula-3 프로그램의 구문, 어휘 및 의미 분석을 위한 라이브러리로 사용 가능하다.[15]
  • 크리티컬 매스 CM3, DEC-SRC M3의 다른 후속 버전이다.
  • 몬트리올 공과대학교 Modula-3 PM3, DEC-SRC M3의 후속 버전으로 현재 CM3와 병합 중이다.
  • EzM3, CVSup과 관련하여 개발된 독립적이고 가볍고 이식성이 용이한 구현이다.
  • HM3, NPTL을 사용하여 네이티브 스레딩을 지원하는 PM3의 pm3-1.1.15 릴리스의 후속 버전이다.
  • CM3, 크리티컬 매스 CM3의 후속 버전이다. 이는 현재 최신으로 유지 관리 및 개발되는 유일한 구현이다. 릴리스는 여기에서 사용할 수 있다.


C 데이터 구조에서 Modula-3에 없는 유일한 측면은 공용체 유형이므로, 모든 기존 Modula-3 구현은 이진 코드 배열구조체의 C 언어 형식 선언과 좋은 호환성을 제공할 수 있다.

7. 영향

모듈라-3는 주류 지위를 얻지는 못했지만, DEC-SRC M3 배포판의 여러 부분은 영향을 미쳤다. 아마도 가장 영향력 있는 부분은 자바의 최초 원격 메서드 호출(RMI) 구현, 네트워크 프로토콜을 포함하는 기반이 된 네트워크 객체 라이브러리일 것이다. 이 공통 객체 요청 브로커 아키텍처(CORBA) 표준에서 IIOP 기반 프로토콜로 이동했을 때만 이 라이브러리는 사라졌다. 원격 객체의 가비지 컬렉션에 대한 자바 문서는 여전히 모듈라-3 네트워크 객체를 위해 수행된 선구적인 작업을 언급하고 있다.[21] 또한 파이썬의 클래스 구현은 C++와 모듈라-3에서 발견된 클래스 메커니즘에서 영감을 받았다.[22]

프로그래밍 언어도 추적 포인터 대 비추적 포인터와 같이 모듈라-3의 몇 가지 측면을 사용한다.

8. 관련 프로젝트


  • SPIN 운영 체제
  • CVSup 소프트웨어 저장소 동기화 프로그램
  • 오블릭 언어. 모듈라-3의 네트워크 객체 기능을 사용하여 로컬 네트워크를 통해 객체를 투명하게 마이그레이션하여 분산된 모듈라-3 객체 지향 프로그래밍 패러다임을 지원한다. 분산 애플리케이션, 컴퓨터 애니메이션, 그리고 모듈라-3의 스크립팅 확장의 형태로 웹 프로그래밍 애플리케이션을 구축하는 데 사용되었다.

참조

[1] 웹사이트 Critical Mass Modula-3 (CM3) https://modula3.eleg[...] elego Software Solutions GmbH 2020-03-21
[2] 웹사이트 Polytechnique Montréal Modula-3 (PM3): What is it https://modula3.eleg[...] elego Software Solutions GmbH 2020-03-21
[3] 웹사이트 Ezm3: An Easier Modula-3 Distribution http://www.cvsup.org[...] 2020-03-21
[4] 웹사이트 M3/PC Klagenfurt 96: a Modula-3 environment for MS-DOS http://www.ifi.uni-k[...] University of Klagenfurt 2020-03-21
[5] 웹사이트 Frequently Asked Questions http://nim-lang.org/[...] 2020-03-21
[6] 웹사이트 R/Rust - I just learned about Modula-3, a language that had a lot of similar goals to Rust, and there was even an experimental OS that relied on the safety provided by the language https://www.reddit.c[...] 2019-09
[7] 웹사이트 Programming Python: Foreword (1st ed.) https://www.python.o[...] 2020-03-21
[8] 웹사이트 Design and History FAQ: Why must 'self' be used explicitly in method definitions and calls? https://docs.python.[...] 2020-03-21
[9] 문서 Modula-3 report (revised) http://www.hpl.hp.co[...] DEC Systems Research Center 1989-11
[10] 논문 Modula-3 language definition https://dl.acm.org/d[...] 1992-08
[11] 문서 Some Useful Modula-3 Interfaces http://apotheca.hpl.[...] DEC Systems Research Center 1993-12
[12] 문서 LM3 http://apotheca.hpl.[...] DEC Systems Research Center 1991-06
[13] 문서 Extended Static Checking http://apotheca.hpl.[...] Compaq SRC Research Report 1998-12
[14] 문서 SRC Modula-3 3.3 ftp://ftp.u-aizu.ac.[...] Digital Equipment Corporation 1995-01
[15] 논문 An extensible programming environment for Modula-3
[16] 문서 An Introduction to Programming with Threads http://apotheca.hpl.[...] DEC Systems Research Center 1989-01
[17] 문서 Synchronization Primitives for a Multiprocessor: A Formal Specification http://apotheca.hpl.[...] DEC Systems Research Center 1987-08
[18] 문서 IO Streams: Abstract Types, Real Programs http://apotheca.hpl.[...] DEC Systems Research Center 1989-11
[19] 문서 Modula-3 Reference Manual http://www.minet.uni[...] DEC Systems Research Center 1995-02
[20] 문서 Trestle Tutorial http://apotheca.hpl.[...] DEC Systems Research Center 1992-05
[21] 문서 'Garbage Collection of Remote Objects' http://docs.oracle.c[...] Java Remote Method Invocation Documentation for Java SE 8
[22] 문서 Classes https://docs.python.[...] Official Python Documentation
[23] 웹인용 Critical Mass Modula-3 (CM3) https://modula3.eleg[...] elego Software Solutions GmbH 2020-03-21
[24] 웹인용 Polytechnique Montréal Modula-3 (PM3): What is it https://modula3.eleg[...] elego Software Solutions GmbH 2020-03-21
[25] 웹인용 Ezm3: An Easier Modula-3 Distribution http://www.cvsup.org[...] 2020-03-21
[26] 웹인용 M3/PC Klagenfurt 96: a Modula-3 environment for MS-DOS http://www.ifi.uni-k[...] University of Klagenfurt 2020-03-21
[27] 웹인용 Frequently Asked Questions http://nim-lang.org/[...] 2020-03-21
[28] 웹인용 R/Rust - I just learned about Modula-3, a language that had a lot of similar goals to Rust, and there was even an experimental OS that relied on the safety provided by the language https://www.reddit.c[...]
[29] 웹인용 Programming Python: Foreword (1st ed.) https://www.python.o[...] 2020-03-21



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com