Câu hỏi hay. Tôi rất tiếc khi thấy rằng không có câu trả lời nào thực sự trả lời câu hỏi của bạn một cách chính xác. Có lẽ tôi có thể giúp ...
Định nghĩa về lập trình meta thực sự khá đơn giản: nó có nghĩa là các chương trình điều khiển chương trình.
Câu trả lời được chấp nhận của bạn cho biết các chương trình tự thao túng. Đó thực sự là metaprogram nhưng chúng là một tập con của tất cả các metaprogram.
All:
- parsers
ngôn ngữ cụ thể
- miền (DSL)
- miền Embedded ngôn ngữ cụ thể (EDSLs)
- Trình biên dịch
- phiên dịch
- rewriters Term
- provers lý
là metaprograms. Vì vậy, GCC compiler là một metaprogram, các CPython interpreter là một metaprogram, các Mathematica computer algebra system là một metaprogram, các Coq theorem prover là một metaprogram và như vậy.
Câu trả lời khác đã khẳng định rằng metaprogram là chương trình tạo ra các chương trình khác. Đó thực sự là metaprograms nhưng, một lần nữa, chúng là một tập con của tất cả các metaprogram. Thư viện Fastest Fourier Transform in the West (FFTW) là một ví dụ về một metaprogram như vậy. Mã nguồn được viết chủ yếu trong OCaml và nó tạo ra các bit của mã C (được gọi là codelets) được kết hợp để tạo ra các thói quen hiệu suất cao Fast Fourier Transform được tối ưu hóa cho các máy cụ thể. Thư viện đó thực sự được sử dụng để cung cấp các thói quen FFT trong Matlab. Mọi người đã viết các chương trình để tạo ra các phương pháp số trong nhiều thập kỷ, kể từ những ngày đầu của FORTRAN.
Ngôn ngữ lập trình đầu tiên hỗ trợ tích hợp cho lập trình meta là LISt Processor (LISP) vào cuối những năm 1950. LISP 1.5 bao gồm một số tính năng làm cho lập trình meta dễ dàng hơn. Thứ nhất, loại dữ liệu cốt lõi của LISP là các danh sách lồng nhau, tức là các cây như (a (b c) d)
, có nghĩa là bất kỳ mã LISP nào cũng có thể được thể hiện như một cấu trúc dữ liệu. Điều này được gọi là homoiconicity. Thứ hai, mã LISP có thể được chuyển đổi thành dữ liệu dễ dàng bằng QUOTE. Ví dụ: (+ 1 2 3)
thêm 1 + 2 + 3 và (QUOTE (+ 1 2 3))
tạo biểu thức thêm 1 + 2 + 3 khi được đánh giá. Thứ ba, LISP cung cấp một bộ đánh giá siêu vòng tròn cho phép bạn sử dụng trình thông dịch hoặc trình biên dịch máy chủ để đánh giá mã LISP tại thời gian chạy, bao gồm cả mã LISP chạy theo thời gian chạy. Con cháu của LISP bao gồm Scheme và Clojure. Trong tất cả các ngôn ngữ lập trình meta này thường thấy nhất ở dạng chương trình tự sửa đổi, thường sử dụng macro.
Trong những năm 1970, Robin Milner đã phát triển một MetaLanguage (ML) mà phát triển thành các gia đình ML của ngôn ngữ lập trình bao gồm Standard ML và OCaml và mạnh mẽ ảnh hưởng Haskell và F#. Các ngôn ngữ này giúp dễ dàng diễn tả các ngôn ngữ khác. Trong những ngôn ngữ này, metaprogram thường được thấy dưới dạng lexers, parsers, interpreters và compilers.
Năm 1994, Erwin Unruh discovered that the C++ template system was Turing complete and could be used to execute arbitrary programs at compile time. Lập trình meta mẫu C++ mang metaprogramming tới khối lượng chưa rửa (ab) đã sử dụng nó cho nhiều thứ khác nhau, bao gồm tạo ra các phương thức số trong Blitz++ library.
Bạn có thể quan tâm đến câu trả lời này http://stackoverflow.com/questions/2565572/metaprogramming-self-explanatory-code-tutorials-articles-books/2566561#2566561 – ewernli
@ewernli: Câu trả lời đó thực sự tốt hơn bất kỳ câu trả lời nào các câu trả lời ở đây! –