C – ۴

استانداردها

اصولا استانداردها برای چی هستند؟ فکر کنید هرکس هرجوری خواست با قواعد خودش برنامه بنویسه. هر کس به میل خود به روش خودش متغیر تعریف کنه. یکی پرانتز بزاره یکی آکولاد. یکی این کارو بکنه یکی اون کار. خب سنگ رو سنگ بند نمیشه. برای داشتن یک برنامه که بشه در کل دنیا ازش بهره برد باید استانداردی داشت که در کل دنیا تعریف شده باشه و مورد استفاده قرار بگیره.
اولین نیمچه استانداردی(چون واقعا استاندارد نبود بلکه پیروی از روش بود) که در مورد C اتخاذ شد استاندارد K&R مخفف کارنیگان و ریچی بود. این استاندارد دقیقا پیروی از شیوه برنامه نویسی این دو والا مقام در کتابشون بود به نام  The C Programming Language که در سال ۱۹۷۸ منتشر شد. همچنین یک فصل به نام C Reference Manual به این کتاب ضمیمه شد که راهنمایی برای نحوه پیاده سازی کامپایلر بود برای کسانی که میخواستند کامپایلر بنویسن برای C. به هر حال هرچه زمان پیش میرفت و برنامه نویسان و شرکت های بیشتری به سمت C می آمدند نیاز به یک استاندارد کامل و جامع و به روز بیشتر حس میشد. تا اینکه موسسه استاندردهای ملی امریکا کمیته ای را به نام X3J11 ایجاد کرد تا استاندارد جدیدی را برای زبان C تعریف کنند که استانداردشان را رسما در سال ۱۹۸۹ تصویب و منتشرکردند. در این استاندارد که به نام ANSI C شناخته میشد هم استانداردهای زبان C و هم استانداردهای کتابخانه های C بیان شده بود. در سال ۱۹۹۰ سازمان بین المللی استانداردسازی نیز استانداردی را تحت عنوان ISO C تعریف کرد. استاندارد ISO C در واقع تفاوتی با استاندارد ANSI C نداشت. اسم استاندارد ANSI C را C89 و اسم استاندارد ISO C را C90 گذاشتند(سالهایی که رسمی تعریف شدند). در کتابهای برنامه نویسی ممکن است به عبارت ANSI/ISO C89/90 برخورد بکنید که خود گواهی بر این است که این دو استاندارد تفاوتی ندارند و صرفا استاندارد دوم، استاندارد اول را جهان شمول عنوان کرده است.
اهدافی که در این دو استاندارد عنوان شده بود به این قرار بود:

  • به برنامه نویس اعتماد کنید
  • از قرار دادن هر آنچه که برنامه نویس را محدود میکند بپرهیزید
  • زبان C را تا حد ممکن ساده و کوچک نگاه دارید
  • فقط یک راه برای انجام یک عملیات فراهم کنید(زبان را کلاف سر در گم نکنید)
  • برنامه ها را بگونه ای بنویسید که بالاترین سرعت را داشته باشند. حتی اگر با این کار از پورتابل بودن برنامه کاسته شود(کاری که در درایورها انجام میشود. زیرا سرعت پاسخگویی یک درایور بسیار مهمتر از قابلیت حمل آن است)

منظور کمیته از بند آخر این است که برنامه ها برای سیستم هدف کاملا بهینه و سریع نوشته شوند. در طول این تاپیک ما به چنین مواردی به کرات برخورد میکنیم.

استاندارد C99

در سال ۱۹۹۴ دو کمیته ANSI و ISO با هم تلفیق شدند و کمیته ای را تحت عنوان کمیته C9X شکل دادند. این کمیته جدید شروع به ویرایش و بهبود استاندارد قبلی کرد. در این استاندارد هیچ یک از گزینه های استاندارد قبلی پاک نشد و مورد جدیدی نیز افزوده نشد و فقط پاره ای از بهبودها نظیر:

  • پشتیبانی از کارکترهای بین المللی و محلی کشورها
  • کدها و اعلان های متصل. اعلان متغیر دیگر وابسته به محدوده فایل نباشد
  • چند نوع داده جدید از جمله نوع داده بولی, complex و long long int
  • افزودن کامنتهای یک خطی //
  • افزودن فایلهای سرآیند جدید

و موارد جزئی دیگری افزوده شدند.

استاندارد C11

استانداردسازی یک امر دائمیست. نه به این دلیل که استانداردهای قبلی ناقص و ضعیف باشند. بلکه به این دلیل که به مرور زمان مفاهیم و تکنولوژی هایی زاده میشوند که در گذشته نبوده اند، مانند برنامه نویسی همزمان یا concurrent programming که در آن از چندین پردازنده برای برنامه نویسی استفاده میشود. به همین دلیل کمیته استانداردسازی زبان C در سال ۲۰۰۷ استاندارد دیگری را تحت عنوان C1X پدید آورد. لازم به ذکر است که استانداردها با همدیگر سازش دارند. بگونه ای میتوان اکثر برنامه های قدیدمی را در کامپایلرهای مبتنی بر استانداردهای جدید کامپایل کرد، اما نه بالعکس. اما توصیه میشود همیشه طبق اخرین استاندارهای روز که در مستندات هر کامپایلر ذکر شده است برنامه بنویسید. باری، اولین نسخه ازین استاندارد که منتشر شد استاندارد C11 بود.

استاندارد C18

ین استاندارد که تازه ترین استاندارد زبان C است مورد جدیدی به استاندارد C11 اضانه نکرده است و صرفا شامل بهبود ویژگی‌های قبلی و رفع نواقص استاندارهای قبلی بوده است. استاندارد C18 از LLVM Clang 6.0 و GCC 8.0 به بعد پشتیبانی میشود.

همیشه سعی کنید از استانداردهای روز پیروی کنید تا به مشکل نخورید. یک تمرین خوب این است که در مخازن و کتابها برنامه های قدیمی C را بیابید و با استانداردهای جدید بازنویسی کنید. البته دقت کنید که کرنل لینوکس یک شیوه خاص از قواعد رو در C پیش گرفته و با اون پیش میره که اندکی با استاندارد فعلی تفاوت داره. کرنل لینوکس یه ساختار مستقل stand-alone است که بررسیش میکنیم. بطور کلی سعی میکنم مثالها و تمرینهامون رو از سورس کرنل بگیرم و حلشون کنیم.

درباره نویسنده: Hoshyar Karimi

مطالب زیر را حتما بخوانید

1 Comment

  1. خیلی عالیه. واقعا عالیه!
    اگه تا قسمت ۱۰م رو نخونم نمی تونم بذارمش کنار!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *