داستان از جایی شروع شد که در مقاله چطور کاری کنیم لیسپ سریعتر از سی اجرا شود؟ خواندم که کامن لیسپ بنا به خواست برنامهنویس میتواند «زبانی با تعیین نوع پویا(dynamic) ویا ایستا(static) باشد» که کنجکاوی بنده برانگیخته شد(بخوانید فضولیام گل کرد!) و در کانال #clschool روی شبکهی آیآرسی فرینود پرسیدم که در ادامه نتیجه بحث خدمتتون عرض خواهد شد.
زمانی که از مردمان لیسپ این پرسش را پرسیدم اول بهم گفتند که بله کمابیش اینطور هست و افزودند که «سمانتیک زبان به صورت پویا مشخص شده. اما اگر کامپایلر زمان کامپایل بتونه ثابت کنه نوع مقادیر زمان اجرا چی میشه،میتونه کد تعیین نوع شده ایستا تولید کنه.برنامهنویس هم میتونه به کامپایلر با استفاده از تعاریف نوع کمک کنه.» و بعد هم گفتند که چون زبان بسیار پویا هست سخت میتوان کدی نوشت که [تماما] ایستا تعیین نوع شود. علاوه بر آن در کامن لیسپ میتوان بخشی از کد را ایستا و بخشی را پویا نوشت.
با استفاده از DECLARE در کامن لیسپ میتوانید به کامپایلر بگویید تمام اشیا یا مقادیری که به فلان متغیر نسبت داده میشوند از یک نوع خاص هستند.با وجودی که برنامهنویس [در حالت عادی] به کامپایلر دروغ نمیگوید اما ممکن است خطا داشته باشد و اینجاست که «چک نوع» توسط کامپایلر خطاها را تشخیص داده و در زمان اجرا آنها را گوشزد میکند.میتوانید با استفاده از DECLAIM و بهینهسازی تکهای از کد یا تمام برنامه برای سرعت،این چک نوع را غیرفعال کنید.در عوض پرفرمنسی که بدست خواهید آورد،کد شما همانند یک کد سی رفتار تعریف نشده خواهد داشت اگر خطا کنید!ضمن اینکه کامپایلر SBCL میتواند از یک کامپایلر سی هم «ناامن» تر باشد اگر با DECLAIM کاری کنید safety صفر باشد.
نهایتا برای اطلاعات بیشتر در مورد بهینهسازی کد کامن لیسپ برای پرفرمنس به مقالهی مذکور در اول مطلب مراجعه کنید.