고유 한 구문 구성을 설정할 수 있고 코드를 선택한 언어로 변환 할 수있는 프로그래밍 언어가 있습니까?
예를 들어, "Python 's indexed blocks"와 같은 특정 구성을 선택 하고 지수 등을 위해 [a,b,c]
배열을 초기화합니다 ^
. 스크립트는 해당 언어를 원하는 언어로 변환합니다.
고유 한 구문 구성을 설정할 수 있고 코드를 선택한 언어로 변환 할 수있는 프로그래밍 언어가 있습니까?
예를 들어, "Python 's indexed blocks"와 같은 특정 구성을 선택 하고 지수 등을 위해 [a,b,c]
배열을 초기화합니다 ^
. 스크립트는 해당 언어를 원하는 언어로 변환합니다.
답변:
네,하지만 당신이 생각하는 방식에는 맞지 않을 것입니다.
Lisp 와 그 친척들은 소스에서 임의의 변환을 수행 할 수있는 강력한 매크로 시스템을 가지고 있기 때문에 원칙적으로 매크로 (및 문자 수준에서 리더 매크로)를 사용하여 원하는 확장을 만들 수 있습니다. 결합 언어 (및 관련 분야의 저자가 사용하는 언어)는 유사한 메타 프로그래밍 능력 을 가질 수 있습니다 . 이에 대한 좋은 예는 Forth 이며 많은 구문 구문 (예 : 주석)을 사용자 정의 할 수 있습니다. 현대적이지 않은 비현실적인 예를 들어, 사용자 정의 구문에 대해 Perl 5보다 향상된 Perl 6 지원 을 제공하려는 노력이 있습니다.
operator[]
를 들어 여러 인수에 대한 오버로드 또는 Haskell에서와 같이 새로운 연산자를 도입하는 것이 좋을 것입니다 . 그러나 나는위원회가 파싱 문제를 지나칠 것을 의심한다.
익숙하지 않지만 XL 은 특별히 고안된 언어입니다.
XL에는 프로그래머가 재구성 할 수있는 구문과 의미가 있습니다. 컴파일러 플러그인을 사용하여 언어에 새로운 기능을 추가 할 수 있습니다.
Lisp와 Forth는 XL보다 작지만 개념 프로그래밍을 지원합니다. Lisp는 매우 실용적이고 효과적이므로 제안합니다. 가장 중요한 것은 Lisp가 제공하는 표기법이 아닌 명확하고 유연한 구문입니다.
예를 들어, "Python 's indexed blocks", "[a, b, c]"는 배열을 초기화하고 "^"는 지수 등을 지정합니다.
매우 유연하지만 균일 한 구문을 가진 Haskell과 같은 언어에 관심이있을 수 있습니다.
내 지식이 아닙니다.
표준 언어 구문의 주요 이점 중 하나는 많은 사람들이 읽을 수 있다는 것입니다. 모든 사람이 자신의 구문을 발명하면 아무도 다른 사람의 코드를 이해할 수 없습니다. .... 그래서이 언어는 애호가에게는 재미 있지만 실용적으로는 많이 쓰지 않을 것입니다.
존재하는 가장 가까운 것은 아마도 Lisp 일 것입니다. 매크로 시스템은 매우 유연한 방식으로 새로운 언어 구성을 작성할 수 있습니다. 일반적으로 여전히 Lisp 구문을 사용하지만 실제로 원한다면 모든 것을 효과적으로 재정의 할 수 있습니다.
결과적으로 Lisp는 DSL 구현에 특히 인기가 있습니다. 좋은 예는 Clojure (Korma) 의이 데이터 액세스 DSL로 데이터베이스 액세스에 필요한 모든 상용구 코드를 처리합니다.
스칼라는 종종 이런 방식으로 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와 같은 일반 텍스트 이름입니다.
여전히 대부분 실험적이므로 사용하지 말아야하지만 최근 흥미로운 프로그래밍 패러다임 중 하나는 언어 지향 프로그래밍 (LOP)입니다.
언어 지향 프로그래밍의 개념은 사용자의 용어로 요구 사항을 포착 한 다음 사용자 설명에 가능한 한 동형 인 구현 언어를 만들어서 요구 사항과 구현 간의 매핑이 가능한 한 직접적이라는 접근 방식을 취합니다.
Sergey Dmitriev가 더 자세히 설명 합니다.
그것이 이념이지만, 실제로는 그것이 요구하는 행동을 뒷받침하는 것으로 요약됩니다. 당신은 할 수 있습니다 :
이 패러다임을 따르는 가장 활동적인 프로그래밍 환경 은 JetBrains 의 무료 MPS ( Meta Programming System )입니다.
실제로 상용 소프트웨어에서도 사용되기 시작하여 아마도 '실험적'단계에서 벗어나기 시작했을 것입니다.
도메인 별 언어는 Tcl 커뮤니티에서 일반적으로 사용됩니다. 예를 들어 C 및 SQL이 모두 포함 된 TDSL 프로그램 (Critcl 및 Sqlite 패키지를 통해)을 포함 된 DSL로 보는 것은 드문 일이 아닙니다. 임베디드 DSL에 대한 유일한 제한 사항은 임베디드 언어가 중괄호의 균형을 맞추면 훨씬 낫다는 것입니다. 실제로는 실제로 비 독점적 인 요구 사항으로 판명되었습니다!
DSL을 쉽게 만드는 또 다른 언어는 표준 ML이며,이를 사용하면 일반 시스템 토크 나이저에서 식별자를 키워드로 변환하기 전의 원시 토큰에 액세스 할 수 있습니다. 따라서 주석, 문자열 및 토큰 경계와 관련하여 SML의 기본 구문 규칙 중 일부 를 준수하는 경우 광범위한 DSL을 쉽게 수행 할 수 있으며 실제로 언어의 여러 주요 구동 응용 프로그램에 많이 사용됩니다. (정리 증명 자 등)
모든 언어가 그렇게 쉬운 것은 아닙니다. 특히 중괄호 용어의 내용을 자동으로 구문 분석하는 언어 (여러 개 중 다수)는이를 수행 할 수 없으므로 하위 언어를 문자열 안에 넣거나 연산자를 재정 의하여 DSL을 작성해야합니다. DSL을 호스트 언어 내에서 처리 할 수있는 것으로 재 작성하는 전 처리기 사용.
PPWizard라는 훌륭한 전처리 기가 있습니다. 일단 구문을 익힌 후에는 다른 언어를 대상으로하는 매크로 정의를 만들 수 있습니다. 그 문제에 대해 무모하거나 재미 있지는 않지만 유용한 도구입니다.
당신이 찾고있는 것은 컴파일러 컴파일러 일 것입니다. 컴파일러 컴파일러는 공식 언어로 작성된 언어 정의를 사용하여이 언어에 대한 컴파일러를 만듭니다.