این ضمیمه به عنوان کمکی به برنامهنویسان C با شناسایی جنبههای مختلف زبان تهیه شده است.
به این طریق، این ضمیمه به عنوان یک راهنما است و آموزشی نیست.
سرمنشاءهای [برنامه] C
زبان برنامهنویس C در اولین بار به وسیله دنیس ریتج (Dennis Ritch) بر روی یک DEC.PDP-11 که از سیستمعامل UNIX استفاده میکرد.
اختراع گردید.
زبان C دنباله زبانی با نام BCPL است که هنوز در اروپا بیشترین استفاده از آن میشود.
BEPL به وسیله مارتین ریچارد (Martin Richard) به وجود آمد و به وسیله زبان B تحت تأثیر قرار گرفت.
که توسط کن تامپسون (Ken Thompson) اختراع شد و به ایجاد زبان C منجر گردید.
برای سالهای متمادی استاندارد دی فاکتور (de factor) برای C، استانداردی بود که به وسیله ورژن ۵ سیستم عامل UNIX پشتیبانی میشد و در برنامهنویسی C که به وسیله برایان کرنافن (Brian Kernighan) و دنیس ریچ (Dennis Ritch) نوشته شده بود توضیح داده میشد و به وسیله (Englewood cliffs: Prentice-Hall.Inc.,1978) [منتشر گردید].
در هنگامی که محبوبیت کامپیوترهای کوچک افزایش یافت تعداد زیادی از کارکردهای C خلق شد.
اکثریت این کارکردها در سطح کد با یکدیگر قابل تعویض بودند بنابراین چون استانداردی وجود نداشت اختلاف به وجود میآمد.
برای تصحیح این وضعیت کمیتهای در تابستان ۱۹۸۳ به منظور کار بر روی تولید یک ANSI استاندارد تشکیل شد تا اینکه زبان C را توصیف کند.
با این نوشته، استاندارد مورد نظر کامل بوده و سازگاری آن با ANSI بسیار زود مورد قبول واقع شد.
زبان C به عنوان یک زبان استاندارد
زبان C عموماً به عنوان یک زبان ساختاری در نظر گرفته شد، با برخی تشابهات با ALGOL و پاسکال.
اگرچه کلمه ساختار بلوکی مستقیماً برای زبان C در حالت آکادمیک به کار نمیرود، زبان C به صورت غیر رسمی بخشی از آن گروه زبان است، مشخصه بارز زبان ساختاری جداسازی کد و اطلاعات از یکدیگر است.
این مطلب به این معنی است که زبان میتواند همه اطلاعات و دستورالعملهای ضروری برای انجام یک کار مشخص را از بقیه برنامه حذف و پنهان کند.
به طور کلی، جداسازی با مراحل فرعی با انواع عمومیای که دائماند، به دست میآید.
به این طریق، احتمال دارد که مراحل فرعی نوشته شوند تا اینکه وقایعی که در آن اتفاق میافتد باعث تأثیرات فرعی در قسمتهای دیگر برنامه نشود.
استفاده بیش از حد از انواع جهانی (انواعی که در کل برنامه شناخته میشوند) ممکن است باعث نفوذ عوامل به درون برنامه شود با مجاز شناختن تأثیرات ناخواسته در برنامه، در برنامه C همه مراحل فرعی عملکردهای مجزا هستند.
عملکردها بلوکهای سازههای Cاند که در آن همه فعالیتها اتفاق میافتند.
آنها کارهای بخصوص را در برنامه به منظور کدگذاری و تشخیص جداگانه انجام میدهند.
پس از debugging یک عملکرد که فقط انواع عمومی را به کار میگیرد، شما میتوانید بر عملکردی تکیه کنید که در همه موقعیتهای متنوع بدون به وجود آوردن تأثیرات جانبی در بخشهای دیگر برنامه، کار کند.
همه انواع نشان داده شده در این عملکرد بخصوص فقط با آن عملکرد شناخته خواهند شد.
همچنین استفاده از بلوکهای کد در برنامه C ساختار برنامه را به وجود میآورد.
یک بلوک کد عبارتهایی از یک گروه برنامه منطقی متصل است که میتواند به عنوان یک واحد در نظر گرفته شود.
و با قرار گرفتن خطوط کد مابین ابروها بسته و باز مانند زیر قرار میگیرند.
همچنین استفاده از بلوکهای کد در برنامه C ساختار برنامه را به وجود میآورد.
و با قرار گرفتن خطوط کد مابین ابروها بسته و باز مانند زیر قرار میگیرند.
If (x در این مثال، دو عبارت پس از "if" بین ابروها هر دو نمایش داده میشوند اگر X کمتر از ۱۰ باشد.
این دو عبارت با هم با ابروها یک بلوک کد را نشان میدهند.
آنها به یکدیگر متصل میشوند؛ یک عبارت نمیتواند بدون نشان دادن دیگری نشان داده شود.
در C هر عبارت میتواند یا یک عبارت مجزا و یا بلوکی از عبارتها باشد.
استفاده از بلوکهای کد برنامههای خوانایی را با متطقی برای پیروی کردن از آنها، به وجود میآورد.
C یک زبان برنامهنویس است، بر خلاف اکثر برنامههای کامپیوتری سطح بالا، C محدودیتهایی را اعمال میکند که شما میتوانید با آن کار کنید.
با استفاده از C یک برنامهنویس میتواند از برنامهنویسی کد در کل جلوگیری کند، فقط در موارد بسیار ضروری در حقیقت یک انگیزه برای اختراع C به وجود آوردن یک برنامه جایگزین مونتاژ بود.
زبان کامپیوتری از نشانهای مشخص از یک کد دهتایی واقعی استفاده میکند که کامپیوتر مستقیماً آن را به کار میگیرد.
هر زبان کامپیوتری عامل به یک عامل مجزا طراحی میشود تا اینکه کامپیوتر آن را به کار گیرد.
اگر چه یک زبان کامپیوتری به برنامهنویسان قدرت انجام کارها را با بالاترین انعطاف و بهرهمندی میدهد، بسیار آشکار، کارکردن با آن در هنگام ایجاد یک برنامه مشکل است.
به علاوه چون یک زبان کامپیوتری طبیعتاً بی برنامه است، برنامه نهایی تمایل به «یک کد خطی» (Spaghett:code) یک آشفتگی جهشی (tangle of jump) و یا شاخص و خواندن دارد.
این مطالب باعث میشود که این زبان برای خوانده شدن، بهسازی شدن و نگهداری مشکل باشد.
در ابتدا C برای برنامهنویسی سیستمها به کار رفت.
برنامه سیستم قسمتی از یک دسته از برنامهها است که قسمتی از یک سیستم عامل کامپیوتر و یا کاربردهای پشتیبان را شکل میدهد.
مثلا موارد زیر را برنامههای سیستم مینامند.
● سیستمهای عامل ● مترجمها ● سردبیرها ● اسمبلرها ● مؤلفین ● مدیران دادهها هنگامی که C در حال همهگیر شدن بود بسیاری از برنامهنویسان به دلیل کارآیی و قابلیت دسترسی به آن، آن را برای برنامهریزی همه کارها به کار گرفتند.
چون مؤلفین C برای همه کامپیوترها وجود دارند، گرفتن یک کد برای یک ماشین و سپس تألیف و به کار گیری آن در ماشین دیگر با تغییرات بسیار کم یا بدون تغییر، بسیار ساده است.
این دسترسی در زمان و هزینه صرفهجویی میکند.
مؤلفین C همچنین تصمیم به تولید یک کد سریع، متراکم و عینی کردند.
مثلاً سریعتر و کوچکتر از همگردانهای BASIC.
شاید دلیل واقعی اینکه C در همه انواع کارهای برنامهریزی به کار میرود اینست که برنامهنویسان آن را دوست دارند.
C سرعت «همگردانان و گستردگی را دارد، در حالی که فقط تعداد کمی از محدودیتهای پاسکال را دارد.
یک برنامهنویس C میتواند یک آزمایشگاه از کارکردهای به وجود آورد که با شخصیتش سازگاری داشته باشد، زیرا C به همگردانیهای جداگانه ترغیب میکند و اجازه میدهد که پروژههای بزرگ به راحتی مدیریت شوند.
یک بازنگری C همانگونه که تعریف شد استاندارد ANSL مورد نظر، ۳۲ کلمه کلیدی که در جدول A-1 نشان داده شده همراه با دستور فرمان C، برنامه زبان C را تشکیل میدهد.
علاوه بر این کلمات کلیدی چندین همگردانی را C به منظور استفاده در فرآیندها یا محیطهای برنامهنویسی چند زبانه طراحی کرد.
و کلمات زیر برای دستیابی به کنترل بیشتر در راه حافظه و منابع سیستمهای مورد استفاده اضافه شدهاند.
-es -ds -es -ss Cdecl far huge interrupt Near pascal همگی کلمات کلیدی C در حروف نمونه پایینتر قرار دارند.
در C نمونه پایینتر یا بالاتر تفاوتی نمیکند به همین دلیل "else" یک کلمه کلیدی است ELSE اینطور نیست.
تنوعات انواع و اعلامها C پنج نوع اطلاعات درونی دارد، همانگونه که در جدول A-2 نشان داده شده است.
به غیر از کلمه Void همه این اطلاعات ممکن است در کاربرد نشاندهندههای نوع C تعریف شوند.
Signed unsigned short long نامهای متنوع، رشتههایی از حروفاند از یک تا چند مشخصه در طول، استاندارد ANSL میگوید که شش مشخصه مهم خواهند بود.
برای وضوح خط تیره ممکن است برای قسمتی از نام یک متغیر به کار رود مثلاً (first-time) به خاطر داشته باشید که در C متغیرهای بالاتر و پایینتر متفاوتند TEST-test دو نوع متفاوت خواهند بود.
همه متغیرها میبایست قبل از استفاده نشان داده شوند شکل کلی اعلامها اینست.
نوع Variable – name [جدول A-1 صفحه ۳۵۱] [جدول A-2 صفحه ۳۵۲] Data type C مساوی کلمه کلیدی مشخصه char عدد int نقطه شناور float نقطه شناور دوم double ارزش ـ فاقد void مثلا برای نشان دادن X که یک شناور باشد، Y یک عدد باشد و ch که یک مشخصه باشد شما باید float x; int y; charch را تایپ کنید.
به علاوه در نمونههای درون ساختی شما میتوانید ترکیبهایی از نمونههای درون ساخت با استفاده از struct و union به وجود آورید، همچنین میتوانید با استفاده از typedef نامهای جدیدی برای نمونههای متغیر به وجود آورید.
یک «ساختار» کلکسیونی از متغیرهای جمعآوری شده و بایگانی شده تحت یک نام است یک شکل کلی از نمایاندن ساختار struct struct – name {element1; element2;….
element n} struct-variable است.
به عنوان مثال ساختار زیر دارای دو عامل است name یک صفحه مشخصه و balance یک عدد نقطه شناور struct client {char name [80]; float balance;}; است.
برای ارجاع به عوامل ساختار مجزا از نقطه عمل کننده استفاده میشود در صورتیکه ساختار جهانی باشد و یا در عملکردی که به آن ارجاع داده میشود نشان داده شود.
پیکان عملکننده در همه موارد دیگر به کار میرود هنگامی که دو متغیر یا بیشتر یک حافظه مشترک دارند یک union تعریف میشود.
شکل کلی یک union .است Union union-name{element1; element2;… element n}union – variable عوامل یک union یکدیگر را میپوشانند، مثلاً، در زیر یک uniont شبیه به تصویر A-1 در حافظه است.
Union tom {char ch; int x; t;} به متغیرهای مجزا که union را شامل میشوند با استفاده از نقطه عمل کننده ارجاع میشود.
پیکان عمل کننده با نشان دهندههای unionها به کار میروند.
تصویر A-1 صفحه ۳۵۳ نوع دیگر متغیر که میتواند تولید شود فهرست نامیده میشود، که یک فهرست از موضوعات یا ارزشهاست.
(به اینکه چگونه آن را ترجمه کنیم بستگی دارد).
نوع فهرست یک برجستگی موضوعات است که متعلق به شمارش است.
هنگامی که یک متغیر یک نوع شمارش نشان داده میشود، بنابراین مقادیر آن ممکن است آنهایی باشند که شمارش تعریف شدهاند.
برای به وجود آوردن یک شمارش باید از کلمه کلیدی enum.
استفاده کرد.
مثلاً برنامه کوتاه زیر یک شمارش از شهرها را با نام cities و متغیر C از نوع cities را تعریف میکند.
بالاخره برنامه C را، ارزش houston تعیین میکند.
enum cities {, , }; enum cities c; main c, C=; شکل کلی یک نوع شمارش enum name {list of values} است.
نشاندهندههای نوع کلاس ـ ذخیرهسازی انواع نشاندهندههای static, extern,auto,register,const,volatile برای تغییر دادن مسیر C ذخیرهای را برای متغیرهای زیر به وجود میآورد.
اگر کلمه نشاندهنده extern قبل از یک نام متغیر قرار بگیرد مؤلف میداند که متغیر در جای دیگری نشان داده شده است.
نشاندهنده extern معمولاً در هنگامی استفاده میشود که دو یا چند فایل از متغیرهای جهانی مشابه استفاده میکنند.
یک متغیر auto در یک ورودی به سمت بلاک تولید شده و در خروج از میان میرود.
مثلاً همه متغیرهای تعریف شده در یک عملکرد به صورت قرار دادی auto هستند.
اگرچه به ندرت متغیرهای auto میتوانند در سیستمهای مشخص و بخصوص با ارزش باشند در جایی که RAM دارای عرصه کمی باشد.
کلمه register فقط میتواند در عدد صحیح عمومی یا متغیرهای مشخصه مورد استفاده قرار گیرد.
این نشاندهنده مؤلف را وادار میکند که این ارزش را در فهرست cpu و به جای قرار گرفتن در حافظه نگهدارد.
در این کتاب از متغیرهای register برای کنترل گردشی استفاده شد.
مثلاً عملکرد زیر از یک کنترل گردشی register استفاده میکند.
f1 () {register int t; for Lt=0; t (10000;++t) {…}} متغیرهای نوع const ممکن است در طول اجرای برنامه شما تغییر نکنند.
مؤلف برای قرار دادن متغیرهایی از این نوع در ROM ملزم نیست.
مثلاً خط زیر Const int a; شمارشی را به وجود میآورد با نام a که نمیتواند به وسیله برنامه شما تعریف شود، اما میتواند در انواع بیانهای دیگر مورد استفاده قرار گیرد.
یک متغیر Const ارزش خود را یا از یک کامپیوتر آشکار و یا از ابزارآلات سختافزاری وابسته دریافت کند.
گنجایش نوع متغیر Const به افزایش کارآییهای ROM کمک میکند.
نشاندهنده volatile به مؤلف میگوید که ارزش متغیرها در مسیرها ممکن است تغییر کند، نه به صورت آشکاری که به وسیله برنامه تعریف شده باشد.
مثلا آدرس یک متغیر جهانی ممکن است به یک ساعت مشخص سیستم عامل تغییر کند و برای نگهداری ساعت سیستم به کار رود.
در این وضعیت، محتویات متغیر ممکن است بدون هیچگونه عبارت واضحی در برنامه تغییر کند.
برای به دست آوردن کارکرد بالاتر بعضی از مؤلفین به طور اتوماتیک اصطلاحات مشخص را بهینه سازی میکنند با فرض اینکه محتویات یک متغیر در داخل غیرقابل تغییر بوده که...