فرا برنامه‌نویسی

از ویکی‌پدیا، دانشنامهٔ آزاد

فرا برنامه‌نویسی (به انگلیسی: 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.

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