다오 (프로그래밍 언어)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
다오는 입출력, 표준 라이브러리, 자료형, 제어 구문, 함수, 클래스, 매크로, 동시성 및 분산 프로그래밍을 지원하는 프로그래밍 언어이다. 변수는 암묵적 타이핑을 통해 선언되며, 파스칼과 유사한 문법으로 명시적 정의도 가능하다. 다오는 조건문, 반복문, 분기문 등의 제어 구문과 루틴이라 불리는 함수를 제공하며, 일급 함수와 람다 함수도 지원한다. 클래스는 `class` 키워드로 정의하고, `private` 및 `public` 지시자를 통해 멤버 접근을 제어한다. 매크로는 `syntax` 키워드로 정의하여 코드 패턴을 변환하며, 비동기 함수 호출(AFC)을 통해 멀티 스레드 프로그래밍을 쉽게 구현할 수 있다.
더 읽어볼만한 페이지
- 가상 머신 - V8 (자바스크립트 엔진)
V8은 구글이 개발한 오픈 소스 자바스크립트 엔진으로, 자바스크립트 코드 실행 속도 향상을 위해 여러 컴파일러를 거쳐 크롬, 노드.js 등에서 활용된다. - 가상 머신 - X86 가상화
X86 가상화는 x86 아키텍처 기반 시스템에서 가상 머신을 구현하는 기술로, 소프트웨어 기반 가상화와 하드웨어 지원 가상화로 나뉘며, CPU 제조사의 가상화 확장 기술을 활용하여 가상 머신의 성능을 향상시킨다. - 스크립트 언어 - Tcl
Tcl은 존 오스터하우트가 개발한 명령어 기반의 프로그래밍 언어로, Tk 툴킷과 결합하여 GUI 스크립팅 환경으로 발전했으며, 다양한 운영체제에서 사용 가능하고 C, C++, Java 등 다른 언어와의 인터페이스를 지원한다. - 스크립트 언어 - PHP
PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다.
다오 (프로그래밍 언어) |
---|
2. 기초
다오(Dao)는 동적 타입 스크립트 언어이며, 인터프리터 방식으로 실행된다. 다오의 주요 특징은 다음과 같다.
- '''내장 함수 부재:''' 다오는 내장 함수(built-in function)가 없다. 모든 함수는 '''stdio''', '''stdlib''', '''math''' 등과 같은 표준 라이브러리의 일부로 제공된다.
- '''암묵적 변수 선언:''' 변수는 값을 대입하는 시점에 암묵적으로 선언되며, 인터프리터가 표현식으로부터 형을 유추한다. 이를 암묵적 타이핑(implicit typing)이라고 한다.
- '''명시적 타입 정의:''' 파스칼과 유사한 문법을 사용하여 변수의 형을 명시적으로 정의할 수도 있다.
- '''정적 형 검사:''' 형이 결정된(typed) 변수는 다오 인터프리터에서 정적 형 검사(static checking)를 수행한다.
- '''제어 구문:''' 프로그램의 흐름을 제어하기 위해 조건문(if-elif-else), 반복문(while, for, for-in), 분기문(switch) 등 다양한 제어 구문을 제공한다.
2. 1. Hello World
Hello world 프로그램을 다오를 써서 작성해보면 다음과 같다.```dao
stdio.print ( "Hello world!" )
```
여기서 '''stdio'''는 입출력을 처리하는 표준 라이브러리이다. 다오에는 내장 함수(built-in function)이 없다. 모든 함수는 어떤 라이브러리의 일부이다. 예를 들면, '''stdio''', '''stdlib''', '''math''', '''coroutine''', '''reflect''', '''mpi''' (message passing interface), '''network''', 그리고 '''thread''' 같은 것들이다.
프로그래머는 '''stdlib.listmath''' 루틴을 사용하여 라이브러리 내의 메소드들을 출력해볼 수 있다. 예를 들면, '''math'''의 메소드들은 다음과 같이 하면 출력된다.
```dao
stdlib.listmath ( math )
2. 2. 자료형
다오에서 변수는 값을 대입하는 시점에 암묵적으로 선언된다. 예를 들어 다음과 같다.```
a_number = 123
a_string = "abc"
a_list = { 1, 2, 3 }
a_hash = { "CD"=>123, "AB"=>456 }
a_vector = [ 1, 2, 3 ]
a_matrix = [ 1, 2; 3, 4 ]
```
변수는 선언에 사용된 표현식으로부터 다오 인터프리터가 유추한 형을 갖는다. 이를 암묵적 타이핑(implicit typing)이라고 한다. 파스칼 (프로그래밍 언어)과 유사한 문법을 사용하여 변수의 형을 명시적으로 정의할 수도 있다.
```
var_typed : ''type''
var_typed : ''type'' = ''value''
```
''type'' 자리에는 '''int''', '''float''', '''double''', '''string''', '''complex''', '''list''', '''hash''', '''array''', '''buffer''', '''routine''' 등의 내장 형이나, 이들의 조합이 들어갈 수 있다.
예:
```
a_list2 : '''list'''<'''list'''<'''float'''> >
a_list3 : '''list'''<'''list'''<'''string'''> > = {}
a_hash2 : '''hash'''<'''string''','''int'''> = { "ABC"=>123 }
```
''type'' 자리에는 다오 클래스 이름이나 사용자가 정의한 C 형(type)의 이름을 사용할 수도 있다. "무엇이든 형"(any type)에는 '''any''' 키워드를, 정의되지 않은 형(undefined types)에는 '''?'''를 쓴다.
형이 결정된(typed) 변수는 다오 인터프리터에서 정적 형 검사(static checking)를 수행한다.
2. 3. 제어
다오(프로그래밍 언어)는 프로그램의 흐름을 제어하기 위해 조건문, 반복문, 분기문 등 다양한 제어 구문을 제공한다.조건문 (If-Elif-Else)```
a = '''math'''.rand();
'''if'''( a > 0.75 ){
a -= 0.75
}'''elif'''( a > 0.5 ){
a -= 0.5
}'''else'''{
a -= 0.25
}
```
`if`, `elif`, `else` 키워드를 사용하여 조건을 검사하고 조건에 따라 다른 코드 블록을 실행한다. 위 예시에서는 `a`의 값이 0.75보다 크면 0.75를 빼고, 0.5보다 크면 0.5를 빼고, 그렇지 않으면 0.25를 뺀다.
반복문 (While)```
i = 0;
'''while'''( i < 10 ) i++
```
`while` 키워드는 조건이 참인 동안 코드 블록을 반복해서 실행한다. 위 예시에서는 `i`가 10보다 작은 동안 `i`를 1씩 증가시킨다.
반복문 (For)```
'''for'''( i=0; i<10; i++ ) '''stdio'''.println( i )
'''for'''( i=0 : 9 ) '''stdio'''.println( i )
'''for'''( i=0 : 2 : 9 ) '''stdio'''.println( i )
```
`for` 키워드는 특정 횟수만큼 또는 특정 범위 내에서 코드 블록을 반복한다.
- 첫 번째 예시는 C 언어와 유사하게 초기값, 조건, 증감을 지정하는 방식이다.
- 두 번째 예시는 0부터 9까지 1씩 증가하는 방식이다.
- 세 번째 예시는 0부터 9까지 2씩 증가하는 방식이다.
반복문 (For-in)```
a_list = { 1, 2, 3 }
'''for'''( it '''in''' a_list ) '''stdio'''.println( it )
a_list2 = { "a", "b", "c" }
'''for'''( it '''in''' a_list; it2 '''in''' a_list2 ) '''stdio'''.println( it, it2 )
```
`for-in` 키워드는 리스트나 해시와 같은 자료구조의 각 요소에 대해 코드 블록을 반복한다.
- 첫 번째 예시는 `a_list`의 각 요소를 `it`에 할당하여 출력한다.
- 두 번째 예시는 `a_list`의 각 요소를 `it`에, `a_list2`의 각 요소를 `it2`에 할당하여 출력한다.
- `For-in` 구문은 해시에도 사용할 수 있다.
분기문 (Switch)```
a = "abc"
'''switch'''( a ){
'''case''' 1 : a += 123;
'''case''' "abc" : a += "456"
'''default''' : '''stdio'''.println( "default case" )
}
```
`switch` 키워드는 변수의 값에 따라 여러 개의 `case` 중 하나를 선택하여 실행한다. `default`는 어떤 `case`에도 해당하지 않을 때 실행된다. 위 예시에서는 `a`가 "abc"이므로 `a += "456"`이 실행된다.
3. 함수
다오에서 기본적인 함수는 "루틴"(routine)이라고 부른다. 기본적인 함수의 모양새는 다음과 같다.
```
routine foo( a, b : string, c = 123 ) => int
{
return 456;
}
```
다오는 일급 함수를 지원한다. 함수의 정의 방식은 일반적인 루틴과 같지만, 다음과 같은 차이점이 있다.
- 함수 이름을 꼭 써 줄 필요가 없다. 하지만 생성한 함수는 반드시 변수에 할당해야 한다.
- 기본값(default value) 식(expressions)은 상수 식(constant expressions)일 필요가 없다. 런타임에 함수가 생성될 때 계산된다.
- 함수 몸체(body)는 그 함수를 생성해주는 "상위" 함수에서 정의하고 있는 변수들을 포함할 수 있다.
```
a = "ABC";
rout = routine( x, y : string, z = a+a ){
a += "_abc";
stdio.println( "lambda ", a )
stdio.println( "lambda ", y )
stdio.println( "lambda ", z )
}
rout( 1, "XXX" );
4. 클래스
다오에서 클래스는 `class` 키워드를 사용하여 선언한다. 클래스 멤버의 접근 제어는 `private` (비공개)와 `public` (공개) 지시자를 통해 이루어진다.
다음은 `MyNumber`라는 간단한 클래스를 정의하는 예제이다.
```text
class MyNumber( value = 0 )
{
private
my Value = 0; # 기본값은 0이다.
Value = value;
public
routine setValue( value : int ){ Value = value }
routine getValue(){ return Value }
}
```
위 예제에서 `my Value`와 `Value`는 `private`으로 선언되어 클래스 외부에서는 직접 접근할 수 없다. `setValue`와 `getValue` 메서드는 `public`으로 선언되어 외부에서 객체의 값을 설정하고 가져오는 데 사용된다. 이러한 접근 제어는 객체 지향 프로그래밍의 캡슐화 개념을 구현하는 데 중요한 역할을 한다.
5. 매크로
다오는 `syntax` 키워드를 사용하여 매크로를 정의할 수 있도록 지원한다. 매크로는 코드의 특정 패턴을 다른 형태로 변환하여 코드의 가독성을 높이고 중복을 줄이는 데 사용된다.
매크로는 다음과 같은 형태로 정의한다.
```
syntax{
source_syntax_pattern
}as{
target_syntax_pattern
}
```
여기서 `source_syntax_pattern`은 변환하고자 하는 코드의 패턴을 나타내고, `target_syntax_pattern`은 변환된 코드가 가질 형태를 나타낸다.
예를 들어, `while-do-end` 구문을 중괄호(`{}`) 없이 사용하는 매크로는 다음과 같이 정의할 수 있다.
```
syntax{
while $EXP do [ $BL ] end
}as{
while( $EXP ){ [ $BL ] }
}
```
위 매크로에서 `$EXP`는 조건식을, `$BL`은 코드 블록을 나타내는 변수이다. 이 매크로는 `while-do-end` 형태의 코드를 중괄호를 사용하는 일반적인 `while` 루프 형태로 변환한다.
6. 동시적(Concurrent)이며 분산된(Distributed) 프로그래밍
다오는 동시성 및 분산 컴퓨팅을 지원한다.
6. 1. 비동기 함수 호출(Asynchronous Function Call, AFC)
다오에서 멀티 스레드 프로그램을 만드는 가장 쉬운 방법은 비동기 함수 호출(AFC, Asynchronous Function Call)이다. 비동기 함수 호출은 동기 함수 호출과 매우 비슷하며, 함수 호출 끝에 `async` 키워드를 붙이면 된다.```
myfunc( myparams ) async;
myobj.mymeth( myparams ) async;
```
모든 함수는 위와 같은 방식으로 비동기 호출이 가능하다.
일반적으로 비동기 함수 호출은 서로 다른 네이티브 스레드에서 실행된다. 이는 스레드 풀에서 사용 가능한 유휴(idle) 스레드일 수도 있고, 필요에 따라 새로 생성된 스레드일 수도 있다.
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com