Lập trình meta

**Lập trình meta** hay còn gọi là **siêu lập trình** là việc tiến hành một trong hai thao tác (hay cả hai) sau:
* Công việc viết một chương trình máy tính mà chương trình này lại điều chỉnh hay soạn thảo một chương trình khác (hay điều chỉnh chính nó) như là dữ liệu của lập trình meta
* Công việc viết một chương trình máy tính mà một phần của công việc này chỉ hoàn tất trong thời gian dịch mã.

Trong đa số các trường hợp thì, vận dụng lập trình meta có thể giúp lập trình viên hoàn tất nhiều việc hơn trong cùng một thời gian so với họ làm điều đó bằng tay.

Trong một ý nghĩa riêng biệt, thì đây bao gồm phương pháp tạo ra mã của một ngôn ngữ lập trình một cách tự động thông qua một ngôn ngữ lập trình nào đó.

Một thí dụ đơn giản để minh họa là văn lệnh BASH sau, được dùng trong lập trình tạo mã (*generative programming*):

 #!/bin/bash
 # metaprogram
 echo '' >metaprogram.htm
 echo '' >>metaprogram.htm
 echo '' >>metaprogram.htm
 echo '' >>metaprogram.htm
 echo 'My Automatic WEB Page' >>metaprogram.htm
 echo ' ' >>metaprogram.htm
 echo ' ' >>metaprogram.htm
 echo 'Mã của trang WEB này được tự động tạo ra từ ngôn ngữ BASH' >>metaprogram.htm 
 echo ' ' >>metaprogram.htm
 echo ' ' >>metaprogram.htm

Chương trình trên đã dùng ngôn ngữ BASH để viết ra một chương trình khác (dùng ngôn ngữ HTML). Chương trình này được viết trong một tập tin tên là `metaprogram.htm`. Khi thực thi thì tập tin `metaprogram.htm` sẽ được tạo ra có nội dung là:
 
 
 
 
 
 
 Mã của trang WEB này được tự động tạo ra từ ngôn ngữ BASH
 
 

Chương trình `metaprogram.htm` chỉ đơn giản là một trang mã HTML. Khi thực thi bởi máy truy cập, nó hiển thị dòng chữ `Mã của trang WEB này được tự động tạo ra từ ngôn ngữ BASH`. Với phương pháp này, người ta có thể tạo ra hàng loạt trang mã có một số đặc tính chung (về hình thức trình bày hay về một số nội dung chẳng hạn).

Không phải mọi cách lập trình meta đều bao gồm lập trình tạo mã. Nếu các chương trình được điều chỉnh trong thời gian thực thi (như là Lisp, Smalltalk, Ruby, và v.v...) thì các kỹ thuật này có thể được dùng để tiến hành lập trình meta mà không cần tạo ra mã nguồn.

## Ứng dụng
*Hầu như công cụ dùng cho lập trình meta đều là các trình dịch hay các chương trình thông dịch, chúng cho phép người lập trình viết các chương trình tương đối ngắn bằng một ngôn ngữ bậc cao và dùng nó để tạo ra một hay nhiều chương trình có ngôn ngữ tương đương với ngôn ngữ assembly hay ngôn ngữ máy. Việc này thường tiết kiệm khá nhiều thì giờ thay vì phải viết các ngôn ngữ máy này bằng tay.
* Sử dụng trong lex (xem thêm flex), yacc, và bison), để tạo ra các chương trình biên dịch và chương trình thông dịch.
* Dùng trong quine, đây là một loại lập trình meta mà mã nguồn của nó được dùng như là đầu ra.
* Lập trình định hướng ngôn ngữ là một kiểu lập trình mà tập trung chủ yếu của nó là lập trình meta.

## Xem thêm
*:en:Template metaprogramming
*OpenC++
*Recoder
*:en:Code generation
*GCC RDF Introspector
*:en:XL Programming Language
*:en:Self-modifying code
*:en:Partial evaluation
*:en:Ruby on Rails
## Tham khảo

## Liên kết ngoài
*c2.com Wiki: Metaprogramming article
*Metaprogramming and Free Availability of Sources by François-René Rideau
*MetaL - Metaprogramming language with source code in XML that is used to generate code in several target languages: Java, Perl, PHP, etc.
*DSLEngine - Scheme macro metaprogramming example
*MetaML  - A version of ML with homogeneous (same-language) metaprogramming
*RECODER - Framework for source code metaprogramming in Java
*Metaprogramming Weblog - At Lambda the Ultimate
*Moka, a Java-to-Java extensible compiler
*why’s (poignant) guide to ruby - Metaprogramming in Ruby
*Siêu Lập Trình với AST trong Erlang