프로그램이 언어 의미를 확장 할 수있을 정도로 프로그램 언어를 변경할 수 있습니까?


15

프로그래머가 클래스를 정의한 후 언제라도 클래스를 확장 / 재정의 할 수있게하는 루비 (및 자바 스크립트)와 같은 언어의 기능과 관련하여 (문자열과 같은 클래스 포함) 나중에 이론적으로 프로그램을 확장 할 수있는 언어를 설계하는 것이 가능합니까? 그것의 의미론.

예 : Ruby는 다중 상속을 허용하지 않지만 다중 상속 구현을 허용하기 위해 기본 언어 동작을 확장 / 재정의 할 수 있습니다.

이것을 허용하는 다른 언어가 있습니까? 이것이 실제로 언어 디자이너들에게 관심의 대상입니까? 웹 애플리케이션 개발을위한 레일 프레임 워크를 구축하기 위해 루비를 사용하는 선택을 살펴보면, 이러한 언어는 다양한 애플리케이션을위한 프레임 워크 (또는 DSL)를 설계하는 데 매우 강력 할 수 있습니다.


2
예외를 라이브러리 코드로 구현할 수있는 의미 체계 Scheme의 위생 매크로 또는 뉴스 피크의 반영 으로 간주합니까? Perligata : Romana 와 같은 구문 확장은 어떻 습니까?

이것은 개념이 아닌 언어 목록을 요구하는 질문 인 것 같습니다. 보류중인 수정 사항은 질문의 방향을 변경하여 사실상 주 제외로 마감하기 위해 투표합니다.
Raphael

올바르게 기억한다면 Java조차도 프로그램이 유형 시스템을 확장 할 수있는 기능을 갖게 될 것입니다.
Raphael

1
@Raphael, JSR 305 를 생각하고 있습니까? 자바 주석이 내가 내 대답은 아래에 링크 된도 옹호 신어 설계 길 라드 브라 차에 의해 (부분적으로) 디자인 된 플러그 타입 시스템을 . 주석 시스템이 원하는 JSR 305 개 용품 유형 @Nullable@NonNullfindbugs 같은 외부 체커가 사용된다.
Mike Samuel

"의미 확장"이라는 의미가 무엇인지 확실하지 않습니다. 내가 보면 Boost.Spirit 내 교차되고, 개인 이미 "확장 의미"의 임계 값 : C의 산술 연산자를 ++ 컴파일러는 다음 말했다 언어에 대한 파서로 변신하는 대신 언어 구문을 설명하는 데 사용된다. 나는 이것이 실험실 쥐의 "확장 언어 의미론"이 의미하는 것이 아니라는 것을 알고 있지만 꽤 인상적이라고 생각합니다.
DevSolar

답변:


12

Converge 에는 매우 인상적인 메타 프로그래밍 기능이 있습니다.

간단한 수준에서 이것은 매크로와 비슷한 기능으로 보일 수 있지만 컴파일 타임에 임의의 코드를 실행할 수 있기 때문에 대부분의 기존 매크로 기능보다 강력합니다. 이를 사용하여 컴파일러와 상호 작용하고 ITree (일명 추상 구문 트리)처럼 안전하고 쉽게 코드를 생성 할 수 있습니다.

이는 참조 적으로 투명한 매크로 정의를 허용하는 Scheme의 위생 매크로 에서 한 단계 향상되었습니다 .

준 리터럴 과 같은 메커니즘을 사용하면 다른 언어로 구문 분석 트리를 구성하고 파괴 할 수 있지만 자체 수정 대신 DSL (Domain-Specific Language)과 상호 작용하는 데 더 자주 사용됩니다.


Newspeak의 반영을 통해 예외는 라이브러리 코드로 구현 될 수 있습니다.

7.6 예외 처리

Newspeak는 활성화 레코드 (3.6)에 대한 반사 액세스 (7.2)를 제공하므로 예외 처리는 순전히 라이브러리 문제입니다. 이 플랫폼은 스몰 토크에서와 마찬가지로 예외 발생, 포착 및 재개를 지원하는 표준 라이브러리를 제공합니다.


Perligata : Romana 는 완전히 새로운 구문을 언어에 스키닝하는 방법을 보여줍니다.

이 백서는 Linl :: Romana :: Perligata와 같은 Perl 모듈을 설명하며 Perl 프로그램을 라틴어로 작성할 수 있습니다.


의미 론적으로 의미가 크지 않은 PyPy는 의미론이 고도로 정적으로 분석 가능한 Python 하위 집합에 지정된 언어의 해석기 생성기이며 언어에 썽크 를 추가하는 것과 같이 Python에서 새로운 언어 구문을 실험하는 데 사용합니다 .


또한 관심을 가질만한 것은 Ometa 입니다.

이 논문은 컴퓨터 과학 실험에 중점을 둡니다. 특히, 실험을 지원하기 위해 특별히 설계된 새로운 프로그래밍 언어와 구성이 연구원과 프로그래머의 작업을 실질적으로 단순화 할 수 있음을 보여줄 것입니다.

나는 두 가지 매우 다른 종류의 실험을 다루는 작품을 소개합니다. 첫 번째 목표는 프로그래밍 언어 연구자들이 새로운 프로그래밍 언어와 기존 언어의 확장을 쉽게 프로토 타이핑 할 수 있도록하여 아이디어를 실험 할 수 있도록 돕는 것입니다. 다른 하나는 프로그램 자체가 다른 행동과 가능성을 실험 할 수있게함으로써 프로그래밍 패러다임으로서의 실험을 조사하는 것입니다. 다시 말해, 무엇에 대한 언어 지원을 제공하려는 시도입니까? 또는 가능한 세계 추론.

Alex Warth의 논문은 JavaScript + Ometa에서 Ometa를 사용하여 새로운 의미 체계 (세계를 통한 거래 의미 체계)를 정의하는 방법을 보여줍니다.


8

"이론적으로 실현 가능합니까? *

에스

에스

런타임 모델이 구현 언어와 크게 다르면 새 언어가 여전히 느리게 실행될 수 있습니다. 이 경우 인터프리터의 비트가 변환 된 코드에 표시되고 계속 느리게 실행됩니다. 그러나 새로운 언어가 원래 언어와 거의 동일하고 약간만 수정하면 부분 평가를 신중하게 조정하여 대상 코드에서 대부분의 인터프리터 비트를 제거 할 수 있습니다. 그러면 새로운 기능에 대해서만 성능 저하가 발생합니다.

실제로 이것은 프로그래밍 언어를위한 "가상화"기술입니다.


6

역사적으로 Lisp 는 메타 프로그래밍 기능을 도입 한 최초의 주요 프로그래밍 언어였습니다. Lisp의 매크로 시스템을 통해 프로그래머는 새로운 제어 구조, 새로운 데이터 템플릿 등을 정의 할 수 있습니다 . 예를 들어, Common Lisp Object System 은 객체 나 클래스에 대해 전혀 모르는 핵심 언어 이상의 매크로로 완전히 정의 할 수 있습니다. 매크로 시스템은 또한 도메인 특정 언어 의 정의를 허용합니다 .

루비는 반사율과 메타 프로그래밍 능력을 포함하여 Lisp로부터 많은 영감을 받았습니다. 이러한 점에서 많은 동적 유형 언어가 Lisp에서 영감을 얻었습니다. 많은 유형의 확장이 원래 유형 시스템에 맞지 않기 때문에 정적 입력은 문제를 복잡하게 만듭니다.


4

답변 / 의견에 아직 언급되지 않은 내용 :

설문 조사:

초록 : 확장 가능한 언어는 사용자가 구문을 수정 또는 추가하고 새로운 구문 양식을 의미와 연관시킬 수있는 프로그래밍 언어입니다. 이 언어들은 무엇에 도움이됩니까? 어떤 종류의 기능을 추가하기 쉽고 어떤 기능이 추가되지 않습니까? 그것들은 진지하게 받아 들여질만큼 강력합니까? 이 설문 조사에서는 절차 적, 객체 지향적, 기능적 및 범용 확장 가능한 언어를 고려할 때 이러한 질문에 대답하려고 시도합니다. 우리는 주로 표현력 (정규, 맥락이없는), 관련 경고 (비위생적, 모호함) 및 다양한 메커니즘의 사용 편의성에 관심이 있습니다.

초록 : 새로운 구문 형식으로 언어를 확장하는 기능은 강력한 도구입니다. 충분히 유연한 매크로 시스템을 통해 프로그래머는 공통 기반에서 문제 영역을 위해 특별히 설계된 언어를 만들 수 있습니다. 그러나 통합되고, 유능하며 동시에 널리 사용되는 간단한 매크로 기능은 현재까지 Lisp 언어 군으로 제한되었습니다. 이 백서에서는 Lisp 매크로 시스템의 뛰어난 성능과 사용 편의성을 갖춘 Java Syntactic Extender (JSE)라는 매크로 기능을 소개하지만보다 일반적인 대수 구문이있는 언어 인 Java의 경우를 소개합니다. ...


1
각 참고 문헌에 대해 하나 또는 두 개의 요약 문장을 작성하십시오. 순수한 링크 모음은 거의 "좋은"답변이 아닙니다.
Raphael
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.