برچسب ها: تاریخچه استانداردسازی C، ANSI C، ISO C، C99، C11، ISO/IEC C، C.

ریشه ها

C و یک "محصول مشترک" از ایجاد سیستم عامل یونیکس است که در آزمایشگاه های بل توسط کن تامپسون، دنیس ریچی و همکاران توسعه داده شد. تامپسون به تنهایی نسخه اصلی یونیکس را نوشت که روی DEC PDP-7 اجرا می شد، یکی از اولین کامپیوترهای کوچک با حافظه اصلی تنها 8K کلمه (به هر حال سال 1969 بود).

مانند سایر سیستم عامل های روز، یونیکس به زبان اسمبلی نوشته می شد. اشکال زدایی برنامه های زبان اسمبلی یک درد واقعی است و بهبود آن دشوار است و یونیکس نیز از این قاعده مستثنی نبود. تامپسون تصمیم گرفت که یک زبان سطح بالا برای توسعه بیشتر سیستم عامل مورد نیاز است و یک زبان کوچک را ارائه کرد. B. تامپسون زبان BCPL را انتخاب کرد، زبانی برای برنامه نویسی سیستمدر اواسط دهه 60 توسعه یافت. BCPL، به نوبه خود، از Algol 60، یکی از قدیمی ترین (و تاثیرگذارترین) زبان ها سرچشمه می گیرد.

ریچی به زودی به پروژه یونیکس پیوست و شروع به نوشتن در B کرد. در سال 1970، آزمایشگاه بل یک PDP-11 را برای این پروژه خریداری کرد. از آنجایی که B آماده اجرا بر روی PDP-11 بود، تامپسون بخشی از یونیکس را به B بازنویسی کرد. در سال 1971، مشخص شد که B برای PDP-11 کاملا مناسب نیست، بنابراین ریچی شروع به ایجاد یک نسخه توسعه یافته از B کرد. ابتدا آن را NB (New B) نامیدند، اما زمانی که زبان بسیار متفاوت از B شد، نام آن به C تغییر کرد. در سال 1973، زبان به اندازه‌ای پایدار بود که یونیکس می‌توانست در آن بازنویسی شود. انتقال به C یک مزیت مهم داشت: قابلیت حمل. با نوشتن یک کامپایلر C برای هر یک از ماشین ها در آزمایشگاه های بل، تیم توسعه می تواند یونیکس را به آنها پورت کند.

استاندارد سازی

C در دهه 70 به تکامل خود ادامه داد، به ویژه بین سال های 1977 و 1979، زمانی که اولین کتاب C منتشر شد. زبان برنامه نویسی C، نوشته شده توسط برایان کرنیگان و دنیس ریچی و منتشر شده در سال 1978، به کتاب مقدس برنامه نویسان C تبدیل شد. در غیاب یک استاندارد رسمی، این کتاب - که با نام K&R یا همان طور که طرفداران C دوست دارند آن را "کتاب سفید" نامیده می شود - به استاندارد واقعی تبدیل شده است. در دهه 70 تعداد کمی برنامه نویس C وجود داشت و بیشتر آنها کاربران یونیکس بودند. با این حال، در دهه 80، C از محدوده های باریک دنیای یونیکس فراتر رفت. کامپایلرهای C بر روی ماشین های مختلفی که سیستم عامل های مختلف را اجرا می کنند در دسترس هستند. به طور خاص، C شروع به گسترش در پلتفرم رایانه شخصی IBM به سرعت در حال توسعه کرد.

همراه با افزایش محبوبیت، مشکلاتی نیز به وجود آمد. برنامه نویسانی که کامپایلرهای جدید نوشتند، زبانی را که در K&R توضیح داده شده است، مبنایی قرار دادند. متأسفانه، در K&R، برخی از ویژگی های زبان به طور مبهم توصیف شده است، بنابراین کامپایلرها اغلب آنها را به صلاحدید خود تفسیر می کنند. همچنین، این کتاب تمایز روشنی بین ویژگی های زبان و ویژگی های سیستم عامل یونیکس قائل نشده است. بدتر از آن، پس از انتشار K&R، C به توسعه خود ادامه داد: ویژگی های جدیدی به آن اضافه شد و ویژگی های قدیمی از آن حذف شد. به زودی نیاز آشکار به توصیفی جامع، دقیق و به روز از زبان احساس شد. بدون چنین استانداردی، گویش‌هایی از زبان ظاهر می‌شوند که با قابلیت حمل، قوی‌ترین جنبه زبان، تداخل می‌کنند.

توسعه استاندارد C آمریکا در سال 1983 تحت نظارت موسسه ملی استاندارد آمریکا (ANSI) آغاز شد. پس از بازنگری های فراوان، این استاندارد در سال 1988 تکمیل شد و به طور رسمی در دسامبر 1989 به عنوان ANSI X3.159-1989 پذیرفته شد. در سال 1990 توسط سازمان بین المللی استاندارد (ISO) به عنوان استاندارد بین المللی ISO/IEC 9899:1990 تایید شد. این نسخه از زبان معمولاً به‌عنوان C89 یا C90 شناخته می‌شود تا با نسخه اصلی C که معمولاً K&R C نامیده می‌شود، اشتباه نشود.

این زبان در سال 1995 دستخوش تغییرات جزئی شد (تغییرات در سندی که معمولاً اصلاحیه 1 نامیده می شود توضیح داده شده است). تغییرات مهم تری در سال 1999 رخ داد، زمانی که استاندارد ISO/IEC 9899:1999 منتشر شد. زبان توصیف شده در این استاندارد معمولاً به عنوان C99 شناخته می شود. اصطلاحات «ANSI C»، «ANSI/ISO C» و «ISO C» که زمانی برای توصیف C99 استفاده می‌شد، به دلیل وجود دو استاندارد مبهم هستند.

