طراحی زبان‌های برنامه‌سازی

Design of Programming Languages

شماره درس: ۴۰۳۶۴ تعداد واحد: ۳
مقطع: کارشناسی نوع درس: نظری
پیش‌نیاز: برنامه‌سازی پیشرفته هم‌نیاز: –

اهداف درس

اهداف اصلی این درس عبارتند از: ۱) مروری بر سیر طبیعی تحولات مفاهیم و روش‌های طراحی و پیاده‌سازی نسل‌های مختلف زبان‌های برنامه‌سازی به روشی تجربی و گام به گام، ۲) معرفی روش‌های مهندسی زبان‌های برنامه‌سازی در مراحل طراحی و پیاده‌سازی به کمک زبان‌های تغییرپذیر یا قابل برنامه‌سازی به خصوص با تاکید بر اهمیت طراحی و پیاده‌سازی زبان‌های ویژه دامنه ، ۳) آشنایی با پیاده سازی مفسرها به ویژه بر بستر ماشین‌های مجازی و ۴) مروری بر اصول و مسائل مرتبط با طراحی زبان‌های برنامه‌سازی و همچنین روش‌ها و ساختارهای داده‌ای به کار رفته در پیاده‌سازی یا محقق کردن محیط برنامه نویسی.

ریز مواد

  • مقدمه
    • تاریخچه تکاملی زبان‌های برنامه‌سازی و معرفی برخی زبان‌های مهم از منظر تحولات تاریخی
    • معرفی مقایسه‌ای سنت‌های اصلی برنامه‌سازی (سنت‌های برنامه‌سازی امری-رویه‌ای ، شی‌گرا ، برنامه‌سازی مبتنی بر قاعده و سنت برنامه‌سازی توصیفی-تابعی ) از منظر نگاه آن‌ها به مفهوم و تعریف برنامه.
  • تفسیر یا ترجمه
    • مقایسه مفهوم تفسیر و ترجمه هم از منظر طراحی زبان و هم از منظر نحوه و مسائل مرحله‌ی پیاده‌سازی
  • مهندسی زبان
    • آشنایی با زبان‌ها و ابزارهای موجود برای ایجاد امکان طراحی زبان‌های ویژه‌ی دامنه و پیاده‌سازی کارا و سریع مفسر آن‌ها. پیشنهاد خاص: معرفی و تمرین عملی کار با ابزار برنامه‌پذیر DrRacket.
  • برنامه‌سازی تابعی
    • مروری بر مفاهیم اصلی برنامه‌نویسی تابعی و حساب لامبدا همراه با تمرینات و پروژه‌های عملی. زبان پیشنهادی Scheme (بر اساس نحو و معناشناسی کتاب Friedman) یا Racket (بر اساس نحو و معناشناسی کتاب Krishnamurthi). در واقع برداشتی امروزین از زبان Lisp بر بسترهای برنامه‌پذیر (معرفی مختصری از امکانات برنامه‌سازی تابعی زبان Java ویرایش 8 به بعد و تمرینی عملی بر آن نیز برای علاقه‌مند سازی دانشجویان توصیه می‌شود)
  • طراحی تکاملی یک زبان برنامه نویسی و پیاده‌سازی گام به گام مفسر آن
    • زبان حاوی عبارات محاسباتی (بدون اثر جنبی حافظه‌ای)
    • افزودن رویه‌ها(زیربرنامه‌ها)ی غیربازگشتی و سپس بازگشتی به زبان و مفسر آن
    • افزودن مفاهیم حوزه‌ی تعریف و دامنه اعتبار متغیرها به زبان و مفسر آن
    • افزودن امکان تاثیر بر مقادیر حافظه (وجود متغیر از نوع ارجاع دهنده یا آدرس) به زبان و مفسر آن
    • افزودن مفهوم نوع‌دار بودن متغیرها به زبان و مفسر آن
    • ایجاد امکان تعریف مادول، شی و کلاس (ایجاد امکان برنامه نویسی مادولار و شی گرا) در زبان طراحی شده و پیاده‌سازی مفسر آن.
  • مباحث تکمیلی منتخب
    • معرفی اجمالی برخی زبا‌ن‌های برنامه‌سازی مطرح مانندML و برداشتهای بعدی آن، Haskell، Scala و F#
    • مروری بر نیازمند‌هایی از سایر زمینه‌ها که بر طراحی و پیاده‌سازی زبان‌ها تاثیر می‌گذارند مانند نیازمندی‌های برنامه‌سازی موازی یا هم‌روند، بی‌درنگ بودن، تحت وب بودن و مهندسی نرم‌افزار مولفه‌گرا یا سرویس‌گرا.
  • مقدمه‌ای بر معناشناسی زبان‌های برنامه‌سازی و استدلال مبتنی بر آن
    • معناشناسی عملیاتی
    • معناشناسی ارجاعی
    • معناشناسی اصل موضوعی (منطق هور)

ارزیابی

  • آزمون نیم ترم (۲۵% کل نمره)
  • آزمون پایان ترم (۴۰% کل نمره)
  • تمرین: شامل ۱) تمرینات برنامه نویسی تابعی ۲) تمرینات گام به گام طراحی مفسر ۳) تمرینات نظری (۲۰% کل نمره)
  • پروژه ( ۱۵% کل نمره)

مراجع

  1. D. P. Friedman, M. Wand. Essentials of Programming Languages. 3rd Edition, MIT Press, 2008.
  2. S. Krishnamurthi. Programming Languages: Application and Interpretation. 2nd Edition, 2017.
  3. M. Felleisen, R. B. Findler, M. Flatt, S. Krishnamurthi, E. Barzilay, J. McCarthy, S. Tobin-Hochstadt. A Programmable Programming Language. Communications of the ACM, Vol. 61, No. 3, Pp. 62-71, March 2018.