| CMUCL(1) | General Commands Manual | CMUCL(1) |
نام (NAME)
cmucl - محیط برنامهنویسی CMU Common Lisp
توضیحات (DESCRIPTION)
CMU Common Lisp یک محیط برنامهنویسی Common Lisp عمومی در رده صنعتی (industrial strength) و در مالکیت عمومی است. بسیاری از تغییرات استاندارد X3j13 در CMU CL گنجانده شدهاند. در هر کجا که امکان داشته، این کار بهگونهای انجام شده است که استفاده شفاف از CLtL1 یا استاندارد پیشنهادی ANSI CL را میسر سازد. احتمالاً جالبترین قابلیتهای جدید برای کاربران، توابع SETF، ماکروی LOOP و ماکروی WITH-COMPILATION-UNIT هستند.
نیازمندیهای سختافزاری (HARDWARE REQUIREMENTS)
در حال حاضر CMU CL برای طیف متنوعی از ورکاستیشنهای یونیکس در دسترس است. برای پلتفرمهای پشتیبانیشده به فایل README مراجعه کنید. حداقل ۱۶ مگابایت حافظه رم و ۲۵ مگابایت فضای دیسک توصیه میشود. طبق معمول، سختافزار قویتر عملکرد بهتری خواهد داشت.
نمای کلی (OVERVIEW)
در مقایسه با سایر پیادهسازیهای Common Lisp، سیستم CMU CL دو مزیت عمده دارد:
- --
- کامپایلر جدید CMU CL بنام Python نسبت به سایر کامپایلرهای Common Lisp پیشرفتهتر است. این کامپایلر هم کد بهتری تولید میکند و هم استفاده از آن سادهتر است.
- --
- محیط برنامهنویسی مبتنی بر ویرایشگر Hemlock یکپارچگی بهتری نسبت به محیطهای مبتنی بر GNU Emacs دارد (هرچند در صورت تمایل همچنان میتوانید از GNU Emacs استفاده کنید).
همچنین CMU CL دارای مزایای غیرفنی قابل توجهی است:
- --
- از پشتیبانی محلی خوبی برای کاربران CMU برخوردار است و بهخوبی با محیط دانشکده علوم کامپیوتر CMU یکپارچه شده است.
- --
- در مالکیت عمومی (Public Domain) قرار دارد و بهصورت رایگان در دسترس مراکزی خارج از CMU است که توانایی مالی خرید لایسنس سازمانی برای نسخههای تجاری لیسپ را ندارند.
ویژگیهای کامپایلر (COMPILER FEATURES)
فصل «Advanced Compiler» در راهنمای کاربر بهطور مفصل به قابلیتهای بهینهسازی کامپایلر Python پرداخته است (به بخش مستندات در ادامه مراجعه کنید). در اینجا به چند نکته برجسته اشاره میشود:
- --
- کارایی بالا و بررسی نوع داده (type-checking) بهطور همزمان. کامپایل کردن کد با حالت امن در بدترین حالت تنها موجب افت سرعت ۲ برابری میشود.
- --
- در کدهای امن، اعلانهای نوع داده اعتبارسنجی میشوند و امکان اشکالزدایی اعلانها در کد امن فراهم میگردد. بنابراین هنگام کامپایل ناامن، از صحت اعلانها مطمئن خواهید بود.
- --
- اشکالزدایی کامل کد کامپایلشده در سطح سورسکد، از جمله نمایش فراخوانی دقیقی که منجر به خطا شده است.
- --
- نکات کارایی مناسب که علت عدم امکان open code شدن یک عملیات یا محل تخصیص حافظه برای اعداد (number-consing) را توضیح داده و زمینه سورس بیسابقهای ارائه میدهند.
- --
- کامپایل بلوکی، ارزیابی جزئی، توابع سبک و بازگشت دمدستی واقعی (proper tail-recursion) امکان انتزاع کمهزینه فراخوانی توابع را فراهم میسازد.
پشتیبانی از انواع (TYPE SUPPORT)
نکته مهم: حتی برنامههای اشکالزداییشده ممکن است حاوی خطاهای نوع داده باشند که توسط سایر کامپایلرها کشف نشدهاند. هنگام کامپایل با غیرفعال کردن بررسی نوع داده با کامپایلر CMU Common Lisp، این خطاها ممکن است موجب رفتارهای عجیب یا توقف غیرعادی برنامه شوند. در صورتی که بررسی نوع غیرفعال نشود، این برنامهها با یک خطای صریح نوع داده متوقف میشوند.
بارزترین تفاوتی که کامپایلر Python با کامپایلرهای قبلی Common Lisp دارد، شناخت بیشتر آن از انواع داده و رویکرد متفاوتش در بررسی نوع است. بهویژه، Python بررسی نوع داده را بهصورت «مشتاقانه (eager)» و «دقیق (precise)» پیادهسازی میکند:
- --
- مشتاقانه
به این معنا
که بررسی
نوع
بلافاصله
به محض وجود
یک اعلان
انجام
میشود، نه
اینکه تا
زمان
استفاده
واقعی از
مقدار به
تعویق
بیفتد. برای
مثال:
(let ((x ...)) (declare (fixnum x)) ...)
در اینجا، نوع مقدار اولیه X باید FIXNUM باشد، در غیر این صورت خطا اعلام خواهد شد. - --
- دقیق به این معنا که دقیقاً همان نوع مشخصشده بررسی میشود. برای مثال، اگر متغیری از نوع (integer 3 7) اعلان شود، مقدار آن همیشه باید عددی صحیح بین ۳ و ۷ باشد.
از آنجا که Python بررسیهای نوع بیشتری انجام میدهد، برنامههایی که با سایر کامپایلرها بدون مشکل اجرا میشوند ممکن است هنگام کامپایل با Python خطای نوع بدهند. مهم است که برنامهها در ابتدا با خطمشی پیشفرض (امن) کامپایل و تست شوند. اگر برنامهای با یک اعلان نادرست و بدون بررسی نوع کامپایل شود (به دلیل کاهش پارامتر بهینهسازی SAFETY)، خطای نوع ممکن است موجب خطاهای مبهم یا حلقههای نامحدود شود. به بخش «Getting Existing Programs to Run» (بخش ۶.۶) در فصل کامپایلر راهنمای کاربر مراجعه کنید.
محیط CMU CL از استاندارد تصحیح نوع تابع X3J13 پیروی میکند، به این معنی که لیستهای کوتشده lambda از نوع FUNCTION نیستند و دیگر بهطور مستقیم قابل فراخوانی نخواهند بود. از تابع COERCE با نوع نتیجه FUNCTION استفاده کنید.
بهینهسازی (OPTIMIZATION)
کامپایلر Python بهینهسازیهای متعددی انجام میدهد که در سایر کامپایلرهای Common Lisp وجود ندارند یا عمومیت کمتری دارند: بازگشت دمدستی واقعی، فراخوانی سبک توابع، کامپایل بلوکی، استنتاج نوع میانرویهای، تحلیل جریان سراسری، استنتاج پویای نوع، تخصیص سراسری ثباتها، تخصیص اعداد روی پشته، بهینهسازی کنترل، تحلیل محدوده اعداد صحیح، بسط درونخطی پیشرفته، بهینهسازی چندمقداری و تبدیلات سورس به سورس.
بهینهسازی و بررسی نوع داده توسط اعلان OPTIMIZE کنترل میشوند. خطمشی پیشفرض کامپایل بر پایه ایمنی نوع (type-safe) است.
پشتیبانی عددی (NUMERIC SUPPORT)
کامپایلر Python بهویژه در محاسبات سنگین عددی بسیار قدرتمند است:
- --
- کدگذاری درونخطی بهینه برای عملیات اعداد اعشاری و اعداد صحیح ۳۲ بیتی بدون ایجاد حافظه اضافی (number consing). این شامل تمام توابع پایه سختافزاری ROUND، TRUNCATE، COERCE و همچنین توابع کتابخانهای مهم مانند SCALE-FLOAT و DECODE-FLOAT میشود. نتایجی که در ثباتها جا نشوند روی پشته اختصاصی اعداد قرار میگیرند.
- --
- پشتیبانی کامل از استاندارد IEEE برای دقت یگانه و مضاعف (اعداد غیرعادی denorm، مقادیر صفر مثبت و منفی و غیره).
- --
- در کدهای کامپایلشده بلوکی، اعداد بهعنوان آرگومانهای تابع و مقادیر بازگشتی در ثباتها منتقل میشوند (بدون تخصیص حافظه اضافی برای اعداد).
- --
- فراخوانی توابع کتابخانهای (مانند SIN و...) به یک فراخوانی مستقیم به روتین کتابخانه C بهینهسازی میشود (بدون تخصیص حافظه عددی). در سختافزارهایی با پشتیبانی مستقیم از چنین توابعی، این عملیات میتوانند بهسادگی بهصورت کدهای مستقیم (open-coded) تولید شوند.
- --
- کارایی بهمراتب بهتر در کار با اعداد بزرگ (bignum) نسبت به پیادهسازیهای تجاری (۲ تا ۴ برابر سریعتر). اعداد بزرگ در لیسپ با استفاده از word integer پیادهسازی شدهاند، بنابراین میتوانید پیادهسازی سفارشی خود را بسازید.
هشدارهای کامپایلر و نکات کارایی Python بهویژه در کدهای عددی بسیار ارزشمند هستند. بیش از ۵۰ صفحه در راهنمای کاربر قابلیتهای Python را با جزئیات بیشتر شرح داده است.
اشکالزدا (THE DEBUGGER)
علاوه بر رابط پنجرهای مبتنی بر Motif و رابط خط فرمان پایه، اشکالزدا دارای چندین قابلیت قدرتمند جدید است:
- --
- دستورات «source» و «vsource» عبارت سورسکد اصلی و *دقیق* مسئول خطا یا فراخوانی معلق تابع را چاپ میکنند. دیگر نیازی نیست حدس بزنید کدام فراخوانی به CAR موجب خطای «not a list» شده است.
- --
- متغیرها در کد کامپایلشده از طریق نام قابل دسترسی هستند، بنابراین اشکالزدا همواره فرمها را در محیط واژگانی فریم جاری ارزیابی میکند. این دسترسی به متغیرها در حضور بهینهسازیهای کامپایلر پایدار است؛ اگرچه سطوح بالاتر بهینهسازی ممکن است مقادیر متغیرها را در برخی نقاط محدوده متغیر غیرقابلدسترس کند، اشکالزدا همیشه جانب احتیاط را رعایت کرده و از نمایش مقادیر احتمالی نادرست خودداری میکند.
- --
- کد کامپایلشده را میتوان گامبهگام اجرا کرد و در هر انتقال کنترل متوقف ساخت.
- --
- یکپارچگی با ویرایشگر Hemlock. در یک فرآیند slave، دستور «edit» باعث میشود ویرایشگر سورسکد مربوط به موقعیت جاری را باز کند. ویرایشگر همچنین میتواند با کلیدهای میانبر C-M-H ورودیهای غیرخطی به اشکالزدا ارسال کند. دستور apropos "debug" را در Hemlock امتحان کنید.
برای جزئیات بیشتر به فصل اشکالزدا در راهنمای کاربر مراجعه کنید. ما در حال کار روی یکپارچهسازی بیشتر اشکالزدا با Hemlock و X Window هستیم.
رابط گرافیکی (THE GRAPHICAL INTERFACE)
محیط CMU Common Lisp دارای یک رابط به Motif است که از نظر عملکردی مشابه CLM است، اما در CMU CL عملکرد بهتری دارد. مراجعه کنید به:
-
doc/motif-toolkit.doc
doc/motif-internals.doc
از این رابط Motif برای نوشتن بازرس (inspector) و اشکالزدای گرافیکی استفاده شده است. همچنین یک کنترلپنل Lisp با امکانات مدیریت ساده فایل، کادرهای محاورهای apropos و بازرس، و کنترلهایی برای تنظیم گزینههای عمومی وجود دارد.
برای ایجاد کنترلپنل، INTERFACE:LISP-CONTROL-PANEL را فراخوانی کنید. هنگامی که متغیر INTERFACE:*INTERFACE-STYLE* برابر با :GRAPHICS (پیشفرض) باشد و متغیر محیطی DISPLAY تعریف شده باشد، با اجرای INSPECT یا هنگام بروز خطا، بازرس و اشکالزدای گرافیکی فراخوانی میشوند. مقادیر مجاز عبارتند از :GRAPHICS و :TTY. اگر مقدار :GRAPHICS باشد اما نمایشگر X در دسترس نباشد، بهطور خودکار از رابط TTY استفاده میشود.
مفسر (THE INTERPRETER)
از نظر معناشناسی Common Lisp، هیچ مفسری وجود ندارد؛ این عملاً یک پیادهسازی صرفاً کامپایلی است. فرمهایی که در حلقه خواندن-ارزیابی-چاپ (REPL) وارد میشوند یا به EVAL ارسال میگردند، در عمل قبل از اجرا کامپایل میشوند. در سطح پیادهسازی، یک مفسر وجود دارد اما روی نمایش داخلی تولیدشده توسط بخش فرانتاند کامپایلر عمل میکند.
توصیه نمیشود که برنامهها با اجرای کل برنامه در حالت تفسیری اشکالزدایی شوند، چرا که کامپایلر Python و اشکالزدا دلایل اصلی استفاده از مفسر برای اشکالزدایی را برطرف کردهاند:
- --
- کد کامپایلشده بررسی خطای بسیار بیشتری نسبت به کد تفسیری انجام میدهد.
- --
- اشکالزدایی کد کامپایلشده به همان سادگی کد تفسیری است.
توجه داشته باشید که اشکالزدا در حال حاضر از تکگامی (single-stepping) پشتیبانی نمیکند. همچنین پیشپردازش مفسر، تعاریف ماکروهای فعال در زمان تعریف یک تابع تفسیری را تثبیت میکند. تا زمانی که پردازش مجدد خودکار هنگام بازتعریف ماکروها پیادهسازی شود، لازم است تعریف یک تابع تفسیری مجدداً ارزیابی شود تا تعاریف ماکروی جدید اعمال گردند.
مستندات (DOCUMENTATION)
مستندات CMU CL بهصورت گزارشهای فنی چاپ شده و (در CMU) در اتاق اسناد در دسترس است:
-
CMU Common Lisp User's Manual
Hemlock User's Manual
Hemlock Command Implementor's Manual
کاربران خارج از CMU میتوانند مستندات را از مسیر doc/ در توزیع باینری دریافت کنند:
- cmu-user.info
- راهنمای کاربر CMU CL در فرمت Gnu Info. فایلهای «cmu-user.info-<N>» زیرفایلهای آن هستند. میتوانید از نگهدارنده EMACS خود بخواهید این فایل را در ریشه info نصب کند یا از دستور info بهصورت «g(...whatever.../doc/cmu-user.info)» استفاده نمایید.
- cmu-user.ps
- راهنمای کاربر CMU CL (۱۴۸ صفحه) در فرمت PostScript. نسخههای سورس LaTeX و DVI نیز موجود است.
- release-notes.txt
- اطلاعات مربوط به تغییرات میان نسخهها.
- hemlock-user.ps
- نسخه PostScript راهنمای کاربر Hemlock (۱۲۴ صفحه).
- hemlock-cim.ps
- نسخه PostScript راهنمای پیادهسازان دستورات Hemlock (۹۶ صفحه).
پشتیبانی (SUPPORT)
گزارشهای باگ باید به نشانی cmucl-bugs@cs.cmu.edu ارسال شوند. لطفاً قبل از ارسال به این لیست، با مسئول محلی CMU CL یا متخصص Common Lisp خود بررسی کنید تا از باگ بودن واقعی مشکل اطمینان حاصل نمایید.
پروژه CMU Common Lisp دیگر بودجه مالی دریافت نمیکند، بنابراین تنها پشتیبانی حداقلی در دانشگاه CMU انجام میشود. یک جامعه اینترنتی از کاربران و توسعهدهندگان cmucl وجود دارد که از طریق گروه خبری comp.lang.lisp و لیست پستی cmucl-bugs@cs.cmu.edu با یکدیگر ارتباط برقرار میکنند.
توزیع (DISTRIBUTION)
محیط CMU Common Lisp یک پیادهسازی در مالکیت عمومی از Common Lisp است. سورسکدها و فایلهای اجرایی از طریق FTP ناشناس بهصورت رایگان در دسترس هستند؛ این نرمافزار «همانگونه که هست (as is)» ارائه میشود و فاقد هرگونه ضمانت است. دانشگاه CMU و نویسندگان هیچ مسئولیتی در قبال پیامدهای ناشی از استفاده از این نرمافزار نمیپذیرند. برای دستورالعملهای FTP به فایل README در توزیع مراجعه کنید.
درباره پروژه CMU COMMON LISP (ABOUT THE CMU COMMON LISP PROJECT)
از نظر سازمانی، CMU Common Lisp بخش کوچک و تا حد زیادی مستقلی از پروژه سیستمعامل Mach بود. پروژه CMU CL بیشتر تلاشی برای توسعه ابزار بود تا یک پروژه پژوهشی صرف. این پروژه با عنوان Spice Lisp آغاز شد که یک پیادهسازی مدرن از لیسپ را برای استفاده در جامعه دانشگاهی CMU فراهم میکرد. CMU CL از اوایل دهه ۱۹۸۰ (همزمان با تلاشها برای استانداردسازی Common Lisp) بهطور مداوم تحت توسعه بوده است. اکثر پیادهسازان CMU Common Lisp اکنون روی محیط Gwydion برای زبان Dylan کار میکنند (به http://legend.gwydion.cs.cmu.edu:8001/gwydion مراجعه کنید).
بودجه CMU CL توسط دارپا (DARPA) و تحت قرارداد «پژوهش روی محاسبات موازی» در دانشگاه CMU تأمین میشد. بهجای انجام تحقیقات محض روی زبانهای برنامهنویسی و محیطها، تأکید بر توسعه ابزارهای کاربردی برنامهنویسی بود. گاهی این امر نیازمند فناوریهای جدید بود، اما بخش عمده کار در ایجاد محیط Common Lisp متمرکز بود که ویژگیهای پیشرفته سیستمهای موجود (هم لیسپ و هم غیرلیسپ) را در خود ادغام میکرد.
از آنجا که سورسکدها بهصورت آزاد در دسترس هستند، CMU Common Lisp به سختافزارهای آزمایشی پورت شده و بهعنوان پایهای برای پژوهش در ساخت زبانهای برنامهنویسی و محیطهای توسعه مورد استفاده قرار گرفته است.
همچنین ببینید (SEE ALSO)
lisp(1), README
The ``CMU Common Lisp User's Manual'',
the ``Hemlock User's Manual'', and
the ``Hemlock Command Implementor's Manual''
| October 15, 1991 | 7th Edition |