Cyclone زبان برنامه نویسی
این مقاله ممکن است بهعنوان مقالهای تازهساز بدون تاریخچهٔ مرتبط که مقاله(های) موجود دربارهٔ موضوع (سایکلون (زبان برنامهنویسی) • مقایسهٔ صفحهها) را گسترش نمیدهد، جزئیاتی به آن(ها) اضافه نمیکند یا اطلاعات آن(ها) را بهبود نمیدهد، واجد شرایط معیارهای حذف سریع ویکیپدیا باشد. دقت داشته باشید مقالههای حاصل از تفکیک مقالههای حجیم مشمول این معیار نیستند. اگر عنوان این صفحه میتواند تغییرمسیری قابل قبول به یک صفحهٔ از پیش موجود باشد، صفحه شایستهٔ حذف سریع نیست و بهجای حذف باید تغییر مسیر داده شود. محس م۱۰ را ببینید.
اگر این مقاله واجد شرایط معیارهای حذف سریع نیست، یا این که قصد دارید اشکالات آن را برطرف کنید، لطفاً این اعلان را بردارید، اما این اعلان را نباید از صفحههایی که خودتان ایجاد کردهاید حذف کنید. اگر خودتان این صفحه را ایجاد کردهاید و با دلیل ارائهشده برای حذف موافق نیستید، میتوانید روی دکمهٔ زیر کلیک کنید و با قرار دادن پیامی توضیح دهید که چرا باور دارید این مقاله نباید حذف شود. همچنین میتوانید به صفحهٔ بحث سر بزنید و ببینید که آیا پاسخی به پیام شما داده شده است یا خیر. دقت کنید که اگر این مقاله بهطور واضحی واجد شرایط حذف سریع باشد، یا توضیحات درج شده در صفحهٔ بحث کافی نباشند، این مقاله هر لحظه ممکن است حذف شود. قابل توجه نگارندهٔ صفحه: شما هنوز صفحهٔ بحث این مقاله را ویرایش نکردهاید. اگر میخواهید با این حذف سریع مخالفت کنید، با کلیک بر روی دکمهٔ بالا این امکان را خواهید داشت تا پیامی در صفحهٔ بحث قرار دهید و توضیح دهید که چرا فکر میکنید این مقاله نباید حذف شود. اگر پیش از این پیامی در صفحهٔ بحث قرار دادهاید، اما این پیام همچنان به شما نمایش داده میشود، احتمالاً لازم است میانگیر صفحه را خالی کنید. این صفحه آخرین بار در ۳۰ سپتامبر ۲۰۲۴، ساعت ۱۸:۲۰ (UTC) (۲ ثانیه پیش) توسط Toggle88 (مشارکتها | سیاههها) ویرایش شده است |
AT&T Labs | طراحی شده توسط |
دانشگاه کرنل | توسعه دهنده |
2002، 21 سال قبل | اولین بار در این تاریخ دیده شد |
1.0، 8 می 2006؛ 17 سال قبل | انتشار باثبات |
http://cyclone.thelanguage.org/ | وبسایت |
C | تحت تاثیر قرار گرفته از |
راست, Project Verona | تحت تاثیر قرار داد |
زبان برنامه نویسی Cyclone یک زیرمجموعه امن از زبان C در نظر گرفته شده. Cyclone به منظور جلوگیری از سرریز بافر و دیگر آسیب پذیری هایی که در برنامه های C احتمال وقوع دارندف طراحی شده است، بدون از دست دادن قدرت و آسودگیِ زبان C به عنوان یک ابزار برنامه نویسی سیستمی.
توسعه Cyclone به عنوان یک پروژه مشترک بین AT&T Labs Research و تیم گِرِگ موریست در دانشگاه کرنل در سال 2001 آغاز شد.
ویژگی های زبان
ویرایشزبان Cyclone برای جلوگیری از بعضی دام های رایج زبان C تلاش می کند، در حالی که هم چنان جلوه و عملکردش را حفظ کرده. به این منظور، Cyclone محدودیت های زیر را در برنامه ها قرار می دهد:
- چک های
NULL
برای جلوگیری از خطای بخش بندی(Segmentation fault) درج می شوند - اشاره گر حسابی محدود شده است
- اشاره گر ها باید قبل از استفاده مقدار دهی اولیه شوند ( این مورد توسط آنالیز تخصیص قطعی اجرا می شود)
- اشارهگرهای معلق از طریق آنالیز منطقه ای و محدودیت های روی
()free
جلوگیری می شوند - تنها قالب ها و اتصالات "امن" مجاز هستند
goto
در محدوده ها غیر مجاز هستند- برچسب های
switch
در محدوده های متفاوت غیر مجاز هستند - توابعی که یک اشاره گر بر می گردانند باید
return
را اجرا کنند - setjmp و longjmp پشتیبانی نمی شوند
برای حفظ مجموعه ابزاری که برنامه نویسان C به آن عادت دارند، Cyclone افزونه های زیر را فراهم می کند:
- اشاره گر های Never-null نیاز به چک کردن
null
ندارند - اشاره گر های "چاق"، اشاره گر حسابی را همراه بررسی مرز ها در زمان اجرا پشتیبانی می کند
- ناحیه های قابل رشد فرمی از مدیریت امن حافظه را پشتیانی می کند
- بازیافت حافظه برای مقادیر تخصیص یافته به پشته
- اتصالات علامت گذاری شده از انواع متفاوت آرگومان ها پشتیبانی می کنند
- تزریقات، کمک به خودکار سازی عمل استفاده از اتصالات علامت گذاری شده برای برنامه نویسان می کنند
- چندریختی بعضی از استفاده های
* void
را جایگزین می کند - varargs به عنوان اشاره گر های چاق اجرا می شوند
- استثنا ها بعضی از استفاده های
setjmp
وlongjmp
جایگزین می کنند
برای معرفی بهتر و سطح بالاتر به زبان Cyclone، دلیل وجود Cyclone و منبع تمام این لیست ها، این مقاله را مشاهده کنید.
Cyclone در کل بسیار شبیه به C است، اما باید به عنوان یک زبان شبه-C دیده شود.
انواع اشاره گر ها
ویرایشCyclone سه نوع اشاره گر را پیاده سازی می کند:
*
(نوع معمولی)@
(اشاره گر نوع never-NULL
)?
(تنها نوع اشاره گر حسابی مجاز، اشاره گر های "چاق")
هدف از معرفی کردن این اشاره گر های جدید برای جلوگیزی از مشکلات رایج به هنگام استفاده از اشاره گر ها است. برای مثال یک تابع را در نظر بگیرید به نام foo
که یک اشاره گر به یک int است:
int foo(int *);
اگرچه فردی که تابع foo
را نوشته می توانست چک کردن NULL
را درج کند، اما بنا به دلایل عملکرد فرض می کنیم که اینکار را انجام نداده است.
صدا زدن foo(NULL)
به عنوان یک رفتار نامشخص نتیجه خواهد داد (معمولا، اگرچه لازم نیست، یک سیگنال خطای بخش بندی به برنامه در حال ارسال است). برای جلوگیری از مشکلاتی نظیر این، Cyclone اشاره گر @
را معرفی می کند، که هیچگاه نمی تواند NULL
باشد. بنابراین، ورژن امنِ تابع foo
به این صورت در می آید:
int foo(int @);
برای جلوگیری از رفتار نامشخص فوق الذکر، این به کامپایلر Cyclone می گوید که آرگومان ورودی foo
هیچ گاه نباید NULL
باشد. تغییر ساده *
به @
برنامه نویس را از نوشتن کد برای چک کردن NULL
خلاص می کند و سیستم عامل را برای مجبور بودن به دام انداختن اشاره گر NULL
عدم ارجاعات. این محدودیت اضافه، با این حال می تواند نسبتا مانع بزرگی برای بیشتر برنامه نویسان C باشد، که به دستکاری کردن اشاره گر هایشان مستقیما با اعمال حسابی عادت کردند. اگرچه این مطلوب است، ولی می تواند به سرریز بافر , و دیگر اشتباهات یک به یک مانند ختم شود. برای پیشگیری این مشکل، اشاره گر نوع ?
با یک مرز شناخته شده محدود می شود، اندازه آرایه. اگرچه این به دلیل اطلاعات اضافی ذخیره شده در مورد اشاره گر، سربار اضافه می کند، ایمنی و امنیت آن را بهبود می بخشد. به عنوان یک مثال ساده تابع strlen
در نظر بگیرید که در C نوشته شده است:
int strlen(const char *s)
{
int i = 0;
if (s == NULL)
return 0;
while (s[i] != '\0') {
i++;
}
return i;
}
این تابع فرض میکند که رشتهای که در آن ارسال میشود با '\0'
NULL
خاتمه مییابد. با این حال، چه اتفاقی می افتد اگر char buf[6] = {'h','e','l','l','o','!'};
به این رشته ارسال شود؟ این در C کاملاً قانونی است، اما باعث می شود strlen
از طریق حافظه تکرار شود که لزوماً با رشته s
مرتبط نیست. توابعی مانند strnlen
وجود دارد که می توان از آنها برای جلوگیری از چنین مشکلاتی استفاده کرد، اما این توابع با هر پیاده سازی ANSI C استاندارد نیستند. نسخه Cyclone strlen
چندان متفاوت از نسخه C نیست:
int strlen(const char ? s)
{
int i, n = s.size;
if (s == NULL)
return 0;
for (i = 0; i < n; i++, s++) {
if (*s == '\0')
return i;
}
return n;
}
در اینجا، strlen
خود را با طول آرایه ارسال شده به آن محدود می کند، بنابراین از طول واقعی عبور نمی کند. هر یک از انواع نوع اشاره گر را می توان با خیال راحت به هر یک از موارد دیگر فرستاد، و آرایه ها و رشته ها به طور خودکار به ?
توسط کامپایلر تبدیل می شوند. (تغییر دادن از ?
به @
هر دو چک کردن NULL
و یک چک کردن مرزی را فراخوانی می کند. تغییر دادن از *
به ?
به هر حال نتیجه در هیچ چک نکردنی می دهد؛ در نتیجه اشاره گر ?
اندازه 1 دارد.)
اشاره گر های معلق و آنالیز ناحیه ای
ویرایشکد زیر را در C در نظر بگیرید:
char *itoa(int i)
{
char buf[20];
sprintf(buf,"%d",i);
return buf;
}
تابع itoa
آرایه ای از کاراکترهای buf
را در پشته تخصیص می دهد و یک اشاره گر را به شروع buf
برمی گرداند. با این حال، حافظه ای که در پشته برای buf
استفاده می شود، زمانی که تابع برمی گرداند، تخصیص داده می شود، بنابراین مقدار بازگشتی نمی تواند به طور ایمن خارج از تابع استفاده شود. در حالی که مجموعه کامپایلر جی سی سی و سایر کامپایلرها در مورد چنین کدی هشدار می دهند، موارد زیر معمولاً بدون اخطار کامپایل می شوند:
char *itoa(int i)
{
char buf[20], *z;
sprintf(buf,"%d",i);
z = buf;
return z;
}
مجموعه کامپایلر جی سی سی می تواند اخطارهایی را برای چنین کدهایی به عنوان اثر جانبی گزینه -O2
یا -O3
ایجاد کند، اما هیچ تضمینی وجود ندارد که همه این خطاها شناسایی شوند. Cyclone تجزیه و تحلیل منطقه ای هر بخش از کد را انجام می دهد و از نشانگرهای معلق مانند آنچه از این نسخه از itoa
برگردانده شده است جلوگیری می کند. همه متغیرهای محلی در یک محدوده معین به عنوان بخشی از همان منطقه، جدا از پشته یا هر منطقه محلی دیگر در نظر گرفته می شوند. بنابراین، هنگام تجزیه و تحلیل itoa
، کامپایلر Cyclone می بیند که z
یک اشاره گر در پشته محلی است و یک خطا را گزارش می دهد.
همچنین ببینید
ویرایشمنابع
ویرایش- "Open Access Cyclone (programming language) Journals · OA.mg". oa mg
- "Cyclone"و "Cornell University"
لینک های خارجی
ویرایش- صفحه اصلی وبسایت Cyclone
- وبسایت قدیمی
- Cyclone - مخازن و کد منبع
- Cyclone - سوالات متداول
- Cyclone برای برنامه نویسان C
- راهنمای کاربری Cyclone
- Cyclone: یک زیر زبان Type-safe از C توسط دن گروسمن، مایکل هیکس، ترور جیم و گِرِگ موریست - انتشار شده در ژانویه 2005
ارائه ها: