چیکن (پیاده‌سازی اسکیم)

از ویکی‌پدیا، دانشنامهٔ آزاد
Chicken Scheme
Logo for Chicken Scheme
خانوادهLisp
طراحی شده توسطFelix Winkelmann
توسعه‌دهندهThe Chicken Team
ظهوریافته در۲۰ ژوئیه ۲۰۰۰؛ ۲۳ سال پیش (۲۰۰۰-20}})[۱]
انتشار پایدار
5.2.0 / ۲۹ فوریه ۲۰۲۰؛ ۴ سال پیش (۲۰۲۰-29}})
Dynamic , latent, strong
دامنهLexical
زبان پیاده‌سازی
Scheme, C
بن‌سازه رایانشIA-32, x86-64, ARM, MIPS, SPARC64, PowerPC
سیستم‌عاملCross-platform: Windows, Linux, macOS, FreeBSD, NetBSD, OpenBSD, Solaris, AIX, Haiku, Android, iOS
پروانهBSD
.scm
وبگاه
متأثر از
Lisp, Scheme

چیکن (به صورت CHICKEN) یک زبان برنامه‌نویسی است، به ویژه یک کامپایلر و مفسّر که گویشی از زبان برنامه‌نویسی اسکیم را پیاده‌سازی می‌کند و کد منبع Scheme را به C استاندارد کامپایل می‌کند. بیشتر سازگار با R5RS است و افزونه‌های زیادی را به استاندارد پیشنهاد می‌دهد. استاندارد جدیدتر R7RS از طریق یک کتابخانه افزونه پشتیبانی می‌شود.[۲] چیکن یک نرم‌افزار رایگان و منبع باز است که تحت مجوز BSD در دسترس است. این برنامه بیشتر در Scheme اجرا می‌شود، بعضی از قسمت‌ها در C برای عملکرد یا آسان‌تر تعبیه کردن در برنامه‌های به زبان برنامه‌نویسی C است.

تمرکز[ویرایش]

تمرکز چیکن به سرعت از شعار آن مشخص می‌شود: «یک سیستم اسکیم عملی و قابل حمل».

تمرکز اصلی چیکن استفادهٔ عملی از Scheme برای نوشتن نرم‌افزار در دنیای واقعی است. Scheme به دلیل استفاده در برنامه‌های درسی علوم کامپیوتر و آزمایش زبان برنامه‌نویسی کاملاً مشهور است، اما در تجارت و صنعت کاربرد کمی داشته‌است.[۳] جامعهٔ چیکن مجموعهٔ بزرگی از کتابخانه‌ها را برای انجام کارهای مختلف تولید کرده‌است. Chicken wiki (نرم‌افزاری که آن را اجرا می‌کند، خود یک برنامه چیکن است) هم شامل لیستی از نرم‌افزارهایی است که به زبان چیکن نوشته شده‌اند.[۴]

هدف دیگر چیکن قابل حمل بودن است. با کامپایل کردن در یک نمایش میانی، در این حالت C قابل حمل (همانند Gambit و Bigloo)، برنامه‌های نوشته‌شده در چیکن را می‌توان برای سیستم عامل‌های رایج مانند Linux، macOS، سایر سیستم‌های مشابه یونیکس، ویندوز، هایکو و پلتفرم‌های تلفن همراه iOS و Android کامپایل کرد.[۵] همچنین دارای پشتیبانی داخلی برای ترجمهٔ دوگانه برنامه‌ها و برنامه‌های افزودنی است[۶] که به شما اجازه می‌دهد در پلتفرم‌های سامانهٔ نهفته مختلف مورد استفاده قرار گیرد.

طرح[ویرایش]

مانند بسیاری از کامپایلرهای اسکیم، چیکن از C استاندارد به عنوان نمایش میانی استفاده می‌کند. یک برنامهٔ Scheme توسط کامپایلر چیکن به C ترجمه می‌شود و سپس یک کامپایلر C برنامهٔ C را به کد ماشین برای معماری رایانه مورد نظر ترجمه کرده، یک برنامهٔ قابل اجرا تولید می‌کند. در دسترس بودن جهانی C آن را برای این منظور مفید می‌کند.

طراحی چیکن از مقاله ۱۹۹۴[۷] توسط هنری بیکر الهام گرفته شده‌است که یک استراتژی ابتکاری برای کامپایل کردن Scheme به C طرح کرده‌است. یک برنامهٔ Scheme به تابع‌های C کامپایل می‌شود. این توابع C هرگز به دستور return نمی‌رسند. در عوض، آن‌ها بعد از کامل شدن، continuation جدید را صدا می‌زنند. این continuationها توابع C هستند و به عنوان آرگومان‌های اضافی به سایر توابع C منتقل می‌شوند. آن‌ها توسط کامپایلر محاسبه می‌شوند.

