فرادادهنویسی و ماکروها
فرادادهنویسی برنامهها را به عنوان دادهای در نظر میگیرد که برنامههای دیگر میتوانند آنها را تولید، بازرسی یا تبدیل کنند، در حالی که ماکروها انتزاع نحوی کنترلشدهای را در زمان کامپایل فراهم میکنند.
Definition
فرادادهنویسی (Metaprogramming) به معنای نوشتن برنامههایی است که برنامههای دیگر (یا خودشان) را تولید، تحلیل یا تبدیل میکنند؛ ماکروها (macros) ابزاری برای فرادادهنویسی هستند که نحو منبع را قبل یا در حین کامپایل به کد بسطیافته بازنویسی میکنند.
Scope
این موضوع به تکنیکهایی میپردازد که برنامهها توسط آنها برنامههای دیگر را دستکاری میکنند: ماکروهای لغوی و نحوی، بسط ماکروی بهداشتی، تولید کد در زمان کامپایل، برنامهنویسی چندمرحلهای، بازتاب (reflection) و سیستمهای الگو. این مبحث به چگونگی گسترش نحو و انتزاعات یک زبان توسط این مکانیزمها، ضمن حفظ صحت، به ویژه در مورد گرفتن و اتصال متغیرها، میپردازد.
Core questions
- چگونه انتزاع نحوی میتواند یک زبان را بدون گرفتن نام ناامن گسترش دهد؟
- چه چیزی فرادادهنویسی زمان کامپایل را از بازتاب زمان اجرا متمایز میکند؟
- چگونه برنامهنویسی چندمرحلهای تولید برنامه را از اجرا جدا میکند؟
- چه زمانی فرادادهنویسی انتزاع را بهبود میبخشد و چه زمانی به خوانایی و ابزارها آسیب میرساند؟
Key theories
- بسط ماکروی بهداشتی
- کوهلبکر و همکارانش ماکروهای بهداشتی را معرفی کردند که به طور خودکار متغیرهای مقید را در طول بسط تغییر نام میدهند تا کد تولید شده توسط ماکرو نتواند به طور تصادفی نامها را در محل استفاده بگیرد یا توسط آنها گرفته شود.
- برنامهنویسی چندمرحلهای
- طاها و شیارد محاسبات مرحلهبندی شده را با حاشیهنویسیهای صریح رسمی کردند و توضیحی نوعدار از تولید و اجرای کد در مراحل ارزیابی متمایز ارائه دادند.
- فرادادهنویسی الگو
- شیارد و پیتون جونز فرادادهنویسی زمان کامپایل نوعدار را به Haskell اضافه کردند که به برنامهها اجازه میدهد نحو انتزاعی را در زمان کامپایل بسازند و به هم متصل کنند.
Clinical relevance
ماکروها و فرادادهنویسی به نویسندگان کتابخانهها اجازه میدهند تا انتزاعات خاص دامنه ایجاد کنند، کدهای تکراری را حذف کنند و تخصیص زمان کامپایل را برای بهبود عملکرد انجام دهند. بهداشت (Hygiene) و نظم مرحلهبندی (staging discipline) عواملی هستند که این امکانات قدرتمند را برای استفاده روزمره به اندازه کافی ایمن میسازند.
History
ماکروها به اوایل زبانهای Lisp و اسمبلی بازمیگردند، اما ماکروهای Lisp غیربهداشتی مستعد گرفتن تصادفی متغیرها بودند. بسط بهداشتی Kohlbecker در سال 1986 این مشکل را حل کرد و بر قواعد نحوی Scheme تأثیر گذاشت. کارهای بعدی برنامهنویسی چندمرحلهای (MetaML) را رسمی کردند و فرادادهنویسی زمان کامپایل نوعدار را به زبانهایی مانند Haskell، Scala و Rust آوردند.
Debates
- قدرت در برابر قابل فهم بودن ماکروها
- طراحان زبان قدرت بیانی انتزاع نحوی نامحدود را در برابر دشواریهایی که برای خوانندگان، اشکالزداها و ابزارها ایجاد میکند، میسنجند که این امر بهداشت و سیستمهای ماکروی منظم را توجیه میکند.
Key figures
- Eugene Kohlbecker
- Matthias Felleisen
- Walid Taha
- Tim Sheard
- Simon Peyton Jones
Related topics
Seminal works
- kohlbecker1986
- taha2000
- sheard2002
- abelson1996
Frequently asked questions
- چه چیزی یک سیستم ماکرو را بهداشتی میکند؟
- یک سیستم ماکروی بهداشتی تضمین میکند که شناسههای معرفی شده توسط یک ماکرو به طور ناخواسته شناسههای موجود در محل فراخوانی را نگیرند یا پنهان نکنند، و بالعکس، با تغییر نام سیستماتیک متغیرهای مقید در طول بسط.
- فرادادهنویسی چه تفاوتی با توابع معمولی دارد؟
- توابع معمولی بر روی مقادیر زمان اجرا عمل میکنند، در حالی که فرادادهنویسی بر روی نمایشهای برنامه عمل میکند، کد را تولید یا تبدیل میکند، اغلب در زمان کامپایل، قبل از اینکه هر مقدار زمان اجرایی وجود داشته باشد.