루시드 (프로그래밍 언어)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
루시드는 데이터 계산을 위해 요구 구동 모델을 사용하는 데이터 흐름 프로그래밍 언어이다. 각 변수는 무한 값의 스트림으로, 함수는 필터 또는 변환기로 작동하며, 반복은 'fby' 연산자를 통해 시뮬레이션된다. 루시드는 대수를 기반으로 하며, 변수의 변화하는 값의 기록인 기록을 사용한다. 루시드는 명시적 로직을 피할 수 있어 코드 감소에 기여하며, 스트림의 값을 처리하기 위한 다양한 연산자를 제공한다. 루시드는 계승, 피보나치 수, 수열의 합, 변화하는 평균, 소수, 퀵 정렬, 제곱평균제곱근, 해밍 문제 등 다양한 예제를 통해 사용법을 보여준다.
더 읽어볼만한 페이지
- 질의 언어 - 임베디드 SQL
임베디드 SQL은 호스트 프로그래밍 언어 내에 SQL 문을 삽입하여 데이터베이스와 상호 작용하는 기술로, 데이터베이스 액세스를 표준화하지만 보안 취약점과 이식성 저하의 단점도 가진다. - 질의 언어 - XQuery
XQuery는 함수형 프로그래밍 패러다임을 지원하며 XPath 식 구문의 상위 집합을 포함하는 XML 데이터 추출 및 조작을 위한 쿼리 언어로서, FLWOR 식을 통해 XML 데이터 조작 및 새로운 XML 문서 구성을 지원하고 XQuery 및 XPath 데이터 모델(XDM)을 기반으로 한다. - 병행 프로그래밍 언어 - 자바 (프로그래밍 언어)
자바는 제임스 고슬링 등에 의해 개발된 객체 지향 프로그래밍 언어로, 다양한 플랫폼에서 실행 가능하며 샌드박스 모델 기반의 보안 기능, 자동 메모리 관리, 멀티스레딩 등을 지원한다. - 병행 프로그래밍 언어 - 스칼라 (프로그래밍 언어)
스칼라는 마틴 오더스키가 설계한 객체 지향 및 함수형 프로그래밍 언어이며, 자바 플랫폼에서 실행되고 자바 코드와 상호 운용이 가능하며, 아파치 스파크 등 다양한 곳에서 활용된다. - 선언형 프로그래밍 언어 - XAML
XAML은 마이크로소프트에서 개발한 XML 기반의 마크업 언어로, 사용자 인터페이스, 데이터 바인딩, 이벤트 처리 등을 정의하며 WPF, Silverlight, WF, WinRT API 앱, Xamarin.Forms 등에서 UI 개발에 널리 사용된다. - 선언형 프로그래밍 언어 - 임베디드 SQL
임베디드 SQL은 호스트 프로그래밍 언어 내에 SQL 문을 삽입하여 데이터베이스와 상호 작용하는 기술로, 데이터베이스 액세스를 표준화하지만 보안 취약점과 이식성 저하의 단점도 가진다.
| 루시드 (프로그래밍 언어) - [IT 관련 정보]에 관한 문서 | |
|---|---|
| 기본 정보 | |
| 유형 | 데이터 흐름 프로그래밍 언어 |
| 설계 | 에드워드 A. 애시크로프트 |
| 설계 | 윌리엄 W. 웨지 |
| 등장 시기 | 1976년 |
| 개발자 | 애시크로프트 |
| 개발자 | 웨지 |
| 타이핑 | 형 없음 |
| 구현체 | pLucid |
| 방언 | GIPSY |
| 방언 | GLU (Granular Lucid) |
| 방언 | 인덱시컬 루시드 (Indexical Lucid) |
| 방언 | 텐서 루시드 (Tensor Lucid) |
| 방언 | 포렌식 루시드 (Forensic Lucid) |
| 방언 | Lucx |
| 방언 | JOOIPL |
| 영향을 준 언어 | ISWIM |
| 영향을 받은 언어 | SISAL |
| 영향을 받은 언어 | PureData |
| 영향을 받은 언어 | Lustre |
2. 모델
루시드는 데이터 계산을 위해 요구 구동 모델을 사용한다. 각 구문은 데이터가 흐르는 프로세서 네트워크와 통신 라인을 정의하는 방정식으로 이해할 수 있다. 각 변수는 무한 값의 스트림이며 모든 함수는 필터 또는 변환기이다. 반복은 '현재' 값과 'fby'( '다음에'로 읽음) 연산자를 통해 시뮬레이션되어 스트림의 구성을 허용한다.
루시드(및 기타 데이터 흐름 언어)에서 아직 속박되지 않은 변수를 포함하는 식은 변수가 속박될 때까지 기다린 후 진행된다.
루시드는 기록의 대수를 기반으로 하며, 기록은 데이터 항목의 무한 시퀀스이다. 작동상, 기록은 변수의 변화하는 값의 기록으로 생각할 수 있으며, first 및 next와 같은 기록 연산은 이름에서 제시하는 방식으로 이해할 수 있다. 루시드는 원래 검증이 단순화될 수 있는, 정돈되고, 수학적으로 순수한, 단일 할당 언어로 구상되었다. 그러나 데이터 흐름 해석은 루시드가 진화한 방향에 중요한 영향을 미쳤다.
3. 언어의 상세
x + y와 같은 식은 x와 y가 모두 바인딩될 때까지 기다린 후 식의 출력으로 반환한다. 이것의 중요한 결과는 관련 값을 업데이트하기 위한 명시적 로직을 피할 수 있다는 것이며, 이는 주류 언어에 비해 상당한 코드 감소로 이어진다.
루시드의 각 변수는 값의 스트림이다. n = 1 fby n + 1 식은 'fby' 연산자( "followed by"에 대한 기억술 )를 사용하여 스트림을 정의한다. fby는 이전 식 다음에 오는 것을 정의한다. (이 경우 스트림은 1,2,3,...을 생성한다).
스트림의 값은 다음과 같은 연산자로 처리할 수 있다(x가 사용되는 변수라고 가정).
계산은 이러한 시간에 따라 변화하는 데이터 스트림에 작용하는 필터 또는 변환 함수를 정의하여 수행된다.
4. 예시
4. 1. 계승
루시드는 스트림을 다루기 위한 데이터 흐름 프로그래밍 언어의 일종으로, pLucid에 영향을 주었다.```
fac
where
n = 0 fby (n + 1);
fac = 1 fby ( fac * (n + 1) );
end
4. 2. 피보나치 수
루시드에서 피보나치 수는 다음과 같이 정의된다.```lucid
fib
where
fib = 0 fby ( 1 fby fib + next fib );
end
```
4. 3. 수열의 합
wikitextx의 값을 더하는 수열의 합계는 다음과 같이 구할 수 있다.
```wikitable
| 코드 |
|---|
```
4. 4. 변화하는 평균
변화하는 평균을 계산하는 루시드 코드는 다음과 같다.```source
running_avg :
sum = 처음(input) fby sum + 다음(input);
n = 1 fby n + 1;
running_avg = sum / n;
end;
running_avg
where
sum = first(input) fby sum + next(input);
n = 1 fby n + 1;
running_avg = sum / n;
end;
```
4. 5. 소수 (수론)
소수여기서
소수 = 2 fby (n whenever 소수판별(n));
n = 3 fby n+2;
소수판별(n) = not(약수) asa 약수 또는 소수*소수 > N
여기서
N은 현재 n;
약수 = N mod 소수 eq 0;
end;
end

- --+1<--- -->소수판별----
| | |
| | V
- >fby--------------->언제든지--->
^
|
2
4. 5. 1. 데이터 흐름도
- --+1<--- -->소수판별----
| | |
| | V
- >fby--------------->언제든지--->
^
|
2
4. 6. 퀵 정렬
wikitextqsort(a) = 만약 eof(first a)이면 a 그렇지 않으면 follow(qsort(b0),qsort(b1)) fi
여기서
p = first a < a;
b0 = p일 때 a;
b1 = p가 아닐 때 a;
follow(x,y) = 만약 xdone이면 y upon xdone 그렇지 않으면 x fi
여기서
xdone = iseod x fby xdone 또는 iseod x;
end
end
==== 데이터 흐름도 ====
퀵 정렬 알고리즘의 데이터 흐름을 시각적으로 표현한 다이어그램은 다음과 같다.
```text
- -------> 언제든 -----> qsort ---------
| ^ |
| | |
| 아님 |
| ^ |
|---> 처음 | |
| | | |
| V | |
|---> 작음 --- |
| | |
| V V
- --+--------> 언제든 -----> qsort -----> conc -------> 만약-그렇지 않다면 ----->
| ^ ^
| | |
- -------> 다음 ----> 처음 ------> 파일 끝 -------------- |
| |
- ----------------------------------------------------------
```
위 다이어그램에서 `whenever`, `qsort`, `first`, `less`, `conc`, `ifthenelse`, `next`, `iseod` 등은 루시드 프로그래밍 언어의 연산자 또는 함수를 나타내는 것으로 추정된다. 특히 `qsort`는 퀵 정렬 알고리즘을, `ifthenelse`는 조건문을, `conc`는 연결 연산을 의미하는 것으로 보인다. `first`, `next`는 데이터 스트림의 요소에 접근하는 연산자로 추정된다. `whenever`는 특정 조건이 만족될 때까지 반복하는 연산자, `less`는 비교 연산자, `iseod`는 파일의 끝(End of Data)을 확인하는 함수로 추정된다.
```text
- -------> whenever -----> qsort ---------
| ^ |
| | |
| not |
| ^ |
|---> first | |
| | | |
| V | |
|---> less --- |
| | |
| V V
- --+--------> whenever -----> qsort -----> conc -------> ifthenelse ----->
| ^ ^
| | |
- -------> next ----> first ------> iseod -------------- |
| |
- ----------------------------------------------------------
```
위 다이어그램은 한국어로 번역되기 이전의 영어 원본 다이어그램이다.
4. 6. 1. 데이터 흐름도
퀵 정렬 알고리즘의 데이터 흐름을 시각적으로 표현한 다이어그램은 다음과 같다.```text
- -------> whenever -----> qsort ---------
| ^ |
| | |
| not |
| ^ |
|---> first | |
| | | |
| V | |
|---> less --- |
| | |
| V V
- --+--------> whenever -----> qsort -----> conc -------> ifthenelse ----->
| ^ ^
| | |
- -------> next ----> first ------> iseod -------------- |
| |
- ----------------------------------------------------------
```
위 다이어그램에서 `whenever`, `qsort`, `first`, `less`, `conc`, `ifthenelse`, `next`, `iseod` 등은 루시드 프로그래밍 언어의 연산자 또는 함수를 나타내는 것으로 추정된다. 특히 `qsort`는 퀵 정렬 알고리즘을, `ifthenelse`는 조건문을, `conc`는 연결 연산을 의미하는 것으로 보인다. `first`, `next`는 데이터 스트림의 요소에 접근하는 연산자로 추정된다. `whenever`는 특정 조건이 만족될 때까지 반복하는 연산자, `less`는 비교 연산자, `iseod`는 파일의 끝(End of Data)을 확인하는 함수로 추정된다.
```text
- -------> 언제든 -----> qsort ---------
| ^ |
| | |
| 아님 |
| ^ |
|---> 처음 | |
| | | |
| V | |
|---> 작음 --- |
| | |
| V V
- --+--------> 언제든 -----> qsort -----> conc -------> 만약-그렇지 않다면 ----->
| ^ ^
| | |
- -------> 다음 ----> 처음 ------> 파일 끝 -------------- |
| |
- ----------------------------------------------------------
```
위 다이어그램은 한국어로 번역된 버전이다. 영어 원본 다이어그램의 각 요소를 한국어로 번역하여 데이터 흐름을 시각적으로 표현하고 있다.
4. 7. 제곱평균제곱근
wikitext제곱평균제곱근(RMS)을 구하는 루시드 코드는 다음과 같다.
:
sqroot(avg(square(a))):
where:
square(x) = x*x;:
avg(y) = mean:
where:
n = 1 fby n+1;:
mean = first y fby mean + d;:
d = (next y - mean)/(n+1);:
end;:
sqroot(z) = approx asa err < 0.0001:
where:
Z is current z;:
approx = Z/2 fby (approx + Z/approx)/2;:
err = abs(square(approx)-Z);:
end;:
end;여기서 `square(x)`는 x의 제곱을, `avg(y)`는 y의 평균을, `sqroot(z)`는 z의 제곱근을 구하는 함수이다. `fby`는 'followed by'의 약자로, 루시드에서 시퀀스를 정의하는 데 사용되는 연산자이다. `asa`는 해당 조건이 만족할 때까지 해당 라인의 값을 계속 계산한다.
`avg(y)` 함수 내부의 `mean`은 초깃값으로 `first y`를 갖고, 이후 `mean + d`로 업데이트된다. `d`는 `(next y - mean) / (n + 1)`로 계산되는데, 이는 새로운 값과 현재 평균의 차이를 `n + 1`로 나눈 값이다.
`sqroot(z)` 함수 내부의 `approx`는 초깃값으로 `Z / 2`를 갖고, 이후 `(approx + Z / approx) / 2`로 업데이트된다. `err`는 `abs(square(approx) - Z)`로 계산되는데, 이는 근사값의 제곱과 Z의 차이의 절댓값이다. 이 값이 0.0001보다 작아질 때까지 `approx`의 값을 반복적으로 계산하여 제곱근의 근사값을 구한다.
4. 8. 해밍 문제
```
```
```
h
where
h = 1 fby merge(merge(2 * h, 3 * h), 5 * h);
merge(x,y) = if xx <= yy then xx else yy fi
where
xx = x upon xx <= yy;
yy = y upon yy <= xx;
end;
end;
```
h
where
h = 1 fby merge(merge(2 * h, 3 * h), 5 * h);
merge(x,y) = if xx <= yy then xx else yy fi
where
xx = x upon xx <= yy;
yy = y upon yy <= xx;
end;
end;
4. 8. 1. 데이터 흐름도
- -------------------*2---------
| -------------*3---------|
| | --*5---------|
| | | |
| V V |
- -->병합----->병합----->fby-------->
^
|
1
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com