تاکنون، این اصل سبک ادامه دادن است. ایدهٔ جدید بیکر استفاده از پشتهٔ C برای پشتهٔ Scheme است. از این رو، می‌توان از عملیات پشته C طبیعی مانند ایجاد متغیر خودکار، تخصیص آرایه به اندازهٔ متغیر و غیره استفاده کرد. وقتی پشته پر شد (یعنی نشانگر پشته به بالای پشته می‌رسد)، می‌توان یک بازیافت حافظه راه‌اندازی کرد. طرحی که استفاده می‌شود، یک جمع‌کننده زباله کپی‌بردار است که در اصل توسط C.J. Cheney ابداع شده‌است که تمام ادامهٔ زندگی و سایر اشیای زنده را در پشته کپی می‌کند.[۸] با وجود این، کد C از کادرهای پشته C کپی نمی‌کند، فقط از اشیای Scheme استفاده می‌کند؛ بنابراین نیازی به دانش در مورد پیاده‌سازی C نیست.

به‌طور کامل، پشتهٔ Scheme از پشته C به عنوان مهدکودک همراه با دو پشتهٔ مورد نیاز جمع‌کننده زبالهٔ نسل تشکیل شده‌است. این روش سرعت پشتهٔ C را برای بسیاری از عملیات فراهم می‌کند و به شما امکان می‌دهد از ادامه‌ها به عنوان تماس‌های ساده به توابع C استفاده کنید. به علاوه، راه حل بیکر رفتار بازگشتی مجانبی را تضمین می‌کند، همان‌طور که در استاندارد زبان Scheme لازم است. پیاده‌سازی در کامپایلر Chicken Scheme حتی به صورت مجانبی برای فضا بی‌خطر است.

محدودیت‌ها و انحراف از استاندارد[ویرایش]

اسکیم چیکن عمدتاً با R5RS سازگار است، با چند محدودیت و انحراف قابل توجه.[۹] سازگاری R7RS به عنوان کتابخانه افزونه ارائه می‌شود.[۲]

سیستم اصلی از پشتیبانی اساسی از نویسه‌های UTF-8 برخوردار است؛ با این حال روند نمایه‌سازی رشته و دستکاری آن از UTF-8 مطلع نیست. یک کتابخانه داخلی وجود دارد که پشتیبانی از آگاهی کامل از UTF-8 را اضافه می‌کند.[۱۰]

نرم‌افزار الحاقی[ویرایش]

چیکن مخزن نرم‌افزاری بزرگی از کتابخانه‌ها و برنامه‌های اضافه‌شده به نام تخم‌مرغ دارد.[۱۱] این سیستم شباهت زیادی به RubyGems دارد.[۱۲]

در ابتدا، این تخم‌مرغ‌ها در یک مخزن svn مرکزی توسعه یافتند[۱۳] که در آن ایجاد یک برچسب باعث می‌شود به‌طور اتوماتیک نسخهٔ جدیدی از افزونه برای بارگیری در دسترس قرار گیرد. در حال حاضر، تخم‌مرغ‌ها را می‌توان در هر مکان و تحت هر سیستم کنترل نسخه‌ای توسعه داد؛ در حالی که هنگام استفاده از اکثر سایت‌های میزبان کد محبوب، هنوز مدیریت انتشار نیمه اتوماتیک حفظ می‌شود.[۱۴] این روش انتشار VCS-agnostic است؛ به این معنا که کاربر نیازی به نصب این VCSها ندارد. توسعه‌دهنده آزاد است که هر مکانی که انتخاب می‌کند، میزبانی کند و حتی می‌تواند انتخاب کند که از کنترل نسخه عمومی خودداری کرده و فقط tarballهای ساده را توزیع کند.

برای همهٔ تخم‌مرغ‌های آزادشده، آخرین نسخه به‌طور خودکار به عنوان بخشی از یک فرایند یکپارچه‌سازی مداوم آزمایش می‌شود. یک سرور آزمایشی استاندارد وجود دارد[۱۵] که در آن سیستم هسته و همهٔ تخم‌مرغ‌ها روزانه در برابر جدیدترین نسخهٔ توسعه‌یافته (برای گرفتن باگ‌های برگشتی) و آخرین نسخهٔ پایدار (برای اطمینان از این‌که همه‌چیز برای کاربران سیستم پایدار کار می‌کند) آزمایش می‌شوند. هم‌چنین، هر کسی می‌تواند داوطلب شود تا ظرفیت آزمایش بیشتری را در انواع مختلف: سخت‌افزار، سیستم عامل یا هستهٔ منتشرشده ارائه دهد.

