문제

C++는 아마도 가장 널리 사용되는 언어일 것입니다. 정적 메타프로그래밍 그리고 자바는 지원하지 않습니다.

생성 프로그래밍(프로그램을 생성하는 프로그램)을 지원하는 C++ 외에 다른 언어가 있습니까?

도움이 되었습니까?

해결책

템플릿 스타일 메타 프로그래밍의 대안은 다양한 Lisp 구현에서 볼 수 있는 매크로 스타일입니다.다운로드를 제안하겠습니다 폴 그레이엄의 리스프에 대하여 그리고 또한 살펴보는 중 클로저 JVM에서 실행되는 매크로가 포함된 Lisp에 관심이 있다면.

Lisp의 매크로는 C/C++ 스타일보다 훨씬 강력하며 그 자체로 언어를 구성합니다. 이는 메타 프로그래밍을 위한 것입니다.

다른 팁

목록을 하나 나열해 보겠습니다 몇 가지 중요한 세부 사항 어떻게하는지 메타프로그래밍 공장 리스프에서 (또는 계획, 또는 슬레이트, 또는 선호하는 "동적" 언어를 선택하세요):

  • lisp에서 메타프로그래밍을 할 때 두 가지 언어를 다룰 필요가 없습니다.메타 레벨 코드는 생성된 객체 레벨 코드와 동일한 언어로 작성됩니다.메타프로그래밍은 두 가지 수준으로 제한되지 않으며 두뇌에도 더 쉽습니다.
  • lisp에서는 런타임 시 사용 가능한 컴파일러.실제로 컴파일 타임/런타임 구분은 매우 인위적인 것으로 느껴지며 관점에 따라 크게 달라질 수 있습니다.단순한 함수 호출만으로 lisp에서는 함수를 기계 명령어로 컴파일할 수 있으며, 이후부터 일류 객체로 사용할 수 있습니다.즉.지역 변수나 전역 해시 테이블 등에 보관할 수 있는 이름 없는 함수일 수 있습니다.
  • 매크로 Lisp에서는 매우 간단합니다.해시테이블에 채워져 컴파일러에 제공되는 함수 묶음입니다.컴파일러는 컴파일하려는 각 양식에 대해 해당 해시테이블을 참조합니다.함수를 찾으면 컴파일 타임에 원래 형식으로 함수를 호출하고 원래 형식 대신 이 함수가 반환하는 형식을 컴파일합니다.(중요하지 않은 일부 세부 사항을 모듈로) 따라서 lisp 매크로 기본적으로 컴파일러용 플러그인입니다..
  • lisp 코드를 평가하는 lisp 함수를 lisp에 작성하는 것은 약 두 페이지의 코드입니다. 평가).이러한 기능에서는 메타 수준에서 원하는 새로운 규칙을 도입할 수 있는 모든 권한을 갖습니다.(빠르게 실행하려면 약간의 노력이 필요하지만...새로운 언어를 부트스트래핑하는 것과 거의 같습니다...:)

무엇의 임의의 예 사용자 라이브러리로 구현할 수 있습니다 Lisp 메타프로그래밍 사용(이것은 일반적인 Lisp 라이브러리의 실제 예입니다):

  • 언어를 확장하다 구분된 연속 (hu.dwim.delico)
  • 구현하다 js-lisp-rpc javascript에서 사용할 수 있는 매크로(lisp에서 생성됨).이는 참조된 모든 지역 변수를 (http 요청에서) 자동으로 게시하고, 서버 측에서 디코딩하고, 서버에서 lisp 코드 본문을 실행하고, 반환 값을 자바스크립트로 반환하는 js/lisp 코드의 혼합으로 확장됩니다. 옆.
  • "일반" Lisp 코드와 매우 원활하게 통합되는 언어에 역추적과 같은 프롤로그를 추가합니다(비명 참조).
  • XML 템플릿 확장 일반 리스프(다음 예제 포함) 리더 매크로 이는 lisp 파서용 플러그인입니다)
  • 수많은 작은 DSL, 고리 또는 반복하다 쉬운 루핑을 위해

