۱۳۹۵ آذر ۱۰, چهارشنبه

زبان‌های برنامه‌نویسی...

دنیای زبان‌های برنامه‌نویسی هم دنیای جالبیه برا خودش! ظاهرا هیچ‌وقت ایده‌های افراد برای زبان‌های جدید تموم نمیشه :) و البته بعد از اومدن زبون‌هایی که ماشین مجازی دارند یا مفسری هستند مثل دات‌نت و ruby و این‌ها باز زبون‌هایی اومدن که به صورت بومی! (native) کامپایل میشند. زبون‌هایی مثل Vala و Go که خیلی طرفدار پیدا کرده و بعدش هم Rust که توی فدورا ۲۵ کامپایلرش اضافه شده.

ولی خب! اصلا قصدم از این پست صحبت در مورد این‌ها نبود. فقط خواستم اینو بگم: فکر می‌کنید این کد به چه زبونیه؟
void f(string_view id, unique_ptr foo) {
   if (auto [pos, inserted] = items.try_emplace(id, move(foo)); inserted){
      pos->second->launch();
   } else {
      standby.emplace_back(move(foo))->wait_for_notification();
   }
}

اگه می‌دونید که هیچ! ولی اگه نمیدونید حتما حدس زدید که شبیه سی++ هست ولی به نظر دقیقا سی++ هم نمیاد. خب حق دارید! چون سی++ هست، ولی سی++۱۷ (C++17). این کد یه نمونه کد هست از اینجا.

کلا روال جدید به روز رسانی استاندارد سی++ خیلی بهتر از قبل شده. بعد از استاندارد سی++۱۱ که در واقع قرار بود قبل از سال ۲۰۱۰ بیاد و خیلی طولانی شد (در واقع، تغییر توی سی++ بعد از ۱۳ سال بود نسبت به استاندارد ۹۸ (استاندارد ۲۰۰۳ هم بود ولی اون تغییر اساسی‌ای نسبت به ۹۸ نداشت))، تصمیم گرفتند روال استاندارد هم، مثل روالی که خیلی نرم‌افزارها برای انتشارشون در نظر گرفتند، براساس زمان و فعلا ۳ سال یک‌بار باشه. برای همین هم استاندارد سی++۱۴ و الان هم سی++۱۷ تو راهه. و بعدی هم میشه سی++۲۰.

و ظاهرا از برکات سیستم جدید استاندارد هم اینه که کامپایلرها بیشتر بهش توجه می‌کنند و چون قابل پیش‌بینی تر هست سریع‌تر پشتیبانیش به کامپایلرها اضافه میشه. حتی زودتر از اومدن خود استاندارد.

هر چند این زبون‌های جدید جای سی++ رو تنگ کردند :(
؛)


۲ نظر:

  1. سلام
    ظاهرا سی++ با جدیت روند مرتبا غیرقابل خواندن‌تر و غیرقابل خواندن‌تر شدنش را دنبال می‌کنه :))
    کلا خانواده سی و سی++ یک چالش اساسی دارند که برنامه‌نویس‌هاشون نمی‌دونند اونها را بلد نیستند و واقعا اگه بخواهند هم نمی‌تونند هم یاد بگیرند.
    خیلی موارد خیلی ساده طبق استاندارد undefined هستند و به سادگی باعث می‌شوند کد نوشته شده کاری که انتظار می‌ره را انجام ندهد. (آنهم در شرایط بسیار خاص، یا وضعیتی که دو بار کمپایل متفاوت نتیجه متفاوت بده!)
    مثال‌هاش فراوان هستند. از اینکه دو تابع هم‌نام در دو فایل مجزا می‌توانند باشند و لینکر هر کدام را خواست رندوم لینک می‌کنه. حتی کد خود gcc یا مثل اون هم از اینگونه خطاها توشون پیدا می‌شه!

    پاسخحذف
    پاسخ‌ها
    1. سلام! :))
      آره شاید. هر چند این مثال به نظرم خیلی هم در این جهت نرفته!

      البته یکی از اتفاقایی که فکر کنم توی همین سی++۱۷ افتاده کم شدن حداقل یکی از موارد undefined هست.
      و الان کامپایلر (gcc و clang) میتونه موارد undefined رو در حین اجرا مشخص کنه (اگه فعال شده باشه!).

      ولی خب... یه سری چیزاش میتونست/میتونه بهتر از اینها باشه. یا مثلا اون ۲تابع هم‌نام حالا نمیدونم اگه طبق استاندارد هست میتونه حداقل یه warning داشته باشه. البته یه چیزی به اسم «ماژول» هم دارند اضافه میکنند شاید این مشکل رو هم حل کنه!

      البته وقتی بحث کتابخونه‌های dynamic باشه یکمی این قضیه پیچیده‌تر میشه. حالا نمیدونم توی زبان‌های دیگه چی کار میکنن.

      حذف