در سال 2011، همراه با ویرایش زبان C++، استاندارد C11 منتشر شد. با وجود وجود استاندارد 11، هنوز بسیاری از کامپایلرها حتی از نسخه های C99 به طور کامل پشتیبانی نمی کنند، بنابراین استفاده از استاندارد C11 به صراحت بیان خواهد شد.

زمانی که شهرت شما برای سود شما کار می کند

مدیریت جامعه

ایجاد لحن صدا. پردازش سریع نظرات منفی و مثبت از طرف برند. مدیریت ارتباطات با توجه به سناریوهای داده شده. انتقال لحظات مشکل ساز به مشتری.

عوامل نفوذ

ایجاد و پیاده سازی "مجازی" در انجمن ها و در در شبکه های اجتماعی. پایگاه داده ای از حساب های پمپ شده و زنده در بیش از 300 سایت وجود دارد.

کار با نظرات

نوشتن، هماهنگی و ارسال نظرات برند در سایت های برتر و سایت های نقد و بررسی. پردازش و تداخل نظرات منفی با نظرات مثبت. در نتیجه نتایج جستجومنفی به تدریج جایگزین می شود.

نظارت بر رسانه های اجتماعی

کار با سیستم های Youscan، IQbuzz، Brand Analytics. کنترل نام تجاری شناسایی بینش های کلیدی، پاسخ سریع به منفی گرایی. ابزاری ضروری برای کنترل بازخورداز مشتریان

تجزیه و تحلیل و تحقیق

تحلیل و بررسی زمینه اطلاعات، تحقیق دسته بندی محصول و رقبای اصلی برند. این ابزار وظایفی از کنترل شهرت و بازاریابی در زمان واقعی تا تحقیقات عمیق را پوشش می دهد.

SERM

تحلیل تفصیلینتایج جستجو برای کلمات کلیدی انتخاب شده مجموعه ای از منشن ها در مورد مشتری در شبکه های اجتماعی، انجمن ها و سایت های خبری. توسعه استراتژی برای مقابله با اطلاعات منفی. مشتری یک مشکل کاملاً کنترل شده در TOP10 دریافت می کند.

وضعیت زبان C چگونه است؟ از لحاظ تاریخی، این زبان از سیستم عامل یونیکس که اکنون در حال تولد دوباره خود است جدایی ناپذیر است. دهه 60 دوران شکل گیری سیستم عامل ها و زبان های برنامه نویسی سطح بالا بود. در آن زمان، سیستم عامل و کامپایلرها به طور مستقل برای هر نوع کامپیوتر، و اغلب حتی زبان های برنامه نویسی خودشان (برای مثال، PL/I) را به خاطر بسپارید. در عین حال کلیت مشکلاتی که در این مورد به وجود می آید از قبل آشکار شده است. پاسخ به تحقق این اشتراک، تلاش برای ایجاد یک موبایل جهانی بود سیستم عامل، و برای این کار کمتر جهانی و زبان موبایلبرنامه نويسي. C به آن زبان تبدیل شد و یونیکس به اولین سیستم عاملی تبدیل شد که تقریباً به طور کامل به یک زبان سطح بالا نوشته شد.

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

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

با این حال، عامل دیگری وجود دارد که موفقیت زبان را تعیین می کند. سازندگان به طرز بسیار ماهرانه ای ویژگی های وابسته به ماشین و مستقل را در آن جدا کردند. به لطف این، بیشتر برنامه ها را می توان به صورت جهانی نوشت - عملکرد آنها به معماری پردازنده و حافظه بستگی ندارد. چند بخش وابسته به سخت افزار کد را می توان در آن بومی سازی کرد ماژول های فردی. و با استفاده از پیش پردازنده، می توانید ماژول هایی ایجاد کنید که در صورت کامپایل شدن در آنها پلتفرم های مختلفکد وابسته به ماشین مربوطه را تولید می کند.

سینتکس زبان C جنجال زیادی به پا کرد، اختصارات به کار رفته در آن در صورت استفاده بیش از حد می تواند برنامه را کاملا ناخوانا کند. اما، همانطور که دایکسترا گفت، - ابزارها برای این واقعیت که از آنها بی سواد استفاده می شود مقصر نیستند. در واقع، اختصارات نحوی ارائه شده در C با موقعیت‌های کلیشه‌ای که اغلب در عمل با آن مواجه می‌شوند، مطابقت دارد. اگر اختصارات را اصطلاحاتی برای بیان رسا و فشرده چنین موقعیت هایی در نظر بگیریم، سودمندی آنها بی قید و شرط و آشکار می شود.

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

مانند همه زبان‌ها، زبان C در طول زمان تکامل یافته است، اما بیشتر پیشرفت‌ها اساسی نبوده است. مهمترین آنها را شاید باید معرفی یک مشخصات دقیق از انواع تابع در نظر گرفت، که به طور قابل توجهی قابلیت اطمینان تعامل بین ماژول ها را در C افزایش داد. همه این پیشرفت ها در سال 1989 در استاندارد ANSI گنجانده شدند، که هنوز هم این استاندارد را تعریف می کند. زبان C.

اما اگر همه چیز خیلی بی ابر است، پس چرا از همه زبان های دیگر استفاده می شود، چه چیزی وجود آنها را پشتیبانی می کند؟ پاشنه آشیل زبان C این بود که برای کارهایی که دهه 90 در دستور کار قرار داده بودند بسیار سطح پایین بود. و این مشکل دو جنبه دارد. از یک طرف، ابزارهای سطح پایین در زبان ساخته شده بودند - اول از همه، این زبان با حافظه و حساب آدرس کار می کرد. بی جهت نیست که تغییر ظرفیت پردازنده ها تأثیر بسیار دردناکی بر بسیاری از برنامه های C دارد. از سوی دیگر، C فاقد ابزارهای سطح بالا است - انواع داده ها و اشیاء انتزاعی، چند شکلی، مدیریت استثنا. در نتیجه، در برنامه های C، تکنیک اجرای یک کار اغلب بر محتوای آن غالب است.

اولین تلاش ها برای اصلاح این کاستی ها در اوایل دهه 1980 آغاز شد. حتی در آن زمان، Bjorn Stroustrup در AT & T Bell Labs شروع به توسعه پسوند زبان C تحت نام شرطی کرد. سبک توسعه کاملاً با روحی که خود زبان C در آن ایجاد شد مطابقت داشت - ویژگی های خاصی به آن وارد شد تا آن را بیشتر کند. کار راحتافراد و گروه های خاص اولین مترجم تجاری زبان جدید به نام C++ در سال 1983 ظاهر شد. این یک پیش پردازشگر بود که برنامه را به کد C ترجمه کرد. با این حال، انتشار کتاب استروستروپ در سال 1985 را می توان تولد واقعی این زبان در نظر گرفت. از این لحظه بود که C++ شروع به محبوبیت جهانی کرد.

نوآوری اصلی C++ مکانیسم کلاس است که امکان تعریف و استفاده از انواع داده های جدید را فراهم می کند. برنامه نویس نمایش داخلی یک شی کلاس و مجموعه ای از توابع متد را برای دسترسی به این نمایش توصیف می کند. یکی از اهداف گرامی در هنگام ایجاد C ++ تمایل به افزایش درصد استفاده مجدد از کدهای قبلاً نوشته شده بود. مفهوم کلاس ها مکانیزم ارثی را برای این کار ارائه می دهد. وراثت به شما اجازه می دهد تا کلاس های جدید (مشتق شده) با نمایش گسترده و متدهای اصلاح شده بدون تأثیر بر کد کامپایل شده کلاس های اصلی (پایه) ایجاد کنید. در عین حال، وراثت یکی از مکانیسم‌های پیاده‌سازی چندشکلی را فراهم می‌کند - مفهوم اساسی برنامه‌نویسی شی گرا، که بر اساس آن، به منظور انجام همان نوع پردازش انواع متفاوتداده ها، از همان کد می توان استفاده کرد. در واقع، پلی مورفیسم نیز یکی از روش‌های اطمینان از استفاده مجدد از کد است.

معرفی کلاس ها تمام نوآوری های زبان C++ را تمام نمی کند. این دارای یک مکانیسم مدیریت استثنایی ساختاریافته کامل است که عدم وجود آن در C نوشتن برنامه های قابل اعتماد را بسیار دشوارتر می کند، یک موتور الگو، یک مکانیسم پیچیده تولید ماکرو که عمیقاً در زبان تعبیه شده است، و مسیر دیگری را برای استفاده مجدد از کد باز می کند. و خیلی بیشتر.

بنابراین، خط کلی توسعه زبان با هدف گسترش قابلیت‌های خود با معرفی ساختارهای سطح بالا جدید در حالی که تا حد امکان سازگاری کامل با عملیات ANSI C را حفظ می‌کند، به طوری که برنامه‌نویس در واقع کار مستقیم با حافظه و موجودیت‌های وابسته به سیستم را متوقف می‌کند. با این حال، این زبان دارای مکانیسم‌هایی نیست که توسعه‌دهنده را مجبور به ساختار صحیح برنامه کند و نویسندگان هیچ توصیه سیستماتیکی برای استفاده از ساختارهای نسبتاً پیچیده آن صادر نکرده‌اند. آنها به موقع و در مورد ایجاد یک کتابخانه کلاس استاندارد که رایج ترین ساختارهای داده را پیاده سازی می کند، مراقبت نکردند.

همه اینها به این واقعیت منجر شد که بسیاری از توسعه دهندگان مجبور شدند خود هزارتوهای معناشناسی زبان را کشف کنند و به طور مستقل به دنبال اصطلاحات موفق باشند. بنابراین، برای مثال، در مرحله اول توسعه زبان، بسیاری از سازندگان کتابخانه های کلاس به دنبال ایجاد یک سلسله مراتب کلاسی با یک کلاس پایه مشترک Object بودند. این ایده از Smalltalk - یکی از معروف ترین زبان های شی گرا - وام گرفته شده است. با این حال، معلوم شد که در C++ کاملاً غیرقابل اجرا است - سلسله مراتب پیچیده کتابخانه کلاس غیرقابل انعطاف بود و کار کلاس ها واضح نبود. برای اینکه کتابخانه های کلاس قابل استفاده باشند، باید به صورت کد منبع ارائه می شدند.

ظاهر کلاس های قالب کاملاً این جهت توسعه را رد کرد. وراثت فقط در مواردی مورد استفاده قرار گرفت که نیاز به تولید نسخه تخصصی یک کلاس موجود بود. کتابخانه ها از طبقات مجزا و سلسله مراتب کوچک غیر مرتبط تشکیل شدند. با این حال، استفاده مجدد از کد در طول مسیر شروع به کاهش کرد، زیرا C++ اجازه استفاده چندشکلی از کلاس‌های سلسله مراتب مستقل را نمی‌دهد. استفاده گسترده از قالب ها منجر به افزایش غیرقابل قبولی در میزان کد کامپایل شده می شود - فراموش نکنیم که قالب ها با استفاده از روش های تولید ماکرو پیاده سازی می شوند.

یکی از بدترین کاستی‌های C++ که از سینتکس C به ارث رسیده است، در دسترس بودن توضیحات ساختار داخلی همه کلاس‌های مورد استفاده در کامپایلر است. در نتیجه، تغییر در ساختار داخلی نمایش برخی از کلاس های کتابخانه منجر به نیاز به کامپایل مجدد همه برنامه هایی می شود که در آن از این کتابخانه استفاده می شود. این امر توسعه دهندگان کتابخانه را از نظر نوسازی آنها بسیار محدود می کند، زیرا، انتشار نسخه جدید، آنها باید سازگاری باینری را با قبلی حفظ کنند. همین مشکل است که بسیاری از کارشناسان را بر این باورند که C++ برای پروژه های بزرگ و فوق بزرگ نامناسب است.

و با این حال، با وجود کاستی های ذکر شده و حتی در دسترس نبودن استاندارد زبان (این پس از بیش از پانزده سال استفاده است!)، C ++ همچنان یکی از محبوب ترین زبان های برنامه نویسی است. نقطه قوت آن در درجه اول در سازگاری تقریباً کامل آن با زبان C است. به لطف این، تمام دستاوردهای ساخته شده در C در دسترس برنامه نویسان C ++ است. در عین حال، C ++، حتی بدون استفاده از کلاس ها، به ارمغان می آورد. ج تعدادی از مهم است ویژگی های اضافیو امکاناتی که بسیاری از مردم از آن به سادگی به عنوان C بهبود یافته استفاده می کنند.

مربوط به مدل شی++C، پس تا زمانی که برنامه شما خیلی بزرگ نشده است (صدها هزار خط)، استفاده از آن کاملاً امکان پذیر است. روند اخیر انتقال به جزء نرم افزارفقط موقعیت C ++ را تقویت می کند. هنگام توسعه اجزای منفرد، کاستی های C ++ هنوز ظاهر نمی شود و اتصال اجزا به یک سیستم کار دیگر در سطح زبان انجام نمی شود، بلکه در سطح سیستم عامل انجام می شود.

با توجه به تمام آنچه گفته شد، چشم انداز C++ تاریک به نظر نمی رسد. اگرچه انحصار در بازار زبان های برنامه نویسی برای او نمی درخشد. شاید فقط بتوانیم با قاطعیت بگوییم که این زبان از نوسازی-توسعه دیگری جان سالم به در نخواهد برد. بی دلیل نبود، وقتی جاوا ظاهر شد، توجه زیادی به آن شد. زبانی که از نظر نحو نزدیک به C++ است و بنابراین برای بسیاری از برنامه نویسان به ظاهر آشناست، از فاحش ترین کاستی های C++ که از دهه 70 به ارث برده بود، در امان مانده است. با این حال، به نظر نمی رسد جاوا در حد نقشی باشد که برخی افراد به آن داده اند.

نقش ویژه زبان های C/C++ در برنامه نویسی مدرن، ارائه آدرس های خاص در اینترنت را که می توانید مطالبی را روی آنها بیابید، تقریباً بی معنی می کند. فقط خیلی جاها مثل این وجود دارد. با این حال، اگر علاقه مند به یادگیری بیشتر در مورد تکامل C++ هستید، با یک مقاله کوتاه شروع کنید http://citforum.syzran.ru/programming/prg96/76.shtml.

الکساندر سرگیف، [ایمیل محافظت شده]
مقاله از مجله BYTE/Russia، مارس 2000

برای نشان دادن بصری استفاده از زبان های توصیف شده در عمل، وظیفه ای را انتخاب کردیم که در آن لازم بود یک سری اعداد صحیح را از ورودی استاندارد یا از یک فایل وارد کنیم و سپس فقط اعداد فرد را خروجی کنیم و در به صورت برعکس. این یکی از ساده‌ترین مشکلاتی است که برای حل آن نیاز به کار زیادی با آرایه‌ها، حلقه‌ها، انشعاب‌ها و I/O دارد و همچنین به شما امکان نمایش فراخوانی‌های زیر روال را می‌دهد. در عین حال قابل مشاهده است و به راحتی قابل درک است.

فهرست 1. ج

1 #شامل /* اتصال توابع I/O */ 2 3 void main(void) 4 ( 5 int M; /* آرایه 10 عدد صحیح، شمارش از 0 */ 6 int N؛ 7 برای (N=0؛ N<10; ++N) /* Вводим не более 10 чисел */ 8 if (EOF == scanf ("%d, M+N)) 9 break; /* Если конец файла, прерываем цикл */ 10 11 for (-N; N>=0; --N) /* اگر (M[N]%2) /* به ترتیب از طریق آرایه به صورت معکوس حلقه بزنید */ 12 و موارد فرد را چاپ کنید */ 13 printf("%d\n"، M[N]) ; چهارده )

  • خط 3.در C/C++، اجرای برنامه همیشه با تابع اصلی شروع می شود.
  • خطوط 7 و 11.هدر حلقه حاوی یک نقطه ویرگول برای نشان دادن تنظیمات اولیه، شرایط ادامه و قانون برای محاسبه مجدد پارامتر حلقه است. عملیات ++ و -/- - معروف ترین اختصارات زبان C، به معنای افزایش و کاهش یک متغیر، یعنی افزایش و کاهش مقدار آن به اندازه یک.
  • خط 8.عملکرد scanfبا توجه به فرمت مشخص شده توسط پارامتر اول، مقادیر متغیرهایی که آدرس آنها توسط پارامترهای باقی مانده مشخص شده است را وارد می کند. در اینجا، آدرسی که مقدار وارد شده است با استفاده از حساب آدرس، به آدرس محل آرایه محاسبه می شود. مافست اضافه شده است نعناصر. همین اثر را می توان با نوشتن به دست آورد &M[N].
  • خط 12.عمل % باقیمانده یک تقسیم را محاسبه می کند. وضعیت اپراتور اگراگر مقدار عددی عبارت غیر صفر باشد، تکمیل شده در نظر گرفته می شود.
  • خط 13.عملکرد printf- چاپ بر اساس فرمت به طور مشابه کار می کند scanf، اما به جای آدرس ها، مقادیر برای خروجی ارسال می شود.
