| پارادایم‌های برنامه‌نویسی |
| --- |
| * زبان عملی
* عامل گرا
* آرایه‌گرا
* مبتنی بر اتوماتا
* رایانش همزمان
	+ نسبیت گرایی
* داده‌محور
* اعلانی (تضاد: دستوری)
	+ تابعی
		- منطق تابعی
		- تابعی خالص
	+ منطقی
		- منطقی قیاسی
		- مجموعه جواب
		- منطق همزمان
		- منطق تابعی
		- منطق استقرایی
	+ محدودیتی
		- منطق محدودیتی
			* منطق محدودیت همزمان
	+ جریان داده
		- مبتنی بر جریان
		- واکنشی
	+ هستی‌شناسی
* تشخیص پذیر
* پویا/اجرانامه‌نویسی
* رویدادمحور
* سطح تابع (تضاد: سطح مقدار)
	+ سبک بدون آرگومان
		- الحاقی
* همگانی
* دستوری (تضاد: اعلانی)
	+ رویه‌ای
	+ شیءگرا (OOP)
		- کد چندریخت
* تصمیم گرا
* زبان گرا
	+ خاص دامنه
* ادیبانه
* برنامه‌نویسی زبان طبیعی
* فرا برنامه‌نویسی
	+ خودکار
		- استقرایی
	+ پژواکی
		- صفت گرا
	+ مبتنی بر کلان‌دستور (ماکرو)
	+ خودآرا
* غیر ساخت‌یافته (تضاد: ساخت‌یافته)
	+ آرایه‌ای (برداری)
* غیرقطعی
* رایانش موازی
	+ فرایند گرا
* احتمالی
* کوانتمی
* نظریه مجموعه‌ها
* مبتنی بر پشته
* ساخت‌یافته (تضاد: غیر ساخت‌یافته)
	+ بلوک ساختاری
		- ساخت‌یافته همزمان
	+ شیءگرا (OOP)
		- مبتنی بر بازیگر
		- مبتنی بر کلاس
		- همزمان
		- بر پایه پیش‌نمونه
		- با تفکیک دغدغه‌ها:
			* جنبه‌گرا
			* نقش گرا
			* موضوع گرا
	+ بازگشتی
* نمادین
* سطح مقدار (تضاد: سطح تابع)
 |
| * ن
* ب
* و
 |

**فرا برنامه‌نویسی** (به انگلیسی: Metaprogramming)، یک تکنیک برنامه‌نویسی است که در آن برنامه‌های رایانه ای می‌توانند سایر برنامه‌ها را به عنوان داده خود بپذیرند. این بدان معناست که یک برنامه می‌تواند برای خواندن، تولید، تحلیل یا تبدیل برنامه‌های دیگر و حتی اصلاح خود در حین اجرا طراحی شود. در بعضی موارد، این به برنامه نویسان اجازه می‌دهد تا تعداد خطوط کد را برای بیان راه حل به حداقل برسانند، به نوبه خود زمان توسعه را کاهش می‌دهد. این برنامه همچنین با انعطاف‌پذیری بیشتر به برنامه‌ها امکان می‌دهد تا به‌طور مؤثری با شرایط جدید و بدون جبران مجدد رفتار کنند.

فرابرنامه نویسی می‌تواند برای جابجایی محاسبات از زمان اجرا به زمان کامپایل، تولید کد با استفاده از محاسبات زمان کامپایل و فعال کردن کد اصلاح شده خود استفاده شود. زبانی که در آن فرابرنامه نوشته شده‌است، فرازبان است. به زبان برنامه‌هایی که دستکاری می‌شوند، زبان برنامه‌نویسی ویژگی گرا گفته می‌شود. توانایی یک زبان برنامه‌نویسی برای فرازبان بودن، خود بازتاب یا «انعطاف‌پذیری» نامیده می‌شود. بازتاب یکی از ویژگی‌های ارزشمند زبان برای تسهیل فرابرنامه نویسی است.

فرا برنامه‌نویسی در دهه ۱۹۷۰ و ۱۹۸۰ با استفاده از زبانهای پردازش لیست مانند LISP رایج شد. دستگاه‌های سخت‌افزاری LISP در دهه ۱۹۸۰ محبوب بودند و برنامه‌هایی را ایجاد می‌کردند که می‌توانند کد را پردازش کنند. آنها اغلب برای برنامه‌های هوش مصنوعی استفاده می‌شدند

فرابرنامه نویسی به توسعه دهندگان امکان می‌دهد برنامه‌هایی را بنویسند و کدی را بسازند که در الگوی برنامه‌نویسی عمومی قرار دارد. داشتن زبان برنامه‌نویسی به عنوان یک نوع داده درجه یک (مانند Lisp , Prolog , SNOBOL یا Rebol) نیز بسیار مفید است. این به عنوان زبان پردازنده خود شناخته شده‌است. برنامه‌نویسی عمومی با اجازه دادن به شخصی برای نوشتن کد بدون نگرانی در تعیین انواع داده‌ها، امکاناتی برای فرابرنامه نویسی را در یک زبان ممکن می‌کند زیرا در هنگام استفاده می‌توان آنها را به عنوان پارامتر فرض کرد.

رویکردها
--------

فرابرنامه نویسی معمولاً به یکی از سه روش انجام می‌شود:

1. اولین رویکرد، در معرض قرار دادن داخلی موتور زمان اجرا در کد برنامه‌نویسی از طریق برنامه رابط‌های برنامه‌نویسی (API) مانندIL emitter برای .net
2. رویکرد دوم اجرای پویا عباراتی است که حاوی دستورها برنامه‌نویسی است، که اغلب از رشته‌ها تشکیل شده‌اند، اما می‌تواند از سایر روش‌ها با استفاده از آرگومان یا متن مانند جاوا اسکریپت نیز باشد؛ بنابراین، «برنامه‌ها می‌توانند برنامه بنویسند.» اگرچه هر دو روش می‌توانند به زبان مشابه مورد استفاده قرار گیرند، اما اکثر زبان‌ها به سمت یکی یا دیگری گرایش دارند.
3. رویکرد سوم این است که کاملاً از زبان خارج شود. سیستم‌های کلی تبدیل برنامه هدف مانند کامپایلرها، که توصیف‌های زبان را می‌پذیرند و تحولات دلخواه را بر روی آن زبانها انجام می‌دهند، پیاده‌سازی مستقیم فرابرنامه نویسی عمومی هستند. این اجازه می‌دهد تا فرابرنامه نویسی برای هر زبان هدف تقریباً بدون توجه به اینکه آیا آن زبان مقصد دارای توانایی‌های فرابرنامه نویسی است، اعمال شود. می‌توان این را در محل کار با Scheme مشاهده کرد و اینکه چگونه می‌توان با استفاده از ساختارهایی که بخشی از خود زبان Scheme برای گسترش C بودند، با محدودیت‌هایی که در C قرار دارد، مقابله کرد.

مثال‌ها
-------

یک مثال ساده از یک فرابرنامه، این اسکریپت POSIX Shell است که نمونه ای از برنامه‌نویسی مولد است:

```
#!/bin/sh
# metaprogram
echo '#!/bin/sh'> program
for i in $(seq 992)
do
 echo "echo $i">> program
done
chmod +x program

```
این اسکریپت (یا برنامه) یک برنامه ۹۹۳ خط جدید ایجاد می‌کند که اعداد ۱ تا ۹۹۲ را چاپ می‌کند. این تنها تصویری از نحوه استفاده از کد برای نوشتن کد بیشتر است. این کارآمدترین روش برای چاپ لیستی از اعداد نیست. با این وجود، یک برنامه‌نویس می‌تواند این فرابرنامه را در کمتر از یک دقیقه بنویسد و اجرا کند، و دقیقاً ۱۰۰۰ خط کد را در همین زمان ایجاد می‌کند.

کویین(quine) نوع خاصی از فرابرنامه است که سورس کد خود را به عنوان خروجی تولید می‌کند. کوئین‌ها عموماً از نظر بازآفرینی یا نظری مورد توجه هستند.

