Câu hỏi tuyệt vời. Tôi rất tiếc khi thấy rằng không có câu trả lời nào hiện thực sự trả lời đúng câu hỏi của bạn. Có lẽ tôi có thể giúp ...
Định nghĩa của siêu chương trình thực sự khá đơn giản: nó có nghĩa là chương trình thao tác với 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à những siêu chương trình nhưng chúng là một tập hợp con của tất cả các siêu chương trình.
Tất cả:
- Trình phân tích cú pháp
- Ngôn ngữ cụ thể của miền (DSL)
- Các ngôn ngữ cụ thể của miền được nhúng (EDSL)
- Trình biên dịch
- Thông dịch viên
- Người viết lại thuật ngữ
- Trình duyệt định lý
là các chương trình siêu hình. Vì vậy, trình biên dịch GCC là một siêu chương trình, trình thông dịch CPython là một siêu chương trình, hệ thống đại số máy tính Mathematica là một siêu chương trình, câu tục ngữ định lý Coq là một siêu chương trình, v.v.
Các câu trả lời khác đã khẳng định rằng siêu chương trình là chương trình tạo ra các chương trình khác. Đó thực sự là những siêu chương trình nhưng, một lần nữa, chúng là một tập hợp con của tất cả các siêu chương trình. Các nhanh nhất Fourier Transform ở phương Tây (FFTW) thư viện là một ví dụ về metaprogram như vậy. Mã nguồn được viết chủ yếu bằng OCaml và nó tạo ra các bit của mã C (được gọi là codones) được kết hợp để tạo ra các quy trình Fast Fourier Transform hiệu suất cao đượ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 quy trình 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 siêu mẫu là ngôn ngữ Bộ xử lý LISt (LISP) vào cuối những năm 1950. LISP 1.5 bao gồm một số tính năng giúp cho việc lập trình siêu ứng dụng trở nên dễ dàng hơn. Thứ nhất, kiểu dữ liệu cốt lõi của LISP là các danh sách lồng nhau, tức là dạng cây (a (b c) d)
, có nghĩa là bất kỳ mã LISP nào cũng có thể được thể hiện nguyên bản dưới dạng cấu trúc dữ liệu. Điều này được gọi là sự đồng nhất. Thứ hai, mã LISP có thể được chuyển đổi thành dữ liệu một cách 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 trình đá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 điểm chạy, bao gồm mã LISP được tạo trong 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ữ này, lập trình siêu chương thường thấy nhất ở dạng các chương trình tự sửa đổi, thường sử dụng macro.
Vào những năm 1970, Robin Milner đã phát triển một MetaLanguage (ML) phát triển thành họ ngôn ngữ lập trình ML bao gồm Standard ML và OCaml và ảnh hưởng mạnh mẽ đến Haskell và F # . Những ngôn ngữ này giúp bạn dễ dàng diễn đạt các ngôn ngữ khác. Trong các ngôn ngữ này, các siêu chương trình thường được nhìn thấy nhiều nhất ở dạng lexers, parser, thông dịch và biên dịch.
Năm 1994, Erwin Unruh phát hiện ra rằng hệ thống khuôn mẫu C ++ đã hoàn chỉnh và có thể được sử dụng để thực thi các chương trình tùy ý tại thời điểm biên dịch . Lập trình siêu chương trình theo mẫu C ++ đã mang siêu chương trình đến với những người chưa được rửa sạch, những người (ab) đã sử dụng nó cho nhiều việc khác nhau bao gồm việc tạo ra các phương thức số trong thư viện Blitz ++ .