템플릿 메타프로그래밍은 본질적으로 템플릿 메커니즘을 남용하는 것입니다.내 말은 계획되지 않은 부작용인 기능에서 기본적으로 기대할 수 있는 것을 얻는다는 것입니다. 그것은 엉망이고 (도구가 점점 좋아지고 있지만) 언어가 그렇지 않기 때문에 정말 골치 아픈 일입니다. 당신이 그것을 할 수 있도록 지원하십시오. (나는 본질적으로 접근 방식을 포기했기 때문에 이것에 대한 최첨단 기술에 대한 나의 경험은 시대에 뒤떨어졌다는 점에 주목해야 합니다.하지만 큰 진전이 있었다는 소식은 들어본 적이 없습니다.)

98년경에 이 문제를 다루면서 더 나은 솔루션을 찾게 되었습니다.나는 그것에 의존하는 유용한 시스템을 작성할 수 있었지만 그것은 지옥 같았습니다.이리저리 뒤지다가 결국 나를 Common Lisp로 이끌었습니다.물론, 템플릿 메커니즘은 튜링 완전이지만, 인터칼도 마찬가지입니다.

Common Lisp는 '올바른' 메타프로그래밍을 수행합니다.특별한 구문 없이 언어를 사용하는 동안 언어의 모든 기능을 사용할 수 있으며 언어가 매우 동적이기 때문에 더 많은 작업을 수행할 수 있습니다.

물론 다른 옵션도 있습니다.내가 사용한 다른 어떤 언어도 Lisp보다 메타프로그래밍을 더 잘 수행하지 못합니다. 이것이 제가 연구 코드에 Lisp를 사용하는 이유입니다.다른 것을 시도하고 싶은 이유는 많지만 모두 절충점이 될 것입니다.Haskell/ML/OCaml 등을 볼 수 있습니다.많은 기능적 언어에는 Lisp 매크로의 성능에 근접한 기능이 있습니다.일부 .NET 대상 항목을 찾을 수 있지만 사용자 기반 등의 측면에서 모두 매우 미미합니다.실제로 산업적으로 사용되는 언어의 큰 플레이어 중 누구도 이와 같은 것을 가지고 있지 않습니다.

네멀레 그리고 우우 그런 것들을 개인적으로 가장 좋아합니다.Nemerle은 문서가 열악함에도 불구하고 매우 우아한 매크로 구문을 가지고 있습니다.Boo의 문서는 훌륭하지만 매크로는 약간 덜 우아합니다.그러나 둘 다 매우 잘 작동합니다.

둘 다 .NET을 대상으로 하므로 C# 및 기타 .NET 언어(IKVM을 사용하는 경우 Java 바이너리 포함)와 쉽게 상호 운용할 수 있습니다.

편집하다:명확히 하자면, C의 전처리기 매크로가 아니라 Lisp 의미의 매크로를 의미합니다.이를 통해 컴파일 타임에 새로운 구문과 무거운 메타프로그래밍을 정의할 수 있습니다.예를 들어, Nemerle은 컴파일 타임에 SQL 서버에 대해 SQL 쿼리를 검증하는 매크로를 제공합니다.

Nim은 정적 메타 프로그래밍을 광범위하게 지원하고 효율적인(C++와 같은) 컴파일 코드를 생성하는 비교적 새로운 프로그래밍 언어입니다.

http://nim-lang.org/

컴파일 타임 함수 평가, 매크로를 통한 lisp와 유사한 AST 코드 변환, 컴파일 타임 반영, 임의 값으로 매개변수화할 수 있는 일반 유형, 사용자 정의 고급 유형 인식을 생성하는 데 사용할 수 있는 용어 재작성을 지원합니다. 엿보는 구멍 최적화.코드 생성에 영향을 줄 수 있는 컴파일 프로세스 중에 외부 프로그램을 실행하는 것도 가능합니다.예를 들어, 코드의 ORM 정의(일부 DSL을 통해 제공됨)가 데이터베이스의 스키마와 일치하는지 확인하기 위해 로컬로 실행되는 데이터베이스 서버와 통신하는 것을 고려해 보십시오.

그만큼 "D" 프로그래밍 언어 C++와 비슷하지만 훨씬 더 나은 메타프로그래밍 지원을 제공합니다.다음은 컴파일 타임 메타프로그래밍만을 사용하여 작성된 광선 추적기의 예입니다.

