۱۱ ویژگی گیجکننده زبانهای برنامهنویسی

زبانهای برنامه نویسی ویژگیهای عجیب و غریب زیادی دارند اما بعضی از آنها بیشتر از بقیه ویژگیها توسعهدهندگان را شگفت زده میکنند.
هر زبان برنامهنویسی ویژگیهای منحصر به فردی مانند قواعد دستوری عجیب، قابلیتهای غیرمعمول یا پیادهسازیهای غیراستاندارد دارد. این موارد باعث میشود توسعهدهندگانی که با یک زبان جدید کار میکنند یا حتی کسانی که کارکشته و باتجربه اند در مواجهه با آنها، با تعجب سر خود را بخارانند! گاهی اوقات این ویژگیهای عجیب ممکن است به یک مشکل جدی برای برنامهنویس تبدیل شوند یا گاهی میتوانند مورد قبول و تحسین وی واقع شوند.
تعداد بیشماری از این ویژگیها وجود دارد اما در اینجا ۱۱ مورد از آنها که بیشتر از بقیه بین توسعهدهندگان بحث میشود آورده شده است:
۱- رشتههای خالی در Oracle SQL به عنوان Null در نظر گرفته میشوند
موضوع: سیستم مدیریت پایگاه داده اوراکل رشتههای کاراکتری با طول صفر را Null درنظر میگیرد. این مساله برخلاف سایر پایگاهدادهها و SQL استاندارد است که در آنها رشته خالی یک مقدار شناخته شده و Null یک مقدار ناشناخته است و این دو مقدار یکسان نیستند. این موضوع تبدیل کد به/از سایر سیستمهای مدیریت پایگاهداده یا نوشتن کدی که از چند سیستم پشتیبانی کند را دشوار میگرداند.
دلیل: این موضوع به نظر میرسد یادگاری است از روزهای اولیه اوراکل که از زمان پیادهسازیهای تجاری اولیه SQL در سال ۱۹۷۹، قبل از حضور SQL استاندارد، بهجا مانده است. اوراکل خود به توسعهدهندگان هشدار میدهد که این رفتار در آینده ممکن است تغییر کند.
۲- + عملگر الحاق در جاوا اسکریپت است
موضوع: عملگر + در جاوا اسکریپت overload شده به طوری که برای اعداد عملگر جمع و برای رشتهها عملگر الحاق است. اگر یک عملوند رشتهای باشد، جاوا اسکریپت متغیر دیگر را نیز به رشته تبدیل کرده و الحاق رخ میدهد پس مثلا ۱+’۱’ = ‘۱۱’
دلیل: این مساله به دلیل loose typing در جاوا اسکریپت است. برای مثال پایتون نیز از عملگر + برای الحاق استفاده میکند اما به دلیل strong type بودن در صورتی که از + بین دو عملوند رشته و عدد استفاده شود خطا داده میشود.
۳- ماژولهای Perl بایستی True برگردانند
موضوع: ماژولهای Perl حتما بایستی با عبارت ۱ خارج شوند. اگر این اتفاق رخ ندهد یا مقدار True برگردانده نشود خطا پرتاب میشود.
دلیل: ماژولهای Perl میتوانند علاوه بر متدها شامل کدهای مقداردهی اولیه نیز باشند. بعد از بارگذاری فایل، Perl با نگاه کردن به خروجی ماژول، چک میکند که چنین کدی با موفقیت اجرا شده باشد. حتی اگر هیچ مقداردهی اولیهای در کار نباشد، Perl کماکان انتظار دارد که جمله نهایی، برگرداندن True باشد یا اینکه خطا میدهد.
۴- Trigraph در c و c++
موضوع: زبان C و C++ شامل مجموعهای از ۹ Trigraph، ترکیبی از سه کاراکتر، میباشد که به طور اتوماتیک قبل از هر پردازشی به یک کاراکتر تبدیل میشود. مثلا ??! که به | تبدیل میشود. این موضوع میتواند رفتارهای پیشبینی نشده ایجاد کند و خواندن کد را دشوارتر سازد.
دلیل: این ویژگی میتوانست به برنامهنویسان اولیهی C کمک کند که کاراکترهای خاصی را که کیبورد آنان پشتیبانی نمیکرد، مانند آکولاد، تولید کنند.
۵- زبان PHP به کوچکی و بزرگی حروف حساس نیست
موضوع: در حالی که در بسیاری از زبانها شناسهها به کوچکی و بزرگی حروف حساس اند، در PHP اسم توابع و اسم کلاسها به کوچکی و بزرگی حروف حساس نیستند. برای هرچه بیشتر سردرگم کردن توسعهدهندگان، اسم متغیرها و ثابتها و ویژگیهای کلاسها(class properties) همگی به کوچکی و بزرگی حروف حساس اند!
دلیل: به احتمال زیاد تبدیل مجموعهای از اسکریپت های CGI به یک زبان برنامهنویسی کامل که منجر به توسعه PHP شده است این مساله را ایجاد کرده است.
۶- در Ruby صفر به عنوان true درنظرگرفته میشود
موضوع: در Ruby بر خلاف بسیاری از زبانهای برنامه نویسی مانند C و C++ و پایتون، مقدار صفر true است.
دلیل: در Ruby فقط مقدار False و nil به عنوان false ارزیابی میشوند و هرچیز دیگر true است و صفر نیز مشابه سایر اعداد true است.
۷- فاصلهها در پایتون بلوکها را مشخص میکنند
موضوع: به جای نشانهگذاری یا استفاده از کلمات کلیدی، پایتون از فاصلهها برای مشخص کردن بلوکی که هر خط کد در آن قرار میگیرد استفاده میکند. بنابراین تعداد نادرستی از فاصلهها میتواند خطا ایجاد کند.
دلیل: افزایش خوانایی و کاهش حجم کد
۸- اندیس گذاری آرایهها در C مشابه عملیات پوینترها رفتار میکنند
موضوع: علاوه بر المان ارجاع i در آرایه a مانند a[i]، سی اجازه میدهد به همان عنصر با i[a] دسترسی داشته باشیم.
دلیل: در C آرایهها مانند اشارهگر به بلوکهایی از حافظه رفتار میکنند بنابراین
a[i] = *(a+i)=*(i+a)=i[a]
۹- متغیرهای از پیش تعریف شده در Perl
موضوع: زبان Perl لیستی طولانی از متغیرهای خاص با اسامی گیج کننده دارد که معادلهای انگلیسی طولانیتری دارند. برای خوانندگانی که با Perl کار نمیکنند، لازم است مرتبا به مستندات Perl رجوع کنند و به همیندلیل خواندن کد سختتر میشود.
دلیل: این متغیرها اطلاعات و دسترسی به جوانب مختلف اجرای برنامه را فراهم میکنند مانند شناسه پردازش ($$)، پیغام خطا ($@) و تطابق با عبارات منظم ($^R)
۱۰- درج اتوماتیک نقطهویرگول (;) در جاوا اسکریپت
موضوع: جاوا اسکریپت به طور اتوماتیک با قراردادن نقطهویرگول در جایی که فکر کند صحیح است، جملات را پایان میدهد، مانند بعد از رفتن به خط بعد. این مساله میتواند بدون نمایش خطا، اجرای برنامه را با مشکل روبرو کند.
دلیل: درج نقطهویرگول به منظور راحتتر کردن قواعد نحوی جاوا اسکریپت برای توسعهدهندگان جدید است.
۱۱- autoboxing جاوا با ذخیره اعداد صحیح
موضوع: جاوا به طور اتوماتیک نوعدادههای اولیه را به objectها تبدیل میکند (autoboxing) مثلا int به Integer تبدیل میشود. به علاوه به طور پیش فرض کلاس Integer، حافظهی نهانی برای ذخیره مقادیر در بازه -۱۲۸ تا ۱۲۷ دارد. این مساله میتواند رفتار پیشبینی نشدهای در هنگام استفاده از == برای مقایسه اعداد صحیح autobox شده با همان مقادیر ایجاد کند. آیا منطقی است کد زیر دو جواب مختلف چاپ کند؟!
Integer a = 1000, b = 1000;
System.out.println(a == b); // false
Integer c = 100, d = 100;
System.out.println(c == d); // true
دلیل: autoboxing حجم کدی که توسعهدهندگان باید بنویسند را کاهش میدهد و ذخیره کردن مقادیر Integerها کارایی را بالا میبرد.
منبع: