元编程:编写在运行时操纵语言构件的代码。
--《Ruby元编程》
应该是借鉴了lisp里的宏(macro)。其他语言里还有类似的用法吗?
大家讲道理2017-04-22 09:01:06
이렇게 말하면
산업시대 초기의 상황은 이랬다.
사람은 기계를 생산하고, 기계는 제품을 생산합니다.
나중 단계:
사람은 기계를 만들고, 기계는 기계를 만들고, 기계는 제품을 생산합니다.
분명히 기계 생산은 노동력을 크게 해방시키는 큰 발전입니다.
메타프로그래밍은 기계가 기계를 생산하는 것과 유사합니다. 간단히 말해서 프로그램은 스스로를 바꾸거나 새로운 프로그램을 생성할 수 있습니다. 물론 이것은 프로그래머를 크게 해방시킵니다.
물론, 사실 메타프로그래밍 이전에 프로그래머들은 프로그래밍을 돕기 위해 IDE 등과 같은 수많은 보조 도구를 발명했습니다. 하지만 나중에 프로그래머들은 IDE가 여전히 너무 약해서 검색 및 바꾸기, 참조로 점프, 템플릿 적용 등을 할 수 있다고 느꼈습니다. 프로그램이 스스로 제작할 수 있다면 좋을 것입니다.
====================과학의 대중화가 완성됐는데 무책임한 생각이 몇 가지 있습니다================ === ====
사실 메타 프로그래밍은 잘 정의된 개념이 아니었습니다. 주로 메타라는 단어 자체의 의미가 매우 모호하기 때문입니다.
위안은 일반적으로 더 기본적이고 근본적인 것으로 이해됩니다. 메타 프로그래밍은 프로그램보다 더 기본적인 프로그래밍입니다. 즉, 프로그램이 프로그램을 생성합니다. 이러한 관점에서 보면 C++ 템플릿, C 매크로, .NET의 Emit 및 Compiler Provider, JavaScript의 문자열 접합 및 평가, Dongwang 코드 생성기 등 모두 프로그램 생성 프로그램입니다.
그러나 일반적으로 메타프로그래밍이라고 부르려면 일정한 조건이 충족되어야 합니다. 물론 메타프로그래밍의 개념이 잘 정의되어 있지 않기 때문에 이러한 조건은 합의라고만 볼 수 있습니다. A라는 사람은 이 언어의 특징을 메타프로그래밍이라고 생각하지만 B라는 사람은 그렇게 생각하지 않는 것이 정상입니다. 아래 나열된 조건은 단지 제 관점에서 본 것입니다.
1. 메타 프로그래밍 기능이 있는 언어는 한 언어를 사용하여 다른 언어로 프로그램을 생성하는 것이 아니라 동일한 프로그래밍 언어로 코드를 생성할 수 있는 언어여야 합니다. 이렇게 하면 코드 생성기가 방정식에서 제외됩니다.
2. 메타프로그래밍 기능이 있는 언어의 경우 메타프로그래밍으로 생성된 프로그램 코드는 어휘 분석을 통과할 수 있어야 합니다. 이 문서에서는 C 매크로와 JavaScript eval을 제외합니다.
…
메타 프로그래밍으로 간주되며, 다양한 제약 조건을 사용하면 다른 결과를 얻을 수 있다고 볼 수 있습니다. 프로그래밍 언어를 메타프로그래밍할 수 있는지 여부를 논의할 때 기본적으로 조건 1에 대해서는 합의에 도달할 수 있지만 조건 2에 대해서는 모든 사람이 각자의 의견을 가지고 있습니다.
메타프로그래밍이 처음 만들어졌을 때는 단순히 프로그래머의 부담을 줄이기 위해 만들어졌다고 합니다. C++ 템플릿은 처음에는 오버로딩의 확장에 불과했습니다. 강력한 타이핑으로 인해 C 언어는 다양한 유형에 대해 많은 반복 코드를 작성해야 합니다. 오버로딩은 이러한 반복 코드의 이름 오염을 해결하고 제네릭은 이러한 코드의 중복을 해결하기 시작합니다. 그러나 C++ 표준화 위원회의 사람들은 분명히 Anders와 같은 제네릭에 머물지 않을 것입니다. 고급스러운 분위기와 품격은 항상 C++의 끊임없는 추구였기 때문에 프로그래머들도 함께 모였습니다. , 나는 C++ 템플릿 메타 프로그래밍을 생각해 냈습니다.
PHP中文网2017-04-22 09:01:06
자바스크립트가 있습니다!
http://www.slideshare.net/danwrong/metaprogramming-javascript
이 프리젠테이션의 출판 날짜에 주목하세요. 이것은 새로운 것이 아닙니다. 수년에 걸쳐 언어가 지속적으로 개선되고 확장됨에 따라 더 많은 메타프로그래밍 기술이 널리 사용되었습니다.
또한 메타 프로그래밍을 지원하는 언어는 매우 일반적이며 거의 모든 함수형 프로그래밍 언어를 사용할 수 있고 Java에는 Annotation이 있으며 Clojure는 말할 것도 없습니다. Lisp는 매크로를 기반으로 하며 Ruby와 Smalltalk는 주로 반사 메커니즘을 사용합니다. 바이트 인코딩과 AST 변환 등을 기반으로 하는 Groovy와 같은 것도 있습니다.
메타프로그래밍은 고급 기술이지만 마법도 아니고 아주 드문 기능도 아닙니다.