Ctrace

또한 C++에서 지원하지 않는(적어도 아직은) 메타 프로그래밍 구성을 지원하는 "Concept GCC"라는 gcc 분기가 있습니다.

컨셉 GCC

Common Lisp는 여러 가지 방법으로 프로그램을 작성하는 프로그램을 지원합니다.

1) 프로그램 데이터와 프로그램 "추상 구문 트리"가 동일합니다(S-표현식!)

2) defmacro

3) 리더 매크로.

4) 걸레

이 중에서 진짜 마음을 사로잡는 것은 MOP입니다."MetaObject 프로토콜의 기술"을 읽으십시오. 그것은 당신을 위해 물건을 바꿀 것입니다, 나는 약속합니다!

나는 추천한다 하스켈.여기에는 종이 컴파일 타임 메타프로그래밍 기능을 설명합니다.

Haskell에는 많은 작업이 있습니다:도메인 특정 언어(DSL), 실행 가능 사양, 프로그램 변환, 부분 애플리케이션, 단계적 계산.시작하는 데 도움이 되는 몇 가지 링크:

ML 언어 계열은 이러한 목적을 위해 특별히 설계되었습니다.OCaml의 가장 유명한 성공 사례 중 하나는 FFTW 거의 전적으로 OCaml 프로그램에 의해 생성된 C 코드인 고성능 FFT용 라이브러리입니다.

건배, Jon Harrop.

대부분의 사람들은 자기 검색을위한 "궁극적 인 반사"가 있고 새 코드를 반복하기위한 "평가"와 같은 언어를 찾으려고 노력합니다.그러한 언어는 찾기가 어렵고 (LISP는 주요 반례입니다) 주류는 아닙니다.

그러나 또 다른 방법은 프로그램 코드를 검사, 생성 및 조작 할 수있는 일련의 도구를 사용하는 것입니다.잭팟은 자바에 중점을 둔 도구입니다. http://jackpot.netbeans.org/

당사의 DMS 소프트웨어 리엔지니어링 툴킷은 C, C ++, C#, Java, Cobol, PHP, JavaScript, ADA, Verilog, VHDL 및 기타 다양한 언어에서 작동하는 도구입니다.(생산 품질 프론트 엔드를 사용 하여이 모든 langauges를 읽을 수 있습니다).더 좋은 점은 동시에 여러 언어로 이 작업을 수행할 수 있다는 것입니다.보다 http://www.semdesigns.com/Products/DMS/DMSToolkit.html

DMS는 AST로서 프로그램 구조에 대한 완전한 액세스를 위한 일반적인 방법과 지원 인프라를 제공하고 대부분의 경우 정교한 프로그램 조작을 수행하는 데 필요한 기호 테이블, 유형 정보, 제어 및 데이터 흐름 분석과 같은 추가 데이터를 제공하기 때문에 성공합니다.

'메타 프로그래밍'은 적어도 하나 이상의 언어에 대해 논의할 때 이 특정 기능에 대한 나쁜 이름입니다. 왜냐하면 이 기능은 다음과 같은 좁은 언어에만 필요하기 때문입니다.

  • 공전
  • 기계어로 컴파일
  • 컴파일 타임 성능에 크게 최적화됨
  • 사용자 정의 데이터 유형으로 확장 가능(C++의 경우 OOP)
  • 엄청난 인기

이들 중 하나를 선택하면 '정적 메타프로그래밍'은 의미가 없습니다.따라서 원격으로 주류 언어에 C++에서 이해되는 것과 같은 것이 있다면 놀랄 것입니다.

물론 동적 언어와 여러 기능적 언어는 메타프로그래밍이라고도 할 수 있는 완전히 다른 개념을 지원합니다.

Lisp는 C++ 템플릿 메타프로그래밍과 동일한 의미는 아니지만 "메타프로그래밍" 형식을 지원합니다.또한 "정적"이라는 용어는 이 맥락에서 다른 의미를 가질 수 있지만 Lisp는 정적 타이핑도 지원합니다.

물론 메타언어(ML)는 다음과 같습니다. http://cs.anu.edu.au/student/comp8033/ml.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top