1 #شامل 23 قالب کلاس آرایه 4 ( 5 عمومی: آرایه (T اندازه = 1) : M (T جدید)، N(اندازه)، n(0) () 6 آرایه (باطل) (حذف M؛) 7 T تعداد (باطل) صرف ( بازگشت n؛ ) 8 اپراتور T (int i) const ( بازگشت M[i]؛ ) 9 void افزودن (T Data)؛ 10 خصوصی: 11 T* M؛ // آدرس حافظه توزیع شده 12 int N, n؛ // N - توزیع شده؛ n - استفاده می شود 13). قالب 14 15 آرایه خالی ::Add(T Data) 16 ( if (N-n) // اگر همه 17 تخصیص داده شده (int* P = new T; // مکان استفاده شده است، 18 بیشتر برای (int i=0; i) تخصیص دهید آ؛ // آرایه ای از اعداد صحیح با اندازه متغیر 28 while (1) // حلقه بی نهایت 29 (int N؛ 30 cin >> N؛ // cin - جریان ورودی استاندارد 31 اگر (cin.eof()) شکسته شود؛ // خروج از حلقه تا پایان فایل 32 A.Add(N)؛ // عدد وارد شده را به آرایه 33 اضافه کنید ) 34 برای (int N=A.Count()-1; N>=0; --N) // حلقه از طریق آرایه 35 if (A[N]%2) 36 cout<و حافظه را آزاد کنید
  • خطوط 3-13.کلاس الگو اعلام شده است آرایهبا پارامتر تی. آرایه ای از اشیاء با اندازه متغیر از نوع است تی. البته در وظیفه ما نیازی به استفاده از کلاس قالب نیست. با این حال، ما می‌خواستیم نشان دهیم که چگونه C++ یک ساختار داده چندشکلی ایجاد می‌کند که می‌تواند با هر نوع عنصری کار کند.
  • خط 5.سازنده کلاس نمایش شی را مقدار دهی اولیه می کند. مثلا در زمینه مآدرس بلوک حافظه سفارش داده شده توسط عملیات وارد می شود تی جدید.
  • خط 8.نمونه ای از بارگذاری بیش از حد یک عملیات. عملکرد اپراتورزمانی فراخوانی می شود که براکت های مربع در سمت راست شی کلاس ظاهر شوند آرایه.
  • خط 9.این تابع در پیاده سازی اصلی است. عناصری را به آرایه اضافه می کند و در صورت نیاز آن را گسترش می دهد. از آنجایی که پیچیده تر از سایرین است، تعریف آن از توضیحات کلاس خارج شده است. توابع توضیح داده شده در بدنه کلاس در C++ نه با فراخوانی، بلکه با جایگزینی درون خطی پیاده سازی می شوند. این امر سرعت برنامه را افزایش می دهد، اگرچه حجم آن را افزایش می دهد.
  • خطوط 15-24.تعریف تابع آرایه::افزودن (T)(به هر حال، این نام کامل او است).
  • خط 27.یک شی از نوع ایجاد کنید آرایه. معبد آگاوپارامتر بندی شده بر اساس نوع بین المللی.

چرا C++

C++ در حال حاضر زبان غالبی است که برای توسعه محصولات نرم افزاری تجاری استفاده می شود. در سال‌های اخیر، این سلطه با ادعاهای مشابهی از زبان برنامه‌نویسی مانند جاوا کمی متزلزل شده است، اما آونگ افکار عمومی به سمت دیگری تغییر کرده است و بسیاری از برنامه‌نویسانی که C++ را برای جاوا کنار گذاشته‌اند، اخیراً به عشق سابق او بازگشته‌اند. در هر صورت این دو زبان به قدری شبیه به هم هستند که با یادگیری یکی از آنها به طور خودکار 90 درصد بر دیگری تسلط پیدا می کنید.

سی شارپ زبان جدیدی است که توسط مایکروسافت برای پلتفرم شبکه توسعه یافته است. در اصل، سی شارپ نوعی C++ است و با وجود تعدادی تفاوت اساسی، زبان‌های سی شارپ و سی پلاس پلاس حدود 90 درصد منطبق هستند. احتمالاً زمان زیادی طول خواهد کشید تا C# به رقیب جدی C++ تبدیل شود. اما حتی اگر چنین شود، دانش زبان C++ مزیت قابل توجهی خواهد بود.

C++ یک زبان برنامه نویسی عمومی است. دامنه طبیعی آن برنامه نویسی سیستم است که به معنای وسیع کلمه درک می شود. علاوه بر این، C++ با موفقیت در بسیاری از زمینه های کاربردی که بسیار فراتر از محدوده مشخص شده هستند، استفاده می شود. پیاده سازی های C++ اکنون بر روی هر ماشینی، از فروتن ترین ریز کامپیوترها تا بزرگترین ابرکامپیوترها، و تقریباً برای همه سیستم عامل ها وجود دارد.

پیدایش و تکامل زبان C++