امکانات[ویرایش]

چیکن از اکثر Scheme استاندارد R5RS پشتیبانی می‌کند، اما هم‌چنین کمی از ویژگی‌های غیراستاندارد را اضافه می‌کند که در همهٔ پیاده‌سازی‌های اسکیم در دسترس نیست.

رابط تابع خارجی[ویرایش]

کامپایل چیکن به C این امکان را فراهم می‌کند تا کد C سفارشی را به نتیجهٔ کامپایل‌شده تزریق کنید؛ این امر ادغام با کتابخانه‌های C را آسان می‌کند. رابط کاربری خارجی آن از تبدیل جلو و عقب بین اکثر تایپ‌های داخلی C و اشیا اسکیم مربوطه پشتیبانی می‌کند.

هم‌چنین، کتابخانه‌های افزونه‌ای برای ارتباط با Python ,[۱۶] Lua,[۱۷] و Java، از طریق Java Native Interface (JNI)[۱۸] یا یک پل وجود دارد.[۱۹]

متقابل گردآوری[ویرایش]

تدوین متقابل کد Scheme به پلتفرم دیگر (به عنوان مثال برای استفادهٔ تعبیه‌شده بر روی یک دستگاه) نسبتاً آسان است.

برای امکان کامپایل متقابل برای کد اسکیم، چیکن مدلی از کامپایل جداگانه را تحمیل می‌کند: یک ماژول کامپایل‌شده شامل دو کتابخانه مشترک است. یک کتابخانه حاوی کد واقعی است که در زمان اجرا استفاده خواهد شد (برای پلتفرم هدف کامپایل شده‌است) و دیگری یک ماژول واردشده است که برای بارگذاری کدی که در زمان کامپایل مانند کد ماکروی رویه‌ای اجرا می‌شود، (بر روی پلتفرم میزبان) استفاده می‌شود.

کامپایلر چیکن هم‌چنین می‌تواند به راحتی کامپایل متقابل کند. پس از دست‌یابی به ترجمه به C، می‌توان به سادگی از کامپایلر C استفاده کرد که برای ساخت یک پلتفرم دیگر تنظیم شده‌است.

ماژول‌ها و ماکروها[ویرایش]

از نسخهٔ ۴، چیکن دارای یک سیستم ماژول داخلی است و از ماکروهای hygienic سطح پایین از طریق تغییر نام صریح ماکروها پشتیبانی می‌کند.[۲۰] (قبل از نسخه ۴، این از طریق کتابخانه الحاقی در دسترس بود). هم‌چنین از ماکروها در قوانین نحوی استاندارد و تغییر نام ضمنی ماکروها،[۲۱] که اساساً نسخه معکوس تغییر نام صریح است، پشتیبانی می‌شود.

این مکانیزم برای راحتی، کارایی را معامله می‌کند. هر شناسه‌ای که صریحاً به عنوان غیربهداشتی تزریق نشده باشد، به‌طور خودکار تغییر نام می‌یابد تا از ضبط نام جلوگیری شود. هزینهٔ عملکرد به این دلیل اتفاق می‌افتد که تغییر نام ضمنی مستلزم گسترش‌دهنده ماکرو است تا عبارات را دو بار دیگر بازپس‌گیرد. این هزینه در زمان توسعه پرداخت می‌شود؛ بنابراین یک نویسنده ماکرو باید در نظر بگیرد اگر زمان‌های بیشتری برای کامپایل قابل قبول باشد.

رفع اشکال از راه دور[ویرایش]

