COMPΞZ 🧬
396 subscribers
1.88K photos
52 videos
24 files
740 links
متخصص کامپیوتر و نرم‌افزار • سازنده • هنرمند و طراح • مجموعه‌دار • نویسنده • تحلیل‌گر • مشاور استارتاپی و ایده‌پرداز

𐎲𐎴𐎠𐎼𐎴𐎫𐎹 𐏃𐎢𐎶𐎠𐎫𐎹

We create because the world deserves better code.

https://linktr.ee/compez
Download Telegram
خب از امروز برای همیشه با هدر گارد‌ها و سرآیند‌های سنتی سی++ خداحافظی می‌کنم.

یه پچ نوشتم که با کامپایلر‌های جدید بسیار تمیز استاندارد STL رو هم وارد پروژه می‌کنه بدون نیاز به سبک سنتی include و سرآیند‌های سنتی.

تصویر مربوط به کد رو ببینید! یکیش به سبک استاندارد قبل از ۲۰ هست، یکیش به سبک ۲۰ به بعد.

یعنی کلاً سرآیند‌های سنتی حذف و با یه خط import std چیزی که لازم هست فراخوانی می‌شه.

استفاده از ماژول‌های مدرن سی++ یعنی:

- کد تمیزتر
- مراحل ساختِ قابل‌کنترل‌تر
- وابستگی‌های شفاف‌تر
- آلودگی کمتر در توسعه
و در بسیاری از پروژه‌ها سرعت کامپایل بسیار بیشتر!

از این مثال gist برای آزمایش و تجربهٔ سی++ جدید استفاده کنید:

https://gist.github.com/thecompez/2bceb35bfb80107bb51d2c38fee2a4af
COMPΞZ 🧬
این مثال ترکیبی مدیریت سرآیند‌ها به سبک سنتی هست. یعنی کلی سرآیند باید include بشن. خب در پروژه‌های بزرگتر پیچیدگی میاره. مزیتش میشه نمونهٔ بعدی 👇🏼
به جای کلی سرآیند سنتی از کتابخانهٔ استاندارد همین یه دستور خط کافیست.

تعریف و خلاصهٔ کلام اینه که، کامپایلر به جای اینکه چندین سرآیند (header) را مثل متن خام وارد فایل کند، از یک رابط، interface ماژول‌شدهٔ آماده برای کتابخانهٔ استاندارد استفاده می‌کند.

در این روش، std::vector، std::string و std::println همه از طریق همین import std در دسترس‌اند.
COMPΞZ 🧬
به جای کلی سرآیند سنتی از کتابخانهٔ استاندارد همین یه دستور خط کافیست. تعریف و خلاصهٔ کلام اینه که، کامپایلر به جای اینکه چندین سرآیند (header) را مثل متن خام وارد فایل کند، از یک رابط، interface ماژول‌شدهٔ آماده برای کتابخانهٔ استاندارد استفاده می‌کند. …
از ویژگی‌های جالب‌تر اینه که شما می‌تونی بخشی از کدی که نوشتی رو فقط قابل دسترس در بیرون از اون حوزه قرار بدی!

در این مثال تابع sayHello می‌تونه از بیرون در دسترس باشه، اما تابع secretMessage فقط داخل کلاس و همون فایل در دسترسه.

یعنی خارج از اون هرجا صداش بزنی ممکن نیست کامپایل بشه، خطا خواهد داد.

برای همین وقتی به یه تابع یاکلاس یا حتی فضای نام (namespace) کلمهٔ کلیدی export قبل از اون بدی، به معنای این هست که این بخش از کد و زیر مجموعه‌هاش در دسترس از این فایل هم باشه.

یعنی قبل از C++ Modules به این صورت ما نمی‌تونستیم چیزی رو مخفی یا مطمئن مدیریتش کنیم؛ یعنی تعاریف یا همون (implementation) رو باید از هم جدا می‌کردیم؛ مثلاً با جدا کردن .hpp و .cpp، استفاده از namespace ناشناس، static، یا الگوهایی مثل PIMPL گزینه‌های کاربردی بودن که پیچیدگی خاصی هم ایجاد می‌کرد.

اما حالا، هر جای فایل، هر جای کد خواستی چیزی رو خارج از حوزهٔ خودش کنی کافیه قبلش بگی export.

این فقط تمیزتر سازی کد نیست؛ معماری رو قابل‌کنترل‌تر می‌کنه.
COMPΞZ 🧬
از ویژگی‌های جالب‌تر اینه که شما می‌تونی بخشی از کدی که نوشتی رو فقط قابل دسترس در بیرون از اون حوزه قرار بدی! در این مثال تابع sayHello می‌تونه از بیرون در دسترس باشه، اما تابع secretMessage فقط داخل کلاس و همون فایل در دسترسه. یعنی خارج از اون هرجا صداش…
جالبه بدونی توی منبع کد GenyConnect هم از همین ویژگی‌ها استفاده کردم.

یعنی هرچیزی که طی این چند ماههٔ اخیر من ساختم همشون بامعماری و سبک جدیده! بعد بگین کمال‌گرایی همیشه بده! نه کمال‌گرایی بعضی جاها لازمه چون تا آیندهٔ توسعه و معماری رو تضمین می‌کنی که فردا روزی هرچقدر که پروژه یا برنامت بزرگتر شد دیگه چه کنم چه کنم نکنی که ای وای من نمی‌تونم معماری رو بشکنم!

خلاصهٔ اینم مسائل باعث شده من دیگه با خطاها و باگ‌های قدیمی روبرو نشم! وقتم رو صرف حل کردن مشکلات حین کامپایل نکنم. پروژه هم اینطوری از معماری پویا و قابل کنترل تبعیت می‌کنه.

برای همینه همش می‌گم اگه روی استاندارد ۱۱ موندی و همون مدل داری پیش میری، باید بهت بگم که متأسفانه داری به خودت ظلم می‌کنی! با این سرعت پیشروی فناوری باید به‌روز باشی و اگرنه شدید عقب مونده خواهی شد.
Media is too big
VIEW IN TELEGRAM
وقتی می‌زنه تو سرت برداری یه CRT شبیه‌سازی کنی واسه بازسازی نوشتالژی خودت. 😒

روی نسخهٔ CPU رندر فریم به فریم انجام شده! اگه با Vulkan رندر بگیرم روان و عین آب خوردن خواهد شد.

چرا اینو ساختم؟
چون مانیتور‌های امروزی رندر و سبک تصویر‌سازی بازی‌های قدیمی رو پشتیبانی نمی‌کنن.

در واقع من مانتیور CRT رو شبیه سازی کردم که به کمک این برنامه می‌تونه خروجی رندر شبیه‌ساز‌ها رو به نسخهٔ بومی تبدیل کنه.
Please open Telegram to view this post
VIEW IN TELEGRAM
حالا یه سوأل از اون‌هایی که چپ و راست میان می‌گن چرا باید سی++ رو یاد بگیرم!
همچین چیزی رو با کدوم زبان می‌تونی بسازی؟ 😂 نکنه می‌خوای با پایتون انجامش بدی؟ یا با راست یا گو که ۲ فریم بر ثانیه برات بده؟ 😁😒
COMPΞZ 🧬
وقتی می‌زنه تو سرت برداری یه CRT شبیه‌سازی کنی واسه بازسازی نوشتالژی خودت. 😒 روی نسخهٔ CPU رندر فریم به فریم انجام شده! اگه با Vulkan رندر بگیرم روان و عین آب خوردن خواهد شد. چرا اینو ساختم؟ چون مانیتور‌های امروزی رندر و سبک تصویر‌سازی بازی‌های قدیمی رو…
خیلی خلاصه مثال بزنم برنامه‌هایی مثل OBS همچین کاری می‌کنن.
فریم به فریم تصویر رو می‌گیرن. البته کاری که من به عنوان شبیه‌سازی CRT انجام دادم مقداری هم کار با Shader بود که روی GPU اجرا میشه و اون حالت باز‌سازی تصویر پیکسلی رو بهینه‌سازی می‌کنه.

اگه به نسخهٔ CRT شده دقت کنی، افکت‌ها و گرافیک بدِ پیکسلی نسبت به نسخهٔ خام بسیار بهینه‌تر هست.

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

وقتی می‌گی C++26، یعنی نسخهٔ ۲۶ام سی‌پلاس‌پلاس؟!

نه!

اون عددی که کنار عنوان میاد، شمارهٔ نسخه نیست؛ سالِ استاندارد‌ سازیه.

مثلاً:

C++11 یعنی استاندارد ۲۰۱۱
C++14 یعنی استاندارد ۲۰۱۴
C++17 یعنی استاندارد ۲۰۱۷
C++20 یعنی استاندارد ۲۰۲۰
C++23 یعنی استاندارد ۲۰۲۳
C++26 یعنی استاندارد ۲۰۲۶

از C++11 به بعد، تقریباً هر سه سال یک استاندارد جدید منتشر می‌شه. یعنی بین C++11 تا C++14 سه سال فاصله بود، بعد C++17، بعد C++20، بعد C++23 و بعد C++26 و بعدیش هم احتمال بسیار قوی ۲۹ در سال ۲۰۲۹ خواهد بود.

اهمیت ISO هم دقیقاً همینه؛ چون سی‌پلاس‌پلاس بر خلاف بقیهٔ زبان‌های برنامه‌نویسی دست یک شخص یا یک تیم یا یک شرکت خاص نیست که هر وقت خواست یه چیزی اضافه کنه و اسمش رو بذاره نسخهٔ جدید.

استاندارد زبان به عنوان STL شناخته می‌شه که زیر نظر ISO/IEC جلو می‌ره؛ یعنی پیشنهادها بررسی می‌شن، درباره‌شون بحث می‌شه، رأی‌گیری می‌شه، کامپایلرسازها و آدم‌های فنی بزرگ دنیا درگیرش می‌شن و بعد از چند سال، خروجی تبدیل می‌شه به استاندارد رسمی.

پس C++26 یعنی بیست ‌و ششمین نسخهٔ زبان نیست.

دلیل اینکه یک ابزار این‌قدر روی استاندارد حساسه، فقط بحث فنی نیست؛ بحث ریسک صنعتی هم هست که هیچ جا اینو به کسی نمی‌گن معمولاً.

شرکت‌های بزرگ و هزاران زیرساخت نرم‌افزاری حیاتی به این زبان وابسته‌ان. هیچ‌کس نمیاد روی زبانی سرمایه‌گذاری سنگین کنه که مسیرش دست سلیقهٔ یک نفر یا تصمیم لحظه‌ای یک شرکت باشه.

یکی از دلایلی که خیلی از محصولات جدی و سطح‌بالا با این ابزار ساخته می‌شن همین استاندارد بودنه.

چون زبان دیمی جلو نمی‌ره، و هر قابلیت باید از مسیر پیشنهاد، بررسی، بحث فنی، پیاده‌سازی، رأی‌گیری و استانداردسازی عبور کنه. مثل همین موضوع Reflection که خیلی‌ها مسخره می‌کنن می‌گن عه برای سال‌هاست که اینو سی‌شارپ داره، پی‌اچ‌پی داره ولی سی++ چرا نداره برای خاطر همین استاندارد بودنشه! خب کمیتهٔ استاندارد سازی اینطور تصمیم می‌گیره که چه چیزی اضافه بشه چه چیزی نشه! با هوای من برنامه‌نویس بازی نمی‌کنه که مهم آیندهٔ صنعته.

اصلاً قرار نیست امروز یک نفر بگه «از این خوشم اومد، اضافه‌اش کنیم» و فردا میلیون‌ها خط کد درگیر تصمیمش بشن! توی لینکدین از این صحبت‌ها زیاده به خصوص راست‌چی‌ها یا طرفداران زبان‌های اسکریپتی! خب اصلاً موضوع شوخی بردار نیست واقعاً؛ با کوچیکترین تغییر صنعت دنیای نرم‌افزار اینور اونور میشه! نمونش یه مثال ساده و قابل فهم بزنم:

