메타 프로그래밍


10

방금 C ++ 개발자로 여행을 시작했으며 최근에는 메타 프로그래밍이라는 주제를 연구하고 있습니다. 지금까지이 주제에 대한 많은 정보를 살펴 보았으며 몇 가지 질문이 있습니다.

  1. C ++에서 리플렉션 사용 : 가능합니까? 내 이해에 따르면 리플렉션은 프로그램 상태를 조작 할 수있는 메타 프로그래밍 기술이며 그 조작은 내성 또는 내성 일 수 있습니다.

  2. 반사 아키텍처와 메타 레벨 아키텍처의 차이점은 무엇입니까? 메타 프로그래밍 아키텍처는 어떤 범주에 속합니까?

  3. 메타 프로그래밍은 메타 수준과 기본 수준의 두 가지 수준으로 제공됩니다. 내 이해에 따르면, 조사중인 객체 프로그램이나 시스템은 기본 수준이며 조사중인 시스템에서 작동 할 메타 프로그램은 메타 수준입니다. 제가 맞습니까?

또한 C ++에서 템플릿 메타 프로그래밍 작업에 대한 지침을 제공하여 도와주세요.
이 프로그래밍 기술을 실습하기 위해 찾을 수있는 실행 가능한 예제를 제안 해 주시겠습니까?


2
이 질문은 stackoverflow보다 프로그래머에 더 속할 수 있습니다. 전자는 더 이론적이며 후자는 더 실용적입니다. 일부 부품은 쉽게보기의 실용적인 관점에서 답변을 얻을 수 있습니다 반사가없는 C ++ , 그러나 다른 사람은 코드 (예를 들어 반사와 metalevel 아키텍처의 차이)과 관련이없는
dribeas - 데이비드 로드리게스를

이 SO 응답 주소는 왜 C ++은 반사가없는 stackoverflow.com/q/359237/120163 , 그리고 그것 심하게 시뮬레이션 일부 약한 C ++ 기술을.
Ira Baxter

메타 프로그래밍에 관심이 있다면이 시점에서 C ++보다 더 명확한 D 언어를 살펴 보는 것이 좋습니다.
deadalnix

답변:


10

메타 프로그래밍은 단순히 다른 코드를 작성하는 코드를 광범위하게 작성할 수 있다는 의미입니다. C ++은 기본적으로 형식 안전 매크로 언어 인 템플릿 메커니즘을 통해이를 수행합니다. 템플릿 확장 단계를 적용하는 것이 완벽하게 가능하며 결과는 템플릿이없는 유효한 C ++ 코드입니다.

리플렉션 은 프로그래밍 언어 및 / 또는 런타임 환경에서 런타임에 자체 언어 요소를 검사 (및 종종 수정)하는 기능입니다. 일반적으로 리플렉션 언어는 클래스, 메서드, 변수, 매개 변수 등과 같은 언어 요소와이를 검사, 수정 및 생성하는 루틴 또는 클래스를 나타내는 데이터 구조를 제공합니다. 수정 기능은 다른 코드를 생성하는 코드를 작성할 수 있으므로 리플렉션을 메타 프로그래밍 유형으로 만듭니다.

메타 프로그래밍의 다른 예로는 코드 생성기, 자체 수정 바이너리 (20 년 전처럼 더 이상 인기가 없지만), C 매크로; 카레와 비슷한 기능 프로그래밍 기술도 일종의 메타 프로그래밍이라고 주장 할 수 있습니다.


+1 나는 당신의 대답을 정말로 좋아하며 컴파일러를 C #과 같은 서비스로 사용하거나 Java와 같은 스크립팅 엔진을 사용하여 런타임으로 구성된 코드를 실행하는 것에 대해 묻고 싶습니다. 이것은 또한 메타 프로그래밍의 형태가 아닙니까?
M.Sameer

C로 파이썬 인터프리터를 만드는 사람은 메타 프로그래밍입니까? 객체 지향 언어를 SQL에 매핑하는 ORM 구현은 어떻습니까? 모든 웹 프레임 워크가 메타 프로그래밍의 예입니까?
kojiro 2016 년

1
  1. 아뇨. C ++ 프로그램은 머신 코드로 컴파일되고 클래스 등에 대한 모든 정보가 손실됩니다 (.NET 환경에서 C ++ / CLI를 사용하지 않는 한 순수 C ++은 아닙니다).

2-3. 모르겠다-도움이되는 다른 답변을 기다립니다 :-)

C ++ 템플릿을 사용한 메타 프로그래밍은 매우 강력하지만 복잡합니다. 템플릿 확장에는 C ++에서 사용하는 명령형 프로그래밍보다는 기능적 프로그래밍 스타일이 필요합니다. 함수형 프로그래밍에 대한 이전 경험이 없다면 우회하여 기본적인 리스프, 하스켈 또는 체계를 배우는 것이 좋습니다.

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