다른 사람으로 변환하는 데 사용할 수있는 개인화 가능한 프로그래밍 언어가 있습니까?


13

고유 한 구문 구성을 설정할 수 있고 코드를 선택한 언어로 변환 할 수있는 프로그래밍 언어가 있습니까?

예를 들어, "Python 's indexed blocks"와 같은 특정 구성을 선택 하고 지수 등을 위해 [a,b,c]배열을 초기화합니다 ^. 스크립트는 해당 언어를 원하는 언어로 변환합니다.


1
나는 확실히 희망하지 않습니다. TIMTOWTDI는 아마도 나쁘지만 "원하는만큼 호환되지 않는 많은 방법을 발명"할 때 분명히 같은 단점이 수백 배에 달하며 훨씬 덜 유용합니다. DSL은 때때로 그만한 가치가 있지만, 그것의 대가로 구문의 절반을 재정의하는 것 (또는 더 나쁜-두 연산자 교환, 명백한 호환성을 제공하지만 의미론이 다름) ...

나는 이것을 자바 스크립트로 프로그래밍하고 실제로 실제로 내 코드에 몇 가지 구문 설탕을 설정할 수 있기를 원하기 때문에 이것을 묻습니다. 그러나 언어는 그것을 허용하지 않습니다. 작업자 과부하조차 불가능합니다.
Dokkat

2
어느 정도, 당신이 묘사하는 것은 전 처리기 매크로 와 같은 소리 입니다. 이제 우리가 perl과 비슷한 기능을 가질 수 있다면 ...
yannis

5
@ 독 카트 (Dokkat) : JavaScript에 관한 내용으로 구체적으로 질문을 업데이트 하십시오. 질문은 유지 보수 및 지원 악몽입니다. 기존 언어에 새 구문을 추가하거나 전처리기를 사용하여 개인 언어를 공용 언어로 변경하는 것은 정말 끔찍합니다. 하나. 특정 JavaScript 구문 설탕 문제 를 나열 하면 특정 도움 이 필요할 수 있습니다 .
S.Lott

3
이러한 "개인화 된 프로그래밍 언어"는 일반적으로 "도메인 특정 언어"또는 DSL이라고합니다.
Michael Dillon

답변:


14

네,하지만 당신이 생각하는 방식에는 맞지 않을 것입니다.

Lisp 와 그 친척들은 소스에서 임의의 변환을 수행 할 수있는 강력한 매크로 시스템을 가지고 있기 때문에 원칙적으로 매크로 (및 문자 수준에서 리더 매크로)를 사용하여 원하는 확장을 만들 수 있습니다. 결합 언어 (및 관련 분야의 저자가 사용하는 언어)는 유사한 메타 프로그래밍 능력 을 가질 수 있습니다 . 이에 대한 좋은 예는 Forth 이며 많은 구문 구문 (예 : 주석)을 사용자 정의 할 수 있습니다. 현대적이지 않은 비현실적인 예를 들어, 사용자 정의 구문에 대해 Perl 5보다 향상된 Perl 6 지원 을 제공하려는 노력이 있습니다.


8
나는 어떻게 든 Perl이 (일부) 대답이 될 것이라는 것을 알았다. C 전 처리기 매크로도 설명에 맞게 약간 확장 된 것 같습니다.
yannis

또한 C ++에서 연산자 오버로드가 좋을 수 있습니다. Hello World 예제가 떠 오릅니다. cout << "Hi";
Tydus 군

@LordTydus : 사실, 심지어 운영자 오버로드만으로도 깔끔한 인터페이스 뒤에 약간의 마술을 할 수 있습니다. C ++에 더 일반적인 오버로드 기능, 예 operator[]를 들어 여러 인수에 대한 오버로드 또는 Haskell에서와 같이 새로운 연산자를 도입하는 것이 좋을 것입니다 . 그러나 나는위원회가 파싱 문제를 지나칠 것을 의심한다.
Jon Purdy

3

개념 프로그래밍 과 비슷 합니다 .

익숙하지 않지만 XL 은 특별히 고안된 언어입니다.

XL에는 프로그래머가 재구성 할 수있는 구문과 의미가 있습니다. 컴파일러 플러그인을 사용하여 언어에 새로운 기능을 추가 할 수 있습니다.