همه فرابرنامه نویسی شامل برنامه‌نویسی مولد نیست. اگر برنامه‌ها در زمان اجرا قابل تغییر باشند یا اگر بیشتر، تلفیقی در دسترس باشد (مانند C #، Forth , Frink , Groovy , JavaScript , Lisp, Elixir, Lua, Perl, PHP, Python, REBOL, Ruby, Rust, SAS, Smalltalk و Tcl)، پس می‌توان از تکنیک‌هایی برای انجام فرابرنامه نویسی بدون تولید سورس کد استفاده کرد.

لیسپ احتمالاً زبان مهمی با امکانات فرابرنامه نویسی است، هم به دلیل تقدم تاریخی و هم به دلیل سادگی و قدرت فرابرنامه نویسی آن. در فرابرنامه نویسی Lisp، اپراتور unquote (به‌طور معمول کاما) کدی را معرفی می‌کند که در زمان تعریف برنامه به جای زمان اجرا ارزیابی می‌شود. به فرم‌های ارزیابی خود و نقل قول در Lisp مراجعه کنید؛ بنابراین، زبان فرابرنامه نویسی با زبان برنامه‌نویسی میزبان یکسان است و روال‌های موجود Lisp در صورت دلخواه می‌توانند مستقیماً برای برنامه‌نویسی مجدد استفاده شوند.

این رویکرد با درج مترجم در برنامه، که مستقیماً با داده‌های برنامه کار می‌کند، به زبانهای دیگر پیاده‌سازی شده‌است. این نوع پیاده‌سازی برای برخی از زبانهای سطح بالا، مانند اسکریپت RemObject برای Object Pascal، وجود دارد.

پشتیبانی و چالش‌ها
------------------

یکی از سبک‌های فرابرنامه نویسی استفاده از زبانهای دامنه خاص (DSL) است. یک مثال نسبتاً متداول از استفاده از DSLها شامل برنامه‌نویسی مولد است: lex و yacc، دو ابزاری که برای تولید آنالیزور واژگانی و تجزیه گر استفاده می‌شود، به کاربر اجازه می‌دهیم زبان را با استفاده از عبارات منظم و گرامرهای بدون محتوا توصیف کند و الگوریتم‌های پیچیده‌ای را که برای تجزیه و تحلیل مؤثر زبان کار می‌کند، توصیف کند.

یکی از مزایای فرابرنامه نویسی این است که به محض پشت سر گذاشتن قرارداد در مرحله پیکربندی در یادگیری، بهره‌وری توسعه دهندگان را افزایش می‌دهد. برخی استدلال می‌کنند که یک پیچیدگی عمیق یادگیری برای استفاده کامل از ویژگی‌های فرابرنامه نویسی وجود دارد. از آنجا که فرابرنامه نویسی انعطاف‌پذیری و قابلیت تنظیم بیشتری در زمان اجرا ایجاد می‌کند، سوءاستفاده یا استفاده نادرست از فرا برنامه‌نویسی می‌تواند منجر به خطاهای غیرمجاز و غیرمنتظره ای شود که می‌تواند برای یک توسعه دهنده متوسط دشوار باشد. این امر می‌تواند خطرات موجود در سیستم را ایجاد کرده و در صورت عدم مراقبت، آن را آسیب پذیرتر کند. برخی از مشکلات رایج که به دلیل استفاده نادرست از برنامه‌نویسی برنامه نویسی ایجاد می‌شود، عدم توانایی کامپایلر در شناسایی پارامترهای پیکربندی گمشده، داده‌های نامعتبر یا نادرست می‌توانند منجر به استثناء ناشناخته یا نتایج مختلف شوند. به همین دلیل، برخی معتقدند که فقط توسعه دهندگان با مهارت بالا باید روی توسعه ویژگی‌هایی کار کنند که فرابرنامه نویسی را با یک زبان یا پلتفرم انجام می‌دهند و توسعه دهندگان متوسط باید یاد بگیرند که چگونه از این ویژگی‌ها به عنوان بخشی از قرارداد استفاده کنند.

منابع
-----

1. ↑  Harald Sondergaard. "Course on Program Analysis and Transformation". Retrieved 18 September 2014.
2. ↑  Czarnecki, Krzysztof; Eisenecker, Ulrich W. (2000). *Generative Programming*. ISBN 0-201-30977-7.

پیوند به بیرون
--------------

* c2.com Wiki: Metaprogramming article
* Meta Programming on the Program Transformation Wiki
* Code generation Vs Metaprogramming
* "Solenoid": The first metaprogramming framework for eXist-db

| * ن
* ب
* و
گونه‌های زبان‌های برنامه‌نویسی |
| --- |
| 
* Actor-based
* Array
* جنبه‌گرا
* مبتنی بر کلاس
* Concatenative
* محاسبات همزمان
* Data-structured
* Dataflow
* اعلانی
* خاص دامنه
* پویا
* محرمانه
* رویدادمحور
* Extensible
* تابعی
* دستوری
* منطقی
* ماکرو
* فرا برنامه‌نویسی
* چندالگویی
* مبتنی بر شئ
* شیءگرا
* خط لوله
* رویه‌ای
* بر پایه پیش‌نمونه
* پژواکی
* قانون محور
* اسکریپت‌نویسی
* Synchronous
* Templating

 |
| 
* اسمبلی
* ترجمه‌شده
* تفسیری
* ماشین

 |
| 
* سطح پایین
* سطح بالا
* Very high-level

 |
| 
* First generation
* Second generation
* نسل سوم
* نسل چهارم
* زبان برنامه‌نویسی نسل پنجم

 |
| 
* Non-English-based
* تصویری

 |