Bjorn Stroustrup توسعه دهنده زبان C++ و خالق اولین مترجم است. او کارمند مرکز محاسباتی تحقیقاتی AT&T Bell در موری هیل (نیوجرسی، ایالات متحده آمریکا) است. او مدرک کارشناسی ارشد خود را در رشته ریاضیات و مهندسی کامپیوتر از دانشگاه آروس (دانمارک) و دکترای خود را در رشته علوم کامپیوتر از دانشگاه کمبریج (انگلیس) دریافت کرد. او در سیستم های توزیع شده، سیستم عامل ها، مدل سازی و برنامه نویسی تخصص دارد. او به همراه M. A. Ellis نویسنده یک راهنمای کامل برای زبان C ++ - "راهنمای C ++ با یادداشت ها" است.

البته C++ تا حد زیادی مدیون زبان C است که به عنوان زیر مجموعه آن حفظ شده است. تمام ابزارهای سطح پایین ذاتی C، که برای حل مهمترین مشکلات برنامه نویسی سیستم طراحی شده اند، نیز حفظ می شوند. C، به نوبه خود، مدیون نسخه قبلی خود، BCPL است. نظر زبان BCPL به C++ بازیابی شده است. منبع الهام دیگر زبان SIMULA-67 بود. از او بود که مفهوم کلاس ها (همراه با کلاس های مشتق شده و توابع مجازی) به عاریت گرفته شد. توانایی C++ برای بارگذاری بیش از حد اپراتورها و آزادی قرار دادن اعلان ها در هر جایی که ممکن است یک اپراتور ظاهر شود، یادآور زبان Algol-68 است.

نسخه‌های قبلی این زبان، به نام C با کلاس‌ها، از سال 1980 مورد استفاده قرار گرفته‌اند. این زبان به این دلیل به وجود آمد که نویسنده به نوشتن برنامه‌های شبیه‌سازی مبتنی بر وقفه نیاز داشت. زبان SIMULA-67 برای این کار، جدا از کارایی، ایده آل است. زبان "C با کلاس ها" برای کارهای مدل سازی بزرگ استفاده شد. در آن زمان، امکان نوشتن برنامه ها بر روی آن، که منابع زمان و حافظه برای آنها حیاتی است، تحت آزمایش های دقیق قرار گرفت. این زبان فاقد بارگذاری بیش از حد اپراتور، مراجع، توابع مجازی و بسیاری ویژگی های دیگر بود. برای اولین بار، C++ گروه تحقیقاتی را که نویسنده در ژوئیه 1983 در آن کار می کرد ترک کرد، اما در آن زمان بسیاری از ویژگی های C++ هنوز توسعه نیافته بودند.

نام C++ (C پلاس پلاس) توسط Rick Maschitti در تابستان 1983 ابداع شد. این نام منعکس کننده ماهیت تکاملی تغییرات در زبان C است. نماد ++ به عملیات افزایشی C اشاره دارد. نام کمی کوتاهتر C+ است. یک خطای نحوی علاوه بر این، قبلاً به عنوان نام یک زبان کاملاً متفاوت استفاده شده است. معناشناسان C دریافتند که C++ بدتر از ++C است. این زبان D نامیده نمی‌شود زیرا پسوند C است و سعی نمی‌کند با حذف ویژگی‌های C مشکلی را حل کند. تعبیر جالب دیگری از نام C++ را می‌توانید در پیوست به پیدا کنید.

در ابتدا، C++ به گونه‌ای طراحی شد که نویسنده و دوستانش مجبور به برنامه‌نویسی به اسمبلی، C یا سایر زبان‌های سطح بالا مدرن نباشند. هدف اصلی آن ساده کردن و لذت بخش تر کردن فرآیند برنامه نویسی برای هر برنامه نویس است. تا همین اواخر، برنامه توسعه C++ روی کاغذ وجود نداشت. طراحی، اجرا و مستندسازی دست به دست هم دادند. هرگز "پروژه C++" یا "کمیته طراحی C++" وجود نداشته است. بنابراین، زبان به گونه ای تکامل یافته و ادامه می دهد تا بر تمامی مشکلاتی که کاربران با آن مواجه شده اند غلبه کند. بحث و گفتگو توسط نویسنده تمام مشکلات با دوستان و همکارانش نیز به عنوان انگیزه ای برای توسعه عمل می کند.

از زمان انتشار اولین ویرایش این کتاب، زبان C++ دستخوش تغییرات و اصلاحات قابل توجهی شده است. این عمدتاً در مورد ابهام‌زدایی اضافه بار، پیوند دادن و مدیریت حافظه است. با این حال، تغییرات جزئی برای افزایش سازگاری با زبان C انجام شده است. برخی از تعمیم‌ها و پسوندهای قابل توجهی نیز معرفی شده‌اند، مانند ارث بری چندگانه، توابع عضو با مشخصات static و const، اعضای محافظت شده (محافظت شده)، قالب‌های نوع و مدیریت خاص. موقعیت ها تمام این افزونه‌ها و پیشرفت‌ها با هدف تبدیل C++ به زبانی بود که می‌توان در آن کتابخانه‌ها ایجاد و استفاده کرد. همه تغییرات در توضیح داده شده است.

افزونه های دیگری که بین سال های 1985 و 1991 معرفی شدند (مانند وراثت چندگانه، توابع عضو استاتیک، و توابع مجازی خالص) از تعمیم تجربه برنامه نویسی C++ به جای زبان های دیگر پدید آمدند.

برنامه‌های افزودنی زبانی که در این شش سال ساخته شده‌اند، عمدتاً با هدف افزایش بیان C ++ به‌عنوان یک زبان انتزاعی داده و برنامه‌نویسی شی‌گرا به طور کلی و به‌عنوان وسیله‌ای برای ایجاد کتابخانه‌های با کیفیت بالا با انواع داده‌های تعریف‌شده توسط کاربر به‌طور خاص بود.