Lisp와 Forth는 XL보다 작지만 개념 프로그래밍을 지원합니다. Lisp는 매우 실용적이고 효과적이므로 제안합니다. 가장 중요한 것은 Lisp가 제공하는 표기법이 아닌 명확하고 유연한 구문입니다.


예를 들어, "Python 's indexed blocks", "[a, b, c]"는 배열을 초기화하고 "^"는 지수 등을 지정합니다.

매우 유연하지만 균일 한 구문을 가진 Haskell과 같은 언어에 관심이있을 수 있습니다.


이것이 내가 찾던 것입니다.
Dokkat

2

내 지식이 아닙니다.

표준 언어 구문의 주요 이점 중 하나는 많은 사람들이 읽을 수 있다는 것입니다. 모든 사람이 자신의 구문을 발명하면 아무도 다른 사람의 코드를 이해할 수 없습니다. .... 그래서이 언어는 애호가에게는 재미 있지만 실용적으로는 많이 쓰지 않을 것입니다.

존재하는 가장 가까운 것은 아마도 Lisp 일 것입니다. 매크로 시스템은 매우 유연한 방식으로 새로운 언어 구성을 작성할 수 있습니다. 일반적으로 여전히 Lisp 구문을 사용하지만 실제로 원한다면 모든 것을 효과적으로 재정의 할 수 있습니다.

결과적으로 Lisp는 DSL 구현에 특히 인기가 있습니다. 좋은 예는 Clojure (Korma) 의이 데이터 액세스 DSL로 데이터베이스 액세스에 필요한 모든 상용구 코드를 처리합니다.


2

스칼라는 종종 이런 방식으로 DSL (Domain Specific Languages)을 만드는 데 사용됩니다.

주로 Scala에는 연산자가 없기 때문에 Scala 메서드 호출 구문을 약어로 사용할 수 있습니다. 예를 들어 :

5는 정수 오브젝트입니다. 5 더하기 7을 계산하려면 다음을 쓸 수 있습니다.

val ans = 5.add (7) 덧셈 방법은 실제로 "+"라는 이름을 제외하고 다음과 같이 작성합니다.

val ans = 5. + (7) 그러나 Scala에서는 "."를 포함 할 필요가 없습니다. 메소드 호출 또는 인수 주위의 괄호 "()"에서 오브젝트 5의 + 메소드를 호출하려면 다음과 같이 작성하십시오.

val ans = 5 + 7 Scala에는 영리한 메서드 명명 체계를 방해하는 연산자가 없기 때문에 완벽하게 작동합니다. 이제 +와 같은 메소드를 "재정의"하고 >>> 또는 ::라는 자체 메소드를 작성할 수 있다는 사실을 포함하여이 아이디어를 자신의 클래스와 오브젝트로 확장하십시오! 또는 @ * @ 또는 fancify와 같은 일반 텍스트 이름입니다.


대단해. 스칼라를 살펴 보겠습니다.
Dokkat

1

여전히 대부분 실험적이므로 사용하지 말아야하지만 최근 흥미로운 프로그래밍 패러다임 중 하나는 언어 지향 프로그래밍 (LOP)입니다.

언어 지향 프로그래밍의 개념은 사용자의 용어로 요구 사항을 포착 한 다음 사용자 설명에 가능한 한 동형 인 구현 언어를 만들어서 요구 사항과 구현 간의 매핑이 가능한 한 직접적이라는 접근 방식을 취합니다.

Sergey Dmitriev가 더 자세히 설명 합니다.

그것이 이념이지만, 실제로는 그것이 요구하는 행동을 뒷받침하는 것으로 요약됩니다. 당신은 할 수 있습니다 :

  • 기존 언어를 확장하십시오.
  • 다른 언어를 작성하십시오.
  • 새로 정의 된 키워드를 기본 언어로 변환하려면 기존 '변환 언어'를 사용하십시오.

이 패러다임을 따르는 가장 활동적인 프로그래밍 환경 은 JetBrains 의 무료 MPS ( Meta Programming System )입니다.

실제로 상용 소프트웨어에서도 사용되기 시작하여 아마도 '실험적'단계에서 벗어나기 시작했을 것입니다.

  • Realaxy 는 MPS 위에 완전히 구축 된 액션 스크립트 편집기입니다. LOP의 힘을 사용하여 AS3에 대한 클로저를 구현할 수있었습니다.
  • mbeddr C 는 MPS를 기반으로하는 확장 가능한 C 언어입니다.

1

도메인 별 언어는 Tcl 커뮤니티에서 일반적으로 사용됩니다. 예를 들어 C 및 SQL이 모두 포함 된 TDSL 프로그램 (Critcl 및 Sqlite 패키지를 통해)을 포함 된 DSL로 보는 것은 드문 일이 아닙니다. 임베디드 DSL에 대한 유일한 제한 사항은 임베디드 언어가 중괄호의 균형을 맞추면 훨씬 낫다는 것입니다. 실제로는 실제로 비 독점적 인 요구 사항으로 판명되었습니다!

DSL을 쉽게 만드는 또 다른 언어는 표준 ML이며,이를 사용하면 일반 시스템 토크 나이저에서 식별자를 키워드로 변환하기 전의 원시 토큰에 액세스 할 수 있습니다. 따라서 주석, 문자열 및 토큰 경계와 관련하여 SML의 기본 구문 규칙 중 일부 를 준수하는 경우 광범위한 DSL을 쉽게 수행 할 수 있으며 실제로 언어의 여러 주요 구동 응용 프로그램에 많이 사용됩니다. (정리 증명 자 등)

모든 언어가 그렇게 쉬운 것은 아닙니다. 특히 중괄호 용어의 내용을 자동으로 구문 분석하는 언어 (여러 개 중 다수)는이를 수행 할 수 없으므로 하위 언어를 문자열 안에 넣거나 연산자를 재정 의하여 DSL을 작성해야합니다. DSL을 호스트 언어 내에서 처리 할 수있는 것으로 재 작성하는 전 처리기 사용.


0

AFAIU 자신의 DSL (도메인 특정 언어)을 작성하는 데 도움이되는 언어를 찾고 있습니다. 좋은 후보자가 많이 있습니다. 개인적으로 Ruby 또는 Io를 권장합니다 .1) 쉬운 연산자 오버로드, 2) 메타 프로그래밍 및 3) method_missing자체 API를 만드는 데 사용할 수있는 대체 메커니즘을 제공하기 때문 입니다. 예를 들어, 루비 코드를 읽어서 SQL을 생성하는 루비로 작성된 DSL 인 sqldsl을 살펴보십시오 .


0

실제로 사용 하지는 않았지만 올바르게 기억하면 TXL 은 소스 코드 번역을 위해 특별히 설계되었습니다. 따라서 언어 및 / 또는 언어 확장에서 대상 실제 언어로 변환하는 방법을 지정하는 데 사용할 수 있어야합니다.

Javascript에 사용할 수 있는 문법 이있는 것 같습니다 . 그러나 이전에 사용하지 않은 것이 정확히 어떻게 도움이 될지 잘 모르겠습니다.


0

PPWizard라는 훌륭한 전처리 기가 있습니다. 일단 구문을 익힌 후에는 다른 언어를 대상으로하는 매크로 정의를 만들 수 있습니다. 그 문제에 대해 무모하거나 재미 있지는 않지만 유용한 도구입니다.


여기 일부 링크 : PPWIZARD CONTENTS (공식 문서), PPWizard-EDM2 (외부 참조). 이 도구는 강력하지만 문서를 읽기 쉽지 않습니다 (어쩌면 그 힘으로 인해).
Wolf


0

프로그래밍 언어를 부분적으로 개인화하는 한 가지 일반적인 방법은 매크로 프리 프로세서를 사용하는 것입니다. 예를 들어 일부 자바 스크립트 환경에서 다운로드 할 위치에 결과를 넣기 전에 C 전처리기를 통해 "dokkat-lang"을 실행할 수 있습니다.

얼마나 많은 일을 할 수 있는지는 전 처리기의 정교함에 달려 있습니다. C ++, Objective C 및 다양한 실험 언어의 초기 버전은 스톡 C 컴파일러 툴체인에 공급하기 전에 소스 코드를 사전 처리하여 수행되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.