메타프로그래밍
Metaprogramming| 프로그래밍 패러다임 |
|---|
메타프로그래밍은 컴퓨터 프로그램이 다른 프로그램을 데이터로 취급할 수 있는 능력을 갖는 프로그래밍 기술입니다.즉, 프로그램이 다른 프로그램을 읽고, 생성하고, 분석하고, 변환하도록 설계될 수 있으며,[1][2] 실행 중 자체 수정도 가능합니다.이를 통해 프로그래머는 솔루션을 나타내는 코드 행 수를 최소화할 수 있어 개발 [3]시간을 단축할 수 있습니다.또한 프로그램이 재컴파일 없이 새로운 상황을 효율적으로 처리할 수 있는 유연성도 향상됩니다.
메타프로그래밍은 런타임에서 컴파일 타임으로 계산을 이동하고 컴파일 타임 계산을 사용하여 코드를 생성하며 자체 수정 코드를 활성화하기 위해 사용할 수 있습니다.프로그래밍 언어가 자신의 메타 언어가 되는 능력을 [4]반영이라고 합니다.리플리테이션은 메타프로그래밍을 용이하게 하기 위한 중요한 언어 기능입니다.
메타프로그래밍은 LISP와 같은 목록 처리 언어를 사용하여 1970년대와 1980년대에 유행했으며, LISP 하드웨어 머신은 1980년대에 유행하여 코드를 처리할 수 있는 애플리케이션을 가능하게 했다.그것들은 인공지능 응용 프로그램에 자주 사용되었다.
접근
메타프로그래밍을 통해 개발자는 일반적인 프로그래밍 패러다임에 해당하는 프로그램을 작성하고 코드를 개발할 수 있습니다.프로그래밍 언어 자체를 (Lisp, Prolog, SNOBOL 또는 Rebol과 같이) 퍼스트 클래스 데이터 유형으로 갖는 것도 매우 유용합니다.이것을 호모코니시티라고 합니다.범용 프로그래밍은 사용 시 파라미터로 제공될 수 있기 때문에 데이터 유형을 특정할 염려 없이 코드를 작성할 수 있도록 함으로써 언어 내의 메타프로그래밍 기능을 호출한다.
메타프로그래밍은 보통 세 가지 방법 [5]중 하나로 작동합니다.
- 첫 번째 접근법은 런타임엔진 내부를 의 경우와 같이 Application Programming Interface(API; 응용 프로그램프로그래밍 인터페이스)를 통해 프로그래밍 코드에 노출시키는 것입니다.NET IL 이미터
- 두 번째 접근법은 프로그래밍 명령을 포함하는 식을 동적으로 실행하는 것입니다. 이 명령어는 종종 문자열로 구성되지만 [6]Javascript와 같은 인수나 컨텍스트를 사용하는 다른 메서드에서 사용할 수도 있습니다.따라서 "프로그램은 프로그램을 작성할 수 있습니다."두 가지 접근방식을 같은 언어로 사용할 수 있지만, 대부분의 언어는 어느 한쪽 또는 다른 쪽으로 기울어지는 경향이 있습니다.
- 세 번째 접근법은 언어에서 완전히 벗어나는 것입니다.컴파일러와 같은 범용 프로그램 변환 시스템은 언어 기술을 받아들여 이들 언어에 대해 임의의 변환을 실행하며 일반적인 메타프로그래밍을 직접 구현합니다.이를 통해 메타프로그래밍을 대상 언어가 자체 메타프로그래밍 능력을 가지고 있는지 여부에 관계없이 사실상 모든 대상 언어에 적용할 수 있습니다.이는 Scheme와 함께 작동하며, Scheme 언어 자체의 일부였던 구성을 사용하여 [7]C에서 직면하는 몇 가지 제한에 어떻게 대처할 수 있는지 알 수 있습니다.
리스프는 아마도 메타프로그래밍 기능을 갖춘 전형적인 언어일 것입니다.왜냐하면 그 역사적 우선 순위와 메타프로그래밍의 단순함과 힘 때문입니다.Lisp 메타프로그래밍에서는 인용 해제 연산자(일반적으로 쉼표)가 실행 시간이 아닌 프로그램 정의 시간에 평가되는 코드를 소개합니다. 자체 평가 양식 및 인용을 참조하십시오.따라서 메타프로그래밍 언어는 호스트 프로그래밍 언어와 동일하며, 필요에 따라 기존 리스프 루틴을 메타프로그래밍에 직접 재사용할 수 있습니다.이 접근방식은 프로그램의 데이터로 직접 작동하는 통역사를 프로그램에 포함시킴으로써 다른 언어로 구현되었습니다.RemObjects의 Pascal Script for Object Pascal과 같은 일부 일반적인 고급 언어에 이러한 종류의 구현이 있습니다.
사용법
코드 생성
메타프로그램의 간단한 예는 생성 프로그래밍의 예인 이 POSIX 쉘 스크립트입니다.
#!/bin/sh # 메타프로그램 에코 '#!/bin/sh' > $(seq 992)의 i용 프로그램이 chmod +x 프로그램을 실행했다.이 스크립트(또는 프로그램)는 1 ~992 의 번호를 출력하는 새로운 993 행 프로그램을 생성합니다.이것은 코드를 사용하여 더 많은 코드를 작성하는 방법에 대한 설명일 뿐 숫자 목록을 인쇄하는 가장 효율적인 방법은 아닙니다.그럼에도 불구하고 프로그래머는 이 메타프로그램을 1분 이내에 작성하고 실행할 수 있으며, 그 시간 동안 1000줄 이상의 코드를 생성하게 됩니다.
quine은 자체 소스 코드를 출력으로 생성하는 특수한 메타프로그램입니다.쿼인은 일반적으로 오락적 또는 이론적인 관심사일 뿐이다.
모든 메타프로그래밍이 생성 프로그래밍을 포함하는 것은 아닙니다.실행 시 프로그램이 수정 가능하거나 증분 컴파일이 가능한 경우(C#, Forth, Frink, Groovy, JavaScript, Lisp, Elixir, Lua, Nim, Perl, PHP, Python, REBOL, Ruby, Rust, SAS, Smalltalk, Tclap 등), Metro 기술을 사용할 수 있습니다.
생성적 접근 방식 중 하나는 도메인 고유 언어(DSL)를 사용하는 것입니다.DSL을 사용하는 꽤 일반적인 예로는 생성 메타프로그래밍을 들 수 있습니다.렉스와 yacc는 어휘 분석기와 파서를 생성하는 데 사용되는 두 가지 도구입니다.사용자는 정규 표현과 문맥이 없는 문법을 사용하여 언어를 기술하고 언어를 효율적으로 해석하는 데 필요한 복잡한 알고리즘을 포함합니다.
코드 인스트루먼트
메타프로그래밍의 한 가지 용도는 프로그램을 계측하여 동적 프로그램 분석을 수행하는 것입니다.
동작의 변화
메타프로그래밍은 애스펙트 지향 프로그래밍에서처럼 프로그램에서 동작 변화를 짜넣기 위해 사용할 수 있습니다.예를 들어 메타프로그래밍을 사용하여 기능 플래그를 주입하거나 [8]버그를 수정하기 위한 패치를 탐색할 수 있습니다.
과제들
메타프로그래밍 [9]기능을 완벽하게 활용하기 위한 급격한 학습 곡선이 있다는 주장도 있다.메타프로그래밍은 실행 시 보다 유연성과 설정성을 제공하기 때문에 메타프로그래밍을 오용하거나 잘못 사용하면 보통 개발자에게 디버깅하기 매우 어려운 예기치 않은 오류가 발생할 수 있습니다.주의해서 사용하지 않을 경우 시스템에 위험을 초래하고 더 취약해질 수 있습니다.메타프로그래밍의 잘못된 사용으로 인해 발생할 수 있는 일반적인 문제 중 일부는 컴파일러가 누락된 구성 파라미터를 식별할 수 없거나 데이터가 잘못되거나 알 수 없는 예외 또는 다른 [10]결과가 발생할 수 있습니다.따라서 일부에서는[9] 언어나 플랫폼에서 메타프로그래밍을 실행하는 기능을 개발하는 작업은 고도의 기술을 가진 개발자만이 수행해야 하며, 일반 개발자는 이러한 기능을 사용하는 방법을 관습의 일부로 배워야 한다고 생각합니다.
프로그래밍 언어에서 사용
매크로 시스템
매크로 어셈블러
그 IBM/360과 파생 상품은 전체 어셈블리 언어 programs[표창 필요한]나 프로그램을 부분(예를 들어 다른 운영 체제를 위한)을 생성하는 데 사용됬다 강력한 매크로 어셈블러 설비 있었다.매크로 CICS트랜잭션 처리 시스템으로 제공되는pre-processing 단계로 코볼은 생성된assembler는 매크로 했다.
군사 지원 및 판매 교범과 같은 다른 기계어,, 또한 매크로를 지지한다.
Metaclasses
Metaclasses 다음 프로그래밍 언어에서:제공된다.
템플릿 메타프로그래밍
단계별 메타프로그래밍
종속 유형
종속 유형을 사용하면 생성된 코드가 [16]결코 유효하지 않음을 증명할 수 있습니다.그러나 이 접근방식은 최첨단이며 연구용 프로그래밍 언어 이외에서는 거의 찾아볼 수 없습니다.
실장
주목할 만한 메타프로그래밍 시스템 목록은 프로그램 변환 시스템 목록으로 유지됩니다.
「 」를 참조해 주세요.
레퍼런스
- ^ Harald Sondergaard. "Course on Program Analysis and Transformation". Retrieved 18 September 2014.
- ^ Czarnecki, Krzysztof; Eisenecker, Ulrich W. (2000). Generative Programming. ISBN 0-201-30977-7.
- ^ Walker, Max. "The Art of Metaprogrmming in Java". New Circle. Retrieved 28 January 2014.
- ^ Krauss, Aaron. "Programming Concepts: Type Introspection and Reflection". The Societa. Retrieved 14 September 2014.
- ^ Joshi, Prateek (5 April 2014). "What Is Metaprogramming? – Part 2/2". Perpetual Enigma. Retrieved 14 August 2014.
- ^ 예를 들어, Ruby의 instance_eval은 문자열 또는 익명 함수를 사용합니다."Rdoc for Class: BasicObject (Ruby 1.9.3) - instance_eval". Retrieved 30 December 2011.
- ^ "Art of Metaprogramming".
- ^ Durieux, Thomas; Cornu, Benoit; Seinturier, Lionel; Monperrus, Martin (2017). "Dynamic patch generation for null pointer exceptions using metaprogramming" (PDF). 2017 IEEE 24th International Conference on Software Analysis, Evolution and Reengineering (SANER). IEEE: 349–358. arXiv:1812.00409. doi:10.1109/SANER.2017.7884635. ISBN 978-1-5090-5501-2. S2CID 2736203.
- ^ a b Bicking, Ian. "The challenge of metaprogramming". IanBicking.org. Retrieved 21 September 2016.
- ^ Terry, Matt (21 August 2013). "Beware of Metaprogramming". Medium.com. Medium Corporation. Retrieved 21 August 2014.
- ^ 공통 리스프 객체 시스템의 "메타 객체 프로토콜"을 통해
- ^ "C++ Template Metaprogramming". aszt.inf.elte.hu. Retrieved 2022-07-23.
- ^ Lisp(프로그래밍 언어) "자체 평가 양식 및 인용", 준 인용 연산자.
- ^ "LMS: Program Generation and Embedded Compilers in Scala". scala-lms.github.io. Retrieved 2017-12-06.
- ^ Rompf, Tiark; Odersky, Martin (June 2012). "Lightweight Modular Staging: A Pragmatic Approach to Runtime Code Generation and Compiled DSLs". Commun. ACM. 55 (6): 121–130. doi:10.1145/2184319.2184345. ISSN 0001-0782. S2CID 52898203.
- ^ Chlipala, Adam (June 2010). "Ur: statically-typed metaprogramming with type-level record computation" (PDF). ACM SIGPLAN Notices. PLDI '10. 45 (6): 122–133. doi:10.1145/1809028.1806612. Retrieved 29 August 2012.
외부 링크
- c2.com Wiki: 메타프로그래밍 기사
- 프로그램 변환 Wiki의 메타 프로그래밍
- 코드 생성과 메타프로그래밍 비교
- "솔레노이드":eXist-db용 최초의 메타프로그래밍 프레임워크