جستجو در تالارهای گفتگو
در حال نمایش نتایج برای برچسب های 'سیپلاسپلاس'.
49 نتیجه پیدا شد
-
ارائه مکانیزمهای کلیدی سی++ امروزی که برای حفظ سازگاری در طول دههها طراحی شدهاند نویسنده: بیارنه استراستروپ منتشرشده در: ۴ فوریه ۲۰۲۵ خلاصه: بیش از ۴۵ سال از زمان پیدایش سی++ میگذرد. همانطور که برنامهریزی شده بود، این زبان برای پاسخگویی به چالشها تکامل یافته است، اما بسیاری از توسعهدهندگان همچنان از سی++ بهگونهای استفاده میکنند که گویی هنوز در هزاره گذشته هستیم. این رویکرد از نظر سهولت بیان ایدهها، عملکرد، قابلیت اطمینان و قابلیت نگهداری بهینه نیست. در این مقاله، مفاهیم کلیدی برای ساخت نرمافزارهای سی++ با عملکرد بالا، ایمن از نظر نوع داده، و انعطافپذیر ارائه میشود: مدیریت منابع، مدیریت طول عمر، مدیریت خطاها، مدولاریتی، و برنامهنویسی جنریک. در پایان، روشهایی برای اطمینان از بهروز بودن کد ارائه میشود تا از تکنیکهای قدیمی، ناامن و دشوار برای نگهداری اجتناب گردد: راهنماها و پروفایلها. ۱. مقدمه سی++ زبانی با تاریخچهای طولانی است. این موضوع باعث شده که بسیاری از توسعهدهندگان، مدرسان و دانشگاهیان پیشرفتهای چندین دههای آن را نادیده بگیرند و سی++ را طوری توصیف کنند که گویی هنوز در هزاره دوم هستیم؛ زمانی که تلفنها باید به دیوار متصل میشدند و بیشتر کدها کوتاه، سطح پایین و کند بودند. اگر سیستمعامل شما سازگاری را در طول دههها حفظ کرده باشد، میتوانید برنامههای سی++ نوشتهشده در سال ۱۹۸۵ را امروز روی یک رایانه مدرن اجرا کنید. پایداری – یعنی سازگاری با نسخههای قدیمیتر سی++ – بهویژه برای سازمانهایی که سیستمهای نرمافزاری را برای دههها نگهداری میکنند، بسیار مهم است. با این حال، در تقریباً تمام موارد، سی++ امروزی (C++30) میتواند ایدههای موجود در کدهای قدیمی را بسیار سادهتر بیان کند، با تضمینهای ایمنی نوع داده بهتر، و آنها را سریعتر و با مصرف حافظه کمتر اجرا کند. این مقاله مکانیزمهای کلیدی سی++ امروزی را که برای این منظور طراحی شدهاند، ارائه میدهد. در بخش ششم، تکنیکهایی برای اطمینان از استفاده مدرن از سی++ شرح داده میشود. مثال ساده: برنامهای را در نظر بگیرید که هر خط یکتا را از ورودی به خروجی مینویسد: import std;// دسترسی به تمام کتابخانه استاندارد using namespace std; int main() // چاپ خطوط یکتا از ورودی { unordered_map<string,int> m; // جدول هش for (string line; getline(cin,line); ) if (m[line]++ == 0) cout << line << '\n'; } علاقهمندان ممکن است این را بهعنوان برنامه AWK با ساختار (!a[$0]++) بشناسند. این برنامه از unordered_map، نسخه کتابخانه استاندارد سی++ از جدول هش، استفاده میکند تا خطوط یکتا را نگه دارد و فقط زمانی که خطی برای اولین بار دیده میشود، آن را چاپ کند. حلقه for برای محدود کردن محدوده متغیر حلقه (line) به خود حلقه استفاده شده است. در مقایسه با سبکهای قدیمیتر سی++، نکته قابلتوجه غیبت موارد زیر است: تخصیص/آزادسازی صریح حافظه اندازهها مدیریت خطا تبدیلهای نوع (کستها) اشارهگرها اندیسگذاری ناامن استفاده از پیشپردازنده (بهویژه بدون #include). با این حال، این برنامه در مقایسه با سبکهای قدیمیتر کاملاً کارآمد است و حتی از آنچه اکثر برنامهنویسان در زمان معقول میتوانند بنویسند، کارآمدتر است. اگر به عملکرد بیشتری نیاز باشد، میتوان آن را بهینه کرد. یکی از جنبههای مهم سی++ این است که کد با رابط کاربری مناسب میتواند برای نیازهای خاص بهینهسازی شود و حتی از سختافزارهای تخصصی استفاده کند، بدون اینکه به سایر کدها آسیبی برسد یا نیازی به تغییر کامپایلرها باشد. مثال دیگر: نسخهای از برنامه که خطوط یکتا را برای استفاده بعدی جمعآوری میکند: import std; using namespace std; // دسترسی به تمام کتابخانه استاندارد vector<string> collect_lines(istream& is) // جمعآوری خطوط یکتا از ورودی { unordered_set s; // جدول هش for (string line; getline(is,line); ) s.insert(line); return vector{from_range, s}; // کپی عناصر مجموعه به یک بردار } auto lines = collect_lines(cin); چون نیازی به شمارش نبود، از set بهجای map استفاده شده است. بهجای set، یک vector برگردانده شده چون vector پرکاربردترین ظرف (container) است. نیازی به مشخص کردن نوع عناصر vector نبود، زیرا کامپایلر آن را از نوع عناصر set استنباط کرد. پارامتر from_range به کامپایلر و خواننده انسانی نشان میدهد که از یک محدوده (range) استفاده شده است، نه روشهای دیگر برای مقداردهی اولیه vector. نویسنده ترجیح میداد از vector{m} استفاده کند که منطقاً سادهتر است، اما کمیته استاندارد تصمیم گرفت که استفاده از from_range برای بسیاری از کاربران مفیدتر است. برنامهنویسان با تجربه متوجه خواهند شد که این نسخه از collect_lines() کاراکترهای خواندهشده را کپی میکند. این میتواند مشکل عملکردی ایجاد کند، بنابراین در بخش ۳.۲ نشان داده میشود که چگونه میتوان collect_lines() را بهینه کرد تا از این کپیها جلوگیری شود. هدف این مثالهای کوچک چیست؟ نمایش سی++ امروزی پیش از ورود به جزئیات فنی و امیدوارانه، خارج کردن برخی افراد از پیشفرضهای قدیمی و نادرست چند دههای. ۲. آرمانهای سی++ هدفهای من برای سی++ را میتوان بهصورت زیر خلاصه کرد: بیان مستقیم ایدهها ایمنی نوع داده در زمان کامپایل ایمنی منابع (یعنی بدون نشت منابع) دسترسی مستقیم به سختافزار عملکرد (یعنی کارایی بالا) گسترشپذیری مقرونبهصرفه (یعنی انتزاع با هزینه صفر) قابلیت نگهداری (یعنی کد قابلفهم) استقلال از پلتفرم (یعنی قابلیت حمل) پایداری (یعنی سازگاری با نسخههای قبلی) این اهداف از روزهای اولیه سی++ تغییر نکردهاند، اما سی++ برای تکامل طراحی شده بود، و سی++ امروزی میتواند این ویژگیها را در کد بسیار بهتر از نسخههای قبلی ارائه دهد. کد سی++ که این آرمانها را در بر میگیرد، صرفاً با استفاده از تمام ویژگیهای جدید بهدست نمیآید. برخی ویژگیها و تکنیکهای کلیدی قدیمی هستند: کلاسها با سازندهها و تخریبکنندهها استثناها قالبها (Templates) std::vector ... ویژگیهای کلیدی جدیدتر عبارتند از: ماژولها (بخش ۴) مفاهیم (Concepts) برای مشخص کردن رابطهای جنریک (بخش ۵.۱) عبارات لامبدا برای تولید اشیاء تابعی (بخش ۵.۱) محدودهها (Ranges) (بخش ۵.۱) constexpr و consteval برای محاسبات در زمان کامپایل (بخش ۵.۲) پشتیبانی از همزمانی و الگوریتمهای موازی کوروتینها (که سالها غایب بودند، با وجود اینکه در نسخههای اولیه سی++ ضروری تلقی میشدند) std::shared_ptr ... آنچه اهمیت دارد، استفاده از ویژگیهای زبان و کتابخانه بهصورت یک کل منسجم و متناسب با مسئلهای است که باید حل شود. ارزش یک زبان برنامهنویسی در گستردگی و کیفیت کاربردهای آن است. برای سی++، شواهد در گستردگی شگفتانگیز حوزههای کاربردی آن است: نرمافزارهای پایه، گرافیک، کاربردهای علمی، فیلمها، بازیها، خودروها، پیادهسازی زبانها (نه فقط سی++)، کنترل پرواز، موتورهای جستجو، مرورگرها، طراحی و تولید نیمهرساناها، کاوشگرهای فضایی، امور مالی، هوش مصنوعی و بسیار دیگر. با توجه به میلیاردها خط کد سی++، نمیتوان زبان را بهصورت ناسازگار تغییر داد. اما میتوان روش استفاده از سی++ را تغییر داد. در ادامه این مقاله، بر موارد زیر تمرکز میکنم: مدیریت منابع (شامل کنترل طول عمر و مدیریت خطاها) ماژولها (شامل حذف پیشپردازنده) برنامهنویسی جنریک (شامل مفاهیم) راهنماها و اجرا (چگونه میتوانیم تضمین کنیم که کد ما واقعاً «سی++ قرن بیست و یکم» است؟) البته این تمام چیزی که سی++ ارائه میدهد نیست، و کدهای خوب زیادی به روشهایی نوشته میشوند که در اینجا ذکر نشدهاند. برای مثال، برنامهنویسی شیءگرا را کنار گذاشتم چون بسیاری از توسعهدهندگان میدانند چگونه آن را بهخوبی در سی++ انجام دهند. همچنین، کدهای با عملکرد بسیار بالا و کدهایی که مستقیماً سختافزار را دستکاری میکنند، نیاز به توجه و تکنیکهای خاصی دارند. پشتیبانی گسترده سی++ از همزمانی حداقل به مقالهای جداگانه نیاز دارد. با این حال، کلید اکثر نرمافزارهای خوب، رابطهای ایمن از نظر نوع داده است که اطلاعات کافی برای بهینهسازی و بررسی ویژگیها در زمان اجرا را فراهم میکنند، ویژگیهایی که نمیتوان در زمان کامپایل تضمین کرد. ۳. مدیریت منابع منبع، هر چیزی است که باید آن را بهدست آوریم و بعداً بهصورت صریح یا ضمنی آزاد کنیم. برای مثال: حافظه، قفلها، دستههای فایل، سوکتها، دستههای نخها، تراکنشها و شیدرها. برای جلوگیری از نشت منابع، باید از آزادسازی دستی/صریح اجتناب کنیم. انسانها – حتی برنامهنویسان – بهطور بدنامی در بهیاد آوردن بازگرداندن آنچه قرض گرفتهاند، ضعیف هستند. تکنیک پایه سی++ برای مدیریت منابع، ریشهدادن آن در یک دسته (handle) است که تضمین میکند منبع هنگام خروج از محدوده دسته آزاد میشود. برای اطمینان، نمیتوانیم به عملیات صریح مانند delete، free()، unlock() و غیره در کد برنامه وابسته باشیم. چنین عملیاتی باید در دستههای منابع قرار گیرند. به مثال زیر توجه کنید: template<typename T> class Vector { // بردار از عناصر نوع T public: Vector(initializer_list<T>); // سازنده: تخصیص حافظه؛ مقداردهی اولیه عناصر ~Vector(); // تخریبکننده: نابودی عناصر؛ آزادسازی حافظه // ... private: T* elem; // اشارهگر به عناصر int sz; // تعداد عناصر }; در اینجا، Vector یک دسته منبع است. سطح انتزاع را از اشارهگر نزدیک به ماشین بهعلاوه تعداد عناصر، به یک نوع مناسب با مقداردهی اولیه تضمینشده (سازنده) و پاکسازی (تخریبکننده) ارتقا میدهد. بردار استاندارد کتابخانه که این Vector برای نشان دادن آن در نظر گرفته شده، همچنین مقایسهها، تخصیصها، روشهای بیشتر برای مقداردهی اولیه، تغییر اندازه، پشتیبانی از تکرار و غیره را فراهم میکند. این به برنامهنویس یک بردار میدهد که از نظر فنی زبانی، مانند یک نوع داخلی مانند عدد صحیح رفتار میکند، با وجود اینکه یک دسته منبع (کتابخانه استاندارد) است و معناشناسی کاملاً متفاوتی دارد. میتوانیم از آن به این صورت استفاده کنیم: void fct() { Vector<double> constants {1, 1.618, 3.14, 2.99e8}; Vector<string> designers {"Strachey", "Richards", "Ritchie"}; // ... Vector<pair<string,jthread>> vp { {"producer",prod}, {"consumer",cons}}; } در اینجا، constants با چهار مقدار ریاضی و فیزیکی، designers با سه طراح زبان برنامهنویسی شناختهشده، و vp با یک جفت تولیدکننده-مصرفکننده مقداردهی اولیه میشوند. همه توسط سازندههای مناسب مقداردهی شده و هنگام خروج از محدوده توسط تخریبکنندههای مناسب آزاد میشوند. مقداردهی اولیه و آزادسازی توسط جفتهای سازنده-تخریبکننده بهصورت بازگشتی انجام میشود. برای مثال، ساخت و تخریب vp ساده نیست زیرا شامل یک Vector، یک pair، رشتهها (دستههای کاراکترها)، و jthreadها (دستههای نخهای سیستمعامل) است. با این حال، همه اینها بهصورت ضمنی مدیریت میشوند. این استفاده از جفتهای سازنده-تخریبکننده (که اغلب بهعنوان RAII – «تخصیص منبع یعنی مقداردهی اولیه» شناخته میشود) نهتنها آزادسازی منابع را تضمین میکند، بلکه نگهداری منابع را نیز به حداقل میرساند، که در مقایسه با بسیاری از تکنیکهای دیگر، مانند مدیریت حافظه مبتنی بر جمعآوری زباله، مزیت عملکردی قابلتوجهی ارائه میدهد. ۳.۱. کنترل طول عمر کنترل طول عمر اشیاء نمایانگر منابع برای مدیریت ساده و کارآمد منابع ضروری است. سی++ چهار نقطه کنترل را بهصورت عملیات روی یک کلاس (اینجا به نام X) ارائه میدهد: ساخت: پیش از اولین استفاده فراخوانی میشود: ایجاد ثابت کلاس (در صورت وجود). نام: سازنده، X(optional_arguments) تخریب: پس از آخرین استفاده فراخوانی میشود: آزادسازی هر منبع (در صورت وجود). نام: تخریبکننده، ~X() کپی: ساخت یک شیء جدید با همان مقدار شیء دیگر؛ a=b به این معناست که a==b (برای انواع منظم). نامها: سازنده کپی، X(const X&) و تخصیص کپی، X::operator=(const X&) انتقال: انتقال منابع از یک شیء به شیء دیگر، اغلب بین محدودهها. نامها: سازنده انتقال، X(X&&) و تخصیص انتقال، X::operator=(X&&) برای مثال، میتوانیم Vector خود را به این صورت گسترش دهیم: template<typename T> class Vector { // بردار از عناصر نوع T public: Vector(); // سازنده پیشفرض: ساخت یک بردار خالی Vector(initializer_list<T>); // سازنده: تخصیص حافظه؛ مقداردهی اولیه عناصر Vector(const Vector& a); // سازنده کپی: کپی a به *this Vector& operator=(const Vector& a); // تخصیص کپی: کپی a به *this Vector(Vector&& a); // سازنده انتقال: انتقال a به *this Vector& operator=(Vector&& a); // تخصیص انتقال: انتقال a به *this ~Vector(); // تخریبکننده: نابودی عناصر؛ آزادسازی حافظه // ... }; عملگرهای تخصیص باید هر منبعی که شیء مقصد مالک آن است را آزاد کنند. عملیات انتقال باید تمام منابع را به مقصد منتقل کنند و اطمینان دهند که دیگر در منبع وجود ندارند. ۳.۲. حذف کپیهای اضافی با توجه به این چارچوب، بیایید دوباره به مثال collect_lines از بخش ۱ نگاه کنیم. ابتدا میتوانیم آن را کمی سادهتر کنیم: vector<string> collect_lines(istream& is) // جمعآوری خطوط یکتا از ورودی { unordered_set s {from_range,istream_iterator<string>{is}}; // مقداردهی اولیه s از is return vector{from_range,s}; } auto lines = collect_lines(cin); بخش istream_iterator<string>{is} به ما اجازه میدهد ورودی از is را بهعنوان یک محدوده از عناصر در نظر بگیریم، بهجای اینکه عملیات ورودی را بهصورت صریح روی جریان اعمال کنیم. در اینجا، بردار بهجای کپی، از collect_lines() منتقل میشود. بدترین حالت هزینه سازنده انتقال یک بردار، کپی ۶ کلمه است: سه کلمه برای کپی نمایندگی و سه کلمه برای صفر کردن نمایندگی اصلی. این حتی اگر بردار یک میلیون عنصر داشته باشد، صدق میکند. حتی این هزینه کوچک در بسیاری از موارد حذف میشود. از حدود سال ۱۹۸۳، کامپایلرها میدانند که مقدار برگشتی (اینجا، vector{from_range,s}) را در مقصد (اینجا، lines) بسازند. این بهعنوان «حذف کپی» شناخته میشود. با این حال، رشتهها همچنان از مجموعه به بردار کپی میشوند. این میتواند پرهزینه باشد. در اصل، کامپایلر میتوانست استنباط کند که ما پس از ساخت بردار دیگر از s استفاده نمیکنیم و فقط عناصر رشته را منتقل کند، اما کامپایلرهای امروزی به این اندازه هوشمند نیستند، بنابراین باید صراحتاً درخواست انتقال کنیم: vector<string> collect_lines(istream& is) // جمعآوری خطوط یکتا از ورودی { unordered_set s {from_range,istream_iterator<string>{is}}; // مقداردهی اولیه s از is return vector{from_range,std::move(s)}; // انتقال عناصر } این هنوز یک کپی اضافی باقی میگذارد: کپی کاراکترها از بافر ورودی به عناصر رشته مجموعه. اگر این مشکلساز باشد، میتوان آن را نیز حذف کرد. با این حال، انجام این کار شامل تکنیکهای سطح پایین معمولی است که خارج از محدوده این مقاله است. چنین کدی پیچیدهتر است، اما همانطور که همیشه، کد سی++ با رابطهای مشخصشده بهخوبی قابلبهینهسازی است. همچنین، لطفاً بهیاد داشته باشید: بدون اندازهگیری نیاز به بهینهسازی، هرگز بهینهسازی نکنید. ۳.۳. منابع و خطاها یکی از اهداف کلیدی سی++ ایمنی منابع است: هیچ منبعی نباید نشت کند. این به این معناست که باید از نشت منابع در شرایط خطا جلوگیری کنیم. قوانین پایه عبارتند از: هیچ منبعی نباید نشت کند. هیچ منبعی نباید در حالت نامعتبر رها شود. بنابراین، وقتی خطایی که نمیتوان بهصورت محلی مدیریت کرد شناسایی میشود، پیش از خروج از تابع باید: هر شیء دسترسیشده را در حالت معتبر قرار دهیم. هر شیء که تابع مسئول آن است را آزاد کنیم. مدیریت مشکلات مربوط به منابع را به تابع بالاتر در زنجیره فراخوانی واگذار کنیم. این به این معناست که «اشارهگرهای خام» نمیتوانند بهطور قابلاعتماد بهعنوان دستههای منابع استفاده شوند. به نوع Gadget توجه کنید که ممکن است منابعی مانند حافظه، قفلها و دستههای فایل را نگه دارد: void f(int n, int x) { Gadget g {n}; Gadget* pg = new Gadget{n}; // استفاده صریح از new: نکنید! // ... if (x<100) throw std::runtime_error{"Weird!"}; // نشت *pg؛ اما نه g if (x<200) return; // نشت *pg؛ اما نه g // ... } استفاده صریح از new برای قرار دادن Gadget روی هیپ، مشکلی ایجاد میکند همان لحظهای که نتیجه آن در یک «اشارهگر خام» بهجای یک دسته منبع با تخریبکننده مناسب ذخیره میشود. اشیاء محلی سادهتر و معمولاً سریعتر از استفاده صریح از new هستند. برای یک سیستم قابلاعتماد، نیاز به یک سیاست مشخص برای مدیریت خطاها داریم. بهترین روش کلی، تمایز بین خطاهایی است که میتوانند بهصورت محلی توسط فراخواننده فوری مدیریت شوند و خطاهایی که فقط در بالاترین سطح زنجیره فراخوانی قابلمدیریت هستند: از کدهای خطا و آزمایشها برای خطاهایی که رایج هستند و میتوانند بهصورت محلی مدیریت شوند استفاده کنید. از استثناها برای خطاهای نادر («استثنایی») که نمیتوانند بهصورت محلی مدیریت شوند استفاده کنید. جایگزین، «جهان کد خطا» پرهزینه است که در آن هر فراخواننده در زنجیره فراخوانی باید بهیاد بیاورد که آزمایش کند. عدم بررسی یک استثنا منجر به خاتمه میشود، نه نتایج اشتباه. در برخی کاربردهای مهم، خاتمه فوری بیقیدوشرط گزینهای نیست. در این صورت، باید هر کد خطای بازگشتی را آزمایش کنیم و هر استثنا را در جایی (مثلاً در main()) بگیریم و پاسخ مناسب را انجام دهیم. بهطور شگفتانگیزی برای بسیاری، استثناها حتی برای سیستمهای کوچک میتوانند ارزانتر و سریعتر از استفاده مداوم از کدهای خطا باشند. مدیریت خطا مبتنی بر استثناها با اشارهگرهایی که بهعنوان دستههای منابع استفاده میشوند، کار نمیکند. برای مدیریت خطای ساده، قابلاعتماد و قابلنگهداری، باید به استثناها و RAII و همچنین کدهای خطا برای خطاهایی که باید بهصورت محلی مدیریت شوند، تکیه کنیم. به مثال زیر توجه کنید: void fct(jthread& prod, jthread& cons, string name) { ifstream in { name }; if (!in) { /* ... */ } // احتمال شکست مورد انتظار // ... vector<double> constants {1, 1.618, 3.14, 2.99e8}; vector<string> designers {"Strachey", "Richards", "Ritchie"}; auto dmr = "Dennis M. " + designers[2]; // ... pair<string,jthread&> pipeline[] { {"producer", prod}, {"consumer", cons}}; // ... } اگر نتوانیم به استثناها تکیه کنیم، برای این مثال کوچک (اما غیرواقعی نیست) به چند آزمایش نیاز داریم؟ این مثال شامل تخصیص حافظه، ساخت تودرتو، یک عملگر بیشبارگذاریشده، و بهدست آوردن یک منبع سیستمی است. متأسفانه، استثناها بهطور جهانی مورد قدردانی و استفاده قرار نگرفتهاند. علاوه بر استفاده بیشازحد از «اشارهگرهای خام»، مشکلی بوده که بسیاری از توسعهدهندگان اصرار دارند از یک تکنیک واحد برای گزارش تمام خطاها استفاده کنند، یعنی یا همه با پرتاب یا همه با بازگرداندن کد خطا. این با نیازهای کدهای واقعی همخوانی ندارد. ۴. مدولاریتی پیشپردازندهای که سی++ از سی به ارث برده، تقریباً بهطور جهانی استفاده میشود، اما مانع بزرگی برای توسعه ابزارها و عملکرد کامپایلر است. در سی++ امروزی، ماکروهایی که برای بیان ثابتها، توابع و انواع استفاده میشدند، با ثابتهای با نوع و محدوده مناسب، توابع ارزیابیشده در زمان کامپایل، و قالبها جایگزین شدهاند. با این حال، پیشپردازنده برای بیان شکل ضعیفی از مدولاریتی ضروری بوده است. رابطهای کتابخانهها و سایر کدهای کامپایلشده جداگانه بهصورت فایلهایی حاوی متن منبع سی++ و #include نمایش داده میشوند. ۴.۱. فایلهای سرآیند (Header Files) یک دستور #include متن منبع را از یک «فایل سرآیند» به واحد ترجمه فعلی کپی میکند. متأسفانه، این به این معناست که: #include "a.h" #include "b.h" ممکن است معنای متفاوتی نسبت به: #include "b.h" #include "a.h" داشته باشد. این منبع باگهای ظریفی است. یک #include انتقالی است. یعنی اگر a.h شامل #include "c.h" باشد، متن c.h نیز بخشی از هر فایل منبعی که از #include "a.h" استفاده میکند، میشود. این نیز منبع باگهای ظریفی است. از آنجا که یک فایل سرآیند اغلب در دهها یا صدها فایل منبع #include میشود، این به معنای تکرار زیاد در کامپایل است. ۴.۲. ماژولها این مشکلات استفاده از فایلهای سرآیند برای تقلید مدولاریتی از پیش از تولد سی++ شناختهشده بود، اما تعریف یک جایگزین و معرفی آن به میلیاردها خط کد کار سادهای نیست. با این حال، سی++ اکنون ماژولهایی ارائه میدهد که مدولاریتی واقعی را فراهم میکنند. وارد کردن ماژولها مستقل از ترتیب است، بنابراین: import a; import b; همان معنای: import b; import a; را دارد. استقلال متقابل ماژولها به معنای بهبود بهداشت کد است و باگهای وابستگی ظریف را غیرممکن میکند. اینجا یک مثال بسیار ساده از تعریف یک ماژول است: چون وارد کردن ماژول انتقالی نیست، کاربران map_printer به جزئیات پیادهسازی موردنیاز برای print_map دسترسی ندارند. یک ماژول فقط یکبار نیاز به کامپایل دارد، صرفنظر از اینکه چند بار وارد میشود. این به معنای بهبود بسیار قابلتوجه در زمان کامپایل است. یک کاربر گزارش داده است: #include <libgalil/DmcDevice.h> // 457440 خط پس از پیشپردازش int main() { // 151268 خط غیرخالی Libgalil::DmcDevice("192.168.55.10"); // 1546 میلیثانیه برای کامپایل } این یعنی ۱.۵ ثانیه برای کامپایل تقریباً نیم میلیون خط کد. این سریع است! اما کامپایلر کار بیشازحد انجام میدهد. import libgalil; // 5 خط پس از پیشپردازش int main() { // 4 خط غیرخالی Libgalil::DmcDevice("192.168.55.10"); // 62 میلیثانیه برای کامپایل } این یک سرعت ۲۵ برابری است. نمیتوان انتظار داشت که در همه موارد اینگونه باشد، اما برتری ۷ تا ۱۰ برابری وارد کردن نسبت به #include رایج است. اگر آن کتابخانه را در ۲۵ فایل منبع #include کنید، هزینه آن ۱.۵ ثانیه ۲۵ بار خواهد بود، در حالی که وارد کردن در مجموع ۱.۵ ثانیه طول میکشد. کتابخانه استاندارد کامل به یک ماژول تبدیل شده است. به برنامه سنتی «سلام، دنیا!» نگاه کنید: #include <iostream> int main() { std::cout << "Hello, World!\n"; } روی لپتاپ من، این در ۰.۸۷ ثانیه کامپایل شد. جایگزین کردن #include<iostream.h> با import std; زمان کامپایل را به ۰.۰۸ ثانیه کاهش داد، با وجود اینکه حداقل ۱۰ برابر اطلاعات بیشتری در دسترس قرار گرفت. بازسازی مقدار قابلتوجهی از کد آسان یا ارزان نیست، اما در مورد ماژولها، مزایا از نظر کیفیت کد قابلتوجه و از نظر زمان کامپایل عظیم است. چرا در این مورد خاص – و فقط در این مورد – زحمت توضیح «روش قدیمی بد» را به خودم میدهم؟ چون #includeها همهگیر هستند، تقریباً از زمان تولد سی، و بسیاری از توسعهدهندگان تصور سی++ بدون آن را دشوار میدانند. ۵. برنامهنویسی جنریک برنامهنویسی جنریک یکی از پایههای کلیدی سی++ امروزی است. این از پیش از تغییر نام «سی با کلاسها» به «سی++» وجود داشته، اما تنها بهتازگی (C++20) پشتیبانی زبان به آرمانها نزدیک شده است. برنامهنویسی جنریک، یعنی برنامهنویسی با انواع و توابعی که توسط انواع پارامتریزه شدهاند، ارائه میدهد: کد کوتاهتر و خواناتر بیان مستقیمتر ایدهها انتزاع با هزینه صفر ایمنی نوع داده قالبها، پشتیبانی زبان سی++ برای برنامهنویسی جنریک، در کتابخانه استاندارد همهگیر هستند: ظروف و الگوریتمها پشتیبانی از همزمانی: نخها، قفلها، ... مدیریت حافظه: تخصیصدهندهها، دستههای منابع (مثل vector و list)، اشارهگرهای مدیریت منابع، ... ورودی/خروجی رشتهها و عبارات منظم و خیلی چیزهای دیگر میتوانیم کدی بنویسیم که برای تمام انواع آرگومان مناسب کار کند. برای مثال، اینجا یک تابع مرتبسازی است که تمام انواعی که تعریف استاندارد ISO سی++ از یک محدوده قابلمرتبسازی را دارند، میپذیرد: void sort(Sortable_range auto& r); vector<string> vs; // ... پر کردن vs ... sort(vs); array<int,128> ai; // ... پر کردن ai ... sort(ai); کامپایلر اطلاعات کافی برای تأیید این دارد که انواع vs و ai آنچه Sortable_range نیاز دارد را دارند؛ یعنی یک محدوده با دسترسی تصادفی از مقادیر انواعی که میتوانند برای مرتبسازی مقایسه و جابهجا شوند. اگر آرگومانها مناسب نباشند، خطا توسط کامپایلر در نقطه استفاده شناسایی میشود. برای مثال: list<int> lsti; // ... پر کردن lsti ... sort(lsti); // خطا: یک لیست دسترسی تصادفی ارائه نمیدهد طبق استاندارد سی++، یک لیست محدوده قابلمرتبسازی نیست زیرا دسترسی تصادفی ارائه نمیدهد. ۵.۱. مفاهیم (Concepts) یک مفهوم (concept) یک پیشنیاز در زمان کامپایل است. یعنی تابعی که توسط کامپایلر اجرا میشود و یک مقدار بولی تولید میکند. بیشتر برای بیان الزامات پارامترهای یک قالب استفاده میشود. یک مفهوم اغلب از مفاهیم دیگر ساخته میشود. برای مثال، اینجا Sortable_range موردنیاز تابع sort بالا آمده است: template<typename R> concept Sortable_range = random_access_range<R> // دارای begin()/end()، ++، []، +، ... && sortable<iterator_t<R>>; // میتواند عناصر را مقایسه و جابهجا کند این میگوید که یک نوع R یک Sortable_range است اگر یک random_access_range باشد و دارای نوع تکرارساز قابلمرتبسازی باشد. random_access_range و sortable مفاهیمی هستند که در کتابخانه استاندارد تعریف شدهاند. یک مفهوم میتواند یک یا چند آرگومان بگیرد و میتواند از ویژگیهای اساسی زبان ساخته شود. برای مشخص کردن یک ویژگی نوع مستقیماً به زبان (بهجای استفاده از مفاهیم دیگر)، از «الگوهای استفاده» استفاده میکنیم. برای مثال: template<typename T, typename U = T> concept equality_comparable = requires(T a, U b) { {a==b} -> Boolean; {a!=b} -> Boolean; {b==a} -> Boolean; {b!=a} -> Boolean; }; سازههای داخل {...} باید معتبر باشند و چیزی را برگردانند که با مفهوم مشخصشده پس از -> مطابقت داشته باشد. بنابراین، اینجا الگوهای استفاده فهرستشده (مثل a==b) باید چیزی برگردانند که بتوان بهعنوان یک bool استفاده کرد. معمولاً، همانطور که در مثال sort دیده شد، بررسی اینکه یک نوع با یک مفهوم مطابقت دارد بهصورت ضمنی انجام میشود، اما میتوانیم صراحتاً با static_assert این کار را انجام دهیم: static_assert(equality_comparable<int,double>); // موفق static_assert(equality_comparable<int>); // موفق (U بهطور پیشفرض int است) static_assert(equality_comparable<int,string>); // ناموفق مفهوم equality_comparable در کتابخانه استاندارد تعریف شده است. نیازی به تعریف آن توسط خودمان نیست، اما مثال خوبی است. ما میخواهیم کدی بنویسیم که برای تمام انواع آرگومان مناسب کار کند. با این حال، بسیاری (شاید بیشتر) الگوریتمها بیش از یک نوع آرگومان قالب میگیرند. این به این معناست که باید روابط بین این آرگومانهای قالب را بیان کنیم. برای مثال: template<input_range R, indirect_unary_predicate<iterator_t<R> Pred> Iterator_t<R> find_if(R&& r, Pred p); این میگوید که find_if یک محدوده ورودی r و یک پیشنیاز p میگیرد که میتواند روی نتیجه یک غیرمستقیمسازی از طریق تکرارساز r اعمال شود. برای مثال: vector<string> numbers; // رشتههایی که اعداد را نشان میدهند؛ مثلاً "13" و "123.45" // ... پر کردن numbers ... auto q = find_if(numbers, [](const string& s) { return stoi(s)<42; }); پارامتر دوم فراخوانی find_if یک عبارت لامبدا است. این یک شیء تابعی تولید میکند که هنگام فراخوانی در پیادهسازی find_if برای یک آرگومان s، عبارت stoi(s)<42 را اجرا میکند. عبارات لامبدا (که معمولاً فقط «لامبدا» نامیده میشوند) در سی++ امروزی بسیار مفید و محبوب شدهاند. ما همیشه مفاهیم را داشتهایم. هر کتابخانه جنریک موفق نوعی از مفاهیم را دارد: در ذهن طراح، در مستندات، یا در نظرات. چنین مفاهیمی اغلب مفاهیم اساسی یک حوزه کاربردی را نشان میدهند. برای مثال: انواع داخلی سی/سی++: حسابی و اعشاری کتابخانه استاندارد سی++: تکرارسازها، دنبالهها، و ظروف ریاضیات: موناد، گروه، حلقه، و میدان گرافها: یالها و رأسها، گراف، DAG، ... استاندارد C++20 ایده مفاهیم را معرفی نکرد؛ فقط زبان مستقیمی برای مفاهیم اضافه کرد. یک مفهوم یک پیشنیاز در زمان کامپایل است. استفاده از مفاهیم آسانتر از عدم استفاده از آنهاست. با این حال، مانند هر سازه جدید، باید یاد بگیریم که چگونه از آنها بهطور مؤثر استفاده کنیم. ۵.۲. ارزیابی در زمان کامپایل یک مفهوم نمونهای از یک تابع در زمان کامپایل است. در سی++ امروزی، هر تابع بهاندازه کافی ساده میتواند در زمان کامپایل ارزیابی شود: constexpr: میتواند در زمان کامپایل ارزیابی شود consteval: باید در زمان کامپایل ارزیابی شود concept: در زمان کامپایل ارزیابی میشود، میتواند انواع را بهعنوان آرگومان بگیرد این برای انواع داخلی و تعریفشده توسط کاربر صدق میکند. برای مثال: constexpr auto jul = weekday(December/24/2024); // سهشنبه برای اینکه توابع consteval و constexpr و مفاهیم بتوانند در زمان کامپایل ارزیابی شوند، نمیتوانند: اثرات جانبی داشته باشند به دادههای غیرمحلی دسترسی داشته باشند رفتار نامعین (UB) داشته باشند با این حال، آنها میتوانند از امکانات گسترده، از جمله بخش زیادی از کتابخانه استاندارد، استفاده کنند. بنابراین، چنین توابعی نسخه سی++ از ایده یک تابع خالص هستند و یک کامپایلر سی++ امروزی شامل یک مفسر تقریباً کامل سی++ است. ارزیابی در زمان کامپایل همچنین برای عملکرد یک مزیت بزرگ است. ۶. راهنماها و اجرا سبکهای امروزی مزایای عمدهای به همراه دارند. با این حال، ارتقای کد دشوار و اغلب پرهزینه است. چگونه میتوانیم کد موجود را مدرن کنیم؟ اجتناب از تکنیکهای غیربهینه دشوار است. عادتهای قدیمی بهسختی از بین میروند. آشنایی اغلب با سادگی اشتباه گرفته میشود. اطلاعات گیجکننده و قدیمی زیادی در وب و مواد آموزشی منتشر میشود. همچنین، کدهای قدیمی اغلب رابطهای به سبک قدیمی ارائه میدهند، که استفاده از سبکهای قدیمیتر را تشویق میکند. ما به کمک نیاز داریم تا به سمت سبکهای بهتری از کد هدایت شویم. پایداری/سازگاری یک ویژگی اصلی است. همچنین، با توجه به میلیاردها خط کد سی++، تنها پذیرش تدریجی ویژگیها و تکنیکهای جدید امکانپذیر است. بنابراین، نمیتوانیم زبان را تغییر دهیم، اما میتوانیم روش استفاده از آن را تغییر دهیم. مردم (بهطور معقولی) سی++ سادهتری میخواهند، اما همچنین ویژگیهای جدید، و اصرار دارند که کد موجودشان باید به کار خود ادامه دهد. برای کمک به توسعهدهندگان برای تمرکز بر استفاده مؤثر از سی++ امروزی و اجتناب از «گوشههای تاریک» قدیمی زبان، مجموعههایی از راهنماها توسعه یافتهاند. در اینجا من بر راهنماهای هسته سی++ تمرکز میکنم که به نظرم جاهطلبانهترین هستند. یک مجموعه راهنما باید فلسفه منسجمی از زبان نسبت به یک کاربرد خاص را نشان دهد. هدف اصلی من استفاده ایمن از نظر نوع داده و منابع از سی++ استاندارد ISO است. یعنی: هر شیء فقط طبق تعریف خود استفاده میشود هیچ منبعی نشت نمیکند این شامل آنچه مردم بهعنوان ایمنی حافظه میشناسند و خیلی بیشتر است. این هدف جدیدی برای سی++ نیست. بدیهی است که نمیتوان آن را برای هر استفاده از سی++ بهدست آورد، اما اکنون سالها تجربه نشان داده که برای کد مدرن امکانپذیر است، هرچند تاکنون اجرا ناقص بوده است. یک مجموعه راهنما نقاط قوت و ضعفی دارد: اکنون در دسترس است (مثلاً راهنماهای هسته سی++) قوانین فردی میتوانند اجرا شوند یا نشوند اجرا ناقص است با تکیه بر راهنماها، به اجرا نیاز داریم: یک پروفایل مجموعهای منسجم از قوانین راهنما است که اجرا میشود در WG21 و جاهای دیگر در حال کار است هنوز در دسترس نیستند، جز نسخههای آزمایشی و جزئی هنگام فکر کردن به سی++، مهم است بهیاد داشته باشیم که سی++ فقط یک زبان نیست، بلکه بخشی از یک اکوسیستم شامل پیادهسازیها، کتابخانهها، ابزارها، آموزش و غیره است. بهویژه، توسعهدهندگانی که از سی++ استفاده میکنند به امکاناتی فراتر از آنچه در سی در دسترس است وابستهاند. ۶.۱. راهنماها زیرمجموعهسازی ساده سی++ کار نمیکند: ما به ویژگیهای سطح پایین، پیچیده، نزدیک به سختافزار، مستعد خطا و فقط برای متخصصان نیاز داریم تا امکانات سطح بالاتر را بهطور کارآمد پیادهسازی کنیم و ویژگیهای سطح پایین را در صورت نیاز فعال کنیم. راهنماهای هسته سی++ از استراتژیای به نام «زیرمجموعهای از ابر مجموعه» استفاده میکنند: ابتدا: زبان را با چند انتزاع کتابخانهای گسترش دهید: از بخشهایی از کتابخانه استاندارد استفاده کنید و یک کتابخانه کوچک (کتابخانه پشتیبانی راهنماها، GSL) اضافه کنید تا استفاده از راهنماها راحت و کارآمد باشد. سپس: زیرمجموعهسازی: استفاده از ویژگیهای سطح پایین، غیرکارآمد و مستعد خطا را ممنوع کنید. آنچه بهدست میآید «سی++ تقویتشده» است: چیزی ساده، ایمن، انعطافپذیر و سریع؛ نه یک زیرمجموعه فقیر یا چیزی که به بررسیهای گسترده در زمان اجرا وابسته باشد. همچنین زبانی با ویژگیهای جدید و/یا ناسازگار ایجاد نمیکنیم. نتیجه ۱۰۰٪ سی++ استاندارد ISO است. ویژگیهای پیچیده، خطرناک و سطح پایین همچنان میتوانند در صورت نیاز فعال و استفاده شوند. حوزههای کاربردی مختلف نیازهای متفاوتی دارند و بنابراین به مجموعههای راهنمای متفاوتی نیاز دارند، اما در ابتدا تمرکز روی «هسته یا راهنماهای هسته سی++» است. قوانینی که امیدواریم همه در نهایت از آنها بهرهمند شوند: بدون متغیرهای مقداردهینشده بدون نقض محدوده یا nullptr بدون نشت منابع بدون اشارهگرهای آویزان بدون نقض نوع بدون نامعتبرسازی دو کتاب سی++ را با پیروی از این راهنماها شرح میدهند، مگر در مواردی که خطاها را نشان میدهند: «تور سی++» برای برنامهنویسان با تجربه و «برنامهنویسی: اصول و تمرین با استفاده از سی++» برای مبتدیان. دو کتاب دیگر جنبههای راهنماهای هسته سی++ را بررسی میکنند. ۶.۲. قانون نمونه: از اندیسگذاری اشارهگرها استفاده نکنید یک اشارهگر اطلاعات مرتبط موردنیاز برای بررسی محدوده را ندارد. با این حال، بررسی محدوده برای ایمنی حافظه و همچنین ایمنی نوع داده ضروری است، زیرا نمیتوانیم به کد برنامه اجازه دهیم اشیائی را بخواند یا بازنویسی کند که فراتر از محدوده اشیاء اشارهشده هستند. در عوض، باید از انتزاعی استفاده کنیم که اطلاعات کافی برای بررسی محدوده داشته باشد، مانند یک آرایه، یک بردار، یا یک span. سبک رایجی را در نظر بگیرید: یک اشارهگر بهعلاوه یک عدد صحیح که ظاهراً تعداد عناصر اشارهشده را نشان میدهد: void f(int* p, int n) { for (int i = 0; i<n; i++) do_something_with(p[n]); } int a[100]; // ... f(a,100); // مشکلی ندارد؟ (بستگی به معنای n در تابع فراخوانیشده دارد) f(a,1000); // احتمالاً فاجعه این یک مثال بسیار ساده با استفاده از یک آرایه برای نشان دادن اندازه است. از آنجا که اندازه موجود است، بررسی در نقطه فراخوانی ممکن است (هرچند بهندرت انجام میشود) و معمولاً یک جفت (اشارهگر، عدد صحیح) از طریق یک زنجیره فراخوانی طولانیتر منتقل میشود که تأیید را دشوار یا غیرممکن میکند. راهحل این مشکل، اتصال محکم اندازه به اشارهگر است (مانند Vector؛ بخش ۳.۱). این همان کاری است که یک span انجام میدهد: void f(span<int> a) // یک span شامل یک اشارهگر و تعداد عناصر اشارهشده است { for (int& x: s) // حالا میتوانیم از یک range-for استفاده کنیم do_something_with(x); } int a[100]; // ... f(a); // نوع و تعداد عناصر استنباط میشود f({a,1000}); // درخواست مشکل، اما بهصورت نحوی مشخصشده و بهراحتی قابلبررسی استفاده از span نمونه خوبی از اصل «ساده کردن چیزهای ساده» است. کد با استفاده از آن سادهتر از «سبک قدیمی» است: کوتاهتر، ایمنتر، و اغلب سریعتر. نوع span در کتابخانه پشتیبانی راهنماها بهعنوان یک نوع بررسیشده محدوده معرفی شد. متأسفانه، وقتی به کتابخانه استاندارد اضافه شد، تضمین بررسی محدوده حذف شد. بدیهی است که یک پروفایل (بخش ۶.۴) که این قانون را اجرا میکند، باید بررسی محدوده را انجام دهد. هر پیادهسازی عمده سی++ راههایی برای اطمینان از این دارد (مثلاً سختسازی کتابخانه استاندارد GCC، ایمنی فضایی گوگل، و تحلیلگر استاتیک ویژوال استودیو مایکروسافت). متأسفانه، هنوز راه استاندارد و قابلحمل برای درخواست آن وجود ندارد. ۶.۳. قانون نمونه: از اشارهگر نامعتبر استفاده نکنید برخی ظروف، بهویژه بردار، میتوانند عناصر خود را جابهجا کنند. اگر کسی خارج از ظرف اشارهگری به یک عنصر بهدست آورد و پس از جابهجایی از آن استفاده کند، فاجعه ممکن است رخ دهد. به مثال زیر توجه کنید: void f(vector<int>& vi) { vi.push_back(9); // ممکن است عناصر vi را جابهجا کند } void g() { vector<int> vi { 1,2 }; auto p = vi.begin(); // اشاره به اولین عنصر vi f(vi); *p = 7; // خطا: p نامعتبر است } با قوانین مناسب برای استفاده از سی++ (بخش ۶.۱)، تحلیل استاتیک محلی میتواند از نامعتبرسازی جلوگیری کند. در واقع، پیادهسازیهای بررسیهای طول عمر راهنماهای هسته از سال ۲۰۱۹ این کار را انجام دادهاند. پیشگیری از نامعتبرسازی و استفاده از اشارهگرهای آویزان بهطور کلی کاملاً استاتیک (در زمان کامپایل) است. هیچ بررسی در زمان اجرا درگیر نیست. اینجا جای شرح مفصل چگونگی انجام این تحلیل نیست. با این حال، طرح کلی مدل این است: قوانین برای هر موجودی که مستقیماً به یک شیء اشاره میکند، مانند اشارهگرها، اشارهگرهای مدیریت منابع، ارجاعها، و ظروف اشارهگرها اعمال میشود. مثالها شامل int*، int&، vector<int*>، unique_ptr<int>، jthread که یک int* را نگه میدارد، و یک لامبدا که یک int را با ارجاع گرفته است. استفاده پس از delete (بدیهی است) ممنوع است و به RAII (بخش ۳) تکیه کنید. اجازه ندهید یک اشارهگر از محدوده آنچه به آن اشاره میکند فرار کند. این به این معناست که یک اشارهگر فقط در صورتی میتواند از یک تابع برگردانده شود که به چیزی استاتیک اشاره کند، به چیزی در حافظه آزاد (هیپ یا حافظه پویا) اشاره کند، یا بهعنوان آرگومان وارد شده باشد. فرض کنید تابعی (مثل vector::push_back()) که آرگومانهای غیرثابت میگیرد، نامعتبر میکند. اگر اشارهگری به یکی از عناصر آن گرفته شده باشد، فراخوانی آن را ممنوع میکنیم. توابعی که فقط آرگومانهای ثابت میگیرند نمیتوانند نامعتبر کنند، و برای جلوگیری از مثبتهای کاذب گسترده و حفظ تحلیل محلی، میتوانیم اظهارات تابع را با [[profiles::non_invalidating]] حاشیهنویسی کنیم. این حاشیهنویسی میتواند هنگام دیدن تعریف تابع اعتبارسنجی شود. بنابراین، این یک حاشیهنویسی ایمن است، نه یک حاشیهنویسی «به من اعتماد کن». طبیعتاً، جزئیات زیادی برای رسیدگی وجود دارد، اما آنها در پیادهسازیهای آزمایشی و همچنین پیادهسازیهای در حال عرضه آزمایش شدهاند. ۶.۴. اجرا: پروفایلها راهنماها خوب و مفید هستند، اما دنبال کردن آنها بهصورت مداوم در یک پایگاه کد بزرگ عملاً غیرممکن است. بنابراین، اجرا ضروری است. اجرای قوانینی که از مقداردهینشدن، خطاهای محدوده، ارجاعزدایی nullptr، و استفاده از اشارهگرهای آویزان جلوگیری میکنند، اکنون در دسترس است و نشان داده شده که در پایگاههای کد بزرگ مقرونبهصرفه است. با این حال، قوانین بنیادی کلیدی باید استاندارد باشند – بخشی از تعریف سی++ – با یک راه استاندارد برای درخواست آنها در کد برای امکان همکاری بین کدهای توسعهیافته توسط سازمانهای مختلف و اجرا روی چندین پلتفرم و آموزش. ما مجموعهای منسجم از قوانین راهنما که تضمینی را فراهم میکنند، یک «پروفایل» مینامیم. طبق برنامهریزی فعلی برای استاندارد، مجموعه اولیه پروفایلها (بر اساس پروفایلهای راهنماهای هسته که سالهاست استفاده میشوند) عبارتند از: نوع: هر شیء مقداردهیشده؛ بدون کستها؛ بدون یونیونها طول عمر: بدون دسترسی از طریق اشارهگرهای آویزان؛ بررسی ارجاعزدایی اشارهگر برای nullptr؛ بدون new/delete صریح محدودهها: تمام اندیسگذاریها بررسی محدوده میشوند؛ بدون حساب اشارهگر حسابی: بدون سرریز یا زیرریز؛ بدون تبدیلهای تغییر مقدار امضاشده/بدون امضا این اساساً «هسته هسته» توصیفشده در بخش ۶.۱ است. با زمان و آزمایش، پروفایلهای بیشتری دنبال خواهند شد. برای مثال: الگوریتمها: تمام محدودهها، بدون ارجاعزدایی تکرارسازهای end() همزمانی: حذف قفلهای مرده و رقابتهای داده (سخت برای انجام) RAII: هر منبع متعلق به یک دسته (نه فقط منابع مدیریتشده با new/delete) همه پروفایلها استاندارد ISO نخواهند بود. انتظار دارم پروفایلهایی برای حوزههای کاربردی خاص تعریف شوند، مثلاً برای انیمیشن، نرمافزار پرواز، و محاسبات علمی. اجرا عمدتاً استاتیک (در زمان کامپایل) است، اما چند بررسی مهم باید در زمان اجرا باشد (مثل اندیسگذاری و ارجاعزدایی اشارهگر). یک پروفایل باید بهصورت صریح برای یک واحد ترجمه درخواست شود. برای مثال: [[profile::enforce(type)]] // بدون کستها یا اشیاء مقداردهینشده در این واحد ترجمه در صورت لزوم، یک پروفایل میتواند برای یک دستور (از جمله دستورات مرکب) که لازم است، سرکوب شود. برای مثال: [profile::suppress(lifetime))] this->succ = this->succ->succ; نیاز به سرکوب تأیید تضمینها عمدتاً برای پیادهسازی انتزاعهای موردنیاز برای ارائه تضمینها (مثل span، vector، و string_view)، تضمین بررسی محدوده، و دسترسی مستقیم به سختافزار است. چون سی++ نیاز به دستکاری مستقیم سختافزار دارد، نمیتوانیم پیادهسازی انتزاعهای اساسی را به زبان دیگری واگذار کنیم. همچنین – به دلیل گستردگی کاربردها و پیادهسازیهای مستقل متعدد – نمیتوانیم پیادهسازی تمام انتزاعهای بنیادی (مثل تمام انتزاعهای شامل ساختارهای پیوندی) را به کامپایلر واگذار کنیم. ۷. آینده من تمایلی به پیشبینی درباره آینده ندارم، بخشی به این دلیل که این ذاتاً خطرناک است، و بهویژه چون تعریف سی++ توسط کمیته استاندارد ISO عظیم که بر اساس اجماع عمل میکند، کنترل میشود. آخرین باری که بررسی کردم، فهرست اعضا ۵۲۷ ورودی داشت. این نشاندهنده اشتیاق، علاقه گسترده، و ارائه تخصص گسترده است، اما برای طراحی زبان برنامهنویسی ایدهآل نیست و قوانین ISO نمیتوانند بهطور چشمگیر تغییر کنند. در میان موضوعات دیگر، کارهایی در حال انجام است در مورد: یک مدل عمومی برای محاسبات ناهمگام بازتاب استاتیک SIMD یک سیستم قرارداد تطبیق الگو به سبک برنامهنویسی تابعی یک سیستم واحد عمومی (مثل سیستم SI) نسخههای آزمایشی همه اینها در دسترس هستند. یک نگرانی جدی این است که چگونه ایدههای متنوع را به یک کل منسجم ادغام کنیم. طراحی زبان شامل تصمیمگیری در فضایی است که همه عوامل مرتبط نمیتوانند شناخته شوند، و نتایج پذیرفتهشده نمیتوانند برای دههها بهطور قابلتوجهی تغییر کنند. این با اکثر توسعه محصولات نرمافزاری و اکثر پیگیریهای دانشگاهی علوم کامپیوتر متفاوت است. این واقعیت که تقریباً همه تلاشهای طراحی زبان در طول دههها شکست خوردهاند، جدیت این مشکل را نشان میدهد. ۸. خلاصه سی++ برای تکامل طراحی شده بود. وقتی شروع کردم، نهتنها منابع لازم برای طراحی و پیادهسازی زبان ایدهآلم را نداشتم، بلکه درک کردم که به بازخورد از استفاده نیاز دارم تا آرمانهایم را به واقعیتی عملی تبدیل کنم. و تکامل یافت، در حالی که به اهداف اساسی خود وفادار ماند. سی++ امروزی (C++23) تقریب بسیار بهتری به آرمانها نسبت به هر نسخه قبلی است، از جمله پشتیبانی از کیفیت کد بهتر، ایمنی نوع داده، قدرت بیان، عملکرد، و برای گستره بسیار وسیعتری از حوزههای کاربردی. با این حال، رویکرد تکاملی مشکلاتی جدی ایجاد کرد. بسیاری از مردم با دیدگاهی قدیمی از چیستی سی++ گیر کردهاند. امروز، هنوز ارجاعات بیپایانی به زبان افسانهای C/C++ میبینیم، که معمولاً به این معناست که سی++ بهعنوان یک افزونه جزئی از سی دیده میشود که تمام بدترین جنبههای سی را همراه با سوءاستفادههای وحشتناک از ویژگیهای پیچیده سی++ در بر میگیرد. منابع دیگر سی++ را بهعنوان تلاشی ناموفق برای طراحی جاوا توصیف میکنند. همچنین، پشتیبانی ابزارها در زمینههایی مانند مدیریت بستهها و سیستمهای ساخت به دلیل تمرکز جامعه بر سبکهای قدیمیتر استفاده عقب مانده است. مدل سی++ را میتوان بهصورت زیر خلاصه کرد: سیستم نوع استاتیک پشتیبانی برابر برای انواع داخلی و تعریفشده توسط کاربر معناشناسی مقدار و ارجاع مدیریت منابع سیستماتیک و عمومی (RAII) برنامهنویسی شیءگرا کارآمد برنامهنویسی جنریک انعطافپذیر و کارآمد برنامهنویسی در زمان کامپایل استفاده مستقیم از منابع ماشین و سیستمعامل پشتیبانی از همزمانی از طریق کتابخانهها (پشتیبانیشده توسط ویژگیهای داخلی) زبان سی++ و کتابخانه استاندارد بیان عینی این مدل و بخش حیاتی اکوسیستمهای مورداستفاده برای توسعه نرمافزار هستند. ارزش یک زبان برنامهنویسی در کیفیت کاربردهای آن است. - مرجع اصلی مقاله به همراه همهٔ مراجع علمی
-
نگارش ۱.۳.۸
دنیای خود را چگونه با کیوت بسازیم!؟ با توجه به توسعهٔ روزافزون فناوری، دنیای نرمافزاری همگام با آن با سرعت بسیار زیادی در حال پیشرفت و توسعه است. ما برای رسیدن به این مسیر باید به فکر تولید و توسعهٔ محصول با کیفیت همراه با اقدامات کلیدی باشیم تا این محصول هماهنگ با استانداردهای جهانی باشد. برای این امر نیاز است تا این استانداردها را بررسی و در درون پروژههای خود مورد استفاده قرار دهیم. کیوت به عنوان یک چهارچوب قدرتمند یکی از بهترین و پیشتازترین ابزارهای موجود در دنیای برنامهنویسی است که با تمرکز بر روی مباحث تولید محصولی اساساً بر پایهٔ تجربهکاربری و رابطکاربریِ پیشرفته همراه با پشتیبانی از قدرتمندترین زبان برنامهنویسی، نتیجهای مطلوب را در مسیر توسعهٔ محصول نرمافزاری شما فراهم میکند. توجه داشته باشید برنامهنویسی صرفاً نوشتن کد منطقی و برقراری ارتباط با دادهها و حل مسائل مربوط به آن نیست! علاوه بر حل مشکل، برقراری ارتباط با احساسات کاربر و ایجاد یک تجربه و تعامل خوب بسیار مهم است. باید توجه داشت که زمان، هزینه، سرعت و کیفیت همه باهم مهم هستند و برای به حداکثر رساندن درجه کیفیت هر یک از این مولفهها باید از بهترین روشهای ممکن استفاده کرد که شامل مواردی همچون چند-سکویی، ابری، تجربهکاربری، رابطکاربری، رابطهای برنامهنویسی، کتابخانهها و غیره... میباشند و برای رسیدن به آنها کافی است یک زبان مهم و پایه همراه با چند زبان فرعی و فناوریهای مرتبط با یکدیگر را به عنوان ابزار در اختیار داشته باشیم. آخرین اعتبار تخفیفات ویژه به مناسبتهای اخیر به پایان رسیده است. نکتهٔ بسیار مهم: این کتاب به صورت رسمی در کتابخانهٔ ملی ثبت شده است، بنابراین هرگونه چاپ، تکثیر و به اشتراکگذاری این کتاب پیگیرد قانونی دارد. توجه: دریافت نسخههای بهروزرسانی شده تنها از این صفحه برای کسانی که حداقل یک بار آن را تهیه کردهاند امکانپذیر است. نوع این کتاب الکترونیکی است، بعد از پرداخت میتوانید بر روی دکمهٔ دریافت فایل در همین صفحه کلیک کرده و آن را دریافت نمایید. در صورتی که درگاه پرداختی با مشکل مواجه شده باشد، میتوانید به شماره کارت ۶۱۰۴۳۳۷۸۸۴۵۳۳۳۴۸ (بانک ملت) واریز و آن را به آدرس kambiz.ceo@gmail.com و یا شناسهٔ تلگرامی @thecompez اطلاع دهید تا تأیید شود. در صورتی که از شما اطلاعات آدرس مکانی پرسیده شد، میتوانید آنها را وارد نکنید. * تمامی حقوق مادی و معنوی این کتاب متعلق به مولف و ناشر مولف (کامبیز اسدزاده) میباشد و هرگونه کپی برداری از آن پیگرد قانونی خواهد داشت. توجه : در داشتن هر گونه انتقاد و پیشنهاد در رابطه با این کتاب با آدرس شخصی نویسنده (kambiz.ceo@gmail.com) مکاتبه نمایید. نکته : این کتاب در روزهای خاص ممکن است شامل تخفیف قرار بگیرد. نکته دوم : کسانی که این کتاب را یک بار خریداری میکنند نسخهٔ بهروزرسانی شده آن را به صورت رایگان میتوانند دریافت کنند. برخی از درخواستها در کتاب مقدماتی به صورت زیر بودند: آموزش پیشرفته در رابطه با QML و آشنایی با آن آموزش برقراری ارتباط بین ++C و QML به صورت بکاند و فرانتاند آموزش کار با کنترلها و نحوهٔ سفارشی سازی پروژه آموزش برقراری ارتباط با پایگاه داده و فناوری های مرتبط با آن آموزش نحوهٔ پیکربندی کیتها، کامپایلر و ... آموزش نحوه توسعه برنامه بر روی بسترهای مختلف از جمله اندروید، آیاواس و ... و درخواستهای دیگر... بنابراین بر اساس این درخواستها و محتوایی که نیاز می باشد بعد از جلد مقدماتی با آنها آشنا باشید را در این نسخه فراهم کرده ایم. نکته از نظر من در رابطه با محتوا: کتابخانه کیوت شامل مباحث بسیار زیادی است که میتوان از هزاران صفحه محتوای آموزشی تولید کرد. اما در این محتوای آموزشی من تنها به مواردی اشاره کردهام که لازمهٔ کار هستند و در پروژهها میبایست اطلاعات لازم در رابطه با آنها داشته باشید. سرفصل ها و محتوا چه چیزهایی هستند؟ محتوای کتاب طبق آخرین استاندارد کتابخانه بر پایه نسخه ۵.۸ به بالا میباشد. محتوای آن به نسخه ۵.۹ و حتی ۵.۱۳ بهروزرسانی شده است. همچنین ویژگی های و موارد مهمی که در نسخه ۵.۹ و ۵.۱۰ موجود هستند در این کتاب به آنها اشاره شده است. سر فصلهای نهایی و تایید شده کتاب: فصل اول مقدمه بر زبان ++C برخی از قابلیتها ساختار برنامه در ++C کتابخانهها فرق بین C و ++C ویژگیهای معرفی شده در ++C ویرایشهای ۱۱ ٬ ۱۴ و ۱۷ کامپایلرهای ++C و وضعیت آنها ساختار اسناد ++C در پروژه کاربرد این زبان در کجاست؟ استانداردهای زبان مقدمه کیوت (Qt) معرفی کیوت (Qt) ۵.۹ آشنایی با محیط توسعه، نصب و راه اندازی همراه با پیکربندی کیت (Kit) در آن نصب و راه اندازی محیط Qt پیکربندی کیتها در macOS پیکربندی کیتها در Linux پیکربندی کیتها در Windows معرفی محیط توسعه کیوت کرِیتور (Qt Creator) نسخه 4 پیکربندی و تنظیمات مربوط به ساخت برای پلتفرمهای مختلف معرفی مجوز های Qt و نحوه استفاده از مناسبترین مجوز لوگوهای نشانگر ساخته شده با Qt پشتیبانی از انواع پلتفرمها پشتیبانی از انواع معماری ها شرایط و قوانین لازم جهت انتشار اپلیکیشن در فروشگاه iTunes یا همان (Apple Store) شرایط و قوانین لازم جهت انتشار اپلیکیشن در فروشگاهWindows Store شرایط و قوانین لازم جهت انتشار اپلیکیشن در فروشگاه Google Play شرایط و قوانین اختصاصی برنامه تحت Qt جهت انتشار و پذیرش در فروشگاه های مرتبط فصل دوم معرفی فناوری Qt Quick ویرایش 2 معرفی زبان کیو اِم اِل (QML) ویرایش 2 آشنایی با سبک - سینتَکس (Syntax) زبان QML روش اعلام یا اظهار یک شیء در QML اشیاء فرزند (Child-Object) در QML سبک و روش اعمال اظهار نظر (Comment) در QML صفت های اشیاء در QML پشتیبانی از جاوا اسکریپت (JavaScript) و ترکیب آن با QML روش استفاده از جاوا اسکریپت در سند QML روش های ترکیب ++C و استفاده از آن در سند QML فصل سوم معرفی انواع پروژه ها تحت فناوری کیوت کوئیک (Qt Quick) معرفی پروژه از نوع Qt Widget Application معرفی پروژه از نوع Qt Console Application معرفی پروژه از نوع Qt Quick Application معرفی پروژه از نوع Qt Quick Controls 2 Application معرفی پروژه از نوع Qt Quick Controls Application معرفی پروژه از نوع Qt Quick Canvas 3D Application معرفی پروژه از نوع Qt Quick Labs Controls Application آغاز ایجاد پروژه تحت C++ و Qt Quick ساده ترین برنامه معرفی کلاس QGuiApplication معرفی کلاس QQmlApplicationEngine معرفی کلاس QCoreApplication معرفی تابع exect در پروژه فصل چهارم انواع کنترل ها، منو ها و دیگر آبجکت ها معرفی انواع QML پایه در فناوری Qt Quick نوع date نوع color نوع font نوع matrix4x4 نوع point نوع quaternion نوع rect نوع size نوع vector2d نوع vector3d نوع vector4d معرفی انواع اشیاء QML در فناوری Qt Quick معرفی Accessible معرفی AnchorAnimation معرفی AnchorChanges معرفی AnchorImage معرفی AnimatedSprite معرفی Animation معرفی AnimationController معرفی Animator معرفی Behavior معرفی BorderImage معرفی Contex2D معرفی Canvas معرفی CanvasGradient معرفی CanvasImageData معرفی CanvasPixelArray معرفی CanvasColorAnimation معرفی Column معرفی DoubleValidator معرفی Drag معرفی DragEvent معرفی DropArea معرفی EnterKey معرفی Flickable معرفی Flipable معرفی Flow معرفی FocusScope معرفی FontLoader معرفی FontMeteric معرفی Gradient معرفی GridMesh معرفی GridView معرفی Image معرفی IntValidator معرفی Item معرفی ItemGraResult معرفی KeyEvent معرفی KeyNavigation معرفی Keys معرفی LayoutMirror معرفی ListView معرفی Loader معرفی MouseArea معرفی MouseEvent معرفی MultiPointTouchArea معرفی NumberAnimation معرفی OpacityAnimator معرفی ParallelAnimation معرفی GraphicInfo معرفی ParentAnimation معرفی ParentChange معرفی Path معرفی PathAnimation معرفی PathView معرفی PauseAnimation معرفی PropertyAction معرفی PropertyChanges معرفی Rectangle معرفی RegExpValidator معرفی Repeater معرفی Rotation معرفی RotationAnimation معرفی RotationAnimator معرفی Row معرفی Scale معرفی ScaleAnimator معرفی SecuentialAnimation معرفی ShaderEffect معرفی ShaderEffectSource معرفی Shortcut معرفی SmoothedAnimation معرفی SpringAnimation فصل پنجم معرفی انواع کنترل های 2 Qt Quick Controls کنترل AbstractButton کنترل ApplicationWindow کنترل BusyIndicator کنترل Button کنترل ButtonGroup کنترل CheckBox کنترل CheckDelegate کنترل ComboBox کنترل Container کنترل Control کنترل Dial کنترل Drawer کنترل Frame کنترل GroupBox کنترل ItemDelegate کنترل Label کنترل Menu کنترل MenuItem کنترل Page کنترل PageIndicator کنترل Pane کنترل Popup کنترل ProgressBar کنترل RadioButton کنترل RadioDelegate کنترل RangeSlider کنترل ScrollBar کنترل ScrollIndigator کنترل Slider کنترل SprinBox کنترل StackView کنترل SwipeDelegate کنترل SwipeView کنترل Switch کنترل SwitchDelegate کنترل TabBar کنترل TabButton کنترل TextArea کنترل TextField کنترل ToolBar کنترل ToolButton کنترل ToolTip کنترل Thumbler فصل ششم معرفی Qt Quick Dialog (دیالوگ های انتخاب رنگ، فایل، فونت و پیغام) معرفی Color Dialog معرفی Font Dialog معرفی File Dialog معرفی Message Dialog معرفی Qt Quick Layouts معرفی Column Layout معرفی Grid Layout معرفی Row Layout معرفی Stack Layout معرفی Qt Quick Control Styles (سبک و استایل نویسی کنترل ها – سفارشی سازی) واکنش گرایی و پاسخ دهی محتوای وب در اپلیکیشن با Qt WebEngine محتوای چند رسانه ای در کیوت QMultimedia محتوای چند رسانه ای در کیوت QMultimedia پخش صوت ظبط صدا در فایل پخش ویدیو کار با دوربین فصل هفتم معرفی و پیکربندی کار با بانک اطلاعاتی (دیتابیس) کار با بانک اطلاعاتی و ارتباط آن بین C++ و QML معرفی و کار با XML معرفی و کار با JSON معرفی و کار با QSetting سفارشی سازی فایل .pro پروژه فصل هشتم مقایسه انواع حالت های کامپایل Debug و Release نحوه افزودن دیگر کتابخانه های C++ در محیط Qt Creator و استفاده همراه با کتابخانه Qt فرق بین کامپایل استاتیک و داینامیک نحوه خروجی گرفتن / گسترش (Deployment) در Qt پیکربندی و انتشار برنامه در پلتفرم ویندوز (Windows) پیکربندی و انتشار برنامه در پلتفرم مک (macOS) پیکربندی و انتشار برنامه در پلتفرم لینوکس (Linux) پیکربندی و انتشار برنامه در پلتفرمهای iPhone و iPad (iOS) پیکربندی و انتشار برنامه در پلتفرم اندروید (Android) معرفی ابزار کیوبس (QBS) به روز رسانی کیوت بدون دریافت فایل نصبی آفلاین اهداف و چشمانداز فنی کیوت ۶ پیشنهادات و ملاحظات در عملکرد و کارآیی (جدید)ریال۶٬۵۰۰٬۰۰۰
- 2 دیدگاه
- 7 امتیاز
-
- برنامهنویسی
- سیپلاسپلاس
-
(و 12 مورد دیگر)
برچسب زده شده با :
-
نگارش 5.0
هدف از این آموزشها آشنایی با امکاناتی که در Qt میتوان استفاده کرد میباشد، که شامل کدنویسی کمتر، خروجی و طرح های بیشتر و در نهایت استفاده در پلتفرمهای مورد مختلف است. لذا جهت بهرهمندی از این کتابخانه ما با در نظر گرفتن اینکه علاقهمندان با زبان ++C آشنایی لازم را دارند منتشر کردهایم. بنابراین در صورتی که علاقهمندان اطلاعات کافی در رابطه با خود زبان ندارند پیشنهاد میکنیم ابتدا اقدام به تهیه و مطالعه آموزشهای لازم در ++C نمایند که برخی از لینکهای رسمی و استاندارد آن را در زیر اعلام نمودهایم. نوع این کتاب الکترونیکی است، بعد از پرداخت میتوانید بر روی دکمهٔ دریافت فایل در همین صفحه کلیک کرده و آن را دریافت نمایید. در صورتی که درگاه پرداختی با مشکل مواجه شده باشد، میتوانید به شماره کارت ۶۱۰۴۳۳۷۸۸۴۵۳۳۳۴۸ (بانک ملت) واریز و آن را به آدرس kambiz.ceo@gmail.com و یا شناسهٔ تلگرامی @Kambiz_Asadzadeh اطلاع دهید تا تأیید شود. عنوان این آموزش "برنامه نویسی ++C همراه با کتابخانه های Qt 5.12.x (سطح مقدماتی ویرایش ۵) میباشد که به صورت زیر فهرست بندی شده است: فصل اول مقدمه کتابخانه Qt قابلیت ها در طراحی فناوری Qt Quick و QML نسخه های کیوت مجوز های موجود در این کتابخانه محیط های توسعه کیوت ویژگی های کیوت پشتیبانی از انواع سیستم عامل ها نصب و پیکربندی Qt فصل دوم انواه پروژه و ایجاد آن انواع پروژه ها ایجاد پروژه فصل سوم ساده ترین برنامه معرفی و کار با Signal و Slot ها و Event ها معرفی و کار با نمایش Windows معرفی و کار با لایه ها زبانه ها و بدنه های در طراحی معرفی و کار با قابلیت های HTML و CSS در طراحی فصل چهارم معرفی و کار با لایه های افقی و عمودی معرفی و کار با لایه های Grid در طراحی فرم معرفی و کار با جدا کننده ها Splitter فصل پنجم معرفی و کار با دایرکتوری ها معرفی و کار با فایل ها / خواندن و نوشتن در آن ها فصل ششم معرفی و کار با برچسب ها Label معرفی و کار با دکمه ها Button معرفی و کار با کنترل ورودی LineEdit معرفی و کار با چک باکس CheckBox معرفی و کار با RadioButton معرفی و کار با Combobox معرفی و کار با لیست ها / ListWidget معرفی و کار با لیست های درختی / TreeWidget معرفی و کار با Action ها معرفی و کار با Slider و Progress ها معرفی و کار با Statusbar در فرم فصل هفتم معرفی و کار با MessageBox معرفی و کار با Timer معرفی و کار با Thread ها فصل هشتم معرفی و کار با Map معرفی و کار با Hash معرفی و کار با QStringList لیست رشته ای فصل نهم معرفی و کار با الگوریتم های معرفی و کار شبکه / دانلود فایل بر اساس پروتکل های HTTP و FTP معرفی و کار با باینری و سریالیز کردن آبجکت ها معرفی و کار با TextStream ها فصل دهم مقایسه انواع حالت های کامپایل در Qt نحوه افزودن دیگر کتابخانه های C++ در محیط Qt Creator و استفاده همراه با کتابخانه Qt نحوه خروجی گرفتن / گسترش (Deployment) در Qt مقایسه و پیکربندی دو موتور قدرتمند OpenGL و ANGLE در پروژه درایور دیتابیس هایی که تحت این کتابخانه پشتیبانی میشوند ساخت راهانداز دیتابیس در پلتفرمهای Linux، macOS و Windows حق نشر کتاب و اهداف در نسخهٔ بعدی کتاب توجه : در داشتن هر گونه انتقاد و پیشنهاد در رابطه با این کتاب با آدرس شخصی نویسنده (kambiz.ceo@gmail.com) مکاتبه نمایید. نکته دوم : کسانی که این کتاب را یک بار خریداری میکنند نسخهٔ به روز رسانی شده آن را به صورت رایگان میتوانند دریافت کنند.ریال۴٬۵۰۰٬۰۰۰
- 8 دیدگاه
- 1 امتیاز
-
- کیوت
- سیپلاسپلاس
-
(و 10 مورد دیگر)
برچسب زده شده با :
-
اگر شما توسعه دهندهٔ ++C هستید، توصیه میکنم این سری از مقالات را دنبال کنید زیرا در این تاپیک قصد دارم به چکیدهای از آخرین تغییرات مرتبط با سیپلاسپلاس پیشرفته اشاره کنم. بنابراین در بخش اول، مهمترین موارد منسوخ شده، اشکلات رفع شده و ویژگیهای جدید در استانداردهای اخیر را پوشش خواهیم داد که به صورت جزئی خواهد بود و سپس نسبت به هر کدام در مقالات جداگانه به کاربردهای پیشرفتهتر و جزئیات بیشتری اشاره خواهیم کرد. قبل از شروع، اگر میخواهید به لیستی از تغییرات و ویژگیهای کامل در استانداردها دسترسی داشته باشید به مقالهٔ زیر مراجعه کنید. در مقالهٔ فوق به لیست ویژگیهای جدید در استاندارد ۱۱، ۱۴، ۱۷ و ۲۰ اشاره شده است. در نظر داشته باشید که بزرگترین بهروز رسانی سی++ در ده سالِ اخیر مربوط به استاندارد ۲۰ است. این نسخه از زبان تقریباً 2.5 برابر بزرگتر از سی++ ۱۰ سال پیش است! این در حالی است که استاندارد ۱۷ تقریباً ۸۰٪ بزرگتر از استاندارد ۰۳ است. به عنوان مثال، طبق مستندات رسمی پیشنویسهها تغییرات استاندارد از ۸۷۹ صفحه به ۱۸۳۴ صفحه در این استاندارد رسیده است! چیزی حدود ۱۰۰۰ صفحه بیشتر از نسخههای قبلی ? تمامی این بهبودها خبر از بهتر شدن و در عین حال پیچیده شدن زبان اما همراه با سادهتر و سریعتر شدن آن میدهد. اما مشکلی که میتواند رخ دهد در این است که یادگیری آن و بهروزرسانی کدها نیز میتواند دردسر ساز باشد. بنابراین، برای پوشش دادن جزئیات و بهروزرسانیهای بیشتر در این مقاله سعی خواهم کرد که مهمترین موارد را معرفی کنم. جزئیات ++C نسخه ۱۷ (بهبودها و تغییرات) بیایید به آرامی شروع کنیم، امروز ما به عناصر حذف شده و یا به موارد بهبود یافتهٔ کتابخانه استاندارد بپردازیم. معرفی به صورت سلسله مراتبی عناصر حذف شده و توسعه یافته (در این بحث) شفاف سازی در زبان قالبها ویژگیها تغییرات اول کتابخانه تغییرات دوم کتابخانه مستندات و لینکها قبل از هر چیز، اگر شما خودتان میخواهید استاندارد جدید را کاوش کنید آخرین پیش نویسه را در این بخش مطالعه کنید. در صورتی که میخواهید بدانید کدام کامپایلر از ویژگیهای جدید پشتیبانی میکند، در این بخش آن را پیگیری کنید. علاوه بر این، لیستی از توصیفهای مختصر از تمامی ویژگیهای زبان سیپلاسپلاس ۱۷ تهیه شده است که در این بخش میتوانید آن را ببینید که در قالب PDF از طرف مرجع رسمی میباشد. مواردی که ترجیح داده شده است که حذف شوند حذف تریگراف تریگرافها کاراکترهای ویژه ترتیبی هستند که در موقع عدم پشتیبانی سیستم از نوع ۷ بیتی اَسکی (ASCII) همانند ایزو 646 استفاه شوند. برای مثال =?? کاراکتر ویژهای مانند # تولید شده را در قالب -?? تولید میکند. تمامی مجموعه کاراکترهای اصلی سیپلاسپلاس در قالب 7 بیتی اسکی قرار دارند. موضوع فوق به ندرت مورد استفاده قرار میگیرد، بنابراین حذف آن ممکن است به ترجمه ساده کد کمک کند. اگر شما میخواهید اطلاعات بیشتری در رابطه با کارآیی تیرگرافها در سی++ کسب کنید به این لینک مراجعه کنید. ---------------------------------------------------------------------------- | trigraph | replacement | trigraph | replacement | trigraph | replacement | ---------------------------------------------------------------------------- | ??= | # | ??( | [ | ??< | { | | ??/ | \ | ??) | ] | ??> | } | | ??’ | ˆ | ??! | | | ??- | ˜ | ---------------------------------------------------------------------------- شما جزئیات بیشتر را میتوانید در سند N4086 بیابید. اگر شما واقعاً به هر نحوی به گرافها در ویژوال استودیو نیاز دارید، نگاهی به مشخصه /Zc:trigraphs در بخش پیکربندی داشته باشید. همچنین، کامپایلرهای دیگر ممکن است مواردی را پشتیبانی نکنند. وضعیت انجام شده کنونی در کامپایلر های GCC:5.1 و Clang:3.5 میباشد. حذف کلمه کلیدی register کلمه کلیدی register در استاندارد 2011 سیپلاسپلاس منسوخ شده است و دیگر استفاده از آن معنایی ندارد. این کلمه کلیدی در حال حاضر حذف شده است. این کلمه کلیدی محفوظ است و ممکن است در نسخه های بعدی باز نویسی شود (مثلا autokeyword به عنوان یک چیز قدرتمند مجددا مورد استفاده قرار گرفته است). جزئیات بیشتر در رابطه با این مورد در P0001R1 قابل مشاهده است. البته فعلا در MSVC انجام نشده است اما در کامپایلرهای GCC 7.0 و Clang 3.8 انجام شده است. حذف Operator++ bool این اپراتور برای زمان بسیار زیادی است که منسوخ شده است! در سی پلاس پلاس ۹۸ تصمیم بر آن گرفته بودند که از آن استفاده کنند اما در نسخه ۱۷ سیپلاسپلاس کمیته موافقت خود را جهت حذف آن از زبان اعلام کرده است. جزئیات بیشتر در رابطه با این مورد در P0002R1 قابل مشاهده است. البته فعلا در MSVC انجام نشده است اما در کامپایلرهای GCC 7.0 و Clang 3.8 انجام شده است. حذف مشخصات استثنایی از استاندارد ۱۷ در سی پلاس پلاس ۱۷، مشخصات استثنایی بخشی از نوع سیستمی خواهند بود (به P0012R1 نگاه کنید). با این حال، استاندارد شامل مشخصات استثنایی قدیمی و منسوخ شده اند که به نظر غیرعلمی و غیرقابل استفاده است. void fooThrowsInt(int a) throw(int) { printf_s("can throw ints\n"); if (a == 0) throw 1; } کد بالا در سیپلاسپلاس ۱۱ رد (منسوخ شده است). تنها اعلامیه استثنایی علمی throw() است، به این معنی است که این کد چیزی را در قالب throw انجام نخواهد داد. اما از سیپلاسپلاس ۱۱ به اینور، برنامه نویسان توصیه کرده اند که کسی از آن استفاده نکند. برای مثال در کامپایلر Clang 4.0 شما باید خطای زیر را دریافت کنید: error: ISO C++1z does not allow dynamic exception specifications [-Wdynamic-exception-spec] note: use 'noexcept(false)' instead جزئیات بیشتر در رابطه با این مورد در P0003R5 قابل مشاهده است. البته فعلا در MSVC انجام نشده است اما در کامپایلرهای GCC 7.0 و Clang 3.8 انجام شده است. حذف auto_ptr این یکی از به روز رسانیهای خوبی است که در سیپلاسپلاس ۱۱، ما اشاره گرهای هوشمند را دریافت کردیم : unique_ptr,shared_ptr و weak_ptr. با تشکر از این حرکتی که کمیته انجام داده بود، معنای واقعی این به روز رسانی در این بود که زبان میتواند پشتیبانی مناسبی از انتقال منابع منحصربفرد را داشته باشد. در این میان auto_ptr یک چیز قدیمی و نادرست در زبان بود به نا به دلایلی auto_ptr در این جا منسوخ شده است و باید به صورت خودکار به unique_ptr تبدیل شود. توجه داشته باشیم که auto_ptr مدت کوتاهی است که از سیپلاسپلاس ۱۱ به اینور منسوخ شده است و بسیاری از کامپایلر ها منسوخ شدن آن را گزارش میدهند که به صورت زیر خواهد بود: warning: 'template<class> class std::auto_ptr' is deprecated در حال حاضر آن به وضعیت نامناسب تبدیل شده است، و اساساً کد شما کامپایل نخواهد شد. در اینجا خطا از طرف MSVC 2017 زمانی که از گزینه /std::c++latest استفاده کنید اعلام خواهد شد. error C2039: 'auto_ptr': is not a member of 'std' اگر شما نیاز به کمک از تبدیل از auto_ptr به unique_ptr دارید، میتوانید Clang Tidy را بررسی کنید، زیرا آن عمل تبدیل خودکار را انجام خواهد داد. اطلاعات بیشتر در سند N4190 موجود است. همچنین موارد مرتبط دیگری با سند N4190 وجود دارند که در کتابخانه خذف شده اند مانند: unary_function/binary_function ptr_fun() mem_fun()/mem_fun_ref() bind1st()/bind2nd() random_shuffle قوانین جدید خودکار برای Direct-List-Initialization از سی پلاس پلاس ۱۱ به اینور که ما یک مشکل بزرگی در این رابطه داشتیم: auto x { 1 }; از initializer_list اینطور نتیجهگیری شده است. با استاندارد جدید، ما میتوانیم این مشکل را حل کنیم. بنابراین آن میتواند به عنوان نوع int که اکثر مردم تصور میکنند شناسایی شود. برای اینکه این اتفاق بیافتد، ما نیاز داریم که دو روش تخصیص مقدار اولیه را درک کنیم: کپی و مستقیم. auto x = foo(); // copy-initialization auto x{foo}; // direct-initialization, initializes an // initializer_list (until C++17) int x = foo(); // copy-initialization int x{foo}; // direct-initialization برای مقدار دهی اولیه، سیپلاسپلاس ۱۷ قوانین جدیدی را معرفی میکند: For a braced-init-list with only a single element, auto deduction will deduce from that entry; For a braced-init-list with more than one element, auto deduction will be ill-formed. برای مثال: auto x1 = { 1, 2 }; // decltype(x1) is std::initializer_list<int> auto x2 = { 1, 2.0 }; // error: cannot deduce element type auto x3{ 1, 2 }; // error: not a single element auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int> auto x5{ 3 }; // decltype(x5) is int جزئیات بیشتر را در سند N3922 میتوانید مشاهده کنید. همچنین جزئیات در رابطه با فهرست خودکار موجود هستند که توسط جناب آقای Ville Voutilainen اشاره شده است. این اضافات در سیپلاسپلاس از زمان MSVC 14.0، GCC 5.0 و Clang 3.8 کار میکنند. گزینه static_assert بدون هیچ نوع پیغامی این واضح است که، این به شما این امکان را می دهد که فقط بدون داشتن گذراندن پیام، نسخه دارای پیغام در دسترس خواهد بود. این سازگاری با سایر موارد مانند BOOST_STATIC_ASSERT وجود دارد. static_assert(std::is_arithmetic_v<T>, "T must be arithmetic"); static_assert(std::is_arithmetic_v<T>); // no message needed since C++17 جزئیات بیشتر در سند N3928 در دسترس است. پشتیبانی شده در MSVC 2017 ٬ GCC 6.0 و Clang 2.5. انواع مختلف شروع و پایان در محدوده حلقه از سیپلاسپلاس ۱۱ به بعد، محدوده مبتنی بر حلقه ها به صورت داخلی تعریف شده است: { auto && __range = for-range-initializer; for ( auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin ) { for-range-declaration = *__begin; statement } } همانطور که میبینید، __begin و __end دارای نوع مشابه هستند. این ممکن است باعث مشکلاتی شود. برای مثال زمانی که شما چیزی شبیه یک نگهبان (محافظ) که از نوع داده دیگری است را داشته باشید مشکل ساز خواهد بود. در سیپلاسپلاس ۱۷ آن به صورت زیر تغییر کرده است: { auto && __range = for-range-initializer; auto __begin = begin-expr; auto __end = end-expr; for ( ; __begin != __end; ++__begin ) { for-range-declaration = *__begin; statement } } انواع __begin و __end ممکن است متفاوت باشد چرا که فقط اپراتور مقایسه مورد نیاز است. این تغییر کلی باعث میشود که این ویژگی تجربه بیشتری را در این زمینه برای کاربران ارائه دهند. جزئیات بیشتر در P0184R0، پشتیبانی شده در MSVC 2017 ،GCC 6.0 و Clang 3.6.
- 4 پاسخ
-
- استاندارد جدید
- مدرن
-
(و 8 مورد دیگر)
برچسب زده شده با :
-
چرا ساتوشی ناکاموتو ++C را برای ساخت بیتکوین انتخاب کرد و نظر سازندهٔ سیپلاسپلاس در این باره چیست؟
کامبیز اسدزاده نوشته وبلاگ را ارسال کرد در فناوری
بیتکوین در سال ۲۰۰۹ به عنوان یک ارز دیجیتال و یک پلتفرم غیرمتمرکز همتا به همتا راه انداخته شد که کنترل اموال را به همه افراد میدهد. ساتوشی ناکاموتو این پلتفرم را معرفی کرد و از آن زمان به کاربری گسترده رسیده و سرمایهگذاری با ارزش بازار بیش از ۳۵۳ میلیارد دلاری را به دست آورده است. به عنوان یک گزینه سرمایهگذاری، بیتکوین دارای ماهیت نوسانی است و برای افرادی که حاضر به پذیرش ریسک هستند، ثروتآفرین بوده است. حتی برخی از متخصصان مالی ادعا میکنند که قیمت یک بیتکوین ممکن است در چند سال آینده به بیش از ۴۰۰ هزار دلار برسد، این که این دارایی بهتر از طلا به عنوان یک ذخیره ارز باشد. فناوری مورد استفاده در بیت کوین نیز در نوع خود بی نظیر است. ناکاموتو استفاده از الگوریتم های ++C را برای طراحی این فناوری مالی انتخاب کرد، اما چرا؟ مدیریت حافظه مدیریت منابع یکی از حیاتیترین مسائلی است که توسعهدهندگان در هنگام ایجاد نرمافزار در نظر میگیرند. برای اینکه یک نرمافزار بتواند کلیه ویژگیهای خود را به دست آورده و همچنان در ارائه خدمات بسیار موثر باقی بماند، باید پروتکلهای مناسب مدیریت منابع داشته باشد. در توسعه بلاکچین، وضعیت تا حد زیادی تفاوت ندارد. از آنجا که بلاکچین خدماتی را به میلیونها نفر و نهاد ارائه میدهد، باید برای کارایی در ارائه خدمات بسیار مقیاسپذیر باشد. تحقیقات اخیر از Statista نشان میدهد که شبکه بیتکوین در سومین سهماه سال ۲۰۲۰ بیش از ۳۵۰ هزار تراکنش روزانه داشت. بعضی از این تراکنشها شامل مقادیر زیادی پول دیجیتال هستند و به عنوان نتیجه نیاز به محاسبات طولانی دارند. ایده اصلی ایجاد بلاکچین توسط ناکاموتو، ایجاد یک شبکه برای تسهیل تعاملات مالی و تسریع در فرآیندها بود. بهترین زبان برنامهنویسی برای یک سیستم با این ویژگیها الگوریتمهای سیپلاسپلاس است. الگوریتمهای سیپلاسپلاس میتوانند با استفاده بهینه از منابع و کنترل بر روی استفاده از CPU و حافظه، در سطح بهترین عمل کنند. این الگوریتم همچنین به بلاکچین اجازه میدهد تا بلوکها را پذیرفته یا رد کند، بنابراین هر گونه تفکیک در بلاکچین را از بین میبرد. استفاده از C++ بنابراین به پلتفرم کمک میکند تا با نرخ سریع با نقاط پایان مختلف تعامل کند. جداسازی کد توسعه نرمافزار، شامل بلاکچین، باید فضای کافی برای عملیات تعیینپذیر فراهم کند. در مورد بلاکچین، عملکردهای تعیینپذیر، هنگامی که به درستی اجرا میشوند، تضمین میکنند که تراکنشها و فرآیندهای داخلی مانند قراردادهای هوشمند همواره به یک شیوه خدمت میکنند حتی زمانی که در دستگاههای مختلف قرار دارند. اما تنها راه توسعهدهندگان و متخصصان کد نحوه دستیابی کامل به عملیات تعیینپذیر را اعمال جداسازی کدها میدانند. چه چیزهایی باید توسعهدهندگان جدا کنند؟ از آنجا که عملکردهای اجرا شده تعیینپذیر هستند، توسعهدهندگان باید راهی برای جدا کردن عناصر غیرتعیینپذیر از کد قرار دهند. سیپلاسپلاس از قابلیتهای فضای نام (namespace) بهرهمند است که به برنامههای دیگر قابل انتقال هستند. این فضاهای نام به جلوگیری از تداخل در عملکرد کدها کمک میکنند. همچنین ویژگی کلاس وجود دارد که به جدا کردن و تعیین مرزها بین API کمک میکند. قابلیت اطمینان و رسالت ++C یکی از ویژگیهای حیاتی دیگری که به انتخاب ساتوشی ناکاموتو از سیپلاسپلاس به عنوان زبان اصلی برنامهنویسی بیتکوین کمک کرد، ویرایش و بهروز رسانیهای اساسی سیپلاسپلاس است. ++C اغلب بهروزرسانی میشود تا اطمینان حاصل شود که همواره باقی بماند و قابل اطمینان و بهروز باشد. علاوه بر این، ++C دارای ابزارهای دیباگ و تجزیه و تحلیل مختلف است، تمامی این ابزارها به تقویت عملکرد آن کمک میکنند. این ابزارها همچنین امکان شناسایی هر مشکلی را در زمان برنامهنویسی فراهم میکنند. قابلیت اطمینان و ویرایش سیپلاسپلاس آن را به پایدارترین زبان برنامهنویسی برای توسعه بیتکوین تبدیل میکند که همچنین اطمینان میدهد که نرمافزار ساخته شده دارای امنیت بسیار بالاتری باشد. نخها (Threading) نخها یا ترد، در برنامهنویسی شامل یک مجموعه از دستورالعملها، فعالیتها یا وظایفی هستند که میتوانند به طور صاف یا هماهنگ با یکدیگر اجرا شوند. دو نوع عملکرد باید در هر نرمافزار یکپارچه باشند، یعنی وظایف موازی و غیرموازی. یک پروژه بلاکچین بیتکوین هرگز نمیتوانست کار کند اگر وظایف موازی و غیرموازی هماهنگ عمل نمیکردند. اما یکی از پیچیدهترین چیزها در برنامهنویسی، ادغام این وظایف است و بیشتر زبانهای برنامهنویسی در حال حاضر معمولاً تمرکز بر روی یکی از این دو وظیفه، یعنی موازی یا غیرموازی دارند. اما سیپلاسپلاس یکی از قابلیتهای نخی قابل تحسین دارد که توسعهدهنده را قادر میسازد همزمان از هر دو وظیفه موازی و غیرموازی استفاده کند. سیپلاسپلاس میتواند بهطور کارآمد نخهای چندگانه را اجرا کرده و امکان ارتباط همگانی و قابل اعتماد بین تمام نخها را فراهم کند. علاوه بر این، نخهای ایجاد شده توسط سیپلاسپلاس میتوانند در نقطه بهینهترین عمل کنند، بنابراین کل بلاکچین به طور بهینه عمل میکند. با توجه به عملکرد بهینه این زبان، میتوان گفت یک دلیل دیگر که ساتوشی ناکاموتو از سیپلاسپلاس استفاده کرد، این است که این زبان امکان نخبندی آسان برای وظایف موازی و غیرموازی را فراهم میکند. قابلیت (Move Semantics) قابلیت (Move Semantics) یک عملکرد است که به توسعهدهندگان امکان میدهد محتوا را بین اشیاء جابجا کنند به جای اینکه فقط محتوا را کپی کنند. با استفاده از قابلیت جابهجایی اشیاء و ...، توسعهدهندگان و کاربران بر اساس نیاز دسترسی به کپیهای مختلف اطلاعات دارند، که عملکرد را افزایش داده و تکرار را کاهش میدهد. تبعیت از استانداردها و رعایت قوائد انرژی سبز انرژی سبز یکی از چالشهای اصلی در صنعت بلاکچین و تولید بیتکوین است. به دلیل محاسبات پیچیده و فرآیند استخراج معدنی که برای تولید بیتکوین انجام میشود، مصرف انرژی این فعالیتها به سرعت افزایش مییابد. سیپلاسپلاس به عنوان زبان اصلی برنامهنویسی بیتکوین، به طور چشمگیری به بهینهسازی مصرف انرژی متمایل است. استانداردهای مصرف بهینه انرژی در طراحی و اجرای برنامهها، این زبان را به یک انتخاب پایدار برای پروژههای مرتبط با بلاکچین و ارزهای دیجیتال میکند. این به معنای کاهش آثار منفی بر محیط زیست و همچنین صرفهجویی در هزینههای انرژی مرتبط با فرآیند تولید بیتکوین میباشد. همچنین، با توجه به گستردگی بیتکوین و تاثیر زیاد آن بر مصرف انرژی جهان، تلاش برای استفاده از زبانهای برنامهنویسی با بهینهترین مصرف انرژی، اهمیت فوقالعادهای پیدا کرده است. سیپلاسپلاس با امکانات بهینهسازی و مدیریت منابع به کاربران این امکان را میدهد که به نحوی کارایی انرژی را بهبود بخشند و در طولانی مدت، اثرات محیطی مرتبط با تولید بیتکوین را کاهش دهند. از این رو، اهمیت انتخاب این زبان برای توسعه بیتکوین نه تنها در جنبههای فنی بلکه در جنبههای محیطی نیز بیان میشود. بهتر است نظر سازندهٔ سیپلاسپلاس در مورد استفاده از این ابزار برای ارز دیجیتال را هم بدانیم در اشتراک بین خالق زبان برنامهنویسی سیپلاسپلاس، بیارنه استرواستروپ و ساتوشی ناکاموتو، اشاره به زبان برنامهنویسی ++C و موضوع ماینینگ بیتکوین با تأکید بر مصرف انرژی بالا و تأثیرات آن بر محیط زیست است. چندی پیش در یک پادکست هوش مصنوعی با مجری Lex Fridman، استرواستروپ در مورد نحوهٔ استفاده از سیپلاسپلاس و عدم کنترل بر نحوه استفاده از ابزارهای توسعهدهنده صحبت کرده و بهویژه به ماینینگ بیتکوین اشاره کرده است. او به عنوان خالق زبان سیپلاسپلاس ابراز خوشحالی از برخی از کاربردهای این زبان و ناراحتی از برخی دیگر اشاره کرده و به مصرف انرژی بالای ماینینگ بیتکوین اشاره کرده است. استرواستروپ از مصرف انرژی فعلی ماینینگ بیتکوین به خوشایندی خاصی احساس نمیکند و این موضوع را به دلیل انتخاب سیپلاسپلاس به عنوان زبان برنامهنویسی توسعه بیتکوین توسط ساتوشی ناکاموتو ذکر کرده است. از نظر استراستروپ سیپلاسپلاس، یک زبان برنامهنویسی قدرتمند و گسترده است که در حوزههای مختلف برنامهنویسی مورد استفاده قرار میگیرد. این زبان امکانات بالایی برای مدیریت حافظه، کارایی بالا، و امکانات چندپارادیمی (مانند برنامهنویسی شیءگرا) فراهم میکند که در سراسر منابع کد بیتکوین شاهد آن هستیم. اما عامل ناراحتی او، مصرف انرژی بالا ممکن است که به علت نحوه استفاده یا پیادهسازی خاص از زبان و ابزارهای مرتبط با آن باشد و نه ضعف اساسی زبان سیپلاسپلاس، چرا که این زبان یکی از نامدارترین زبانهای است که مصرف انرژی و منابع را به بهترین حالت ممکن میتوان در آن مدیریت کرد، از طرفی در صورت پیادهسازی نه چندان مطلوب کدها، ممکن است نتیجهٔ عکس بدهد. در واقع معتقد است ممکن است کدنویسی بهینهای صورت نگیرد و منجر به مصرف نسبتاً بالایی داشته باشد. وقتی ساتوشی بیتکوین را نوشت، او بهطور ضروری پیشبینی نکرد که مسابقهای که به وجود آمد باعث ساخت دستگاههای ASIC ماینینگ خواهد شد. در واقع، در صفحهٔ سفید اصلی بیتکوین که تنها 9 صفحه است، ساتوشی کلمه CPU را به مجموع 10 بار اشاره کرد. مصرف انرژی کنونی بیتکوین کمتر بود اگر ماینینگ به شکلی انجام میشد که ساتوشی پیشبینی کرده بود. حتی ساتوشی نیز از همان سرنوشتی که استرواستروپ هشدار داد: عدم کنترل بر نحوه استفاده از ابداع خود در آینده، مصون نبود. احتمالاً ساتوشی هم پیشبینی نکرده بود که بیتکوین در میان مجرمان نیز استفاده خواهد شد. اگرچه ممکن بوده باشد که در یک دوره زمانی بیتکوین محبوبیت زیادی در میان تجار مواد مخدر داشته باشد، اما مونرو به عنوان رمزارز انتخابی در میان بسیاری از گروههای جرمی ظاهر شده است. فعالیتهای بشر که در مقیاس بزرگ بر محیط زیست تأثیر منفی میگذارند، زیاد است. بنابراین، هیچ توجیه منطقی برای اختصاص بهطور خاص به ماینینگ بیتکوین وجود ندارد، بهویژه زمانی که مزیت مثبت آن به حداکثر است. اختصاص مصرف انرژی به ماینینگ رمزارز بهمنظور ایجاد و حفظ یک سیستم همتا به منظور تبادل مالی، یک کار کارآمد است چرا که دقیقاً همان چیزی است که برای حذف واسطههای غیرضروری و غیرتکنولوژیکی لازم است: واسطههایی که روز آنها نهایتاً فرا رسیده است. به طور کلی، ارزیابی یک زبان برنامهنویسی باید با توجه به نیازها و شرایط پروژهها صورت گیرد. سیپلاسپلاس در بسیاری از مواقع یک انتخاب عالی است و اگرچه ممکن است برخی نقدهایی وجود داشته باشد، اما این نقدها به طور کلی به عنوان چالشها و به چشمگیرترین قابلیتهای این زبان میتوانند مطرح شوند. نتیجهٔ نهایی زبان برنامهنویسی سیپلاسپلاس احتمالاً محبوبترین زبان برنامهنویسی در دنیای توسعه نرمافزار است. توسعه بلاکچین نیز شامل کدنویسی است و برخی از بلاکچینها مانند شبکه بیتکوین از سیپلاسپلاس به عنوان زبان برنامهنویسی خود استفاده میکنند. ساتوشی ناکاموتو، خالق بیتکوین، این زبان را به دلیل امنیت و قابلیت مدیریت منابع تراکنشها و عملیات قراردادهای هوشمند انتخاب کرد. به علاوه، این زبان به توسعهدهندگان امکان ادغام وظایف موازی و غیرموازی را به صورت بینقص فراهم میکند. مصرف بهینهٔ منابع و رعایت موضوع انرژی سبز مهم است؛ همچنین، این زبان بهطور منظم بهروزرسانی میشود و ابزارهای تجزیه و تحلیل و اشکالزدائی متنوعی دارد که همگی به بهبود عملکرد آن کمک میکنند. نگاه به بهترین مزایای زبان در بلاکچین، به همه اجازه میدهد که درک کنند چرا ساتوشی ناکاموتو این زبان را در ایجاد بلاکچین بیتکوین انتخاب کرد. ایجاد بلاکچین ناکاموتو یکی از پربارترین اختراعات فناوری مالی زمان ما را ایجاد کرد که شفافیت، تمرکززدایی و ماندگاری تراکنش ها و داده ها را تقویت کرد. ارز متمرکز بر بلاکچین نیز همچنان پر استفاده ترین، قابل اعتمادترین، ارز دیجیتال پرسود و چشم انداز سرمایه گذاری است و در پشت ساخت این فناوری غول زبانهای برنامهنویسی آن را به بهترین نوع خود تبدیل و در همین راستا در مسیر توسعه و پیشرفت هدایت میکند.-
- ارزدیجیتال
- بیتکوین
-
(و 2 مورد دیگر)
برچسب زده شده با :
-
کتابخانهٔ Boost: یک راهکار قدرتمند برای توسعهٔ برنامههای سیپلاسپلاس مقدمه کتابخانهٔ Boost یکی از مهمترین ابزارها در دنیای برنامهنویسی سیپلاسپلاس است. این کتابخانه کاملاً رایگان بوده و مجموعهای گسترده از کتابخانهها و ابزارهای مفید برای توسعهدهندگان این زبان فراهم میکند. در این مقاله، به بررسی ویژگیها، اهمیت و کاربرد کتابخانهٔ Boost در سیپلاسپلاس میپردازیم. ۱. ویژگیهای کتابخانهٔ Boost کتابخانهٔ Boost دارای ویژگیهای فراوانی است که آن را از سایر کتابخانهها متمایز میکند. به برخی از این ویژگیها در زیر اشاره خواهیم کرد: الف. تعداد زیادی ابزار و کتابخانه Boost شامل تعداد زیادی از کتابخانهها و ابزارهای مفید است که برای تسهیل و افزایش کارایی در توسعهٔ نرمافزارهای سیپلاسپلاس به کار میروند. برخی از این کتابخانهها شامل: کتابخانهٔ Boost.Filesystem: برای مدیریت فایلها و دایرکتوریها در سیستم عامل استفاده میشود. کتابخانهٔ Boost.Thread: برای پشتیبانی از نخها (Thread) و همزمانسازی استفاده میشود. کتابخانهٔ Boost.Regex: برای پردازش و مدیریت عبارات باقاعده (Regular Expressions) به کار میرود. ب. پشتیبانی از استانداردهای مدرن Boost به خوبی استانداردهای مدرن سیپلاسپلاس را پشتیبانی میکند. این کتابخانه ابزارها و قابلیتهایی ارائه میدهد که توسعهدهندگان را در استفاده از قابلیتهای جدید و بهبودیافتهٔ زبان کمک میکند. با استفاده از Boost، میتوانید از استانداردهای مدرن مانند C++11 و C++14 بهرهبرداری کنید و کدهای بهتری بنویسید. ۲. اهمیت Boost برای توسعهٔ سیپلاسپلاس کتابخانهٔ Boost اهمیت فراوانی در توسعهٔ سیپلاسپلاس دارد. به دلیل وجود ابزارها و کتابخانههای متنوع، Boost به توسعهدهندگان این زبان کمک میکند تا برنامههای قدرتمندی را با سرعت و کارایی بالا ایجاد کنند. همچنین، استفاده از Boost باعث میشود که کد نوشته شده توسط توسعهدهندگان با استانداردهای مدرن و قابلیتهای بهبودیافتهٔ زبان همخوانی داشته باشد. ۳. کاربرد کتابخانهٔ Boost در سیپلاسپلاس کتابخانهٔ Boost در سیپلاسپلاس در بسیاری از زمینهها کاربرد دارد. در ادامه به برخی از کاربردهای این کتابخانه میپردازیم: الف. توسعهٔ برنامههای شبکه Boost ابزارها و کتابخانههای قدرتمندی برای توسعهٔ برنامههای شبکه در سیپلاسپلاس فراهم میکند. از طریق Boost.Asio میتوانید به راحتی بر نامههایی با استفاده از پروتکلهای مختلف شبکه مانند TCP و UDP بنویسید و با سرعت و کارایی بالا با ارتباطات شبکه کار کنید. ب. پردازش و مدیریت رشتهها Boost.Regex ابزاری قدرتمند برای پردازش و مدیریت رشتهها در سیپلاسپلاس است. این کتابخانه امکان استفاده از عبارات باقاعده را فراهم میکند و کار با رشتهها را بسیار آسان میکند. با استفاده از Boost.Regex، میتوانید الگوهای مورد نظر خود را در رشتهها جستجو کنید و اقدامات لازم را انجام دهید. ۴. مزایای استفاده از کتابخانهٔ Boost استفاده از کتابخانهٔ Boost در توسعهٔ پروژههای سیپلاسپلاس دارای مزایای بسیاری است. به دلیل ویژگیها و قابلیتهای فراوان این کتابخانه، میتوانید از مزایای زیر بهرهبرداری کنید: الف. افزایش کارایی و سرعت کتابخانهٔ Boost ابزارها و الگوریتمهایی را ارائه میدهد که میتواند عملکرد و کارایی برنامهها را بهبود بخشید. با استفاده از این ابزارها، میتوانید بهینهسازیهای لازم را انجام داده و کارایی برنامههای خود را افزایش دهید. این موضوع بسیار مهم است زیرا کارایی و سرعت اجرای یک برنامه بر روی سیستمهای حساس به زمان اهمیت بسیاری دارد. ب. پشتیبانی از چندپلتفرم کتابخانهٔ Boost بر روی چندپلتفرم قابل استفاده است و از این جهت بسیار مفید است. اگر برنامهٔ شما باید روی سیستمعاملهای مختلف اجرا شود، Boost میتواند به شما در این مسئله کمک کند. شما میتوانید از ابزارها و قابلیتهای Boost استفاده کنید تا برنامهٔ خود را به طور مستقل از سیستمعامل مقصد اجرا کنید و از سهولت توسعه و نگهداری برخوردار شوید. ج. جامعیت و پایداری Boost یک کتابخانهٔ بسیار جامع و پایدار است. این به این معناست که شما میتوانید به ابزارها و قابلیتهای Boost برای پروژههای مختلفی با انواع نیازها و مشکلات بهرهبرداری کنید. این کتابخانه توسعه یافته و توسط جامعهٔ سیپلاسپلاس حمایت میشود، بنابراین میتوانید از پشتیبانی و بهروزرسانیهای مداوم برخوردار شوید. ۵. کاربردهای کتابخانهٔ Boost کتابخانهٔ Boost به دلیل قابلیتها و امکانات فراوان خود، در زمینههای مختلفی از جمله زیر استفاده میشود: الف. توسعهٔ برنامههای کاربردی Boost ابزارها و کتابخانههایی را فراهم میکند که میتواند در توسعهٔ برنامههای کاربردی مختلف مفید باشد. مثلاً Boost.Asio برای برنامهنویسی شبکه، Boost.FileSystem برای کار با سیستمفایل و Boost.DateTime برای کار با زمان و تاریخ مورد استفاده قرار میگیرد. با استفاده از این ابزارها، میتوانید برنامههای کاربردی پیچیده را با قابلیتهای خاص و منحصربهفرد طراحی و پیادهسازی کنید. ب. توسعهٔ بسترهای نرمافزاری کتابخانهٔ Boost به عنوان یک بستر نرمافزاری مناسب برای توسعهٔ برنامههای کاربردی و تحت وب استفاده میشود. با استفاده از Boost، میتوانید بسترهای نرمافزاری پویا و پایداری ایجاد کنید که قابلیتها و خصوصیات منحصربهفردی داشته باشند. این کتابخانه شما را قادر میسازد تا بسترهای قابل گسترش، قابل تنظیم و با قابلیت انعطافپذیری بالا را پیادهسازی کنید. ج. توسعهٔ بازیها و گرافیک کامپیوتری Boost در زمینهٔ توسعهٔ بازیها و گرافیک کامپیوتری نیز استفاده میشود. ابزارهایی مانند Boost.Geometry برای کار با هندسه و Boost.Graph برای تحلیل و پردازش گرافها مورد استفاده قرار میگیرند. این ابزارها به توسعهدهندگان کمک میکنند تا الگوریتمهای پیچیده را برای بازیها و سیستمهای گرافیکی پیادهسازی کنند و تجربهٔ کاربری بهتری را ارائه دهند. ۶.اهمیت کتابخانهٔ Boost کتابخانهٔ Boost در دنیای سیپلاسپلاس بسیار اهمیت دارد. استفاده از این کتابخانه میتواند توسعهٔ برنامههای شما را سریعتر، قابل اطمینانتر و کارآمدتر کند. با قابلیتها و امکانات گستردهٔ Boost، میتوانید در توسعهٔ نرمافزارهای پیچیده و با تعامل بالا بهترین عملکرد را به دست آورید. ۷. چگونه از کتابخانهٔ Boost بهرهبرداری کنیم؟ برای بهرهبرداری از کتابخانهٔ Boost و استفاده بهینه از قابلیتهای آن، میتوانید مراحل زیر را دنبال کنید: الف. نصب کتابخانه ابتدا باید کتابخانهٔ Boost را بر روی سیستم خود نصب کنید. میتوانید نسخهٔ مناسب برای سیستمعامل خود را از وبسایت رسمی Boost دریافت کنید و طبق دستورالعملهای نصب آن را انجام دهید. ب. مستندات و منابع آموزشی بهتر است پیش از شروع استفاده از Boost، به مستندات رسمی آن مراجعه کنید. مستندات کتابخانه به شما راهنمایی دقیقی دربارهٔ ویژگیها، توابع و کلاسهای موجود در Boost ارائه میدهد. همچنین، میتوانید از منابع آموزشی آنلاین و کتابهای مرجع موجود برای یادگیری عمیقتر از Boost استفاده کنید. ج. استفاده در پروژهها با نصب کتابخانه و آشنایی با مستندات، میتوانید Boost را در پروژههای خود استفاده کنید. در هر قسمت از پروژه که نیاز به قابلیتها یا الگوریتمهای خاصی دارید، میتوانید به کتابخانهٔ Boost مراجعه کنید و از آن استفاده کنید. با استفاده از توابع و کلاسهای Boost، میتوانید کدهای کوتاهتر، بهینهتر و قابل نگهداریتری ایجاد کنید. ۸. بهترین استفاده از کتابخانهٔ Boost برای بهترین استفاده از کتابخانهٔ Boost، توصیه میشود: با استفاده از نسخهٔ مناسب Boost برای پروژه خود، بهروزرسانیها و بهبودهای ارائه شده را دنبال کنید. با دقت مستندات رسمی Boost کار کنید و قابلیتها و توابع موجود را بهخوبی بشناسید. از منابع آموزشی متنوع استفاده کنید تا مفاهیم و مباحث پیشرفتهتر را بیاموزید. در صورت نیاز، از جامعهٔ سیپلاسپلاس و انجمنهای مرتبط با Boost برای رفع سوالات و دریافت راهنمایی استفاده کنید. نتیجهگیری کتابخانهٔ Boost با ارائهٔ ابزارها و کتابخانههای مفید، اهمیت و کاربرد زیادی در توسعهٔ سیپلاسپلاس دارد. از ویژگیهای برجستهٔ این کتابخانه میتوان به تعداد زیادی ابزار و کتابخانه، پشتیبانی از استانداردهای مدرن و کاربردهای مختلف در برنامهنویسی اشاره کرد. با استفاده از Boost، توسعهدهندگان میتوانند برنامههای قدرتمندی را با سرعت و کارایی بالا ایجاد کنند و از قابلیتهای بهبودیافتهٔ زبان بهرهبرداری کنند. کتابخانهٔ Boost با ویژگیها و قابلیتهای منحصربهفرد خود، نقش بسیار مهمی در توسعهٔ پروژههای سیپلاسپلاس دارد. استفاده از این کتابخانه باعث میشود تا برنامههای قدرتمند، قابل اعتماد و با کارایی بالا ایجاد شوند. همچنین، Boost به توسعهدهندگان کمک میکند تا با استفاده از استانداردهای مدرن، بهترین نتایج را در توسعهٔ برنامهها به دست آورند.
-
- کتابخانه
- سیپلاسپلاس
-
(و 2 مورد دیگر)
برچسب زده شده با :
-
شرکت اینتل یک کیت توسعه نرمافزار آزمایشی کوانتومی با نام Quantum SDK را منتشر کرد
کامبیز اسدزاده نوشته وبلاگ را ارسال کرد در سخت افزار
شرکت اینتل یک کیت توسعه نرمافزار آزمایشی کوانتومی با نام Quantum SDK را منتشر کرد! این کیت یک سری ابزار و روشهای برنامهنویسی را در اختیار توسعهدهندگان قرار میدهد که امکان برنامهنویسی الگوریتمهای کوانتومی را در یک شبیهسازی ممکن میکند. این کیت از زبان برنامهنویسی ++C و کامپایلر LLVM برای برنامهنویسی الگوریتمهای کوانتومی استفاده میکند و به سادگی میتواند با برنامههای C و ++C و پایتون به کار برده شود. این کیت، به نوعی باعث بزرگ شدن جامعهٔ توسعهدهندگانی میشود که در زمینهٔ کامپیوترهای کوانتومی فعالیت میکنند. این عکس نشان میدهد که شرکت اینتل، و افرادی که در آن کار میکنند، با استفاده از یک دستگاه پردازشی ۳۰۰ میلیمتری، وافرین بر روی یک وافر کیوبیتی (بخشی از یک صفحه اتصال کوانتومی) سیلیسیوم بر روی یک ورقه کوچک انجام دادهاند. – آن ماتسورا، مدیر برنامههای کاربردی و معماری کوانتومی، آزمایشگاههای اینتل دربارهی Intel Quantum SDK 1.0: نسخهٔ 1.0 این SDK، شامل یک رابط برنامهنویسی مبتنی بر سیپلاسپلاس است که به برنامهنویسان کلاسیکی، زبان برنامهنویسی که با آن آشنایی دارند، را ارائه میدهد و امکان همکاری بین آنها و برنامهنویسان کوانتومی را فراهم میکند. این کیت نیز، یک محیط اجرایی کوانتومی بهینهسازی شده برای اجرای الگوریتمهای کوانتومی-کلاسیکی هیبریدی دارد. توسعهدهندگان میتوانند از دو محیط مختلف برای شبیهسازی کیوبیتها استفاده کنند، یکی برای نمایش بیشتر تعدادی کیوبیتهای عمومی و دیگری، برای شبیهسازی سختافزار کیوبیتی اینتل. محیط اولیه، یک شبیهساز کیوبیت عمومی بسیار عالی با کد منبع باز به نام Intel® Quantum Simulator (IQS) میباشد که برای 32 کیوبیت در یک گره و بیش از 40 کیوبیت در چندین گره، توانایی دارد. محیط دوم نیز با شبیهسازی سختافزار کیوبیتی اینتل، شبیهسازی کوچک مدل کیوبیتهای گرداننده اسپین سیلیکونی اینتل را فراهم میکند. کیوبیتهای اینتل، از تخصص شرکت در تولید ترانزیستور سیلیکونی برای ساخت کامپیوترهای کوانتومی مقیاس گسترده استفاده میکنند. تحقیقات کوانتومی اینتل از دستگاههای کیوبیتی تا معماری سختافزار کلی، معماری نرمافزار و برنامهها را پوشش میدهد. Intel Quantum SDK یک کامپیوتر کوانتومی کامل در شبیهسازی است که همچنین قادر به اتصال به سختافزار کوانتومی اینتل، از جمله چیپ کنترل Horse Ridge II و چیپ کیوبیت گرداننده اسپین اینتل است که بزودی در اختیار عموم قرار خواهد گرفت. کیت توسعهٔ کوانتومی اینتل، به توسعهدهندگان این امکان را میدهد که انتخاب کنند کدام یک از دو محیط موردنیاز برای شبیهسازی کیوبیتها استفاده شود: شبیهساز بسیار عالی و با کد منبع باز کیوبیت عمومی، شبیهساز کوانتومی اینتل (Intel Quantum Simulator) محیط هدف که سختافزار کیوبیتی اینتل را شبیهسازی میکند و به شبیهسازی مدل کوچک کیوبیتهای گرداننده اسپین سیلیکون اینتل امکان میدهد. اعلام شده که شرکت اینتل، متعهد به پیشروی در حوزهٔ کامپیوترهای کوانتومی است و از جمله اینترنت از همه جا به عنوان یک روش برای جذب جامعهٔ توسعهدهندگان میباشد. کاربران بتا این کیت، در حال بررسی انواع موارد مثل دینامیک سیالات، فیزیک نجوم وطراحی مواد هستند. تحقیقات کوانتومی اینتل از دستگاههای کیوبیتی تا معماری سختافزار کلی، کنترل و معماری نرمافزار و برنامهها را پوشش میدهد. -
در این مقاله نیاز است بدانید که، کتابخانهٔ توابع ویژه ریاضی در اصل بخشی از کتابخانه TR1 ISO / IEC TR 19768: 2007 بود، سپس به عنوان یک استاندارد ISO مستقل، ISO / IEC 29124: 2010 منتشر شد و در نهایت از C++ 17 به استاندارد ایزو ادغام شد. برای استفاده از توابع ریاضیاتی مانند هرمیتی، بسل و غیره کافی است فایل سرآیند <cmath> را فراخوانی کنید. به عنوان مثال توابع چندجملهای لگر به صورت زیر میتوانند مورد استفاده قرار گیرند: #include <cmath> #include <iostream> double L1(unsigned m, double x) { return -x + m + 1; } double L2(unsigned m, double x) { return 0.5*(x*x-2*(m+2)*x+(m+1)*(m+2)); } int main() { // spot-checks std::cout << std::assoc_laguerre(1, 10, 0.5) << '=' << L1(10, 0.5) << '\n' << std::assoc_laguerre(2, 10, 0.5) << '=' << L2(10, 0.5) << '\n'; } مثالی از کاربرد توابع چندجملهایهای لژاندر : #include <cmath> #include <iostream> double P20(double x) { return 0.5*(3*x*x-1); } double P21(double x) { return 3.0*x*std::sqrt(1-x*x); } double P22(double x) { return 3*(1-x*x); } int main() { // spot-checks std::cout << std::assoc_legendre(2, 0, 0.5) << '=' << P20(0.5) << '\n' << std::assoc_legendre(2, 1, 0.5) << '=' << P21(0.5) << '\n' << std::assoc_legendre(2, 2, 0.5) << '=' << P22(0.5) << '\n'; } نحوهٔ استفاده از توابع بتا #include <cmath> #include <string> #include <iostream> #include <iomanip> double binom(int n, int k) { return 1/((n+1)*std::beta(n-k+1,k+1)); } int main() { std::cout << "Pascal's triangle:\n"; for(int n = 1; n < 10; ++n) { std::cout << std::string(20-n*2, ' '); for(int k = 1; k < n; ++k) std::cout << std::setw(3) << binom(n,k) << ' '; std::cout << '\n'; } } اطلاعات بیشتر از این تابع، در این لینک. نحوهٔ استفاده از توابع انتگرال بیضوی نوع اول : #include <cmath> #include <iostream> int main() { double hpi = std::acos(-1)/2; std::cout << "K(0) = " << std::comp_ellint_1(0) << '\n' << "π/2 = " << hpi << '\n' << "K(0.5) = " << std::comp_ellint_1(0.5) << '\n' << "F(0.5, π/2) = " << std::ellint_1(0.5, hpi) << '\n'; std::cout << "Period of a pendulum length 1 m at 90° initial angle is " << 4*std::sqrt(1/9.80665)* std::comp_ellint_1(std::pow(std::sin(hpi/2),2)) << " s\n"; } اطلاعات بیشتر از این تابع، در این لینک. نحوهٔ استفاده از توابع انتگرال بیضوی نوع دوم : #include <cmath> #include <iostream> int main() { double hpi = std::acos(-1)/2; std::cout << "E(0) = " << std::comp_ellint_2(0) << '\n' << "π/2 = " << hpi << '\n' << "E(1) = " << std::comp_ellint_2(1) << '\n' << "E(1, π/2) = " << std::ellint_2(1, hpi) << '\n'; } اطلاعات بیشتر از این تابع، در این لینک. نحوهٔ استفاده از توابع انتگرال بیضوی نوع سوم : #include <cmath> #include <iostream> int main() { std::cout << std::fixed << "Π(0.5,0) = " << std::comp_ellint_3(0.5, 0) << '\n' << "K(0.5) = " << std::comp_ellint_1(0.5) << '\n' << "Π(0,0) = " << std::comp_ellint_3(0, 0) << '\n' << "π/2 = " << std::acos(-1)/2 << '\n' << "Π(0.5,1) = " << std::comp_ellint_3(0.5, 1) << '\n'; } اطلاعات بیشتر از این تابع، در این لینک. نحوهٔ استفاده از توابع بسل نوع اول : #include <cmath> #include <iostream> int main() { // spot check for ν == 0 double x = 1.2345; std::cout << "I_0(" << x << ") = " << std::cyl_bessel_i(0, x) << '\n'; // series expansion for I_0 double fct = 1; double sum = 0; for(int k = 0; k < 5; fct*=++k) { sum += std::pow((x/2),2*k) / std::pow(fct,2); std::cout << "sum = " << sum << '\n'; } } اطلاعات بیشتر از این تابع، در این لینک. نحوهٔ استفاده از توابع بسل نوع دوم : #include <cmath> #include <iostream> int main() { // spot check for ν == 0 double x = 1.2345; std::cout << "J_0(" << x << ") = " << std::cyl_bessel_j(0, x) << '\n'; // series expansion for J_0 double fct = 1; double sum = 0; for(int k = 0; k < 6; fct*=++k) { sum += std::pow(-1, k)*std::pow((x/2),2*k) / std::pow(fct,2); std::cout << "sum = " << sum << '\n'; } } اطلاعات بیشتر از این تابع، در این لینک. همچنین در مورد توابع دیگر مانند هرمیتی و غیره میتوانید از مرجع آن استفاده کنید.
-
- سیپلاسپلاس
- سی++
-
(و 5 مورد دیگر)
برچسب زده شده با :
-
ابزار Andrioid SDK , Android NDK, openssl , commandlinetools و غیره رو نصب کردم و در قسمت devices همه تیک ها سبز هست. یک پروژه qtquick برای اندروید ایجاد کردم. موقع کامپایل با خطای (gradle) زیر مواجه میشم : General error during conversion: Unsupported class file major version 63 از JDK ورژنن 17 تا 20 رو هم امتحان کردم بازم فایده نداشت
-
ترکیب کدهای ++C با وردپرس بدون شکستن کد آن
کامبیز اسدزاده نوشته وبلاگ را ارسال کرد در برنامه نویسی
سادهترین راه برای افزودن کد سفارشی به سایتهایی که بر پایهٔ وردپرس ساخته شدهاند، بدون شکستن کد آن چیست؟ زبان برنامهنویسیِ ++C یکی از محبوبترین زبانهای برنامهنویسی است. آخرین آمار نشان میدهد که این زبان با سرعت بسیار زیادی در حال توسعه و پوستاندازی است. این زبان، علیرغم اینکه بیش از 40 سال از عمرش میگذرد، همچنان زبان انتخابی برای بسیاری از برنامهنویسان در سراسر جهان است. برای بسیاری از موارد مانند برنامههای کاربردی دستکاری تصویر، بازیهای سه بعدی، شبیه سازیها، مرورگرهای وب و نرمافزارهای سازمانی استفاده میشود. دلیلش این است که سیپلاسپلاس در حال تکامل است، به انرژی سبز اهمیت میدهد و در عین حال کارآیی بسیار بالا و بهینهای دارد. از آنجایی که این زبان پیچیدهتر از سایر زبانهای برنامهنویسی است، یک کمیتهٔ فرعی از یک سازمان چند سطحی وظیفه استانداردسازی آن را بر عهده دارد. سیپلاسپلاس اکنون از یک مدل قطار پیروی میکند و هر سه سال یکبار نسخههای جدید دریافت میکند که در مورد استانداردهای جدید، اخیراً مقالاتی منتشر شده است. سیپلاسپلاس معمولاً برای توسعهٔ نرمافزار در مقیاس بزرگ استفاده میشود، اما میتوان از آن برای پروژههای توسعه وب نیز استفاده کرد. ممکن است تعجب کنید که چگونه از آن با وردپرس، یکی از محبوبترین سیستمهای مدیریت محتوا و سازندگان وب سایت امروزه استفاده کنید. در این باره قبلاً من مقالاتی را منتشر کردهام که به صورت زیر آمدهاند: در حالی که بسیاری از وب سایتها با استفاده از وردپرس به عنوان پایه ساخته میشوند، این لزوماً به این معنی نیست که اکوسیستم وردپرس تکامل یافته یا کامل است. به عنوان مثال، وردپرس تمرکز زیادی بر تجربهکاربران و نیازهای وبلاگ نویسان دارد، به همین دلیل است که بر چهار زبان HTML، CSS، جاوا اسکریپت و PHP متکی است و این بدان معناست که برای توسعهدهندگانی که میخواهند به طور کامل از قدرت آن استفاده کنند، محدودیتهایی وجود دارد. در حالی که افزونههایی مانند Custom Post Types برای گسترش عملکرد وردپرس وجود دارد و راههای زیادی برای افزودن قابلیتهای جدید بدون شروع از ابتدا وجود ندارد. همچنین، افزودن کد ++C به طور مستقیم به یک سایت وردپرس توصیه نمیشود زیرا به طور بالقوه میتواند آسیب پذیریهای امنیتی را ایجاد کند و وب سایت را خراب کند. با این حال، اگر نیاز خاصی به اجرای کد ++C در سایت وردپرس شما وجود دارد، در اینجا روشهایی که میتوانید آن را انجام دهید گفته شدهاست: شما می توانید یک برنامه یا کتابخانه مستقل ++C ایجاد کنید و سپس آن را از طریق وب API در معرض دید قرار دهید، که میتواند توسط وردپرس مصرف شود. بیایید نگاهی به مراحل کلی بیندازیم: کد ++C خود را بنویسید و آن را در یک برنامه یا کتابخانه مستقل کامپایل کنید. عملکرد برنامه یا کتابخانه ++C را از طریق وب API به نمایش بگذارید. شما میتوانید از یک کتابخانه به عنوان cpprestsdk برای ایجاد نقاط پایانی API استفاده کنید. برنامه یا کتابخانه ++C را بر روی یک سرور، یا در همان سرور سایت وردپرس خود یا در یک سرور جداگانه، مستقر کنید. در سایت وردپرس خود، از یک افزونه یا کد سفارشی برای درخواست HTTP به API و بازیابی نتایج استفاده کنید. شما میتوانید از کتابخانهای مانند cURL برای ارائه چنین درخواستهایی استفاده کنید. در صورت نیاز از نتایج بازیابی شده در سایت وردپرس خود استفاده کنید. راه دیگر برای افزودن قابلیت ++C به سایت وردپرس استفاده از افزونهای است که به شما امکان میدهد کد ++C را مستقیماً در صفحات یا پستهای وردپرس جاسازی کنید. مراحل بسته به افزونهای که استفاده میکنید متفاوت است، اما در اینجا چند مرحله کلی وجود دارد که میتواند کمک کند. افزونهای را که از کد ++C پشتیبانی میکند را در سایت وردپرس خود نصب کنید. یک صفحه یا پست جدید در وردپرس ایجاد کنید و کد کوتاه [cpp] را به قسمت محتوا اضافه کنید. در کد از نوع برچسبِ [cpp]، کد ++C خود را اضافه کنید. صفحه یا پست را منتشر کنید و آن را مشاهده کنید تا کد جاسازی شده ++C را در عمل ببینید. مجدداً توجه داشته باشید که افزودن کد ++C به طور مستقیم به یک صفحه یا پست میتواند خطرناک باشد. مهم است که پیادهسازی خود را به طور کامل آزمایش کنید تا مطمئن شوید که ایمن و قابل اعتماد است. از هر روشی که استفاده میکنید، به یک پایه محکم در سیپلاسپلاس و مهارتهای یکپارچه سازی وردپرس نیاز دارد. وقتی صحبت از وردپرس به میان میآید، شاید بهتر باشد از زبانی مانند PHP استفاده کنید. اگر میخواهید دربارهٔ ++C و نحوهٔ به حداکثر رساندن آن برای پروژهتان بیشتر بدانید، میتوانید به آموزههای مربوط به سیپلاسپلاس در این سایت را بررسی کنید یا کتابهای پیشنهادی در بخش معرفی زبان را بخوانید. فراموش نکنید که سیپلاسپلاس یک زبان جذاب و همیشه در حال تکامل است و افزودن آن به مجموعه مهارتهای شما سودمند است.-
- سیپلاسپلاس
- وردپرس
-
(و 7 مورد دیگر)
برچسب زده شده با :
-
نهاییسازی ویژگیهای استاندارد ۲۳ و خلاصهای از جلسهٔ استانداردسازی WG21
کامبیز اسدزاده نوشته وبلاگ را ارسال کرد در فناوری
با سلام، با توجه به گزارش آنتونی پولوخین که یکی از اعضای کمیتهٔ استانداردسازی WG21 (سازمانی که توسعهٔ زبان برنامهنویسی سیپلاسپلاس را کنترل میکند). این کمیته سه بار در هر سال، هر بار در یک شهر جدید در سراسر جهان جلسه برگزار میکند. در طول این جلسات، پیشنهاداتی برای تغییر در زبان در نظر گرفته میشود. همچنین به توسعهدهندههای محلی سی++ کمک میکنند تا پیشنهادات خود را ارائه کنند. خلاصهای از جلسهٔ ماه جولای با هدف نهایی شدن استاندارد ۲۳ که نشان میهد پیشرفت بزرگی به عنوان ویژگیهای جدید استاندارد ۲۳ وجود دارد ارائه شده است: فهرست برخی از ویژگیها به صورت زیر آمدهاست: std:mdspan std:flat_map std:flat_set freestanding std:print("Hello {}", "world") formatted ranges output constexpr for bitset, to_chars/from_chars std::string::substr() && import std; std::start_lifetime_as static operator() [[assume(x > 0)]] 16- and 128-bit floats std::generator و البته ویژگیهای بسیار بیشتر از این. ویژگی std::mdspan از زمان اتخاذ عملگر opertator[] چند بعدی در آخرین جلسه، معرفیstd::mdspan به عنوان یک ویژگی سادهتر مطرح شده است و نتیجهٔ یک آرایهٔ چند بعدی غیر مالک به صورت زیر است: using Extents = std::extents<std::size_t, 42,="" 32,="" 64="">; double buffer[ Extents::static_extent(0) * Extents::static_extent(1) * Extents::static_extent(2) ]; std::mdspan<double, Extents=""> A{ buffer }; assert( 3 == A.rank() ); assert( 42 == A.extent(0) ); assert( 32 == A.extent(1) ); assert( 64 == A.extent(2) ); assert( A.size() == A.extent(0) * A.extent(1) * A.extent(2) ); assert( &A(0,0,0) == buffer ); این ویژگی حتی میتواند با سایر زبانهای برنامهنویسی خارج از جعبه کار کند. به عنوان مثال، در پارامتر الگوی سوم خود، std::mdspan میتواند یکی از چندین کلاس طرح بندی از پیش تعریف شده را بگیرد: نوعstd::layout_right: سبک چیدمان برای C یا ++C، سطرها دارای شاخص صفر هستند. نوعstd::layout_left: سبک چیدمان برای Fortran یا Matlab، ستونها دارای شاخص صفر هستند. شما می توانید تمام جزئیات را در سند P0009 بیابید. نویسندگان قول دادهاند که در آینده نزدیک نمونههای زیادی از std:mdspan جدید ارائه کنند. ویژگی std::flat_map و std::flat_set نگهدارندههای شگفتانگیز flat_* از کتابخانهٔ بوست، دیگر در استاندارد اصلی سی++ در دسترس هستند. این خاصیتها در کار با دادههای کم بسیار پرکاربرد هستند. در زیر ساختها، ظروف flat دادهها را در یک آرایه مرتب شده ذخیرهسازی میکنند که به طور قابل توجهی تخصیص حافظهٔ پویا را کاهش داده و موقعیت دادهها را بهبود میبخشد. علیرغم پیچیدگی جستجوی O(log N) و پیچیدگی درجO(N) در بدترین حالت، ظروف مسطح هنگام کار با مقدار کمی از عناصر بهتر از std:unordered_map عمل میکنند. در واقع، در طی فرآیند استانداردسازی، ظروف flat_* به عنوان آداپتور ساخته شدهاند. به این ترتیب، برنامهنویسان میتوانند از نگهدارندههای خود برای پیادهسازی اساسی استفاده کنند: template <std::size_t N> using MyMap = std::flat_map< std::string, int, std::less<>, mylib::stack_vector<std::string, N>, mylib::stack_vector<int, N> >; static MyMap<3> kCoolestyMapping = { {"C", -200}, {"userver", -273}, {"C++", -273}, }; assert( kCoolestyMapping["userver"] == -273 ); const auto& keys = kCoolestyMapping.keys(); // Inspired by Python :) assert( keys.back() == "userver" ); یک نکتهٔ جالب این است که استاندارد STL برخلاف پیادهسازی Boost، کلیدها و مقادیر را در نگهدارندهها جداگانه ذخیره میکند. این مکانِ کلیدیِ بهبود یافته، جستجوی ظرفِ flat را سریعتر میکند. رابط کاملstd::flat_set در سند P1222 توضیح داده شده است، در حالی که شرح رابط std:flat_map در سند P0429 موجود است. مستقل (Freestanding) استاندارد ++C میگوید که امکان پیادهسازی کتابخانهٔ استاندارد به صورت میزبان (hosted) یا مستقل (freestanding) وجود دارد. پیادهسازی میزبان نیاز به پشتیبانی سیستمعامل دارد و باید تمام روشها و کلاسها را از کتابخانهٔ استاندارد پیادهسازی کند. مستقل (freestanding) میتواند بدون سیستمعامل کار کند، سختافزار مهم نیست، و برخی از کلاسها و توابع را شامل نمیشود. تا همین اواخر، هیچ توضیحی برای ایستادن آزاد وجود نداشت و سازندگان سختافزارهای مختلف بخشهای مختلفی از کتابخانهٔ استاندارد را ارائه میکردند. این کارِ پورت کردن کد را سختتر کرد و محبوبیت ++C را در محیطهای تعبیهشده (امبدها) تضعیف کرد. بنابراین، زمان تغییر آن فرا رسیده است! سند P1642 مشخص کرده است که کدام بخش از کتابخانهٔ استاندارد برای freestanding اجباری است. ویژگی std::print روشهایی از کتابخانهء محبوب fmt در C++20 اضافه شد. این کتابخانه آنقدر راحت و سریع بود که برنامهنویسان شروع به استفاده از آن کرده و تقریباً در همهجای کد خود به کار بردهاند، از جمله برای خروجی قالببندی شده: std::cout << std::format(“Hello, {}! You have {} mails”, username, email_count); اما کدی مانند آن به دلایل زیر کامل نیست: تخصیص پویا اضافی. نیاز به std::cout جهت قالببندی خطوط از قبل قالب بندی شده. عدم پشتیبانی از یونیکد. کدی که اندازهٔ فایل باینری حاصل را افزایش میدهد. ظاهری نه چندان جذاب. بنابراین، تمام این مشکلات با اضافه کردن متدهایstd::print حل شد: std::print(“سلام, {}! به جامعهٔ {} خوش آمدید!”, name, community); میتوانید جزئیات، معیارها و گزینههای استفاده ازstd::print باFILE* و استریمها را در سند P2093 بیابید. خروجی قالببندی شده محدودههای مقدار به لطف سند P2286 و، std::format (و std::print) اکنون میتوانند محدودههایی از مقادیر را بدون در نظر گرفتن اینکه در یک ظرف هستند یا توسط std::ranges::views::* ارائه شدهاند خروجی بگیرند. std::print("{}", std::vector<int>{1, 2, 3}); // Output: [1, 2, 3] std::print("{}", std::set<int>{1, 2, 3}); // Output: {1, 2, 3} std::print("{}", std::pair{42, 16}); // Output: (42, 16) std::vector v1 = {1, 2}; std::vector v2 = {'a', 'b', 'c'}; auto val = std::format("{}", std::views::zip(v1, v2)); // [(1, 'a'), (2, 'b')] ویژگی constexpr اخبار تجزیه و تحلیل عالی برای توسعهدهندگانی که با کتابخانههای مختلف کار میکنند وجود دارد: خاصیتهایstd::to_chars/std::from_chars اکنون میتوانند در مرحله کامپایل برای تبدیل مقادیر صحیح از متن به باینری استفاده شوند. این نیز باید هنگام توسعه DSL مفید باشد. به نظر میرسد توسعهدهندههای روسی Yandex Go (به نقل از عضو کمیته) قصد دارند از آن در چارچوب کاربر برای بررسی پرس و جوهای SQL در مرحله کامپایل استفاده کنند. گزینهٔ std::bitset نیز تبدیل به constexpr شده است، بنابراین کار با بیتها در مرحلهٔ کامپایل اکنون بسیار آسانتر از قبل است. دانیل گوچاروف روی std::bitset در سند P2417 کار کرد و الکساندر کارائف در سند std::to_chars/std::from_chars P2291 به او پیوست. با تشکر فراوان از آنها برای این کار خوب انجام شده! ویژگی import std; با توجه به اینکه، اولین ماژول کامل(تمامعیار) به کتابخانهٔ استاندارد (STL) اضافه شد. اکنون میتوان کل کتابخانه را با یک خط بر سند وارد کرد: import std;. اگر کل ماژول کتابخانهٔ استاندارد به جای گنجاندن فایلهای هدر وارد شود، ساختها میتوانند تا ۱۱ برابر (گاهی اوقات حتی ۴۰ بار!) سریعتر شوند. میتوانید بنچمارک ها را در P2412 مشاهده کنید. اگر به ترکیب ++C و C و همچنین استفاده از توابع C از فضای نام جهانی عادت دارید، ماژول std.compat برای شما مناسب است. وارد کردن آن همهٔ توابع فایلهای سرآیند C مانند ::fopen و ::isblank و همچنین محتویات کتابخانهٔ استاندارد را در اختیار شما قرار میدهد. با وجود همهٔ اینها، سند P2465 که ماژولهای جدید را پوشش میدهد، در واقع آنقدرها هم طولانی نیست. ویژگی std::start_lifetime_as تیمور داملر و ریچارد اسمیت یک هدیهٔ فوقالعاده برای همهٔ توسعهدهندگانی که روی برنامههای تعبیه شده (امبد) و پربار کار میکنند گرد هم آوردهاند. اکنون تنها چیزی که برای کار کردن همه چیز نیاز دارید این است: struct ProtocolHeader { unsigned char version; unsigned char msg_type; unsigned char chunks_count; }; void ReceiveData(std::span<std::byte> data_from_net) { if (data_from_net.size() < sizeof(ProtocolHeader)) throw SomeException(); const auto* header = std::start_lifetime_as<ProtocolHeader>( data_from_net.data() ); switch (header->type) {> // ... } } به عبارت دیگر، میتوانید بافرهای مختلف را به ساختارها تبدیل کنید و با آنها بدون reinterpret_cast، کپی کردن دادهها یا خطر عملکرد برنامهتان کار کنید. همه چیز در سند P2590 شرح و مستند شده است. ویژگیهای شناورهای (اعشاری) 16 و 128 بیتی استاندارد ++C اکنون شامل std::float16_t، std::bfloat16_t، std::float128_t و نام مستعار برای اعداد موجود با ممیز شناور است: std::float32_t، std::float16_t. شناورهای 16 بیتی در هنگام کار با کارتهای ویدئویی یا یادگیری ماشین کمک میکنند. به عنوان مثال، float16.h میتواند از انواع جدید شناور کوتاه بهرهمند شود. شناورهای 128 بیتی برای محاسبات علمی شامل اعداد بزرگ بهترین هستند. سندِ P1467 ماکروها را برای بررسی پشتیبانی کامپایلر برای اعداد جدید توصیف میکند، و حتی خاصیتِ stdfloat.properties، در جدول مقایسه با توصیف اندازههای مانتیس و توان در بیتها وجود دارد. ویژگی std::generator زمانی که کروتینها در استاندارد C++20 پذیرفته شدند، ایده این بود که میتوان از آنها برای ایجاد «مولد» استفاده کرد: توابعی که وضعیت خود را بین تماسها به خاطر میآورد و مقادیر جدید را بر اساس آن حالت برمیگرداند. در استاندارد C++23 با اشاره به، std::generator به عنوان یک کلاس جدید یاد میشود که به شما امکان میدهد به راحتی ژنراتورهای خود را ایجاد کنید: std::generator<int> fib() { auto a = 0, b = 1; while (true) { co_yield std::exchange(a, std::exchange(b, a + b)); } } int answer_to_the_universe() { auto rng = fib() | std::views::drop(6) | std::views::take(3); return std::ranges::fold_left(std::move(rng), 0, std::plus{}); } در مثال فوق میتوانید ببینید که ژنراتورها با std::ranges چقدر خوب کار میکنند. std::generator کارآمد و ایمن است. کدی که به نظر میرسد یک پیوند معلق ایجاد میکند در واقع کاملاً معتبر است و هیچ مشکلی ایجاد نمیکند: std::generator<const std::string&=""> greeter() { std::size_t i = 0; while (true) { co_await promise::yield_value("hello" + std::to_string(++i)); // Everything is ok! } } میتوانید مثالها و توضیحاتی دربارهٔ نحوه کارکرد و استدلال پشت این رابط را در سند P2502 بیابید. سورپرایزهای دلپذیر کلاس string استاندارد برای متد substr() برای ارجاعات rvalue یک بازنگری اساسی (بهبود) دریافت کرده است: std::string::substr() &&. مانند مثال زیر: std::string StripSchema(std::string url) { if (url.starts_with("http://")) return std::move(url).substr(5); if (url.starts_with("https://")) return std::move(url).substr(6); return url; } این روش اکنون بدون تخصیص پویا اضافی کار میکند. اطلاعات بیشتر را میتوانید در سند P2438 بیابید. به لطف سند P1169، اکنون میتوانیدoperator() را ثابت اعلام کنید، که برای ایجاد CPO برای محدودهها در کتابخانه استاندارد عالی است: namespace detail { struct begin_cpo { template <typename T> requires is_array_v<remove_reference_t<T>> || member_begin<T> || adl_begin<T> static auto operator()(T&& val); }; void begin() = delete; // poison pill } // namespace detail namespace ranges { inline constexpr detail::begin_cpo begin{}; // ranges::begin(container) } // namespace ranges علاوه بر std::start_lifetime_as، تیمور داملر یک راهنمایی عالی برای بهینهساز ارائه کرد[[assume (x > 0)]]. اکنون میتوانید در مورد مقادیر احتمالی اعداد و سایر متغیرهای ثابت به کامپایلر نکاتی بدهید. برخی از مثالها و معیارها در سند P1774 کاهش پنج برابری در تعداد دستورالعملهای اسمبلی را نشان میدهند. این استاندارد همچنین دارای بسیاری از ویرایشهای جزئی، رفع اشکال و پیشرفتها بوده است، در اینجا منظور استاندارد ۲۳ است. در برخی مکانها، از سازندههای حرکتی (move constructors) به جای سازندههای کپی (copy constructors) استفاده شد (P2266). خوشبختانه برای توسعهدهندگان درایور، برخی از عملیات فرار دیگر منسوخ نمیشوند (P2327 با رفع اشکال در C++20). عملگر<=> کدهای قدیمی را کمتر میشکند (P2468)، کاراکترهای یونیکد اکنون میتوانند با نام استفاده شوند (P2071)، و کامپایلرها عموماً برای پشتیبانی از یونیکد (P2295) مورد نیاز هستند. الگوریتمهای جدید برای محدودهها (ranges::contains P2302, views::as_rvalue P2446, views::repeat P2474, views::stride P1899, و ranges::fold P2322) و std::format_string برای بررسیهای زمان کامپایل اضافه شد. std::format (P2508) و ماکروی #warning در (P2437). محدودهها (Ranges) یاد گرفتاند که چگونه با انواع فقط حرکت کار کنند (P2494). و در نهایت std::forward_like برای ارسال متغیرها بر اساس نوع متغیر دیگری اضافه شد (P2445). برای مدت طولانی، به نظر میرسید مهمترین نوآوری C++23 اضافه کردن std::stacktrace از RG21 بود، اگرچه در آخرین جلسه ویژگیهای مورد انتظار بسیاری اضافه شد. نوآوریهایی برای توسعهدهندگان تعبیه شده، شیمیدانان/فیزیکدانان/ریاضیدانان/...، توسعهدهندگان کتابخانههای یادگیری ماشین، و حتی توسعهدهندگانی که روی برنامههای کاربردی با بار بالا کار میکنند، وجود دارد.-
- استاندارد
- سیپلاسپلاس
- (و 4 مورد دیگر)
-
جایزهٔ زبان برنامهنویسی سال TIOBE به ++C تعلق یافت!
کامبیز اسدزاده نوشته وبلاگ را ارسال کرد در ابزارها
در سالی که گذشت (۲۰۲۲)، سیپلاسپلاس محبوبترین زبان برنامهنویسی با رشد شاخص محبوبیت ۴.۶۲٪ انتخاب شد! جایزه زبان برنامهنویسی سال TIOBE به ++C تعلق گرفت! این جایزه به زبان برنامهنویسی تعلق میگیرد که بیشترین افزایش محبوبیت را در یک سال تجربه کرده است. شاخص TIOBE میزان محبوبیت زبانهای برنامهنویسی را اندازهگیری میکند. با این حال، قبل از نتیجهگیری، توجه به این نکته مهم است که Index (شاخص) نه چیزی در مورد کیفیت یک زبان برنامهنویسی میگوید و نه ادعا میکند. این رتبهبندی با تجزیه و تحلیل تعداد مهندسان ماهر در یک زبان خاص، تعداد دورههای آموزشی در آن زبان و تعداد فروشندگان شخص ثالثی که محصولات یا خدمات مرتبط با آن زبان را ارائه میدهند، محاسبه میشود. این فهرست ماهانه بهروز میشود و بر اساس دادههای موتورهای جستجوی محبوب مانند گوگل، بینگ و یاهو است. جایزهٔ زبان برنامهنویسی سال TIOBE در ژانویه هر سال بر اساس رتبهبندی سال قبل اعلام میشود. سیپلاسپلاس یک زبان برنامهنویسی در سال ۲۰۲۲ انتخاب شد که با محبوبیت رشد ۴.۶۲ درصد و بیشترین رشد انتخاب شده است. این زبان برنامهنویسی سطح بالا با کارایی بالا و چندمنظوره برای توسعهٔ نرمافزارهای سیستمی، برنامههای کاربردی و بازیهای ویدیویی با انعطافپذیری و قابلیت کنترل سطوح پایین است. این زبان در نوامبر ۲۰۲۲ جاوا را پشتسر گذاشت و به رتبهٔ سوم شاخص رسید و محبوبیت آن به طور پیوسته در حال افزایش است. نایب قهرمان در سال ۲۰۲۲ به ترتیب C با رشد ۳.۸۲ و پایتون با ۲.۷۸ درصد رشد بودهاند. -
یک سوأل بسیار مهم و پر مخاطب در بارهٔ زبانبرنامهنویسی سیپلاسپلاس در سالهای اخیر این است که «آیا جایگزینی برای این زبان وجود دارد و یا قابل جایگزین است»؟ در بسیاری از پاسخها نشان از گزینههایی مانند Go، Rust و D دیده میشود که بهتر است نسبت به نظرات متخصصهای برنامهنویسی به این موضوع پرداخته شود، ابتدا باید در نظر گرفت که هر ابزاری میتواند جایگزینی داشته باشد اما شرایط و نحوهٔ استفادهٔ آن در رابطه با نیاز متفاوت است. اخیراً سوألات زیادی در این موضوع دیده شده است که میگویند، Rust یک زبان برنامهنویسی ایمن، سریع و سیستمیِ جایگزین برای سیپلاسپلاس است! اما آیا واقعاً اینگونه است یا صرفاً ما بر اساس احساسات و اشتیاق به بهروز شدن به این موضوع میپردازیم؟ پاسخ برای این سوأل به صورت زیر در مدلهای مختلف میتواند مطرح شود که نتیجهگیری و تصمیم از خلاصهٔ آن به عهدهٔ خودِ شماست. من بر این باورم که زبانهای برنامهنویسی همه و همه در حال بهروز رسانی و بهتر شدن نسبت به نسخهها، استانداردها، و نسلهای گذشتهٔ خودشان هستند و به هیچ عنوان هیچ زبانی تا به امروز به طور جدی منسوخ شده اعلام نشده است. برای درک این مطلب بهتر است ابتدا به واژهٔ «منسوخ شده» یا «Deprecated» بپردازیم، این واژه زمانی مورد استفاده قرار میگیرد که شرایط زیر بر آن حاکم باشد: گزینهٔ مورد نظر به طور رسمی از طرف سازنده، پشتیبان یا صاحب آن بد دانسته شده و رسماً کنار گذاشته شود. گزینهٔ مورد نظر بهروز رسانی نشود و آخرین بهروز رسانی آن نیز شامل مشکلاتی باشد که بعد از مدتها نیز حل نشده باشد. گزینهٔ مورد نظر دیگر مورد استفاده قرار نگیرد و کاربردی هم در بین رقبای خود نداشته باشد. گزینهٔ مورد نظر دیگر پشتیبانی نشود و به قولی مُرده باشد. گزینهٔ مورد نظر به علاوهٔ این که شامل این موارد میشود، باید دارای یک جایگزین مناسب و عالی باشد. با توجه به این معیارها و با در نظر گرفتن رسالت هر یک ابزارها باید به آن توجه کرد که هر زبان یا ابزار برنامهنویسی خارج از این، در مرحلهٔ پیشرفت قرار گرفته است که آن نشان دهندهٔ زنده بودن و کاربردی بودن آن است. از طرفی، زبانی مثل سیپلاسپلاس جایگزین نمیشود چرا که هیچ یک از دلایل و معیارهای بالا شامل حال آن نمیشود، اتفاقاً برعکس این زبان دارای ویژگیهای معیاری زیر است: این زبان به طور رسمی توسط کمیتهٔ استانداردسازی که متعلق به هیچ یک از شرکتهای غول صنعتی و یا خصوصی نمیباشد پشتیبانی میشود. این زبان به طور مداوم در حال بهروز رسانی است و کاربردهای چند-منظوره و همه جانبهٔ خود را داراست. این زبان از ویژگیهای از ویژگیهای بسیار خوب به همراه سریعترین بازدهیها را داراست. این زبان رقیبهای بسیاری دارد، اما هیچ کدام از آنها هنوز در عمل و دامنهٔ وسیعی موفق به نمایش عملکرد بهتری نبودهاند. این زبان همانند دیگر ابزارها دارای مشکلاتی است، اما با توجه به پوشش و پشتیبانی از ویژگی BC در روند استانداردسازی و بهروز رسانی به خوبی از پس آنها بر آمده است. برای مثال، زبان جاوا یکی از بهترین زبانهای برنامهنویسی است و خیلی از شرکتها مانند گوگل در سیستمهای توزیع شده از آن استفاده میکنند. اما به معنای این نیست که به سرعت سی++ میرسد و در حد مقایسه با آن است. این زبان میتواند دهها و صدها برابر کندتر از سی++ باشد و این مربوط به طراحی، ساختار و مسائل مربوط به زبان است. از طرفی سیپلاسپلاس محبوب است زیرا که ویژگیهای زیر را دارد و طی سالهای بسیاری آن را ثابت کرده است: کارآیی (پرفرمنس) و سرعت فوقالعادهٔ این زبان، البته خیلی از زبانها ادعا میکنند که همچین ویژگیای را دارند که در عمل نتیجهٔ جالبی مشاهده نمیشود. ذاتِ چند-سکویی و چند-منظوره بودن آن، حداقل همهٔ سیستمها میتوانند کدهای سی++ را کامپایل و اجرا کنند. این زبان به راحتی میتواند با زبانها و فناوریهای دیگری ارتباط برقرار کرده و با آنها تعامل داشته باشد. این زبان به عنوان یکی از کممصرفترین زبانهای برنامهنویسی از نظر مصرف انرژی محسوب میشود. بسیاری از مهندسین این زبانها را به صورت مقطعی و بارها دیده و با آن آشنا هستند. کتابخانههای پیشفرض استاندارد STL و دیگر کتابخانههای سی++ بسیار قدرتمند و گسترده هستند. کتابخانههای نوع سوم (Third-Party) بسیار قدرتمند و بهروز هستند. اولویتهای سیستمهای یونیکس و حتی ویندوز اکثراً بر روی C و ++C است و بازنویسی آنها با زبانهای دیگر هزینهٔ بسیاری را به ارمغان میآورد. بسیاری از وابستگیهای ایجاد شده در سالهای بسیار طولانی بر اساس سی و سی++ بوده و بازنگری و بازنویسی آنها مشروط بر این که رابطها باید بازنویسی شود بسیار سخت و کاری مشابه اختراع دوبارهٔ چرخ است. عملکرد تا حدی قابل پیشبینی است و میتواند آن را درک کرد، چیزی که در زبانهایی مانند جاوا، سیشارپ و گو نمیتواند پیشبینی کرد چرا که پیشبینی چرخهٔ GC دشوار است، هیچ رقیب جدیای در این باره در سطح سی++ وجود ندارد که مدیریت حافظه را برای شما در قالب یک RAII ارائه کند، هرچند در مورد Objective-C و Rust میتوان آنها را به صورت جداگانه مورد بررسی قرار داد و نه عین آن. پشتیبانی از پارادایم (سبک)های طراحی را سی++ به خوبی پشتیبانی میکند، برای مثال برنامهنویسی عمومی در زمان کامپایل را به خوبی ارائه میکند. پشتیبانی از برنامهنویسی سیستمی و سطح پایین در این زبان یک مزیتی دیگری است که در کنار تمامی ویژگیهای سطح بالای خود ارائه میکند. اما در این میان زبانهایی مثل Rust، Go، Swift و غیره ادعای جایگزینی را دارند اما ادعاهای فنی به تنهایی کافی نیستند، در دسترس بودن گسترده از جامعه به اندازهٔ کافی به همراه جامعهٔ معتمد به آن مهم است. علاوه بر ویژگیهای فنی زبان سی++، یک نقطه قوت بسیار مهم این زبان در بحث غیر فنی آن است، در واقع در پشت این زبان نه یک پیادهسازی محدودی وجود دارد و نه یک سازمان که در آینده در مورد آن تصمیم بگیرد و آن را کنترل کند. در حالی که تمامی زبانهای مطرح و ادعا کننده داخل یک چهارچوبی کنترل میشوند که به شدت آیندهٔ آنها را تیره و تار میکند. به طور کلی آزاد بودن یک ابزار و قدرت یک جامعه فارغ از جغرافیا، سازمان، نژاد و زبان یک قدرت بسیار خارقالعادهای را برای یک ابزار به ارمغان میآورد که به تنهایی بسیار اهمیت دارد. در این اواخر بسیاری از مهندسین به فکر بازنویسی بسیاری از موارد شدن و تحقیقات نشان میدهد ابزارهایی گرافیکی بسیار قدرتمند و سریع که اخیراً طراحی شدهاند، مانند وُلکان که با سی++ نوشته شده است زمانی میتوانند با راست و زبانهای دیگر امروزی بازنویسی شوند که یک سیستمعامل جدید با زبانهای جدید ساخته شود! بنابراین صرفاً میتوان یک نسخهٔ Wrapper یا همان (پوشنده) چرا که تقریباً همهٔ سیستمعاملهای مدرن امروزی با زبانهای سی و سی++ نوشته شدهاند. از طرفی تولید یک سیستمعامل بسیار پر خطر است و سرمایهگذاری کلان، زمان و هزینههای بسیاری را میطلبد و تا زمانی که چنین نرمافزارهایی تحت سلطهٔ زبانهایی مانند سی++ قرار گرفته باشند پادشاهی سیپلاسپلاس ادامه خواهد داشت. نکتهٔ پایانی من معتقدم هر ابزار و زبانهای برنامهنویسی جایگاه و شرایط استفادهٔ خودشان را شامل میشوند، دقیقاً مانند ابزارهای موجود در یک جعبهابزار بهتر است ابزارهای خود را طوری بچینید که در جای لازم از مناسبترین آنها استفاده کنید. با این حال زبانها و ابزارهای مانند سی یا سی++ طی سالها ثابت کردهاند که معمولاً در همهٔ حوزهها غالب هستند و میتواند هر کاری را که بخواهید با آنها انجام دهید و یا با یک جایگرین مناسب آن را مدیریت کنید و این بستگی به مهارت و انتخاب شخصی شما دارد. همچنین صحبتهای اخیر کمیتهٔ استانداردسازی در رابطه با نحو ۲ از سیپلاسپلاس میتواند مفهوم خوبی در آیندهٔ این زبان باشد. مقالات مرتبط با این موضوع که میتواند به عنوان مکملی از پیش تعریف شده برای شما مفید باشد:
- 1 دیدگاه
-
- جایگزینی
- سیپلاسپلاس
-
(و 3 مورد دیگر)
برچسب زده شده با :
-
سیستم مدیریت محتوا
کامبیز اسدزاده یک موضوع را ارسال کرد در <span class="ipsBadge ipsBadge_pill" style="background-color: #e62f3d; color: #ffffff;" >برنامه نویسی در C و ++C</span>
آیا این واقعاً امکانپذیر است؟ پاسخ : بله! من میدانم که ممکن است این مبحث تحت سی++ بسیار پیچیده و یک کار بیهودهای باشد! اما واقعیت این است که تکنیکهای پنهان بسیاری وجود دارد که ممکن است همه از آن باخبر نباشند! من قبلاً در مورد اینکه تحت ++C وبسایت میشه طراحی کرد یا خیر تحقیقاتی انجام داده بودم، از لحاظ امکان بودنش جواب مثبت بود اما اینکه به راحتی طراحی تحت Php یا دیگر زبانهای برنامهنویسی باشه خیر! خُب طبیعیه چون شما بسیار راحت یه اسکریپت رو مینویسی و روی سرور اجراش میکنی و سایت شما به خوبی و خوشی بالا میاد! ممکن است در همین قسمت از موضوع شما به این نتیجه رسیده باشید که خُب نیازی به ادامهٔ بحث نداریم! وقتی کار سختیه پس منطقی نیست و شما احتمالاً دیوانهای!!! ? واقعیت جریان این است بر خلاف آن چیزی که تصور کردهایم طراحی وبسایت با سیپلاسپلاس نه تنها بسیار راحت است بلکه بسیار هم جذاب خواهد بود! اما در نگاه اول ممکن است یک سری محدودیتهارا داشته باشد که همهٔ این موارد با کمی تأمل و بررسی قابل حل هستند به قدری که وقتی درگیر این جریان باشید شیفتهٔ آن خواهید شد. مزایای یک وبسایت تحت سیپلاسپلاس نسبت به دیگر زبانهای رایج سرعت خارقالعاده و غیر قابل مقایسه با زبانهای رایج امنیت بهتر کدهای شما مدیریت سادهتر و انعطافپذیری بالا مصرف بسیار بهینه و غیر قابل تصور از منابع سرور دسترسی نامحدود به کتابخانهها عدم محدودیت در دسترسی به برنامهنویسی سطح پایین عدم محدودیت در استفاده از توابع سیستمعامل عدم محدودیت در مدیریت سیستم و هر ویژگی دیگری که در زبانهای اسکریپتی اگر به آن نیاز داشته باشید مجبور هستید تا به صورت اکستنشن آن را تحت سیپلاسپلاس باز نویسی کنید. سیستم راهانداز وبسرور چگونه است؟ در هر سروری CGI به شما امکان این را میدهد که بتوانید تحت پروتکلهای استاندارد برنامههای تحت وب را اجرا کنید. شما میتوانید تحت آن و یا موارد دیگری مانند FastCGI و WSGI و دیگر موارد بهینه شدهٔ آن برنامهٔ تحت وب را بر روی سرور خود اجرا کنید. طراحی قالب هماهنگی با HTML, JavaScript, Css در سیپلاسپلاس چگونه خواهد بود؟ همهٔ گزینههای مربوط به وب را شما بدون هیچ محدودیتی در اختیار خواهید داشت. شما هیچ محدودیتی در استفاده از ویژگیهای HTML5 یا CSS3 و یا JavaScript و دیگر فریمورکها و کتابخانههای کارآمدی چون Angular.JS را نخواهید داشت. بنابراین از نظر طراحی رابط یک وبسایت همانند دیگر زبانهای رایج میتوانید روی آن حساب کنید. طراحی هسته و بکاِند وبسایت چگونه خواهد بود؟ همانند زبانها و فریمورکهای رایج تحت وب شما در سیپلاسپلاس میتوانید هستهٔ وبسایت یا سیستم وبسایت خود را تحت استاندارد سیپلاسپلاس و هر کتابخانهای که میپسندید و یا به آن تسلط دارید پیاده سازی کنید! به شرطی که قابلیتهای آن کتابخانه پاسخگوی نیازهای شما باشد. با این حساب شما میتوانید حتی سیستم مدیریت محتوای (CMS) خود را طراحی کنید! ? بله سیستم مدیریت محتوا تحت سیپلاسپلاس! کاملاً جدی هستیم ? قبل از هر چیز یک مزیت بسیار بزرگ در کنار مزیتهای دیگر این است که یک CMS تحت سیپلاسپلاس میتواند داشته باشد مصرف بهینه از منابع سرور خواهد بود. برای مثال در یک مقایسهٔ ساده و آزمایشی نتیجهٔ بسیار جالبی ارائه شده است. همانطور که میدانید Wordpress به عنوان یک سیستم مدیریت محتوای (بلاگ) شناخته شده و تحت Php توسعه یافته است. نسخهٔ سریعتر و بهینهتر آن با نام Ghost تحت Node.JS توسعه یافته است که ما نسخهٔ توسعه یافتهٔ آن را با یک عمل مشابه در C++1z مورد بررسی قرار داده ایم که نتایج آن بسیار جالب است! مصرف حافظه سیستم مدیریت محتوای Tegra ۳۵۰۰ درخواست در هر ثانیه 3.6 مگابایت سیستم مدیریت محتوای Ghost 100 درخواست در ثانیه 120 مگابایت پشتیبانی از پایگاههای داده به لطف کتابخانههای عظیم سیپلاسپلاس امکان مدیریت یک وبسایت تحت پایگاههای داده مختلفی ممکن است. برای مثال تحت Qt شما میتوانید به رایجترین درایورهای بانکاطلاعاتی دسترسی داشته و سیستم خود را به آنها مجهز کنید. نکته: احتمالاً در برنامهنویسی با نود جیاس و پیاچپی شناختی با کتابخانههای OpenSSL, Libcurl و موارد این چنینی داشته اید! کتابخانههای فوق عضو لیست کتابخانههای C و ++C هستند. بنابراین شما علاوه بر دسترسی مستقیم بر آنها به هزاران و شاید میلیونها کتابخانه در دنیا سیپلاسپلاس خواهید داشت. نمونهٔ اولیه اما شوقآور برای اثبات امکان طراحی وبسایت تحت سیپلاسپلاس چندی پیش من تصمیم گرفتم تا سیستم وبسایتی را تحت Php7 برای یکی از استارتآپها طراحی و پیاده سازی کنم که در این پست به آن اشاره شده است. از آنجایی که به لطف کتابخانهٔ Qt برنامههای سمت کاربر را توسط سیپلاسپلاس پیاده سازی کرده بودم به این فکر افتادم چرا سمت سرور و بخش وبسایت هم با آن هماهنگ نشود!؟ اینگونه هماهنگی بین برنامهها و پرفرمنس همهٔ آنها بسیار افزایش خواهد یافت در اولین نگاه این تفکر بسیار ناشیانه و بسیار ناممکن بود! تنها روشی که به کار گرفته بودم ارسال اطلاعات از طرف کاربر به سمت سرور و مدیریت آنها تحت معماری Restful Api بود که در قالب JSon آنها را تجزیه و مدیریت میکردم. با کمی تحقیق در مورد ویژگیهای سمت وب تحت Fast-CGI, uWSGI, DJango, ClearSilver و موارد مرتبط با آنها سعی کردم تا صفحهٔ بسیار سادهای از HTML را توسط سیپلاسپلاس هندل کنم. این کار نتایج بسیار موفقیت آمیزی را در بر داشت تا نتیجهٔ آن تبدیل به یک پروژهٔ سیستم مدیریت محتوا تحت ++C شد. من پروژهای با نام مفهومی Tegra که نام پروژهٔ قبلی تحت Php بود را در محیط Qt Creator با C++17 و کتابخانهٔ Qt باز سازی کرده و هستهٔ اولیهٔ آن را برای اجرای چند صفحه از یک وبسایت، احراز هویت، بازخوانی و نمایش لیستی از خبرها و مدیریت متا تگها و آدرس صفحات مربوط به هر صفحه را ایجاد کردم. سعی کرده ام در کمترین زمان ممکن برای آزمایش یک سری ویژگیهای اولیه از یک وبسایت آنها را مورد بررسی قرار بدم که عبارتند از هماهنگی با فریمورکهای طراحی مانند BootStrap و یا Angular.JS که خوشبختانه همهچیز بسیار خوب در کنار همدیگه کار میکنند. هستهٔ سیستم به صورت جدا و معماری طراحی آن بر پایهٔ MVC مورد آزمایش قرار گرفته است. در زیر تصاویری از صفحات تولید شده تحت سیستم مدیریت محتوای ساخته شده با سیپلاسپلاس را مشاهده میکنید. ? همه چیز در قدمهای اول قرار دارد و با توجه به سادگی تولید وب سایت بر خلاف تصوری که داشتیم بسیار توسعه و جای پیشرفت خواهد داشت. بخشی از نمونه کدهای این سیستم به صورت زیر آورده شده است تا ذهنیتی برای توسعهدهندگان ارائه شود: تکه کُد زیر عمل ارسال اطلاعات و تمامی لینکهای مربوط به بوت استرپ را برای سمت HTML ارائه میکند که در قالب استاندارد جدید C++17 آورده شده است: auto bootstrapCss = bootStrapLib.find("css"); if(bootstrapCss != bootStrapLib.end()) { c->setStash("BootstrapCss", bootstrapCss->second.c_str()); std::cout << "Found " << bootstrapCss->first << " " << bootstrapCss->second << '\n'; } کد مربوط به سمت قالب به صورت زیر خواهد بود: <!-- Bootstrap core css --> <link href="{{BootstrapCss}}" rel="stylesheet"> نتیجهٔ فوق در صورتی که CDN بر روی لوکال تنظیم شده باشد از روی کدهای کامپایل شده و یا استاتیک فراخوانی خواهد شد. در غیر اینصورت از روی یکی از سرورهای CDN فراخوانی میشوند. نحوهٔ ارسال متغیر از سمت سیپلاسپلاس به قالب بسیار ساده است! بسیار ساده از Php و یا Node.JS میباشد. با در نظر گرفتن ارسال اطلاعات از سمت سیپلاسپلاس به سمت رابط کاربری کافی است نام متغیرها را در قالب خود اعمال کنید. {% for post in news %} <div class="blog-post"> <h2 class="blog-post-title"><a href="news/{{post.uri}}">{{post.title}}</a></h2> <p class="blog-post-meta">{{post.date}} by <a href="#">{{post.author}}</a></p> <p>{{post.announcement|safe}}</p> </div><!-- /.blog-post --> {% endfor %}</div> این ساختار بر پایهٔ ساختار Angular.JS و DJango پیاده سازی شده است که به طور کامل پشتیبانی میشود. فعال سازی فناوری Angular.JS بر روی این سیستم جهت طراحی قالب تنها با دو دستور ساده اعمال میشود: <!-- Link to AngularJS --> <script src= "{{AngularJs}}"></script> <!-- Enable AngularJS Engine --> {{AngularJsSync|safe}} این دستورات در هستهٔ سیستم مدیریت محتوا در کلاسی با نام Template پردازش و در نهایت به سمت HTML هندل میشوند. بخشی از دستورات سمت هسته در سیپلاسپلاس ۱۷ برای مثال ارسال عنوان صفحه به صورت زیر است: std::optional<std::string> LoadListTemplate::getTitle() const { if (isset(title)) { return title; } else { return std::nullopt; } } سمت HTML کافی است دستور فوق را در نظر بگیریم: <title>{{title}}</title> اینها مثالهایی از مراحل توسعهٔ این سیستم است که میدانم آنچنان گسترده نیست، اما برای ثابت کردن طراحی و توسعهٔ وبسایت تحت سیپلاسپلاس مثالهای روشنی هستند. موفق و سربلند باشید! اطلاعیههای مربوط به این پروژه احتمالاً در کانالها و گروه تلگرامی و همین مرجع بازگو و در اختیار شما قرار گیرد.- 13 پاسخ
-
- وبسایت
- سیپلاسپلاس
-
(و 3 مورد دیگر)
برچسب زده شده با :
-
کامبیز اسدزاده یک موضوع را ارسال کرد در <span class="ipsBadge ipsBadge_pill" style="background-color: #7a75ff; color: #ffffff;" >پادکستهای آموزشی</span>
پادکستِ مربوط به شفافسازی تقریبی از مسیرِ توسعهدهندگی تحت سی++ و ساخت محصولِ هدفمند زمان مورد نیاز : ۲۰ دقیقه و ۱۱ ثانیه Podcast-03.mp3-
- تولید محصول
- cpp
-
(و 7 مورد دیگر)
برچسب زده شده با :
-
اگر آبجکتی رو به صورت سینگلتون در چندجای برنامه استفاده کنیم، به این دلیل که این آبجکت در چندجا در حال استفاده هست و نمی شود آن را دیلیت کرد و از اول ایجاد کرد(یا حتی یکی دیگر ایجاد کنم و جایگزین قبلی کنم)، آیا امکانش هست که آن آبجکت ریست بشود (آبجکت به لحظه های اولیه ساخته شدنش برگرده)؟ برای این می پرسم که دیگر نیاز نباشد خودم اطلاعات داخل آبجکت رو به حالت اول برگردانم. .
-
- سیپلاسپلاس
- singletone
-
(و 1 مورد دیگر)
برچسب زده شده با :
-
کامبیز اسدزاده یک موضوع را ارسال کرد در <span class="ipsBadge ipsBadge_pill" style="background-color: #e62f3d; color: #ffffff;" >برنامه نویسی در C و ++C</span>
همانطور که میدانید در زبانهای برنامهنویسی از نوع کامپایلری، گزینهها و تنظیماتی وجود دارند که به شما امکان این را میدهد تا رفتار کامپایلر (همگردان) را تا حدی سفارشی سازی کنید. این امکان به کمک تنظیمات پرچمها (فلگها) و برخی از گزینهها قابل انجام است و انتخاب پرچمهای مناسب برای کامپایلر میتواند مورد توجه قرار بگیرد. با توجه به دو مقالهای که با عناوین زیر ارائه شده است، در این مقاله به جزئیات بیشتری نسبت به تنظیمات کامپایلر (همگردان یا مترجم) میپردازیم که البته توصیه میکنم در صورت عدم آشنایی با تعاریف مربوطه و به خصوص روند ترجمهٔ کدها و ساختار برنامههای نوشته شده توسط سیپلاسپلاس، بهتر است آنها را بررسی کنید. در مثال زیر، نسخهٔ کامپایلر همراه با اطلاعات مربوط به آن، توسط گزینهٔ option در خط فرمان قابل دریافت است: gcc --version خروجی مربوطه میتواند نسبت به نسخهٔ کامپایلر به صورت زیر باشد: gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. در حالت پیشفرض تنظیمات کامپایلر به صورت خودکار انجام میشود. اما در صورتی که نیاز باشد برخی از درخواستها توسط کامپایلر مورد توجه قرار بگیرد و یا برای دیگران آن را گوشزد کند، از این ویژگیها استفاده میشود. در چنین شرایطی میتواند به کامپایلر بگوید که کاربر میخواهد کد را برای اشکالزدائی بهینه کند یا اینکه کاربر نمیخواهد هیچ بهینهسازی خاصی برای آن فعال شود. این عمل معمولاً در سراسر خط فرمان قابل استفاده است و به عنوان مکانیزمی برای دستورالعمل برنامه برای انجام عملیاتی یا رفتاری به روش خاص عمل میکند. به طورکلی، گزینهٔ کامپایلر به عنوان یک عبارت بسیار حساس، برای خط فرمان است که برای تغییر عملکرد پیشفرض کامپایلر استفاده میشود. در اصل این گزینهها برای کامپایل برنامهٔ شما اجبار نیستند، اما برای کمک به کنترل نبههای مختلف برنامه بسیار مفید خواهند بود. از جمله: تولید کد بهینهسازی فایل خروجی (نوع، نام، مکان) خواص پیوند-دهنده اندازه فایل اجرائی سرعت اجرایی اینکه نیاز باشد کدی را بهینهسازی کنید، و یا مسائلی را برای دیگران گوشزد کنید کاملاً سلیقهای است و شما در روند توسعهٔ حرفهای خود میتوانید از این تکنیک استفاده کنید. سادهترین کاربرد این تکنیک میتواند وادار کردن استفادهٔ کامپایلر از یک استاندارد مشخص شده باشد که در صورت پشتیبانی از آن چه به صورت عقبگرد و چه به صورت سوئیچ به استانداردهای اخیر کاربرد خواهد داشت. برای مثال، پرچم std نسخه یا استاندارد ایزو از سیپلاسپلاس را کامپایلرهای رایجی مانند Clang و GCC مشخص میکند که به صورت زیر تعریف میشوند: -std=c++11 (ISO C++11) -std=c++14 (ISO C++14) -std=c++1z (ISO C++17) -std=c++20 (C++20 experimental) -std=gnu++ (ISO C++ with GNU extensions) معادل پرچم استاندارد در کامپایلر MSVC به صورت زیر است: /std:c++14 /std:c++17 /std:c++latest /std:c11 /std:c17 نکته، گزینهٔ /std از نسخهٔ ۲۰۱۷ به بعد از کامپایلر مایکروسافت در دسترس است. به صورت پیشفرض در این نسخه از کامپایلر این گزینه بر روی استاندارد ۱۴ تنظیم شده است. در صورت نیاز به ارتقاء آن به نسخهٔ ۱۷ طبق نمونه عمل کنید. همچنین طبق قوائد مایکروسافت استاندارد نهایی شده از آخرین ویژگیها در کامپایلر تحت /std:c++latest قابل دسترس میباشد که در این لحظه شامل استاندارد ۲۰ میشود. گزینهٔ Verbosity به عنوان اِسم یا Verbose از نوعِ صِفَت به معنای درازنویسی (بهتر است به معنای ارائهکنندهٔ اطلاعات بیشتر به آن توجه شود)، با کاراکتر W که به عنوان مخففی از Warning محسوب میشود قابل تنظیم است. بنابراین، پرچمهای زیر برای اهداف مشخصی در نظر گرفته میشوند که توضیحات هر یک را در مقابل آن آوردهایم: پرچم -Wall با فعال شدن، تعداد زیادی از پرچمهای هشدار دهندهٔ کامپایلر را به طور خاص و باهم روشن میکند که لیست آن به صورت زیر است: -Waddress -Warray-bounds=1 (only with -O2) -Warray-parameter=2 (C and Objective-C only) -Wbool-compare -Wbool-operation -Wc++11-compat -Wc++14-compat -Wcatch-value (C++ and Objective-C++ only) -Wchar-subscripts -Wcomment -Wduplicate-decl-specifier (C and Objective-C only) -Wenum-compare (in C/ObjC; this is on by default in C++) -Wenum-conversion in C/ObjC; -Wformat -Wformat-overflow -Wformat-truncation -Wint-in-bool-context -Wimplicit (C and Objective-C only) -Wimplicit-int (C and Objective-C only) -Wimplicit-function-declaration (C and Objective-C only) -Winit-self (only for C++) -Wlogical-not-parentheses -Wmain (only for C/ObjC and unless -ffreestanding) -Wmaybe-uninitialized -Wmemset-elt-size -Wmemset-transposed-args -Wmisleading-indentation (only for C/C++) -Wmissing-attributes -Wmissing-braces (only for C/ObjC) -Wmultistatement-macros -Wnarrowing (only for C++) -Wnonnull -Wnonnull-compare -Wopenmp-simd -Wparentheses -Wpessimizing-move (only for C++) -Wpointer-sign -Wrange-loop-construct (only for C++) -Wreorder -Wrestrict -Wreturn-type -Wsequence-point -Wsign-compare (only in C++) -Wsizeof-pointer-div -Wsizeof-pointer-memaccess -Wstrict-aliasing -Wstrict-overflow=1 -Wswitch -Wtautological-compare -Wtrigraphs -Wuninitialized -Wunknown-pragmas -Wunused-function -Wunused-label -Wunused-value -Wunused-variable -Wvla-parameter (C and Objective-C only) -Wvolatile-register-var -Wzero-length-bounds برای مثال، با فعالسازی پرچم -Werror، هرگونه هشدار را به خطای تلفیقی تبدیل میکند. این کار باعث میشود خطاهای مربوط به کدهای خطرناک را به گونهای جلوه دهید که از کامپایل آنها جلوگیری شود. کارهای مشابه این مورد، به صورت پیشفرض در زبانهای مانند Rust انجام میشود که از کدهای دارای خطا و خطرناک برای کامپایل جلوگیری میکند. به کار گیری چنین پرچمهایی در کامپایلر سی++ میتواند خطاهای شامل هشدار رو به خطاهای غیر قابل کامپایل تبدیل کند. جهت تنظیم این پرچم در پروژهٔ خود کافی است در ابزار ساخت مورد نظر آن را اعمال کنید، به عنوان مثال در سیمیک (CMake) به صورت زیر عمل کنید: SET (CMAKE_CXX_FLAGS "-Werror") و یا در QMake به شیوهٔ زیر میتوانید این ویژگی را فعال کنید: QMAKE_CXXFLAGS += -Werror برای مثال، کد زیر در صورت فعال بودن این پرچم، کامپایل نخواهد شد. int myFunction() { //no return! } auto main() -> int { return 0; } خروجی این پیام به صورت زیر خواهد بود: error: no return statement in function returning non-void [-Werror=return-type] به معنای این که هیچ بیانیهای به عنوان عبارت بازگشتی در تابع مربوطه که از نوع غیر-باطل (non-void) است، وجود ندارد. بسیاری از این گزینهها برای هدف خاصی در نظر گرفته میشوند که میتوانید جزئیات بیشتر آن را در این لینک پیدا کنید. برخی از پرچمهای رایج برای کتابخانهها گزینهٔ پرچم -lm امکان کامپایل کتابخانههای libm نوع سوم را به همراه کتابخانههای ریاضیاتی که عموماً به زبان سی هستند را میدهد. گزینهٔ پرچم -lpthread امکان کامپایل کتابخانههای مشترک از استاندارد پازیکس (Posix) را ارائه میکند. گزینهٔ پرچم -lstdc++fs امکان کامپایل و لینک شدن به کتابخانهٔ فایلسیستم را در استاندارد ۱۷ به بعد میدهد. پرچمهای بهینهسازی تحت کامپایلر با فعالسازی و اعمال پرچم-O0 هیچ گونه بهینهسازی بر روی کدها انجام نمیشود، در اصل امکان بهینهسازی کاملاً غیرفعال میشود. زمان کامپایل و همگردانی کدها سریعتر میشود و برای ابزارهای اشکالزدائی بهترین عملکرد را دارد. با فعالسازی و اعمال پرچم-O2 سطح بالاتری از بهینهسازی صورت میگیرد، ترکیبی از حالت بهینهسازی و سطح قبلی را اعمال میکند و طبیعتاً زمان بیشتری صرف کامپایل میشود و گزینهٔ بهتری برای ساخت یک محصول بهتر است. با فعالسازی و اعمال پرچم-O3 سطح بالاتری نسبت به سطح دوم از بهینهسازی صورت میگیرد، طبیعتاً زمان بیشتری صرف کامپایل میشود و گزینهٔ بهتری برای ساخت یک محصول بهتر است. از طرفی حجم باینری بیشتری را تولید کرده و زمان کامپایل طولانیتری را تحمیل میکند. با فعالسازی و اعمال پرچم-OFast سطح بالاتری نسبت به سطح سوم از بهینهسازی صورت میگیرد، طبیعتاً زمان بیشتری صرف کامپایل میشود و گزینهٔ بسیار بیشتری مانند -ffloat-store, -ffsast-math, -ffinite-math-only, -O3 را فعال میکند و برای ساخت یک محصول بهتر است. با فعالسازی و اعمال پرچم -OS امکان سطح دوم از بهینهسازی فعال میشود، با تفاوت اینکه برخی از پرچمها با هدف کاهش اندازهٔ فایل کدِ شیء (object-code) غیرفعال میشوند. با فعالسازی و اعمال پرچم-Oz سطح بالاتری نسبت به سطح -OS برای کاهش اندازهٔ فایل صورت میگیرد. این گزینه مختصِ Clang است. توضیحات و مراجع دقیق و بیشتر در رابطه با عملیات مربوط به پرچمهای بهینه سازی در کامپایلرهای مختلف به صورت زیر است: کامپایلر GCC کامپایلر Clang کامپایلر MSVC دقت کنید که نوع پرچمها نسبت به کامپایلرها متفاوت است، برای مثال پرچم -Od به معنای غیرفعالسازی تمامی بهینهسازیها و جمعآوری و کامپایل سریع کدها و در نهایت اشکالزدائی بهتر است که در Clang و MSVC پشتیبانی میشود و یا پرچمِ -OS صرفاً بر روی کامپایلر کلنگ قابل استفاده است. -
اگرچه که زبان برنامهنویسی سیپلاسپلاس به عنوان یک زبان بسیار قدرتمند و قدیمی شناخته شده است، اما کتابخانهٔ استاندارد و پیشفرض آن برخی از موارد واقعاً مهم را به تازگی تعبیه کرده است. ویژگیهایی که در زبانهایی مثل جاوا و یا سیشارپ داتنت سالهاست وجود دارند. به هر حال این ویژگیها در سی++ ۱۷ موجود شدهاند و این یک بهبود و پیشرفت بسیار خوب است. برای مثال ما الآن فایلسیستم استانداردی را در اختیار داریم. این ویژگی به عنوان یک کتابخانه، امکان برای انجام عملیات بر روی سیستمفایلها و اجزای آنها مانند، مسیرها، فایلها و پوشهها را فراهم میکند. کتابخانهٔ فایلسیستم در فایل سرآیند <filesystem> قرار گرفته است که توسط فضای نام مخصوص خود std::filesystem قابل فراخوانی است. به مثال زیر توجه کنید: namespace fs = std::filesystem; استفاده از این کتابخانه بسیار ساده و کاربردی است، بنابراین اگر بخواهیم به سادگی مسیری از یک ریشه را به دست آوریم، کد آن به صورت زیر خواهد بود: #include <iostream> #include <filesystem> namespace fs = std::filesystem; int main() { fs::path p = fs::current_path(); std::cout << "The current path " << p << " decomposes into:\n" << "root name " << p.root_name() << '\n' << "root directory " << p.root_directory() << '\n' << "relative path " << p.relative_path() << '\n'; } فراخوانی کتابخانه، نمونهسازی از کلاس current_path و سپس چاپ نام، ریشه و مسیر مربوطهٔ آن صورت گرفته است. بنابراین این کتابخانه دارای کلاسهای زیر است که توضیح و کاربرد هر کدام را آوردهایم: کلاس path، این کلاس امکان کار با مسیرها را فراهم میکند، در واقع برای نمایش یا مشاهدهٔ یک مسیر از این کلاس استفاده خواهیم کرد. کلاس filesystem_error یک شیء استثناء در اثر سربارگذاری بیشاز حد کتابخانهٔ فایلسیستم ایجاد میکند، در واقع برای مدیریت خطاها کاربردی خواهد بود. کلاس directory_entry برای کنترل ورودی یک مسیر استفاده میشود، برای مثال بررسی وجود یا عدم وجود در زیر مجموعههای این کلاس امکانپذیر است. کلاس directory_iterator یک تکرار کننده از محتوای یک مسیر (دایرکتوری) را ارائه میکند. کلاس recursive_directory_iterator یک تکرار کننده از محتوایت یک مسیر یا زیر مسیرهای آن را ارائه میکند. کلاس file_status نوع فایل و مجوزهای آن را ارائه میکند. کلاس space_info اطلاعات مربوط به فضای آزاد و موجود در سیستمفایل را ارائه میکند. کلاس file_type اطلاعات مربوط به نوع فایل را ارائه میکند. کلاس perms مجوزهای سیستمفایل را شناسایی میکند. کلاس perm_options معانی هر یک از عملیات مرتبط با مجوزها را ارائه میکند. کلاس copy_options معانی عملیات کپی را مشخص میکند. کلاس directory_options معانی عملیات مربوط به مسیر (دایرکتوری) را مشخص میکند. کلاس file_time_type مقادیر زمانی مربوط به فایل را ارائه میکند. هر یک از کلاسهای فوق دارای متدها و توابعی هستند که در مدیریت فایلسیستم بسیار کاربردی و مفید خواهد بود. در کلاس path شما میتوانید با متدهای مفیدی کار کنید، برای مثال کد زیر پسوند یک فایل موجود که در مسیر به آن اشاره میشود را، در صورت وجود ارائه خواهد کرد. fs::path("/foo/bar.txt").extension(); اگر مسیر فوق دارای فایل ذکر شده باشد، مقدار برگشتی آن .txt خواهد بود. و یا اگر نیاز باشد نام فایل را ارائه کند کافی است از متد file_name آن استفاده کنید! به مثالهای زیر توجه کنید: #include <iostream> #include <filesystem> namespace fs = std::filesystem; int main() { std::cout << fs::path("/foo/bar.txt").filename() << '\n' << fs::path("/foo/.bar").filename() << '\n' << fs::path("/foo/bar/").filename() << '\n' << fs::path("/foo/.").filename() << '\n' << fs::path("/foo/..").filename() << '\n' << fs::path(".").filename() << '\n' << fs::path("..").filename() << '\n' << fs::path("/").filename() << '\n' << fs::path("//host").filename() << '\n'; } همچنین جهت مدیریت خطا و دریافت یک کد یا پیغام خطا به کد زیر توجه کنید: try { cout << fs::file_size("path&file"); } catch (fs::filesystem_error &e) { cout << "Error Message = " << e.what() << " with Code : " << e.code(); } در صورتی که خطایی رخ دهد، کد خطا ساطع خواهد شد، جهت نمایش پیام خطا از تابع what و دریافت کد خطا از تابع code استفاده میشود. این مقاله ادامه دارد...
-
قسمت اول معماری CPP: مبحث Overloading و Name Mangling و Template و Auto
cdefender نوشته وبلاگ را ارسال کرد در برنامه نویسی
هنگامیکه شما برای اولین بار از C به CPP مهاجرت می کنید، یا اصلا برنامه نویسی را قصد دارید با CPP شروع کنید، با مفاهیم متعددی روبرو خواهید شد که شاید برای شما جالب باشند که بدانید، این ایده ها چطور شکل گرفتند، چطور به CPP افزوده شدند و اهمیت آن ها در عمل (هنگام برنامه نویسی و توسعه نرم افزار) چیست. در این پست وبلاگی IOStream، به این خواهیم پرداخت که ایده Overloading و Template و Auto Deduction چطور از CPP سر در آوردند. همانطور که شما ممکن است تجربه کرده باشید، هنگامیکه برنامه نویسی و توسعه نرم افزاری را با C شروع می کنید، برنامه شما چیزی بیش از یک مجموعه بی انتها از توابع و استراکچرها و متغیرها و اشاره گرها و ... نخواهند بود. از همین روی شما مجبور هستید مبتنی بر ایده مهندسی نرم افزار و پارادیم برنامه نویسی ساخت یافته، برای هر کاری یک تابع منحصربفرد پیاده سازی کنید. این تابع باید از هر لحاظی از قبیل نام، نوع ورودی ها، نوع خروجی و حتی نوع عملکرد منحصربفرد باشد تا بتواند یک کار را به شکل صحیح کنترل کند که همین مسئله می تواند در پیاده سازی برخی نرم افزارها، انسان را در جهنم داغ و سوزان قرار بدهد. مثلا پیاده سازی یک برنامه محاسباتی مانند ماشین حساب که ممکن است با انواع داده های محاسباتی مانند عدد صحیح (Integer) و عدد اعشاری (Float) رو به رو شود. از همین روی فرض کنید، ما قرار است یک عمل محاسباتی مانند جمع از برنامه ماشین حساب را پیاده سازی کنیم. برای اینکه برنامه به شکل صحیحی کار کند، باید عمل جمع یا همان Add برای انواع داده های موجود از قبیل عدد صحیح و اعشاری پیاده سازی شود. اگر شما این کار را انجام ندهید، برنامه شما به شکل صحیحی کار نخواهد کرد (یعنی نتایج اشتباه ممکن است برای ما تولید کند). در تصویر زیر، نمونه این برنامه و توابع مرتبط با آن پیاده سازی شده است: #include <stdio.h> int AddInt(int arg_a, int arg_b) { return arg_a + arg_b; } float AddFloat(float arg_a, float arg_b) { return arg_a + arg_b; } double AddDouble(double arg_a, double arg_b) { return arg_a + arg_b; } int main(int argc, const char* argv[]) { int result_int = AddInt(1, 2); float result_float = AddFloat(10.02f, 21.23f); double result_double = AddDouble(9.0, 24.3); printf("Result Integer: %d", result_int); printf("Result Float: %f", result_float); printf("Result Double: %lf", result_double); return 0; } به برنامه بالا دقت کنید. ما سه تا تابع Add با نام های منحصربفرد داریم که سه نوع داده مجزا را به عنوان ورودی دریافت می کنند، سه نوع نتیجه مجزا بازگشت می دهند، اگرچه پیاده سازی آن ها کاملا مشابه هم دیگر است و تفاوتی در پیاده سازی این سه تابع وجود ندارد. ولی به هر صورت، اگر به خروجی دیزاسمبلی برنامه مشاهده کنید، دلیل این مسئله را متوجه خواهید شد که چرا هنگام برنامه نویسی با زبان C، به نام های منحصربفرد نیاز است، چون اگر توابع نام های مشابه با هم داشته باشند، لینکر نمی تواند به دلیل تداخل نام (Name Conflict)، آدرس آن ها را محاسبه یا اصطلاحا Resolve کند. همانطور که در تصویر بالا خروجی دیزاسمبلی برنامه Add را مشاهده می کنید، اگر توابع نام مشابه داشتند، در هنگام فراخوانی (Call) تابع Add تداخل رخ می داد، چون دینامیک لودر سیستم عامل دقیقا نمی داند که کدام تابع را باید فراخوانی کند. برای همین نیاز است وقتی برنامه نوشته می شود، نام توابع در سطح کدهای اسمبلی و ماشین منحصر بفرد باشد. به هر صورت، به نظر شما آیا راهی وجود دارد که ما پیاده سازی این نوع توابع را ساده تر کنیم یا حداقل بار نامگذاری آن ها را از روی دوش توسعه دهنده و برنامه نویس برداریم؟ بله امکان این کار وجود دارد. مهندسان CPP با افزودن ویژگی Overloading و Name Mangling یا همان بحث Decoration مشکل برنامه نویسان در پیاده سازی توابع با نام های منحصربفرد را حل کردند (البته کاربردهای دیگر هم دارد که فعلا برای بحث ما اهمیت ندارند). ویژگی اورلودینگ در CPP به ما اجازه خواهد داد یک تابع با عنوان Add پیاده سازی کنیم که تفاوت آن ها فقط در نوع ورودی و نوع خروجی است. به عنوان مثال، در قسمت زیر، کد برنامه Add را مشاهده می کنید که با قواعد CPP بازنویسی شده است. #include <iostream> int Add(int arg_a, int arg_b) { return arg_a + arg_b; } float Add(float arg_a, float arg_b) { return arg_a + arg_b; } double Add(double arg_a, double arg_b) { return arg_a + arg_b; } int main(int argc, const char* argv[]) { int result_int = Add(1, 2); float result_float = Add(10.02f, 21.23f); double result_double = Add(9.0, 24.3); std::cout << "Result Integer: " << result_int << std::endl; std::cout << "Result Float: " << result_float << std::endl; std::cout << "Result Double: " << result_double << std::endl; return 0; } همانطور که مشاهده می کنید، ما اکنون سه تابع با نام Add داریم. ولی شاید سوال پرسیده شود که چطور لینکر متوجه تفاوت این توابع با یکدیگر می شود درحالیکه هر سه دارای یک نام واحد هستند. اینجاست که مسئله Name Mangling یا همان Decoration نام آبجکت ها در CPP مطرح می شود. اگر شما برنامه مذکور را دیزاسمبل کنید، متوجه تفاوت کد منبع (Source-code) و کد ماشین/اسمبلی (Machine/Assembly-code) خواهید شد. همانطور که در خروجی دیزاسمبلی برنامه اکنون مشاهده می کنید، توابع اگرچه در سطح کد منبع دارای نام مشابه با یکدیگر بودند، اما بعد کامپایل نام آن ها به شکل بالا تبدیل می شود. به این شیوه نام گذاری Name Mangling یا Decoration گویند که قواعد خاصی در هر کامپایلر برای آن وجود دارد. این ویژگی موجب می شود در ادامه لینکر بتواند تمیز بین انواع توابع Add شود. به عنوان مثال، تابع نامگذاری شده با عنوان j__?Add@YAHH@Z تابعی است که به نوعی از تابع Add اشاره دارد که ورودی هایی از نوع عدد صحیح دریافت می کند. این شیوه نامگذاری خلاصه موجب خواهد شد لینکر بتواند به سادگی بین توابع تمایز قائل شود. با این حال هنوز یک مشکل باقی است، و آن هم تکرار مجدد یک پیاده سازی برای هر تابع است. به نظر شما آیا راهی وجود دارد که ما از پیاده سازی مجدد توابعی که ساختار مشابه برای انواع ورودی ها دارند، جلوگیری کنیم؟ باید بگوییم، بله. این امکان برای شما به عنوان توسعه دهنده CPP در نظر گرفته شده است. ویژگی که اکنون به عنوان Templateها در مباحث Metaprogramming یا Generic Programming استفاده می شود، ایجاد شده است تا این مشکل را اساساً برای ما رفع کند. با استفاده از این ویژگی کافی است، طرح یا الگوی یک تابع را پیاده سازی کنید، تا در ادامه خود کامپایلر مبتنی بر ورودی هایی که به الگو عبور می دهید، در Backend، یک نمونه تابع Overload شده مبتنی بر آن الگو برای نوع داده شما ایجاد کند. #include <iostream> template <typename Type> Type Add(Type arg_a, Type arg_b) { return arg_a + arg_b; } int main(int argc, const char* argv[]) { int result_int = Add(1, 2); float result_float = Add(10.02f, 21.23f); double result_double = Add(9.0, 24.3); std::cout << "Result Integer: " << result_int << std::endl; std::cout << "Result Float: " << result_float << std::endl; std::cout << "Result Double: " << result_double << std::endl; return 0; } به عنوان مثال، در بالا تابع Add را مشاهده می کنید که نوع داده ورودی این تابع و حتی نوع خروجی آن مشخص نشده است و در قالب Typename به کامپایلر معرفی شده است. این یک الگو برای تابع Add است. کامپایلر اکنون می تواند مبتنی بر ورودی هایی که به تابع هنگام فراخوانی یا اصطلاحا Initialization عبور می دهیم، یک نمونه تابع Overload شده از آن الگو ایجاد کند و در ادامه آن را برای استفاده در محیط Runtime فراخوانی کند. حال اگر برنامه بالا را دیزاسمبل کنید، مشاهده خواهید کرد که کامپایلر از همان قاعده Overloading استفاده کرده است تا نمونه ای از تابع Add متناسب با نوع ورودی هایش ایجاد کند. هنوز می توان برنامه نویسی با CPP را جذاب تر و البته ساده تر کرد، اما چطور؟ همانطور که در قطعه کد بالا مشاهده می کنید، هنوز ما باید خود تشخیص دهیم که نوع خروجی تابع قرار است به چه شکل باشد. این مورد خیلی مواقع مشکل ساز خواهد بود. برای حل این مسئله، در CPP مبحثی در نظر گرفته شده است که آن را به عنوان Auto Deduction می شناسیم که سطح هوشمندی کامپایلر CPP را بالاتر می برد. در این ویژگی خود کامپایلر است که مشخص می کند نوع یک متغیر مبتنی بر خروجی که به آن تخصیص داده می شود، چیست. به عنوان مثال، شما می توانید برنامه بالا را به شکل زیر بازنویسی کنید: #include <iostream> template <typename Type> auto Add(Type arg_a, Type arg_b) { return arg_a + arg_b; } int main(int argc, const char* argv[]) { auto result_int = Add(1, 2); auto result_float = Add(10.02f, 21.23f); auto result_double = Add(9.0, 24.3); std::cout << "Result Integer: " << result_int << std::endl; std::cout << "Result Float: " << result_float << std::endl; std::cout << "Result Double: " << result_double << std::endl; return 0; } با استفاده از ویژگی Auto Deduction و کلیدواژه Auto در برنامه، خود کامپایلر در ادامه مشخص خواهد کرد که تابع Add چه نوع خروجی دارد و همچنین نوع متغیرها برای ذخیره سازی خروجی Add چه باید باشد. به عبارتی اکنون تابع Add هم Value و هم Data type را مشخص می کند که این موجب می شود برنامه نویسی با CPP خیلی ساده تر از گذشته شود. حال اگر به نمونه برنامه آخر نگاه کنید و آن را با نمونه C مقایسه کنید، متوجه خواهید شد که CPP چقدر کار را برای ما ساده تر کرده است. در این پست به هر صورت، قصد داشتم به شما نشان دهم که نحوه تحول CPP به صورت گام به گام چطور بوده است و البته اینکه پشت هر ویژگی در CPP چه منطق کلی وجود دارد. امیدوارم این مقاله برای شما مفید بوده باشد. نمونه انگلیسی این مقاله را می توانید در این آدرس (لینک) مطالعه کنید. میلاد کهساری الهادی- 3 دیدگاه
-
- سیپلاسپلاس
- overloading
-
(و 5 مورد دیگر)
برچسب زده شده با :
-
سلام بر دوستان و اساتید گرامی. پایه و اساس قیمت گذاری یک برنامه C++ چگونه هست؟ با سپاس فراوان.
- 1 پاسخ
-
- c++
- قیمتگذاری
-
(و 3 مورد دیگر)
برچسب زده شده با :
-
سلام.خسته نباشید. می خوام از این کتابخانه در qt استفاده کنم و خروجی اندروید بگیرم.سیستمی هم که باهاش برنامه نویسی می کنم لینوکسی هست.باید نسخه ی اندرویدی این کتابخانه را بگیرم یا لینوکسی رو؟ چجوری داخل پروژم اضافه کنم؟ تشکر
- 1 پاسخ
-
- سیپلاسپلاس
- کتابخانه
-
(و 1 مورد دیگر)
برچسب زده شده با :
-
سلام و درود، مدتی است از سرویسهای کاوهنگار جهت استفاده در پروژههای خودم استفاده میکنم و مطمئنم یکی از بهترین سرویسدهندههای ایرانی در زمینهٔ پیام کوتاه است. متأسفانه همانطور که میدانید بسیاری از سرویسدهندهها در ایران به خاطر عدم شناخت دقیق از اهمیت و کاربرد سی++ هیچ حرکتی در توسعهٔ سرویسهای خود در رابطه با سی++ را نمیکنند. بنابراین، جدیداً تصمیم گرفتم کیتهای توسعه در قالب رابطهای برنامهنویسی مورد نیاز رو برای این چنین شرکت و سرویسها آن ارائه کنم. معرفی سرویس پیام کوتاه کاوهنگار کاوه نگار با ارائه وبسرویس پیامک و تماس صوتی پیشرفته برای توسعه دهندگان ،امکان ارسال و دریافت پیامک و برقراری تماس اینترنتی را در اغلب سرویس های نرم افزاری مهیا می کند. اهمیت وجود این سرویس در زبانهایی مانند C و ++C همانطور که میدانید با توجه به اهمیت این زبانها و به خصوص پشتیبانی از کتابخانههای بسیار مدرن در توسعهٔ اپلیکیشنها و وبها کاربرد بسیاری دارند که شاید در کشور ما آنچنان با آنها آشنا نیستیم. بنابراین وجود سرویسهای ارسال پیامک در قالب زبان سیپلاسپلاس میتواند کمک بسیار بزرگی به توسعهدهندگان و علاقهمندان آن در حوزههای توسعهٔ نرمافزار و انواع برنامههای موبایل و وب کمک کند. ساختار اولیه خروجی سرویس کاوهنگار به صورت زیر است: { "return": { "status":404, "message":"متد تعریف نشده است" }, "entries": { null } } در صورتی که مقادیر ارسالی صحیح و مطابق با اطلاعات کاربری موجود در کاوهنگار باشد نتیجهٔ برگشتی آن به صورت زیر خواهد بود: { "return": { "status": 200, "message": "تایید شد" }, "entries": [ { "messageid": 8792343, "message": "خدمات پیام کوتاه کاوه نگار", "status": 1, "statustext": "در صف ارسال", "sender": "10004346", "receptor": "0914XXXXXXX", "date": 1356619709, "cost": 120 } ] } نمونهٔ اولیه که توسعه داده شده، با مفهوم اولیه جهت ارسال پیام کوتاه بر اساس کلید و شمارههای ارسالی آماده شده که کد نمونهٔ آن به صورت زیر خواهد بود. #include <iostream> #include <Kavenegar> int main() { //! Your Api Key std::string apiKey {"Your Api-Key"}; //! Kavenegar Default Sender Number std::string senderLine {"10004346"}; Kavenegar::KavenegarApi api(MethodType ,"10004346",apiKey); //ToDo.. try catch exception handling. api.send("09140000000","Hi!"); std::cout << "Result : " << api.getResult(); //JSon Output return 0; } نکته: نمونهٔ ساخته شده کامل و با تمام جزئیات موجود در کاوهنگار تکمیل و توسعه داده خواهد شد. لینک مربوط به کیت توسعه در گیتهاب. جهت استفاده از این نمونه توجه داشته باشید که جهت اجرای وبسرویس آن نیاز به نصب Curl و RapidJson خواهید داشت.
-
با سلام و درود، همانطور که میدانید ویژگیهای اخیر در استانداردهای ۱۷ و ۲۰ بسیار عظیم و کاربردی هستند. هدف ما در مرجع آیاواستریم این است که با توجه به بهروزرسانیهای زبان سیپلاسپلاس مهمترین مواردی که نیاز است معرفی کنیم. بنابراین در این بخش به یکی از کاربردیترین موارد مرتبط در استاندارد ۱۷ با عنوان صفتهای ویژه اشاره میشود که در ادامه به تعریف هر یک از آنها میپردازیم. با توجه به استانداردهای ۱۱ و ۱۴ که در آن صفتهایی همچون [[deprecated]] و [[noreturn]] معرفی شدهاند که وظیفهٔ آن به ترتیب نمایش وضعیت منسوخ شدن یک عملکرد و یا وضعیت بازگشتی یک تابع از نوع void است. چنین صفاتی میتوانند در زمان اعلان و تعریف متغیرها و یا توابع مورد استفاده قرار گیرند. به عنوان مثال اگر کدی به صورت زیر داشته باشیم: [[deprecated]] void print(const std::string &message) { std::cout << message << std::endl; } در صورتی که تابع print در بخشی از برنامه مورد استفاده قرار بگیرد، پیغامی از سمت کامپایلر از نوع اخطار (warning) ساطع میشود، مبنی بر آن که تابع مربوطه به عنوان منسوخ شده یاد شده است. warning: 'print' is deprecated این ویژگی میتواند در ساخت و توسعهٔ کتابخانهها، موتورها، چهارچوب (فریمورک) و برنامههایی که قرار است دیگر برنامهنویسان از آنها استفاده کنند بسیار میتواند کاربردی باشد؛ چرا که با اعمال چنین خاصیتهایی در کدهای شما برای توسعهدهندگان یادآوری خواهد شد که کد مربوطه در نسخهٔ جدید یا نسخههای بعدی امکان حذف و یا تغییر را خواهد داشت. #include <iostream> #include <string> [[deprecated]] void print(const std::string &message) { std::cout << message << std::endl; } int main() { print("Hello, World!"); return 0; } در مثال بالا اخطار پیشفرض از سمت کامپایلر ساطع میشود، اما در بعضی از مواقع لازم است پیغام سفارشی جهت راهنمایی بیشتر کاربر اعمال شود که در این صورت صفت میتواند پیغام از نوع رشته را دریافت و در هنگام ساطع شدن، آن را نمایش دهد. برای این کار کافی است متن مورد نظر را به صورت زیر در صفت خود تعیین کنیم. [[deprecated("Use printView with print instead, this function will be removed in the next release")]] برای مثال یک تابع جایگزین و بهینه شده را به صورت زیر در نظر بگیرید، کامپالر اخطار مروبطه و سفارشی شده را نسبت به آن ساطع خواهد کرد. #include <iostream> #include <string> [[deprecated]] void print(const std::string &message) { std::cout << message << std::endl; } void printView(std::string_view message) { std::cout << message << std::endl; } int main() { printView("Hello, World!"); return 0; } همچنین در رابطه با صفت [[noreturn]] که در استاندارد ۱۱ معرفی شده است، باید در نظر داشت این صفت جهت بهینهسازی کامپایلر در رابطه با تولید هشدارهای بهتر و همچنین اعلام اینکه تابع مربوطه قابل دسترسی نیست مورد استفاده قرار میگیرد. مثال: #include <iostream> [[noreturn]] void myFunction() { std::cout << "Hello, World!" << std::endl; throw "error"; } void print() { std::cout << "Print Now!"; } int main() { myFunction(); print(); return 0; } در کد فوق، در زمان همگردانی (کامپایل) پیغام زیر ساطع میشود: warning: code will never be executed بنابراین در زمان اجرا تابع print(); اجرا نخواهد شد، زیرا به عنوان یک کد غیر قابل دسترس بعد از myFunction توسط کامپایلر یاد میشود. چرا که این امر اجازه میدهد تا کامپایلر بهینهسازیهای مختلفی را انجام دهد - نیازی به ذخیرهسازی و بازیابی هرگونه حالتهای ناپایدار در اطراف صدا زننده (Caller) نیست. بنابراین میتواند کدهای غیر قابل دسترس را از بین ببرد. با توجه به نیازهای این چنینی، در استاندارد ۱۷ صفتهای جدیدتر و کاربردیتری نیز ارائه شده است که به معرفی هر یک از آنها در بخش اول از این مقاله میپردازیم. صفتهای معرفی شده در استاندارد 1z یا همان ۱۷ به صورت زیر هستند: [[fallthrough]] [[maybe_unused]] [[nodiscard]] معرفی صفت [[fallthrough]] به طور معمول در برنامهنویسی، هر وقت که مرحلهٔ مربوط به case در دستور switch به انتهای خود میرسد، کد مربوطِ به دستورِ case بعدی اجرا خواهد شد. طبیعتاً عبارت break میتواند از این امر جلوگیری کند. اما از آنجایی که این رفتار را به اصطلاح fall-through میشناسیم، ممکن است در صورت عدم معرفی اشکالاتی را فراهم کند، در این حالت چندین کامپایلر و ابزارهای آنالیز کننده خطای مرتبط به آن را هشدار میدهند تا کاربر در جریان قرار بگیرد. با توجه به این موضوع که ممکن است بعضاً این مورد چشم پوشی شود، در سیپلاسپلاس ۱۷ به بعد یک صفت استاندارد معرفی شد تا توسعهدهنده بتواند با قرار دادن آن در مکان سقوط (fall-through) به کامپایلر اعلام کند که هشداری در آن بخش لازم نیست. کامپایلرها میتوانند هشدارهای مطمئنی را در زمانی که یک عبارت case بدون اجرای دستور break به انتهای خود میرسند و یا سقوط (fall-through) میکند، حداقل با یک جملهٔ مربوطِ به آن را ساطع کند. برای مثال به کد زیر توجه کنید: #include <iostream> int main() { int number { 2017 }; int standard = {0}; switch(number) { case 2011: case 2014: case 2017: std::cout << "Using modern C++" << std::endl; case 1998: case 2003: standard = number; } return 0; } در کد فوق، در زمان اجرای دستور case سوم با مقدار ۲۰۱۷، کامپایلر هشداری به صورت زیر را اعمال خواهد کرد. warning: unannotated fall-through between switch labels در این حالت برای از بین بردن (چشمپوشی کردن) از این خطا در صورتی که نیاز نباشد موارد دیگر مورد بررسی قرار بگیرد قرار دادن دستور break بعد از آن میتواند منطقی باشد. اما با توجه به انتظاری که میرود تا دستورات بدون توقف بین آنها اجرا شود، قراردادن دستور [[fallthrough]]; بعد از آن میتواند راه حل بسیار مناسبی باشد. #include <iostream> int main() { int number { 2017 }; int standard = {0}; switch(number) { case 2011: case 2014: case 2017: std::cout << "Using modern C++" << std::endl; [[fallthrough]]; // > No warning case 1998: case 2003: standard = number; } return 0; } در این حالت، کامپایلر بدون ساطع کردن خطا آن را همگردانی خواهد کرد. معرفی صفت [[maybe_unused]] صفت [[maybe_unused]] برای نشان دادن کد ایجاد شدهای است که ممکن است از منطق قطعی استفاده نکند. این مورد ممکن است اغلب در لینک شدن با پیشپردازندهها مورد استفاده قرار بگیرد یا نگیرد. از آنجایی که کامپایلر (همگردانها) میتوانند نسبت به متغیرهای بلا استفاده هشدار ساطع کنند، این صفت روش بسیار خوبی برای سرکوب آنها خواهد بود. استفاده از این ویژگی میتواند در بخشهای مهمی مفید باشد، فرض کنید کتابخانهای نوشتهایم که قرار است به صورت چند-سکویی دارای ویژگیهای یکسان در بسترهای مختلف باشد. برای مثال ساخت یک فایل در مسیر مشخصی از سیستمعامل مورد نظر جهت اعمال تنظیمات نرمافزار. namespace FileSystem::Configuration { [[maybe_unused]] std::string createWindowsConfigFilePath(const std::string &relativePath); [[maybe_unused]] std::string createMacOSConfigFilePath(const std::string &relativePath); [[maybe_unused]] std::string createLinuxConfigFilePath(const std::string &relativePath); [[maybe_unused]] std::string createiOSConfigFilePath(const std::string &relativePath); [[maybe_unused]] std::string createAndroidConfigFilePath(const std::string &relativePath); } به کد بالا توجه کنید، در صورتی که شما در محیط کدنویسی در حال استفاده از یک دستور مورد نظر از بین دستورات بالا هستید، طبیعتاً کامپایلر به بقیهٔ دستوراتی که از آنها استفاده نمیکنید پیغامی مبنی بر آن که دستور مربوطه بلااستفاده مانده است را ساطع میکند. جهت جلوگیری از این هشدارها کافی است صفت [[maybe_unused]] را قبل از آنها اعمال کنید. معرفی صفت [[nodiscard]] در صورتی که از [[nodiscard]] استفاده شود، کامپایلر میتواند درک کند توابعی که مقدار بازگشتی دارند نمیتوانند مقدار بازگشت داده شدهٔ آنها را دور انداخت و یا از آنها در زمان صدا زدن صرف نظر کرد. بنابراین با تعریف این صفت در توابع از نوع بازگشتی میتوان پیغامی به صورت زیر را ساطع کند. مثال: #include <iostream> [[nodiscard]] int myFunction() { return 17; } int main() { myFunction(); return 0; } در مثال فوق تابع myFunction در زمان فراخوانی که مقدار بازگشتی آن بی نتیجه مانده است از سمت کامپایلر هشدار مورد نظر را دریافت خواهد کرد. این پیغام در صورتی که مقدار بازگشتی تابع به متغیری از هم نوعِ خودش ارسال شود، ساطع نخواهد شد. #include <iostream> [[nodiscard]] int myFunction() { return 17; } int main() { int func; func = myFunction(); return 0; }
-
- آموزش
- سیپلاسپلاس
-
(و 9 مورد دیگر)
برچسب زده شده با :
-
وباسمبلی (WebAssembly) یا wasm یک فناوری برنامهنویسی سطحپایین برای استفاده در مرورگر است. هدف اولیهی آن پشتیبانی از کامپایل کدها به سی و سی++ است هرچند که قرار است از سایر زبانها نیز حمایت شود. حال کتابخانهی Qt این امکان را تحت ماژول Qt WebAssembly فراهم میکند تا برنامهی نوشته شده توسط سی++ و کیوت در محیط مرورگر قابل اجرا باشند. این ویژگی در حال حاضر به عنوان پیشنمایش برای نسخهی Qt 5.11 برنامهریزی شده است. کیوت برای ساخت وب اسمبلی دستورالعملهایی را در اینجا آورده است. قبل از هرچیز شما نیاز دارید تا ابزار کامپایلر emsdk را آماده و نصب نمایید. بنابراین دستورات زیر را به ترتیب اجرا کنید. # Get the emsdk repo git clone https://github.com/juj/emsdk.git # Enter that directory cd emsdk # Fetch the latest registry of available tools. ./emsdk update # Download and install the latest SDK tools. ./emsdk install latest # Make the "latest" SDK "active" for the current user. (writes ~/.emscripten file) ./emsdk activate latest # Activate PATH and other environment variables in the current terminal source ./emsdk_env.sh در صورتی که در پیکربندی نیاز به راهنمایی دارید از راهنمای اصلی آن استفاده کنید و یا در همین مرجع در تالارهای گفتمان از ما بپرسید. ما به این ابزار به عنوان ابزار کامپایل-چندمنظوره استفاده خواهیم کرد. برخی از اسکرین شاتها از نتایج خروجی این ماژول به صورت زیر آمدهاند: یک بازی ساده به نام Colliding mice ویژگی پنجرههای گفتگو به نظر میرسد پنجرههای ساخته شده توسط QOpenGLWindow با فریم ریت ۶۰ به خوبی عمل میکنند. البته به نظر میرسد QOpenGLWidget فعلاً شامل برخی از مشکلات است که حل خواهند شد. کامپایلر Emscripten که به عنوان یک کامپایلر منبعباز که بک اند آن بر روی LLVM اجرا میشود کُدهای OpenGL را به WebGL ترجمه میکند. بنابراین محدودیتهایی در نسخههای دسکتاپ و اِمبدها وجود خواهد داشت. نمونه مثال پنجره تحت OpenGL در کنار اینها QtBases و QtDeclarative که از شاخهی Wip/Web Assembly استقاده میکنند، ماژولهای شناخته شدهی کیوت به صورت زیر به کار گرفته میشوند: QtCharts QtGraphicalEffects QtQuickControls QtQuickControls2 QtWebSockets QtMqtt (با استفاده از وب سوکت) برای استفاده از QtMqtt، شما باید کلاس WebSocketIODevice از نمونه مثالی با نام (websocketsubscription) وارد برنامهی خود کنید. نمونه مثالهای ساعت در QML نکته: از آنجا که جاوااسکریپت و وباسمبلی تنها یک نخ (Thread) دارند، QtDeclarative تنها برای یک نَخ (ترد) کار خواهد کرد. در نظر داشته باشید که ماژولهای QtCharts QtGraphicalEffects، QtQuickcontrols، QtQuickControls2 بدون هیچ تغییراتی کار میکنند. ماژول QtChart از نمونه مثال oscilloscope این پروژه به عنوان یک رویکرد جدید و ویژگیای که در آینده میتواند مفید باشد در حال توسعه است. بخش ویکی رسمی آن در این لینک آورده شده است.
-
- وباسمبلی
- webassembly
-
(و 4 مورد دیگر)
برچسب زده شده با :
-
مدیریت یک شرکت تولید و توسعه نرم افزارهای تخصصی با بیش از یک دهه سابقه موفقیت چشمگیر که اکثریت مشتریانش شرکتهای بین المللی میباشند، برای تکمیل کادر فنی خود قصد دارد 2 نفر برنامه نویس حرفه ای سی پلاس پلاس استخدام نماید. لطفا شرایط و مشخصات کاندیدا های مورد نظر شرکت را در زیر مطالعه فرمایید. فقط واجدین حداقل 80 درصد شرایط زیر برای استخدام در نظر گرفته خواهند شد و با حقوق و مزایای عالی (متناسب با تجربه) دعوت به همکاری بلند مدت میشوند. محل دفتر شرکت در اصفهان میباشد و متقاضی باید ساکن اصفهان بوده و یا به اصفهان نقل مکان نماید. افراد واجد شرایط لطفا رزومه خود را به آدرس simorghsofttech@gmail.com ارسال نمایند. شرح کلی وظایف کاندیدای مورد نظر ما یک برنامه نویس حرفه ای کاملا مسلط به زبان سی پلاس پلاس است که مسولیت نوشتن اپلیکیشن با کاربردهای مختلف از دسکتاپ تا اپلیکشین های بومی موبایل و و برنامه های امبد سیستم را شامل میشوند. Desktop applications و native mobile applications and embedded systems. به طور کلی وظایف اصلی کاندیدای مورد نظر ما شامل طراحی و نوشتن اپلیکیشن ها، نگهداری، آپدیت و توسعه کدها و برنامه های موجود و همکاری با بقیه اعضای تیم در کار روی لایه های مختلف برنامه ها و زیرساخت ها را شامل می شود. جزییات بیشتر در باره وظایف -) طراحی، کد نویسی و نگهداری (دیباگ و آپگرید) کد به زبان سی پلاس پلاس به شکلی که قابل اتکا و قابل توسعه باشند و از بازدهی بالا برخوردار باشند. -) طراحی، کد نویسی و نگهداری (دیباگ و آپگرید) دیتا بیس های پیچیده -) پیدا کردن باگ ها و نقطه ضعف ها و یافتن و اجرای راه حل برای چنین موارد -) خلق ماژول های با کیفیت و باقدرت پردازش بالا -) شرکت و همکاری در حفظ کیفیت و به روز نگاه داشتن و مرتب سازی و اتوماسیون کد ها و برنامه ها -) تولید داکیومنتهای کامل برنامه نویسی و اضافه کردن کامنت در کد به میزان لازم مهارتها -) تسلط به متد برنامه نویسی اسکرام -) تسلط کامل به زبان سی پلاس پلاس و زبان اسپسیفیکیشن -) تسلط به اس کیو ال، اس کیو لایت 3، مای اس کیو ال و اس کیو ال سرور و فریم ورک های سی پلاس پلاس آنها Low level threading primitives and real-time environments (- -) تسلط کامل به لایبرری استاندارد، کانتینر های اس تی ال، ویندوز سرویس الگوریتمها -) تسلط به ابزارهای برنامه نویسی ویژوال استودیو 2008 و 2010 و ورژن های بالاتر -) تسلط به مدیریت حافظه درمحیط Non-garbage collection -) Inheritance, Polymorphism and C++ specific nations such as friend classes -) Embedded system design, low-level hardware interactions -) Templating in C++ -) Cross-platform development -) دانش استانداردهای سی پلاس پلاس 11 و 14 و ترجیحا 17 -) تسلط به دات نت مفید است -) تسلط به جاوا مهم و آشنایی با زبانهای مناسب وب )مانند پی اچ پی و جاوا اسکریپت) برتری محسوب میشود -) آشنایی با دیتا بیس های غیر اس کیو الی مانند مونگو و کاساندرا مفید است Implementation of automated testing platforms and unit tests (- Continuous integration (- -) داشتن مدرک کامپیوتر لیسانس و یا بالاتر در رشته کامپیوتر -) تسلط به زبان انگلیسی در سطح خواندن و نوشتن داکیومنتهای برنامه نویسی و متون سطح متوسط -) حداقل 2 سال سابقه کار برنامه نویسی سی پلاس پلاس -) تجربه برنامه نویسی برای بورس و بازار مالی و تجربه برنامه نویسی فیکس ای پی آی یک برتری بسیار مهم تلقی میشود