아이오 (프로그래밍 언어)
1. 개요
아이오(Io)는 2002년 스티브 데코르테가 개발한 프로그래밍 언어이다. 개념적 통합과 동적 언어를 탐구하며 단순성과 유연성을 중시한다. 순수 객체 지향 프로토타입 언어로서 코드-애즈-데이터, 호모이코닉 특징을 가지며, 고차 함수, 액터 기반 동시성, 예외 처리 등을 지원한다. 높은 이식성을 가지며, 동적 로딩, 가상 머신, 정규 표현식을 지원한다. 메시지 전달 언어이며, 메서드 호출은 괄호 없이, 인수가 있을 경우 괄호 안에 인수를 넣어 표현한다. 메서드와 블록을 통해 익명 함수를 생성하며, 차등 상속 방식을 통해 객체를 생성한다.
이미지 준비중입니다.
| 패러다임 | 객체 지향 프로토타입 기반 |
|---|---|
| 설계자 | Steve Dekorte |
| 개발자 | Steve Dekorte, Jonathan Wright, Jeremy Tregunna |
| 발표 연도 | 2002년 |
| 최신 버전 | 20170906 |
| 최신 버전 발표일 | 2017년 9월 6일 |
| 최신 미리보기 버전 | 2019.05.22-alpha |
| 최신 미리보기 버전 발표일 | 2019년 5월 22일 |
| 타입 | 동적, 강타입 |
| 플랫폼 | IA-32 x86-64 ARM .NET CLR |
| 운영 체제 | Windows macOS |
| 라이선스 | BSD 3-조항 |
| 구현체 | Io(http://iolanguage.org/) Io.NET(https://web.archive.org/web/20110716175739/http://synrc.com/io/index.htm) |
| 영향을 받은 언어 | Smalltalk NewtonScript(https://en.wikipedia.org/wiki/NewtonScript) Self Lua Lisp Python Act1 |
| 영향을 준 언어 | Ioke Potion |
-
2002년 개발된 프로그래밍 언어 -
F 샤프
F#은 .NET 플랫폼에서 실행되는 크로스 플랫폼, 오픈 소스 프로그래밍 언어로서 함수형, 명령형, 객체 지향 프로그래밍을 지원하며 데이터 분석, 웹 개발, 앱 개발 등 다양한 분야에서 활용된다. -
2002년 개발된 프로그래밍 언어 -
시스템베릴로그
SystemVerilog는 Verilog를 확장한 하드웨어 기술 및 검증 언어로서, 객체 지향 프로그래밍, 제약 기반 난수 생성, 어설션 등의 고급 검증 기능을 제공하여 하드웨어 설계 및 검증의 효율성을 높인다. -
프로토타입 기반 프로그래밍 언어 -
루아 (프로그래밍 언어)
루아는 C 언어와의 통합이 용이하고 작고 가벼운 확장 가능한 스크립트 언어로, 테이블 기반의 자료 구조를 통해 다양한 프로그래밍 패러다임을 지원하며 여러 분야에서 활용된다. -
프로토타입 기반 프로그래밍 언어 -
LPC (프로그래밍 언어)
-
스크립트 언어 -
Tcl
Tcl은 존 오스터하우트가 개발한 명령어 기반의 프로그래밍 언어로, Tk 툴킷과 결합하여 GUI 스크립팅 환경으로 발전했으며, 다양한 운영체제에서 사용 가능하고 C, C++, Java 등 다른 언어와의 인터페이스를 지원한다. -
스크립트 언어 -
PHP
PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다.
2. 역사
아이오는 2002년 3월 7일경 스티브 데코르테(Steve Dekorte)가 친구 드루 넬슨(Dru Nelson)의 셀(Cel) 언어 개발을 돕다가 만들게 되었다. 데코르테는 프로그래밍 언어 작동 방식에 대한 이해를 높이기 위해 소형 언어를 직접 만드는 방법을 택했다.
3. 철학
아이오는 개념적 통합과 동적 언어 탐구를 목표로 하므로, 성능보다는 단순성과 유연성을 우선시하는 경향이 있다.
4. 특징
* 객체 지향 기반의 프로토타입
* 코드-애즈-데이터, 호모이코닉
* 함수 매개변수의 지연 평가
* 고차 함수
* 내성, 반사 및 메타프로그래밍
* 액터 기반 동시성
* 코루틴
* 예외 처리
* 가비지 컬렉션 및 약한 참조 지원
* 높은 이식성
* 공유 라이브러리, 동적 링크 라이브러리 (DLL), 대부분의 플랫폼에서 동적 로딩
* 작은 가상 머신
* Perl 스타일의 정규 표현식
5. 문법
아이오는 메시지 전달 언어이며, 주석을 제외한 모든 것은 메시지이다. 모든 메시지는 수신자에게 전송된다.
가장 단순한 형태의 Io 프로그램은 하나의 식별자로 구성된다.
```io
doStuff
```
위의 `doStuff`는 메서드이며, 인자가 없으므로 괄호를 명시적으로 사용할 필요가 없다. 인자가 있는 경우는 다음과 같이 나타낼 수 있다.
```io
doStuff(42)
```
다음은 "version" 메시지가 "System" 객체로 전송되는 예시이다.
```io
System version
```
연산자는 메서드 호출의 특수한 형태이다. Io 파서는 인터프리터에 의해 정의된 연산자 집합을 가로채서 메서드 호출로 변환한다. 예를 들어,
```io
1 + 5 * 8 + 1
```
위 코드는 아래와 같이 변환된다.
```io
1 +(5 *(8)) +(1)
```
Io의 모든 연산자는 메서드이며 (할당 연산자 ":=" 와 "="는 제외), 연산자 우선 순위는 C 언어의 우선 순위와 동일하다. 명시적인 괄호는 편의를 위해 사용하지 않아도 된다.
5.1. 메서드와 블록
아이오(Io)에는 익명 함수를 만드는 두 가지 방법으로 메서드와 블록이 있다. 이 둘은 범위를 제외하고는 거의 동일하다. 블록은 정적 스코프를 가지는 반면, 메서드는 동적 스코프를 갖는다.
메서드와 블록 모두 고차 함수이다.
6. 예제
io
// C++ 스타일의 주석을 사용할 수 있다.
# 쉘 스타일의 주석도 가능하다.
/* C 언어 스타일도 가능하다. */
for(i, 1, 10, i print) // 1부터 10까지의 숫자를 표시한다.
x := Object clone // 새로운 슬롯을 만들 때는 ':='를 사용한다.
x = Map clone // 덮어쓸 때는 '='를 사용한다.
x prettyprint := method( // 인수가 없는 메서드를 만든다.
foreach(key, value, write(key, ": ", value, "\n")) // 맵에서 루프를 돈다.
)
x atPut("hi", 1) // 키와 값의 쌍을 맵에 넣는다.
x atPut("hello", 2)
x prettyprint
/* 출력은 다음과 같다.
hi: 1
hello: 2
*/
```
6.2. 객체 생성
새로운 객체는 객체를 복제하여 생성된다. Io에서는 특히 새롭고 빈 객체가 생성되고, 부모 객체와의 차이점만 새 객체 내에 저장된다. 이러한 동작을 차등 상속이라고 한다. 이러한 동작의 예는 다음과 같다.
```io
A := Object clone // "A"라는 새롭고 빈 객체를 생성한다.
6.3. 팩토리얼 함수
다음은 재귀 호출을 사용하지 않고 팩토리얼을 계산하는 Io 코드이다.
factorial := method(n,
if(n == 0, return 1)
res := 1
Range 1 to(n) foreach(i, res = res * i)
)
`res * i`를 `res`에 할당하는 것이 마지막 작업이므로, 함수는 암묵적으로 결과를 반환한다. 명시적인 return 문은 필요하지 않다. 위 코드는 범위를 사용한다.
6.3.1. 비재귀적 팩토리얼 함수
io
factorial := method(n,
if(n == 0, return 1)
res := 1
for(i, 1, n, res = res * i)
)
```
`Range` 대신 `for` 루프를 사용하면 더 빠르다. `res * i`를 `res`에 할당하는 작업이 마지막이므로, 명시적인 return 문은 필요하지 않다.
6.3.2. 기타 예제
io
"Hello, world!" println
```
새로운 객체는 클로닝으로 생성된다. Io에서는 새로운 빈 객체가 만들어질 때, 그 부모와의 차이점만 새로운 객체에 저장된다. 이러한 방식을 차분 상속이라고 부른다. 다음은 예시이다.
```io
A := Object clone // 새로운 빈 객체 "A"를 만든다
```
재귀를 사용하지 않는 팩토리얼 프로그램은 다음과 같다.
```io
factorial := method(n,
if(n == 0, return 1)
res := 1
n to(1) foreach(i, res = res * i)
res
)
```
위 예제에서는 range를 사용하지만, for 루프가 더 빠르다. 또 다른 예시는 다음과 같다.
```io
// C++ 스타일의 주석을 사용할 수 있다
# 쉘 스타일의 주석도 가능하다
/* C 언어 스타일도 가능하다 */
for(i, 1, 10, i print) // 1부터 10까지의 숫자를 표시
x := Object clone // 새로운 슬롯을 만들 때는 ':='를 사용한다
x = Map clone // 덮어쓸 때는 '='를 사용한다
x prettyprint := method( // 인수가 없는 메서드를 만든다
foreach(key, value, write(key, ": ", value, "\n")) // 맵에서 루프를 돈다
)
x atPut("hi", 1) // 키와 값의 쌍을 맵에 넣는다
x atPut("hello", 2)
x prettyprint
/* 출력은 다음과 같다:
hi: 1
hello: 2
*/