پادشاه بیت‌کوین! 💸فکر می‌کنی الکیه یه کد رو توش تغییر بدی بعد اثر جانبی و کلی موارد درگیرش نشه؟ خب کمیته همه چیرو باید در نظر بگیره! اسباب بازی نیست که مرد حسابی! پایتونه مگه مارمولک بازی کنی باهاش بگی طوری نمیشه! 😂

این زبان در توسعه کندتر از خیلی زبان‌ها حرکت می‌کنه، ولی همین کندی همیشه ضعف نیست. برای زیرساخت، موتور بازی، دیتابیس، سیستم‌عامل، مرورگر، نرم‌افزار مالی، صنعتی و امبد‌؛ پایداری بلند مدتی از هیجان‌های زودگذر تبلیغاتی مهم‌تره.

برای همین استاندارد فقط یک سند رسمی نیست؛ قرارداد اعتماد بین زبان، کامپایلرسازها، شرکت‌ها، توسعه‌دهنده‌ها و میلیاردها خط کده.

از قلم نیفته که زبان C هم همینطوره‌! یعنی این دو زبان C و ++C همیشه طبق استاندارد پیش میرن و غیر این هم نیست. با ساز من و شما هم نمی‌رقصن. 😉

برای C هم استاندارد‌هاش اینا هستن که از سال ۱۹۸۹ آغاز می‌شه:
C89 / C90
C95
C99
C11
C17 / C18
C23

واسهٔ همین هم وقتی می‌بینی یکی میاد زیر پست این توسعه‌دهده‌های این دو تا غول مسخره‌بازی می‌کنه اصلاً اهمیت نمیدن چی میگه! چون تو باغ نیست که اصلاً صنعت چی می‌گه! صنعت دست بزرگان هست نه من برنامه‌نویس ساده که نباشم هم واسشون مهم نیست.
Please open Telegram to view this post
VIEW IN TELEGRAM
COMPΞZ 🧬
واسهٔ همین هم وقتی می‌بینی یکی میاد زیر پست این توسعه‌دهده‌های این دو تا غول مسخره‌بازی می‌کنه اصلاً اهمیت نمیدن چی میگه! چون تو باغ نیست که اصلاً صنعت چی می‌گه! صنعت دست بزرگان هست نه من برنامه‌نویس ساده که نباشم هم واسشون مهم نیست.
یک ارجاع به گواهی استاندارد ایزو با عنوان ISO/IEC 14882:2024 از زبان که در سال ۲۰۲۳ استاندارد‌سازی شده و در سال ۲۰۲۴ گواهیش صادر شده.

کلاً پیشنهاد می‌کنم وقتی چیزیرو یاد می‌گیرید یا ازش استفاده می‌کنید بهش علاقه نشون بدین؛ و اگرنه، نه درکش خواهید کرد و نه اون ابزار مناسبی برای نحوهٔ تفکر شما خواهد بود.

بخش‌های مربوط به هر کتاب که هست مقدمه، یه توضیحی میدن که تاریخچه چی بوده واسهٔ چی بوده اینا برای ورق زدن نیست، برای خوندنه! برای درک کردنه.

این لینک اشارهٔ مستقیم به نقشهٔ راه استاندارد در حال حاضر رو نشون میده:

https://isocpp.org/std/status

و گواهی استاندارد که هر ۵ سال یه باز‌بینی میشه.

https://www.iso.org/standard/83626.html
اینم واسه شما فارسی دوست‌ها. 😄 با این زبان می‌تونی فارسی برنامه‌نویسی کنی! بعد می‌گن چقدر سخته! 😂😝
این هم یک قالب آماده برای تنبلوف‌هایی که هنوز با AI کار نکردن، یا حداقل نمی‌دونن چطور باید هوش مصنوعی رو برای پروژه‌های ++C تنظیم کنن.

هدفش اینه که وقتی Claude Code، Codex، Copilot یا هر AI Agent دیگه‌ای وارد یک پروژه ++C می‌شه، مثل یک برنامه‌نویس بی‌قانون رفتار نکنه! من این مثال رو تنظیم کردم مطابق آخرین چیز‌هایی که خودم روی تجربه می‌کنم.

این یعنی AI از همون اول بدونه چهارچوب استاندارد چیه:

- باید با C++20/23/26 کار کنه
- ساختار پروژه باید module-based باشه
- اعلان‌ها و روابط (Interface) داخل cppm باشه
- تعاریف داخل cpp باشه
- از مفاهیم (concepts) و ویژگی‌های مهمی چون compile-time برای ارزیابی استفاده کنه
- از CMake مدرن استفاده کنه
- تست‌های واقعی اجرا کنه
- نتیجه build/test رو الکی ادعا نکنه
- اگر جایی مجبور شد از raw pointer، manual memory، macro یا header استفاده کنه، دلیل مهندسی‌‌ای باید داشته باشه.

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

AGENTS.md
CLAUDE.md
Claude slash commands
MCP config
Modern CMake
C++ module structure
Unit tests
GitHub Actions
Review checklist


این پروژه قرار نیست یک library بزرگ باشه؛ بیشتر یک قالب (مثال) استاندارد برای اینه که AI داخل پروژه‌های ++C درست، مدرن و قابل کنترل کار کنه.

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

برای همین، قبل از اینکه از AI بخوایم کد بنویسه، باید بهش بگیم دقیقاً با چه استانداردی باید باشه.

https://github.com/thecompez/ai-for-modern-cpp

#cpp #cplusplus #moderncpp #cpp20 #cpp23 #cpp26 #ai #codex #claudecode #cmake #softwareengineering
COMPΞZ 🧬
این باگ نمایشی فارکستره! نگران توکن‌هاتون نباشید. https://farcaster.xyz/compez.eth/0xad91095e بهشون گزارش هم دادم باگه جنی نیست، باگه فارکستره. ✔️ برای اطمینان از دیبانک بررسی کنید: https://debank.com/profile/{yourwallet_address} زیر پستی که زدم براشون…
بعضی از دوستان میرن فارکستر، وارپلت رو باز می‌کنن می‌بینن جنی‌هاشون نیست زهره ترک می‌شن! 😄
نترسید قبلاً که گفتم باگ فارکستره! همه چیز جاشه فقط وارپلته که مشکل نمایشی داره.

کافیه کیف فارکستر رو کلیدواژه‌هاش رو بدین به Rabby یا Metamask خواهید دید جنی‌های نازنینتون سر جاشونه! کسی نه بهشون دست زده نه جرأت داره دست بزنه. دیگه هرچی دزد و پدر سوخته بود رو توی این چند ماه شوت کردم بیرون! تنها خودم به خزانه دسترسی دارم که اونم زیر چند متر خاک چالش کردم برای توزیع‌های آینده!

هیچ کس نمی‌تونه تا زمانی که خودتون کیفتون رو لو ندادین به جنی‌هاتون دسترسی داشته باشه نگران نباشید. 👌
ولی من باز هم پیگیرم تا این مشکل نمایشی رو هم حل بشه.

https://farcaster.xyz/compez.eth/0xab6f7a6a
جیسون وایتزمن، پژوهشگر امنیت سایبری، پس از نصب افزونه‌ای که به Claude متصل بود متوجه شد یک ایجنت با استفاده از کیف پول دیجیتال او، ۳۱۵ دلار خرید اینترنتی غیرمجاز انجام داده است. سناریویی که در آن یک فایل متنی ساده هم می‌تواند به بردار حمله تبدیل شود.

https://abc7news.com/post/anthropic-ai-hack-martinez-california-man-says-fraudulent-charges-racked-euros-claude-account/19366402/

خلاصه که اینطوریاست. 😉
به درک! دزد کثیف.
مگه یادم میره تو دوران قطعی چه فساد‌هایی که نکردی...
توضیح دادن به هوش مصنوعی با «پرامپت نوشتن» فرق دارد؛ این دو را اشتباه نگیرید.

خیلی‌ها بهم می‌گن چرا ما هرچی از AI می‌پرسیم یه چیز غلط بهمون میده! یا اونی نیست که باید باشه یا خنگ میزنه!

خب موضوع اینه که بارها هم گفتم؛ هوش مصنوعی خرد یا شعور نداره! شما با انسان صحبت نمی‌کنی که بتونه درک کنه چی می‌گی.

پرامپت = دستورالعمل ورودی

دستور ‌(پرامپت) یعنی تبدیل خواستهٔ مبهم به دستورالعمل اجرایی.

فرقش با توضیح عادی اینه که توضیح عادی بیشتر شبیه حرف زدن با آدمه؛ اما دستور خوب باید برای ماشین، مدل، ابزار یا سیستم تولید خروجی، قابل فهم، قابل اجرا و قابل ارزیابی باشه.

مثلاً برای تولید تصویر:
توضیح معمولی با خروجی بد

یه تصویر خفن از یه ببر بساز، خیلی خاص باشه، سینمایی باشه، قشنگ باشه.
مشکلش چیه؟

«خفن»، «خاص»، «قشنگ» و «سینمایی» به تنهایی مبهم‌اند. مدل نمی‌فهمه دقیقاً چه قاب‌بندی، چه نور، چه سبک، چه رنگ، چه زاویه، چه حس، چه جزئیاتی، چه چیزهایی نباید داخل تصویر باشد.

برای همین خروجی ممکنه کلیشه‌ای، شلوغ، بی‌هویت یا کاملاً متفاوت از چیزی بشه که توی ذهنته.

پرامپت خوب
یک تصویر سینمایی از یک ببر نیمه‌مکانیکی بساز که از داخل یک دروازهٔ عظیم به شکل حرف T بیرون می‌آید. تصویر از فاصلهٔ دور باشد تا عظمت صحنه دیده شود.

چهرهٔ ببر کامل و واضح رونمایی نشود؛ فقط بخشی از بدن، چشم درخشان و خطوط مکانیکی آن در سایه دیده شود. فضای تصویر تاریک، مه‌آلود، آینده‌نگر و باشکوه باشد. نور اصلی از پشت دروازه بتابد و حالت ضدنور ایجاد کند.

رنگ‌ها ترکیبی از مشکی، خاکستری فلزی، نارنجی سوخته و نور آبی سرد باشند. سبک تصویر باید شبیه پوستر لوکس تکنولوژیک باشد، نه کارتونی و نه فانتزی کودکانه. بدون متن، بدون لوگو، بدون انسان، بدون جزئیات اضافهٔ شلوغ.


البته برای توکن‌سوزی کمتر، به نسخهٔ انگلیسی میشه:
Create a cinematic image of a semi-mechanical tiger emerging from a massive gate shaped like the letter T. The image should be framed from a distance so the scale and majesty of the scene are clearly visible.

The tiger’s face should not be fully or clearly revealed. Only part of its body, its glowing eye, and its mechanical lines should be visible within the shadows. The atmosphere should feel dark, foggy, futuristic, and majestic. The main light source should shine from behind the gate, creating a dramatic backlit silhouette.

The color palette should combine black, metallic gray, burnt orange, and cold blue light. The visual style should feel like a luxury technology poster, not cartoonish and not childish fantasy. No text, no logo, no humans, no unnecessary clutter.


تا پند‌هایی دیگر به درود.
من یه انسانم نه ربات!

کسی خواست تشکر کنه میاد توی روم تشکر می‌کنه! زیر پستم.

کسی هم خواست نقد کنه یا فحشم بده، جرأت اینو داشته باشه بیاد تو روم بگه. 😁 یه بارم ما بر خلاف قانون عرف پیش بریم ببینیم چی میشه خب!قدیما یاهو مسنجر خوب بود! اینطوری نبود حتی فحشتم میدادن با صدا و تصویر خودشون! کسی قایم نمیشد که...

الآن خیلی چرت شده همه تورو می‌بینن بعد تو کسی رو نمی‌بینی! یعنی چی خب! آدمیم بابا ربات نیستیم که.
خب کمال‌گرایی در این حد توی این فاز کافیست! اصولاً برای اینکه ماست مالی کنن میان با worker و یه شبیه‌سازی ساده‌تر قضیه رو می‌بندن! ولی مهم بود که native از خود سیستم‌عامل کمک بگیریم.

حالا بخش دیتابیس تگرا تقریباً به حد کافی non block I/O شده و این برای پیشروی بخش‌های بعدی عالیست.