딜런(프로그래밍 언어)

Dylan (programming language)
딜런
Dylan logo.png
패러다임멀티패키지: 기능성, 객체 지향
개발자오픈소스 커뮤니티 Apple Computer, Harlequin, Carnegie Mellon University
처음 등장한1992년; 30년 전(1992년)
안정된 릴리스
2020.1 / 2020년 10월 10일; 21개월 전(2020-10-10)
타이핑 분야견고하고 점진적
플랫폼IA-32, x86-64
OS크로스 플랫폼
파일 이름 확장자딜런, 뚜껑
웹 사이트opendylan.org
주요 구현
오픈 딜런, 귀디온 딜런
사투리
infix-dylan(일명 Dylan), prefix-dylan(이력만)
영향을 받다
CLOS, ALGOL, Scheme, EuLisp
영향받은
Lasso, Python, Ruby, Julia[1]

Dylan기능성객체 지향 프로그래밍(OOP)을 지원하는 멀티패러다임 프로그래밍 언어이며 동적 및 정적 동작에 대한 세분화된 제어를 포함하여 효율적인 기계 코드 생성을 지원하도록 설계된 프로그래밍 모델을 제공합니다.이것은 1990년대 초에 애플 컴퓨터가 이끄는 그룹에 의해 만들어졌다.

언어에 대한 간결하고 철저한 개요는 딜런 참조 [2]매뉴얼에서 찾을 수 있습니다.

딜런은 Scheme와 Common Lisp에서 파생되었으며 Common Lisp Object System(CLOS)에서 파생된 통합 객체 시스템을 추가합니다.딜런에서 모든 값(숫자, 문자, 함수 및 클래스 포함)은 1등급 객체입니다.Dylan은 다중 상속, 다형성, 다중 디스패치, 키워드 인수, 객체 자기성찰, 패턴 기반 구문 확장 매크로 및 기타 많은 고급 기능을 지원합니다.프로그램은 동적 프로그래밍과 정적 프로그래밍 사이의 연속체를 차지하는 프로그램을 허용하고 진화적 개발을 지원하면서 역동성에 대한 세밀한 제어를 표현할 수 있습니다(빠른 프로토타이핑과 점진적인 미세화 및 최적화).

딜런의 주요 디자인 목표는 상용 소프트웨어 개발에 적합한 동적 언어가 되는 것입니다.딜런은 Lisp 시스템의 완전한 유연성에 "자연적인" 제한을 도입함으로써 잠재적인 성능 문제를 해결하려고 합니다.이것에 의해, 컴파일러는 라이브러리와 같은 컴파일 가능한 단위를 명확하게 이해할 수 있습니다.

Dylan은 Scheme와 다른 Lisps에서 많은 의미론을 도출한다. 일부 Dylan 구현은 처음에 기존의 Lisp 시스템 내에서 구축되었다.그러나 Dylan은 Lisp와 같은 접두사 구문 대신 ALGOL과 같은 구문을 사용합니다.

역사

딜런은 1990년대 초 애플컴퓨터가 이끄는 그룹에 의해 만들어졌다.한때는 애플 뉴턴 컴퓨터에서 사용하기 위한 것이었지만 딜런의 구현은 충분한 성숙기에 이르지 못했고, 대신 뉴턴은 월터 스미스가 개발한 C와 뉴턴스크립트를 혼합하여 사용했다.애플은 1995년에 딜런 개발 노력을 중단했지만, 첨단 통합 개발 환경(IDE)을 포함한 "기술 릴리스" 버전(애플 딜런 TR1)을 이용할 수 있게 되었다.

다른 두 그룹은 언어 설계와 구현 개발에 기여했습니다.할리킨은 마이크로소프트 윈도우용 상용 IDE를 출시했고 카네기 멜론 대학교는 그위디온 딜런이라는 유닉스 시스템용 오픈 소스 컴파일러를 출시했다.이 두 구현 모두 현재 오픈 소스입니다.할리퀸의 실장은 현재 Open Dylan으로 명명되어 있으며, Dylan Hackers라는 자원봉사자 그룹에 의해 관리되고 있습니다.

