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