머큐리 (프로그래밍 언어)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
머큐리(Mercury)는 프롤로그와 유사한 구문을 가진 논리 프로그래밍 언어이다. 정수와 실수를 구분하고, 문자열은 큰따옴표로 묶으며, 리스트를 지원하는 등 몇 가지 문법적 특징을 갖는다. 머큐리는 C, 자바, C# 등 다양한 언어로 컴파일할 수 있는 여러 백엔드를 지원하며, 과거에는 어셈블리, Aditi, .NET Framework용 CIL, 얼랭 백엔드를 지원했다. 또한 다른 언어와의 외국어 인터페이스를 제공하며, Vim, Emacs, 이클립스, 넷빈즈 등 다양한 IDE 및 편집기에서 개발을 지원한다.
더 읽어볼만한 페이지
- 논리형 프로그래밍 언어 - 프롤로그 (프로그래밍 언어)
프롤로그는 알랭 콜메로에르가 개발한 논리 프로그래밍 언어로, 사실과 규칙 기반 데이터베이스에 대한 질의를 통해 프로그램을 실행하며, 단일화, 백트래킹, 논리 변수 바인딩을 핵심 특징으로 인공지능, 자연어 처리 등에 활용된다. - 논리형 프로그래밍 언어 - 앨리스 (프로그래밍 언어)
앨리스는 Standard ML을 확장하여 동시성 및 지연 평가 기능을 제공하는 프로그래밍 언어이며, 미래와 약속 개념을 통해 동시성 프로그래밍을 지원하고 원격 프로시저 호출을 통해 다른 컴퓨터에서 계산을 수행할 수 있다. - 1995년 개발된 프로그래밍 언어 - PHP
PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다. - 1995년 개발된 프로그래밍 언어 - 자바 (프로그래밍 언어)
자바는 제임스 고슬링 등에 의해 개발된 객체 지향 프로그래밍 언어로, 다양한 플랫폼에서 실행 가능하며 샌드박스 모델 기반의 보안 기능, 자동 메모리 관리, 멀티스레딩 등을 지원한다. - 닷넷 프로그래밍 언어 - 파워셸
파워셸은 마이크로소프트에서 개발한 작업 자동화 솔루션으로, 명령줄 셸과 스크립트 언어의 기능을 결합하여 윈도우 시스템 관리를 위해 설계되었으며, .NET 프레임워크 기반의 객체 지향적 특징을 갖고 다양한 플랫폼에서 자동화 스크립트 작성 및 실행, 시스템 구성 관리 등에 활용된다. - 닷넷 프로그래밍 언어 - 코볼
코볼은 1959년 CODASYL에 의해 개발된 공통 사무 처리용 프로그래밍 언어이며, 사무 처리 시스템의 표준 언어로 널리 사용되면서 객체 지향 기능과 새로운 기능이 추가된 표준이 발표되었다.
머큐리 (프로그래밍 언어) - [IT 관련 정보]에 관한 문서 | |
---|---|
기본 정보 | |
종류 | 함수형, 논리형 |
설계자 | 졸탄 소모기 |
개발자 | 멜버른 대학교 |
발표일 | 1995년 4월 8일 |
최신 버전 | 2024-01-18 |
타이핑 | 강한, 정적, 다형적 |
플랫폼 | IA-32 x86-64 Arm SPARC64 Java CLI |
운영 체제 | 크로스 플랫폼: 유닉스 리눅스 macOS 솔라리스 FreeBSD OpenBSD 윈도우 Android |
라이선스 | 컴파일러: GPL 표준 라이브러리: LGPL |
파일 확장자 | .m |
웹사이트 | 머큐리 공식 웹사이트 |
구현체 | 멜버른 머큐리 컴파일러 |
영향을 받은 언어 | 프롤로그 Hope 하스켈 |
2. 문법
머큐리는 프롤로그 논리 프로그래밍 언어를 기반으로 하며, 선택적 선형 확정 절 해상도 (SLD) 알고리즘과 같은 동일한 구문과 기본 개념을 공유한다. 겉으로 보기에는 프롤로그와 대체로 비슷해 보이지만 몇 가지 차이점이 있다.
- 숫자: 프롤로그와 달리 정수와 실수를 구분한다.
- 문자열: 큰따옴표("")로 감싸야 한다.
- 리스트: 빈 리스트 `[]`, 숫자 리스트 `[1,2,3]`, 문자 리스트 `[a,b,c]` 등으로 사용할 수 있다. 프롤로그처럼 `[Head | Tail]` 형태로 리스트를 분리하는 것도 가능하다. 리스트 `[1,2,3]`은 `[1|[2|[3|[]]]]` 또는 `'.'(1,'.'(2,'.'(3, [])))` 와 같이 표현될 수 있다.
- 규칙(절): `Head = Result :- Body` 형태의 구조를 가진다. 규칙의 구체적인 내용은 선언 방식과 결정 방식에 따라 달라진다.
머큐리는 프롤로그의 순수한 부분 집합으로 볼 수 있으며, 강력한 타입과 모드를 가진다. 소프트웨어 공학 원칙에 따라 설계되었으며, 프롤로그와 달리 별도의 컴파일 단계를 거친다. 이를 통해 프로그램을 실행하기 전에 더 많은 오류를 미리 감지할 수 있다. 또한, 엄격한 정적 타입 및 모드 시스템[1]과 모듈 시스템을 갖추고 있다.
머큐리는 순수 선언적 프로그래밍 언어이다. 이는 프롤로그에 있는 `!` (컷) 연산자나 명령형 프로그래밍 방식의 입출력과 같은 "추가 논리적" 구문이 없기 때문이다. 이러한 특징 덕분에 컴파일 시점에 가비지 컬렉션을 포함한 고급 정적 프로그램 분석 및 프로그램 최적화가 가능하다. 하지만 이로 인해 특정 프로그래밍 구문(예: 여러 옵션에 대한 스위치와 기본값 설정)을 표현하기 어려울 수도 있다. 머큐리에서 불순한 기능(순수하지 않은 기능)은 주로 외국어 코드를 호출하는 데 사용되며, 모든 불순한 코드는 명시적으로 표시해야 한다. 일반적으로 불순하다고 여겨지는 연산(예: 입출력)은 선형 타입을 사용하여 순수한 방식으로 표현된다. 이는 관련된 모든 코드를 통해 가상의 "세계" 상태 값을 전달하는 방식으로 이루어진다.
컴파일 시간에 얻는 타입 및 모드 정보 등을 활용하여, 머큐리로 작성된 프로그램은 일반적으로 동일한 기능을 하는 프롤로그 프로그램보다 훨씬 빠르게 실행된다.[2][3] 개발자들은 머큐리가 세계에서 가장 빠른 논리 프로그래밍 언어라고 주장한다.[1]
3. 특징
머큐리는 프롤로그 논리 프로그래밍 언어에 기반하며, 선택적 선형 확정 절 해상도 (SLD) 알고리즘과 같은 동일한 구문과 기본 개념을 공유한다. 그러나 프롤로그와 달리 소프트웨어 공학 원칙에 따라 설계되었으며, 강력한 타입과 모드를 가진 프롤로그의 순수한 부분 집합으로 볼 수 있다.
머큐리는 직접 해석되지 않고 별도의 컴파일 단계를 거친다. 이 과정에서 엄격한 정적 타입 및 모드 시스템[1], 그리고 모듈 시스템을 활용하여 프로그램을 실행하기 전에 다양한 오류를 미리 감지할 수 있다. 컴파일 시간에 타입 및 모드와 같은 정보를 미리 파악하므로, 머큐리로 작성된 프로그램은 일반적으로 동일한 기능을 하는 프롤로그 프로그램보다 훨씬 빠르게 실행된다.[2][3] 개발자들은 머큐리가 세계에서 가장 빠른 논리 언어라고 주장하기도 한다.[1]
머큐리의 가장 큰 특징 중 하나는 순수한 선언적 프로그래밍 언어라는 점이다. 이는 프롤로그에서 사용되는 '!' (컷) 연산자나 명령형 프로그래밍 방식의 입출력과 같은 "추가 논리적" 프롤로그 구문이 없기 때문이다. 이러한 순수성은 컴파일 타임 가비지 컬렉션을 포함한 고급 정적 프로그램 분석 및 프로그램 최적화를 가능하게 한다. 반면, 특정 프로그래밍 구문(예: 여러 옵션에 대한 스위치, 기본값 포함)을 표현하는 데는 어려움이 따를 수 있다.
머큐리는 불순한(impure) 기능을 허용하지만, 이는 주로 외부 언어로 작성된 코드를 호출하기 위한 목적으로 사용되며, 모든 불순한 코드는 명시적으로 표시해야 한다. 입출력과 같이 일반적으로 불순하게 취급될 수 있는 연산들은 선형 타입을 사용하여 순수한 구문 내에서 표현된다. 이는 관련된 모든 코드를 통해 가상의 "세계(world)" 값을 전달하는 방식으로 이루어진다.
4. 백엔드
머큐리는 여러 백엔드를 가지고 있어, 이를 통해 머큐리 코드를 다양한 프로그래밍 언어로 컴파일할 수 있다.
4. 1. 지원 백엔드
4. 2. 과거 지원 백엔드
5. 외국어 인터페이스
머큐리는 다른 프로그래밍 언어로 작성된 코드를 머큐리 코드와 연결할 수 있는 외국어 인터페이스 기능을 제공한다. 사용 가능한 외국어의 종류는 머큐리 코드를 컴파일할 때 선택하는 백엔드(코드 생성 대상 시스템)에 따라 결정된다.
사용 가능한 백엔드와 해당 백엔드에서 직접 연결할 수 있는 외국어는 다음과 같다.
위에 명시된 언어 외의 다른 언어 코드는, 위 목록의 언어 중 하나를 통해 간접적으로 호출하는 방식으로 머큐리와 상호작용할 수 있다. 그러나 외국어 인터페이스를 사용할 경우, 작성된 외국어 코드가 특정 백엔드에 종속될 수 있다는 점에 유의해야 한다. 만약 여러 백엔드에서 동일한 기능을 사용하려면 각 백엔드에 맞춰 외국어 코드를 별도로 작성해야 할 수 있으며, 그렇지 않으면 백엔드 간 코드 이식성이 저하될 수 있다.
현재 가장 일반적으로 사용되는 백엔드는 저수준 C 백엔드이다.
6. 예제
머큐리 프로그래밍 언어의 기본적인 문법과 사용법을 보여주는 몇 가지 예제가 있다. 대표적으로 Hello World 출력, 팩토리얼 계산, 피보나치 수 계산 예제 등이 있으며, 각 예제에 대한 자세한 코드와 설명은 아래 하위 섹션에서 확인할 수 있다.
6. 1. Hello World
Hello World::- module hello.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
main(!IO) :-
io.write_string("Hello, World!\n", !IO).
6. 2. 팩토리얼 계산
아래는 머큐리로 작성된 팩토리얼 계산 예제 코드이다.:- module fac.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module int.
:- func fac(int) = int.
fac(N) = F :- ( N = 0 -> F = 1
; F = N * fac(N-1)
).
main -->
io.write_string("Hello, factorial!\n"),
io.write_int(fac(10)),
io.nl.
이 코드는 `fac`라는 이름의 모듈을 정의한다.
- `interface` 섹션에서는 외부에서 사용할 수 있는 `main` 프레디케이트를 선언한다. `main`은 입출력 작업을 수행한다.
- `implementation` 섹션에서는 실제 코드 구현이 이루어진다.
- `fac` 함수는 정수 `N`을 입력받아 팩토리얼 값을 계산하여 반환한다. 재귀 호출 방식을 사용하며, `N`이 0일 때는 1을 반환하고, 그렇지 않으면 `N * fac(N-1)`을 계산한다.
- `main` 프레디케이트는 "Hello, factorial!" 문자열을 출력하고, `fac(10)`의 결과 (10의 팩토리얼)를 계산하여 출력한 뒤 줄을 바꾼다.
작성된 코드는 머큐리 컴파일러(`mmc`)를 사용하여 다음과 같이 컴파일할 수 있다.
mmc -m fac
6. 3. 피보나치 수 계산
10번째 피보나치 수 계산 예시 (가장 일반적인 방법):[6]```prolog
:- module fib.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module int.
:- func fib(int) = int.
fib(N) = (if N =< 2 then 1 else fib(N - 1) + fib(N - 2)).
main(!IO) :-
io.write_string("fib(10) = ", !IO),
io.write_int(fib(10), !IO),
io.nl(!IO).
% Could instead use io.format("fib(10) = %d\n", [i(fib(10))], !IO).
```
코드에서 `!IO`는 "상태 변수"를 나타내며, 실제로는 컴파일 시 구체적인 이름이 할당되는 변수 쌍에 대한 syntactic sugar이다. 예를 들어, 위 코드는 내부적으로 다음과 같이 처리된다.
```prolog
main(IO0, IO) :-
io.write_string("fib(10) = ", IO0, IO1),
io.write_int(fib(10), IO1, IO2),
io.nl(IO2, IO).
7. 릴리스
머큐리는 안정적인 릴리스와 개발 스냅샷을 제공한다. 초기 13개의 안정 릴리스는 버전 0.1부터 0.13까지 번호를 사용했다. 2010년 2월부터는 안정 릴리스의 이름을 출시 연도와 월을 조합하여 명명하는 방식으로 변경되었다. 예를 들어, 버전 10.04는 2010년 4월에 출시된 릴리스를 의미한다.
또한, 개발 시스템의 최신 상태를 반영하는 주기적인 스냅샷인 오늘의 릴리스(ROTD, Release Of The Day)도 자주 제공된다.
8. IDE 및 편집기 지원
머큐리 언어 개발을 위해 다양한 IDE 및 텍스트 편집기에서 플러그인 또는 기능을 지원한다.
- Vim: 개발자들이 직접 지원을 제공한다.
- Emacs: Flycheck 라이브러리를 통해 지원한다.
- 이클립스: 플러그인을 제공한다.
- 넷빈즈: 플러그인을 제공한다.
참조
[1]
웹사이트
The Mercury Project - Motivation
http://www.mercuryla[...]
[2]
웹사이트
The Mercury Project - Benchmarks
http://www.mercuryla[...]
[3]
학술지
The execution algorithm of Mercury: an efficient purely declarative logic programming language
http://www.mercuryla[...]
Mercurylang.org
2008-08-30
[4]
학위논문
Compile-time garbage collection for the declarative language Mercury
https://mercurylang.[...]
Katholieke Universiteit Leuven
2004-05
[5]
웹사이트
ODASE
https://www.odase.io[...]
[6]
문서
Ralph Becket's Mercury tutorial
http://www.mercuryla[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com