در حدود سال 1987، آشکار شد که کار استانداردسازی C++ قریب الوقوع است و باید فوراً پایه و اساس آن آغاز شود.

AT&T Bell Laboratories کمک کننده اصلی در این کار بود. حدود صد نماینده از حدود 20 سازمان مطالعه کردند و در مورد آنچه که نسخه مدرن کتابچه راهنمای مرجع و منبع منبع برای استانداردسازی ANSI شد، نظر دادند. C++. سرانجام، به ابتکار هیولت پاکارد، در دسامبر 1989، کمیته X3J16 در ANSI تشکیل شد. انتظار می رود که کار استانداردسازی C++ در ANSI (استاندارد آمریکایی) به بخشی جدایی ناپذیر از کار استانداردسازی ISO (سازمان بین المللی استاندارد) تبدیل شود.

C++ همراه با توسعه برخی از کلاس های بنیادی تکامل یافته است.

تاریخچه خلقت

این زبان در اوایل دهه 1980 سرچشمه گرفت، زمانی که کارمند آزمایشگاه بل، بیورن استروستروپ، تعدادی پیشرفت در زبان C برای نیازهای خود ارائه کرد. هنگامی که استراستروپ در اواخر دهه 1970 در آزمایشگاه های بل شروع به کار بر روی مشکلات در تئوری صف (همانطور که در مدل سازی تماس های تلفنی اعمال می شود)، دریافت که تلاش برای استفاده از زبان های مدل سازی موجود در آن زمان بی اثر بوده و استفاده از زبان های ماشین بسیار کارآمد بوده است. بسیار دشوار بود زیرا به دلیل بیان محدود آنها. به عنوان مثال، زبان Simula دارای ویژگی هایی است که برای توسعه نرم افزارهای بزرگ بسیار مفید است، اما بسیار کند است و زبان BCPL به اندازه کافی سریع است، اما بسیار نزدیک به زبان های سطح پایین است و برای توسعه نرم افزارهای بزرگ مناسب نیست.

استروستروپ با یادآوری تجربه پایان نامه خود تصمیم گرفت زبان C (جانشین BCPL) را با قابلیت های موجود در زبان سیمولا تکمیل کند. زبان C که زبان پایه سیستم یونیکس است که رایانه‌های بل روی آن کار می‌کردند، سریع، دارای ویژگی‌های غنی و قابل حمل است. Stroustrup توانایی کار با کلاس ها و اشیاء را به آن اضافه کرد. در نتیجه، مشکلات مدل‌سازی عملی هم از نظر زمان توسعه (به دلیل استفاده از کلاس‌های شبیه به Simula) و هم از نظر زمان محاسبه (به دلیل سرعت C) قابل دسترسی بودند. اولین موارد اضافه شده به C کلاس ها (با کپسوله کردن)، وراثت کلاس، بررسی نوع قوی، توابع درون خطی و آرگومان های پیش فرض بودند. نسخه‌های اولیه این زبان، که در اصل «C با کلاس‌ها» نامیده می‌شدند، از سال 1980 در دسترس بودند.

در حین توسعه C با کلاس ها، استروستروپ برنامه cfront را نوشت، کامپایلری که کد منبع C را با کلاس ها به کد منبع C ساده تبدیل می کند. این کار با استفاده از زیرساخت های موجود در یونیکس امکان کار بر روی یک زبان جدید و استفاده از آن را در عمل فراهم می کند. برای توسعه در C. یک زبان جدید، به طور غیرمنتظره برای نویسنده، او محبوبیت زیادی در بین همکاران به دست آورد و به زودی استروستروپ دیگر نتوانست شخصاً از او حمایت کند و به هزاران سؤال پاسخ داد.

هنگام ایجاد C++، بیورن استروستروپ می خواست
  • دریافت یک زبان جهانی با انواع داده های ایستا، کارایی و قابلیت حمل C.
  • به طور مستقیم و جامع بسیاری از سبک های برنامه نویسی، از جمله برنامه نویسی رویه ای، انتزاع داده ها، برنامه نویسی شی گرا و برنامه نویسی عمومی را پشتیبانی می کند.
  • به برنامه نویس آزادی انتخاب بدهید، حتی اگر به او فرصت انتخاب نادرست را بدهد.
  • تا آنجا که ممکن است سازگاری با C را حفظ کنید، در نتیجه امکان تغییر آسان از برنامه نویسی به C را فراهم می کند.
  • اجتناب از تناقضات بین C و C++: هر ساختاری که در هر دو زبان معتبر است باید در هر یک از آنها به معنای یکسان باشد و به رفتار برنامه یکسان منجر شود.
  • از ویژگی هایی که وابسته به پلتفرم هستند یا جهانی نیستند اجتناب کنید.
  • "برای چیزی که استفاده نمی کنید هزینه نکنید" - هیچ ویژگی زبانی نباید باعث کاهش عملکرد برنامه هایی شود که از آن استفاده نمی کنند.
  • به محیط برنامه نویسی خیلی پیچیده نیاز ندارید.

انتخاب C به عنوان پایه ای برای ایجاد یک زبان برنامه نویسی جدید با این واقعیت توضیح داده می شود که زبان C:

1. زبانی چند منظوره، مختصر و نسبتاً سطح پایین است.
2. مناسب برای حل اکثر مشکلات سیستم.
3. در همه جا و روی همه چیز اجرا می شود.
4. رابط با محیط برنامه نویسی یونیکس.

- ب. استروستروپ. زبان برنامه نویسی C++. بخش 1.6