딜런 언어는 코드명 랄프였다.제임스 호아킨은 "DYNAMic LANguage"를 위해 딜런이라는 이름을 선택했다."

구문

딜런의 구문 특징의 대부분은 리스프의 전통에서 비롯되었다.원래 딜런은 s-expression에 기반한 Lisp와 같은 접두사 구문을 사용했습니다.언어 설계가 완성되었을 때, 구문은 더 많은 프로그래머에게 친숙해질 것이라는 기대와 함께 ALGOL과 같은 구문으로 변경되었습니다.이 구문은 마이클 칼이 설계했다.Dylan Reference [2]Manual에 자세히 설명되어 있습니다.

어휘 구문

딜런은 대소문자를 구분하지 않는다.딜런의 어휘 구문을 사용하면 하이픈(마이너스) 기호가 여러 단어 식별자('lisp-case' 또는 'kebab case'라고도 함)의 부분을 연결하는 명명 규칙을 사용할 수 있습니다.이 규칙은 리스프 언어에서 일반적으로 사용되지만 숫자 리터럴의 일부가 아닌 하이픈 마이너스를 단일 어휘 토큰으로 취급하는 프로그래밍 언어에서는 사용할 수 없습니다.여백 문자로 둘러싸여 있지 않은 경우에도 마찬가지입니다.

영숫자 및 하이픈 마이너스 기호 외에도 Dylan은 특정 영숫자가 아닌 문자를 식별자의 일부로 허용합니다.식별자는 영숫자가 아닌 문자 또는 [2]숫자만으로 구성할 수 없습니다.애매한 점이 있으면 공백이 사용됩니다.

코드 예시

여러 슬롯이 있는 심플 클래스:

정의하다 학급 <포인트> (<개체>)   슬롯 포인트 x :: <blocks>,     required-init-module: x:;   슬롯 뾰족한 :: <blocks>,     required-init-module: y:; 끝. 학급 <포인트>; 

관례상 클래스는 다음과 같이 각도 괄호로 사용되는 보다 작거나 보다 큰 부호로 명명됩니다.<point>를 참조해 주세요.

end class <point>둘다요.class그리고.<point>옵션입니다.이것은 모두에게 해당된다end절을 참조하십시오.예를 들어 다음과 같이 쓸 수 있습니다.end if아니면 그냥end을 종료하다if진술.

을 예로 들다<point>:

만들다(<포인트>, x: 100, y: 200) 


가능한 한 최소한의 방법으로 다시 작성된 동일한 클래스:

정의하다 학급 <포인트> (<개체>)   슬롯 포인트 x;   슬롯 뾰족한; 끝.; 

현재 슬롯은 둘 다 다음과 같이 입력되었습니다.<object>슬롯은 수동으로 초기화해야 합니다.

허락하다 p = 만들다(<포인트>); 포인트 x(p) := 100;  // 또는 p.point-x := 100; 뾰족한(p) := 200;  // 또는 p.point-y := 200; 

관례상 상수 이름은 "$"로 시작합니다.

정의하다 일정한 $pi :: <이중창> = 3.1415927d0; 

요인 함수:

정의하다 기능. 요인 (n :: <blocks>) => (n! :: <blocks>)   사례.     n < > 0     => 에러("음수 정수의 계수를 취할 수 없습니다: %d\n", n);     n = 0     => 1;     그렇지않으면 => n * 요인(n - 1);   끝. 끝.; 

여기서,n!그리고.<integer>그냥 일반적인 식별자입니다.

명시적인 반환 문구는 없습니다.메서드 또는 함수의 결과가 평가된 마지막 식입니다.반환 위치에서 식 뒤에 세미콜론을 두는 것은 일반적인 스타일입니다.

모듈 대 네임스페이스

많은 객체 지향 언어에서 클래스는 캡슐화와 모듈화의 주요 수단입니다.각 클래스는 네임스페이스를 정의하고 외부에서 볼 수 있는 정의를 제어합니다.또한, 많은 언어의 클래스는 전체적으로 사용되어야 하는 분리할 수 없는 단위를 정의합니다.예를 들어,String연결 함수는 Import 및 컴파일을 필요로 합니다.String.

Dylan을 포함한 일부 언어에는 캡슐화를 보다 일반적인 방법으로 수행하는 별도의 명시적 네임스페이스 또는 모듈 시스템도 포함되어 있습니다.

딜런에서는 컴파일 유닛과 Import 유닛의 개념이 분리되어 있으며 클래스는 특별히 어느 쪽과도 관계가 없습니다.라이브러리는 컴파일 및 처리를 함께 수행해야 하는 항목을 정의하고 모듈은 네임스페이스를 정의합니다.클래스는 프로그래머가 원하는 대로 모듈로 함께 배치하거나 모듈 사이를 오려낼 수 있습니다.대부분의 경우 클래스의 완전한 정의는 단일 모듈에 존재하지 않고 옵션으로 수집되는 여러 모듈에 분산되어 있습니다.프로그램마다 필요한 항목만 포함하여 동일한 클래스에 대한 정의가 다를 수 있습니다.

예를 들어 다음에서 regex를 지원하는 추가 기능 라이브러리를 고려하십시오.String. 일부 언어에서는 기능을 문자열에 포함시키려면 이 기능을String네임스페이스.이 일이 일어나자마자String클래스는 커지지만 regex를 사용할 필요가 없는 함수는 계속 증가된 라이브러리 크기로 비용을 지불해야 합니다.이러한 이유로 이러한 종류의 추가 기능은 일반적으로 고유한 네임스페이스와 개체에 배치됩니다.이 접근법의 단점은 새로운 기능이 더 이상 이 접근법의 일부가 아니라는 것입니다. String대신 따로 호출해야 하는 자체 함수 집합에서 분리됩니다.대신myString.parseWith(myPattern)OO의 관점에서 보면 자연스러운 조직이라고 할 수 있습니다.myPattern.parseString(myString)사용되기 때문에 순서가 실질적으로 반전됩니다.

딜런 아래에서 많은 인터페이스를 동일한 코드에 대해 정의할 수 있습니다. 예를 들어 String 연결 메서드는 String 인터페이스와 다양한 클래스의 서로 다른 연결 함수를 모두 수집하는 "연결" 인터페이스 모두에 배치될 수 있습니다.이것은 함수가 매우 다른 객체 유형에 적용되는 경향이 있는 수학 라이브러리에서 더 일반적으로 사용됩니다.

인터페이스 구조의 보다 실용적인 용도는 모듈의 퍼블릭버전과 프라이빗버전을 구축하는 것입니다.이러한 버전은 다른 언어에서 항상 문제를 일으키고 구문을 추가하는 볼트온 기능으로 포함되어 있습니다.Dylan 아래에서, 모든 함수 호출은 단순히 "개인" 또는 "개발" 인터페이스에 있을 수 있으며, 공개적으로 접근할 수 있는 함수를 수집합니다.PublicJava 또는 C++에서는 오브젝트의 가시성이 코드에 정의되어 있습니다.이는 유사한 변경을 지원하기 위해 프로그래머는 정의를 완전히 다시 작성해야 하며 동시에 두 버전을 가질 수 없음을 의미합니다.

딜런의 수업은 다음과 같습니다.slots(데이터 멤버, 필드, ivar 등) 대부분의 OO 언어와 유사한 방식으로 오브젝트.슬롯에 대한 모든 액세스는 Smalltalk와 같이 메서드를 통해 이루어집니다.기본 getter 및 setter 메서드는 슬롯 이름을 기반으로 자동으로 생성됩니다.대부분의 다른 OO 언어와 달리 클래스에 적용되는 다른 메서드는 클래스 외부에서 정의되는 경우가 많기 때문에 일반적으로 Dylan의 클래스 정의에는 스토리지의 정의만 포함됩니다.예:

정의하다 학급 <blocks> (<보기>)   슬롯 직함 :: <문자열> = "제목 없음', init-module: 제목:;   슬롯 위치 :: <포인트>, required-init-module: 위치:; 끝. 학급; 

이 예에서는 클래스가 "<window>" 가 정의되어 있습니다.<class name> 구문은 클래스 이름을 두드러지게 하기 위한 규칙일 뿐입니다.각괄호는 클래스 이름의 일부일 뿐입니다.이에 반해 일부 언어에서는 클래스 이름의 첫 글자를 대문자로 쓰거나 이름 앞에 C 또는 T를 붙이는 것이 관례입니다(예:). <window>단일 클래스에서 상속합니다.<view>및 2개의 슬롯을 갖추고 있습니다.title창 제목 문자열을 잡고 있습니다.position창가 모서리에 X-Y 점을 잡고 있습니다.이 예에서는 제목에 기본값이 지정되지만 위치는 지정되지 않았습니다.옵션의 init-keyword 구문을 사용하면 프로그래머는 클래스의 오브젝트를 인스턴스화할 때 슬롯의 초기값을 지정할 수 있습니다.

C++나 Java와 같은 언어에서는 클래스도 인터페이스를 정의합니다.이 경우 위의 정의에는 명시적인 명령이 없기 때문에 슬롯과 메서드에 대한 접근은 양쪽 언어로 고려됩니다.protected즉, 서브클래스에서만 사용할 수 있습니다.관련 없는 코드가 창 인스턴스를 사용할 수 있도록 하려면 창 인스턴스를 선언해야 합니다.public.

딜런에서 이러한 종류의 가시성 규칙은 코드의 일부가 아니라 모듈/인터페이스 시스템의 일부로 간주됩니다.이것에 의해, 상당한 유연성이 향상됩니다.예를 들어 초기 개발 중에 사용된 하나의 인터페이스는 모든 것을 공개한다고 선언할 수 있지만 테스트 및 전개에 사용된 인터페이스는 이를 제한할 수 있습니다.C++ 또는 Java에서는 이러한 변경은 소스 코드를 변경해야 하므로 사람들은 이를 수행하지 않습니다. 반면 딜런에서는 이는 전혀 관련이 없는 개념입니다.

이 예에서는 사용하지 않지만 딜런은 다중 상속도 지원합니다.

메서드 및 일반 함수

딜런에서 메서드는 본질적으로 어떤 특정 클래스와도 연관되지 않습니다. 메서드는 클래스 외부에 존재하는 것으로 간주할 수 있습니다.CLOS와 마찬가지로 Dylan은 여러 디스패치(멀티메타드)를 기반으로 하며 호출되는 특정 메서드는 모든 인수의 유형에 따라 선택됩니다.이 메서드는 컴파일 시 알 필요가 없습니다.사용자의 취향에 따라 필요한 기능을 사용할 수 있는지 여부를 파악할 수 있습니다.

Java에서는 동일한 메서드가 특정 클래스에서 분리됩니다.이 기능을 사용하려면 프로그래머는 해당 클래스를 가져오고 메서드를 호출하기 위해 명시적으로 참조해야 합니다.해당 클래스를 사용할 수 없거나 컴파일 시에 알 수 없는 경우 응용 프로그램은 컴파일되지 않습니다.

딜런에서 코드는 함수에서 스토리지와 격리됩니다.많은 클래스가 자체 함수를 호출하는 방식을 가지고 있기 때문에 대부분의 다른 OO 언어처럼 보이고 느껴집니다.단, 코드는 일반 함수에 위치할 수도 있습니다.즉, 특정 클래스에 연결되어 있지 않고 누구나 네이티브하게 호출할 수 있습니다.따라서 특정 범용 함수를 클래스 내의 메서드에 링크할 수 있습니다.