از نسخه ۴٫۱۱، چیکن همراه با اشکال‌زدایی به نام Feathers حمل می‌شود.[۲۲] وقتی کد اسکیم با گزینهٔ نیاز به رفع اشکال کامپایل می‌شود، رویدادهای رفع اشکال در نقاط خاصی از کد تزریق می‌شوند. این‌ها به صورت فراخوانی به یک تابع C اجرا می‌شوند که وقتی اشکال‌زدایی کد انجام نمی‌شود، نسبتاً کم‌هزینه است. هنگام اشکال‌زدایی، سعی می‌شود یک ارتباط TCP به فرایند سرور Feathers، احتمالاً در دستگاه دیگری، ساخته شود. این روند متوقف شده‌است، کاربر می‌تواند نقاط شکست را تنظیم کرده و برنامه را شروع کند. سپس، هنگامی که نقطهٔ شکست ایجاد می‌شود، کلاینت (فرایند در حال اشکال‌زدایی) وارد یک حلقه فرمان می‌شود که به شما امکان می‌دهد کلاینت را بازبجویید تا متغیرها را بخواند یا آن‌ها را تغییر دهد.

تحلیل تایپ استاتیک محدود[ویرایش]

چیکن از تجزیه و تحلیل جریان محلی پشتیبانی می‌کند. این به کامپایلر اجازه می‌دهد تا خطاهای تایپ متغیر را در زمان کامپایل دریافت کرده و تخصص تایپ را انجام دهد. این تخصص امکان حذف چندین بررسی ایمنی برای تشخیص تایپ در زمان اجرا را دارد، زمانی که تایپ می‌تواند در زمان کامپایل استنباط شود. این منجر به بهبود عملکرد زمان اجرا می‌شود.

این ممیزی اجازه تجزیه و تحلیل جریان متقابل ماژول را نمی‌دهد؛ پس از آن تنها می‌تواند به بهینه‌سازی کد که بخشی از یک واحد کامپایل (یا ماژول) استفاده کرد.

جستارهای وابسته[ویرایش]

continuation

منابع[ویرایش]

  1. Winkelmann, Felix. "Announcing the Chicken Scheme-to-C compiler". Google Groups (comp.lang.scheme).
  2. ۲٫۰ ۲٫۱ evhan (2018-11-09). "r7rs (Chicken manual)". Chicken Scheme. Retrieved 2019-02-28.
  3. "Scheme FAQ"., section "what is Scheme used for?"
  4. Bex, Peter (sjamaan) (2018-08-16). "Software written in Chicken Scheme". Chicken Scheme. Retrieved 2019-02-26.
  5. "Portability". Chicken Scheme Wiki.
  6. Bex, Peter (sjamaan) (2016-05-28). "Cross development". Chicken Scheme (Manual). Retrieved 2019-02-26.
  7. Baker, Henry (1994). "CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A." Archived from the original on 2006-03-03.
  8. Cheney, C.J. "A Nonrecursive List Compacting Algorithm". CACM 13,11 (Nov. 1970), 677-678.
  9. Bex, Peter (sjamaan); Winkelmann, Felix; mario; svnwiki; iraikov; 1126; mario (2016-05-28). "Confirmed deviations (Chicken manual)". Chicken Scheme. Retrieved 2019-02-28.{{cite web}}: CS1 maint: numeric names: فهرست نویسندگان (link)
  10. Bex, Peter (sjamaan); kooda; mario; svnwiki; wasamasa; kon; mario (2018-08-11). "utf8 (Chicken manual)". Chicken Scheme. Retrieved 2019-02-28.
  11. "Chicken eggs". Chicken Scheme.
  12. "RubyGems". RubyGems.org. Retrieved 2019-02-26.
  13. Bex, Peter (sjamaan). "VCS-independent distribution of language extensions"., blogpost on More magic
  14. "Instructions for popular code hosting methods and VCSes". Chicken wiki.
  15. "Chicken automated tests". Chicken Scheme. Retrieved 2019-02-28.
  16. iraikov (2016-06-11). "pyffi". Chicken Scheme Wiki. Retrieved 2019-03-03.
  17. Bex, Peter (sjamaan); iraikov (2012-03-11). "Lua". Chicken Scheme Wiki. Retrieved 2019-03-03.
  18. mario; svnwiki (2013-06-04). "JNI". Chicken Scheme Wiki. Retrieved 2019-03-03.
  19. Winkelmann, Felix; mario (2013-06-04). "Javahack". Chicken Scheme Wiki. Retrieved 2019-03-03.
  20. Bex, Peter (sjamaan); Winkelmann, Felix; mario (2018-09-23). "Module (Chicken syntax)". Chicken Scheme. Retrieved 2019-02-28.
  21. Bex, Peter (sjamaan); Winkelmann, Felix; mario (2018-09-23). "Module (Chicken syntax)". Chicken Scheme. Retrieved 2019-02-28.
  22. Bex, Peter (sjamaan) (2018-11-25). "Debugging". Chicken Scheme.

پیوند به بیرون[ویرایش]