علیرغم تعدادی از کاستی های شناخته شده زبان C، استروستروپ استفاده از آن را به عنوان پایه انتخاب کرد زیرا "C مشکلات خود را دارد، اما زبانی که از ابتدا طراحی شده است آنها را خواهد داشت، و ما مشکلات C را می دانیم." علاوه بر این، این امکان به دست آوردن سریع یک نمونه اولیه کامپایلر (cfront) را فراهم کرد که فقط عناصر نحو اضافه شده را به زبان اصلی C ترجمه می کرد.

با توسعه C++، ویژگی‌های دیگری نیز گنجانده شد که قابلیت‌های ساختارهای C را نادیده می‌گیرند، و مسئله کنار گذاشتن سازگاری زبان با حذف ساختارهای منسوخ، مکرراً مطرح شد. با این حال، سازگاری به دلایل زیر حفظ شده است:

  • حفظ کد فعلی که در اصل به زبان C نوشته شده و مستقیماً به C ++ منتقل شده است.
  • حذف نیاز به آموزش مجدد برنامه نویسانی که قبلاً C را مطالعه کرده اند (آنها فقط باید ابزارهای جدید C ++ را یاد بگیرند).
  • حذف سردرگمی بین زبان ها هنگام استفاده از آنها ("اگر دو زبان با هم استفاده می شوند، تفاوت آنها باید حداقل باشد یا آنقدر زیاد که زبان ها را نتوان اشتباه گرفت").

تا سال 1983، ویژگی‌های جدیدی مانند توابع مجازی، بارگذاری بیش از حد تابع و اپراتور، مراجع، ثابت‌ها، کنترل کاربر بر مدیریت حافظه آزاد، بررسی نوع بهبودیافته و سبک نظر جدید (//) به زبان اضافه شد. زبان حاصل دیگر فقط یک نسخه تقویت‌شده از C کلاسیک نیست و از C با کلاس‌ها به C++ تغییر نام داده است. اولین عرضه تجاری آن در اکتبر 1985 انجام شد.

نام زبان به دست آمده از عملگر افزایشی unary postfix C++ گرفته شده است (افزایش مقدار یک متغیر به اندازه یک).

قبل از شروع استانداردسازی رسمی، این زبان عمدتاً توسط Stroustrup در پاسخ به درخواست های جامعه برنامه نویسی توسعه داده شد. عملکرد توصیف زبان استاندارد توسط آثار چاپ شده استروستروپ در C ++ (توضیح زبان، کتابچه راهنمای مرجع و غیره) انجام شد.

تاریخچه استانداردها

در سال 1985 اولین ویرایش زبان برنامه نویسی C++ منتشر شد که اولین توصیف این زبان را ارائه کرد که به دلیل عدم وجود استاندارد رسمی بسیار مهم بود.


در سال 1989، C++ نسخه 2.0 منتشر شد. ویژگی‌های جدید آن شامل وراثت چندگانه، کلاس‌های انتزاعی، توابع عضو استاتیک، توابع ثابت و اعضای محافظت‌شده است. در سال 1990، «راهنمای مرجع تفسیری برای C++» منتشر شد که بعداً مبنای استاندارد قرار گرفت. به روز رسانی های اخیر شامل قالب ها، استثناها، فضاهای نام، بازیگران جدید و نوع بولی است.

کتابخانه استاندارد C++ نیز همراه با آن تکامل یافته است. اولین مورد اضافه شده به کتابخانه استاندارد C++، جریان های ورودی/خروجی بود که وسیله ای برای جایگزینی توابع چاپ و اسکن C سنتی فراهم می کرد. بعدها، مهم ترین پیشرفت کتابخانه استاندارد گنجاندن کتابخانه الگوی استاندارد بود.

در سال 1998، استاندارد زبان ISO/IEC 14882:1998 (معروف به C++98) توسط کمیته استانداردهای C++ (گروه کاری ISO/IEC JTC1/SC22/WG21) منتشر شد. استاندارد C++ نحوه نامگذاری اشیاء، برخی از جزئیات رسیدگی به استثناها و سایر ویژگی های مرتبط با پیاده سازی را توصیف نمی کند که باعث می شود کد شی تولید شده توسط کامپایلرهای مختلف ناسازگار باشد. با این حال، استانداردهای زیادی توسط اشخاص ثالث برای معماری ها و سیستم عامل های خاص ایجاد شده است.

در سال 2005، گزارش فنی کتابخانه 1 (به اختصار TR1) منتشر شد. اگرچه به طور رسمی بخشی از استاندارد نیست، اما این گزارش افزونه هایی را برای کتابخانه استاندارد توصیف می کند که نویسندگان انتظار داشتند در نسخه بعدی زبان C++ گنجانده شوند. پشتیبانی TR1 تقریباً در تمام کامپایلرهای پشتیبانی شده C++ در حال بهبود است.

از سال 2009، کار برای به روز رسانی استاندارد قبلی در حال انجام است، نسخه اولیه استاندارد جدید ابتدا C ++ 09 و یک سال بعد C ++ 0x، امروز C ++ 11 بود که شامل اضافاتی به هسته زبان و افزونه ای برای کتابخانه استاندارد، شامل بیشتر TR1.

C++ برای برآوردن نیازهای مدرن به تکامل خود ادامه می دهد. یکی از گروه هایی که زبان C ++ را توسعه می دهد و پیشنهادهایی را برای بهبود آن به کمیته استانداردسازی C ++ ارسال می کند، Boost است که با افزودن ویژگی های فرابرنامه نویسی به آن، به بهبود قابلیت های زبان نیز می پردازد.

هیچکس حقوق زبان C++ را ندارد، این زبان رایگان است. با این حال، خود سند استاندارد زبان (به استثنای پیش نویس ها) به صورت رایگان در دسترس نیست.