정의하다 방법 파랗게 질렸다 (w :: <blocks>)   w.색. := $블루; 끝. 방법; 

이 정의는 다른 언어에서의 정의와 비슷하며, 이 정의는 아마 다음 언어에서 캡슐화되어 있을 것입니다.<window>class. := setter 호출에 주목하십시오. 이것은 다음 용어의 통사당입니다.color-setter($blue, w).

일반 메서드의 유틸리티는 보다 "일반적인" 예를 고려할 때 그 자체로 나타납니다.예를 들어, 대부분의 언어에서 하나의 일반적인 기능은to-string이것은 오브젝트에 대해 사람이 복사한 형식을 반환합니다.예를 들어 창은 제목과 위치를 반환하고 문자열은 반환될 수 있습니다.딜런에서는 이러한 방법들이 모두 "라는 단일 모듈로 수집될 수 있었다.to-string"에 의해 클래스 자체의 정의에서 이 코드를 삭제합니다.특정 객체가 다음을 지원하지 않는 경우to-string에 쉽게 추가할 수 있습니다.to-string모듈.

확장성

이 전체 개념은 일부 독자들에게 매우 이상하다는 인상을 줄 수 있다.취급하는 코드to-string에 정의되어 있지 않기 때문에<window>딜런이 전화에 어떻게 대처하는지를 고려하기 전까지는 말이 안 될 수도 있어요to-string. 프로그램이 컴파일될 때 대부분의[which?] 언어에서to-string위해서<window>검색하여 메서드에 대한 포인터(거의)로 대체됩니다.딜런에서는 프로그램이 처음 실행되었을 때 발생합니다. 런타임은 메서드 이름/파라미터 세부사항 테이블을 작성하고 이 테이블을 통해 메서드를 동적으로 검색합니다.즉, 특정 메서드의 함수는 컴파일 시간 단위뿐만 아니라 어디에나 위치할 수 있습니다.최종적으로 프로그래머는 코드를 배치하는 장소와 적절한 클래스 라인에 따라 코드를 수집하고 그렇지 않은 기능 라인에 대해 상당한 유연성을 갖게 됩니다.

여기서의 의미는 프로그래머가 함수를 별도의 파일에 정의함으로써 기존 클래스에 기능을 추가할 수 있다는 것입니다.예를 들어, 맞춤법 검사를 모두 추가할 수 있습니다.<string>대부분의 언어에서 문자열 클래스의 소스 코드에 대한 액세스가 필요하며 이러한 기본 클래스는 소스 형식으로 제공되는 경우가 거의 없습니다.Dylan(및 기타 "확장 가능한 언어")에서는 맞춤법 검사 방법이 다음 문서에 추가될 수 있습니다.spell-check모듈, 이 모듈을 통해 적용할 수 있는 모든 클래스를 정의합니다.define method건설하다.이 경우 실제 기능은 단일 범용 함수로 정의될 수 있습니다.이 함수는 문자열을 사용하여 오류를 반환합니다.언제?spell-check모듈이 프로그램으로 컴파일되고 모든 문자열(및 기타 오브젝트)이 추가 기능을 갖게 됩니다.

애플 딜런

애플 딜런은 애플컴퓨터가 제작한 딜런을 구현한 것이다.이것은 원래 애플 뉴턴 제품용으로 개발되었습니다.

레퍼런스

  1. ^ Stokel-Walker, Chris. "Julia: The Goldilocks language". Increment. Stripe. Retrieved 23 August 2020.
  2. ^ a b c Andrew Shalit; David Moon; Orca Starbuck (11 September 1996). The Dylan Reference Manual. Apple Press. Addison-Wesley. ISBN 9780201442113.

외부 링크