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

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

We create because the world deserves better code.

https://linktr.ee/compez
Download Telegram
از امروز دیگه نام و اصطلاح فریم منسوخ شده اعلام شد و جایگزینش Mini-App است.

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

نکته) احتمال تغییر نام کلاینت اختصاصی فارکستر از Warpcast به Farcaster هم وجود داره، نهایی نشده.
👍6
COMPΞZ 🧬
خب! درود بر برنامه‌نویس عالم! چالش سی روزه رو آغاز می‌کنم 🫵🏼✍🏼 اما هدف آموزش نحوهٔ کد‌نویسی با C++23 و Solidity. شما هم می‌تونید نکته برداری کنید، منم هدفم اینه هرچی به روز رسانی کردم رو یادداشت کنم تا دوباره برای خودم مرور بشه. هیچ سخت نیست، تنهایی پیش…
تابع std::ranges::end_with بررسی می‌کند که آیا یک محدوده (Range) با یک محدوده دیگر به عنوان پسوند (Suffix) خودش به پایان می‌رسد یا خیر. به عبارتی دیگر، بررسی می‌کند که آیا انتهای محدوده اول با محدوده دوم مطابقت دارد یا خیر.

فرض کنید یک آرایه از اعداد صحیح به نام numbers با مقادیر ۱ تا ۵ وجود دارد و می‌خواهیم بررسی کنیم که آیا این آرایه با عدد ۳ به پایان می‌رسد یا خیر.

import std;

bool numbers[] = {1, 2, 3, 4, 5};

// Check if the array numbers ends with 3
bool ends_with_three = std::ranges::end_with(numbers, numbers + sizeof(numbers) / sizeof(numbers[0]), [](int a, int b) { return a == b; });

if (ends_with_three) {
std::println("The array ends with 3.");
} else {
std::println("The array does not end with 3.");
}


#cpp20 #cpp23 #ranges #end_with #ranges_end_with #چالش #سی‌روزه #رمضان #روز_بیست_و_هشتم
COMPΞZ 🧬
تابع std::ranges::end_with بررسی می‌کند که آیا یک محدوده (Range) با یک محدوده دیگر به عنوان پسوند (Suffix) خودش به پایان می‌رسد یا خیر. به عبارتی دیگر، بررسی می‌کند که آیا انتهای محدوده اول با محدوده دوم مطابقت دارد یا خیر. فرض کنید یک آرایه از اعداد صحیح…
بخش تخصصی دوم (به‌روز رسانی Solidity) | ارث‌بری چندگانه

در ارث‌بری چندگانه، قراردادهای پایه مشتق‌شده‌تر (Most Derived Base Contracts) که یک تابع مشابه را تعریف می‌کنند، باید به طور صریح بعد از کلیدواژه override مشخص شوند. به عبارت دیگر، شما باید تمام قراردادهای پایه‌ای را که همان تابع را تعریف می‌کنند و هنوز توسط قرارداد پایه دیگری (در مسیر دیگری از نمودار ارث‌بری) جایگزین نشده‌اند، مشخص کنید.
همچنین، اگر یک قرارداد یک تابع را از چندین پایه‌ی (غیرمرتبط) به ارث ببرد، باید آن را به طور صریح جایگزین کند:

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.6.0 <0.9.0;

contract Base1
{
function foo() virtual public {}
}

contract Base2
{
function foo() virtual public {}
}

contract Inherited is Base1, Base2
{
// Derives from multiple bases defining foo(), so we must explicitly
// override it
function foo() public override(Base1, Base2) {}
}



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

قوانین دقیق‌تر برای مشخص کردن override:

به طور رسمی، نیازی نیست که تابعی را که به طور مستقیم یا غیرمستقیم از چندین پایه به ارث رسیده است، جایگزین کنید (override)؛ به شرطی که:

۱) یک قرارداد پایه وجود داشته باشد که بخشی از تمام مسیرهای جایگزینی برای امضا (Signature) باشد.
۲) آن قرارداد پایه، تابع را پیاده‌سازی کند (Implement) و هیچ مسیری از قرارداد جاری به آن قرارداد پایه‌ای، به تابعی با آن امضا اشاره نکند.
۳) یا آن قرارداد پایه، تابع را پیاده‌سازی نکند و حداکثر یک اشاره به آن تابع در تمام مسیرها از قرارداد جاری به آن قرارداد پایه وجود داشته باشد.

مسیر جایگزینی برای یک امضا (Override Path):
- مسیر جایگزینی برای یک امضا، مسیری در نمودار ارث‌بری است که از قرارداد تحت بررسی شروع می‌شود و به قراردادی ختم می‌شود که به تابعی با آن امضا اشاره می‌کند و آن را جایگزین نمی‌کند.

عدم استفاده از virtual:
- اگر تابعی را که جایگزین می‌کند با virtual علامت‌گذاری نکنید، قراردادهای مشتق‌شده دیگر نمی‌توانند رفتار آن تابع را تغییر دهند.

نکات مهم:
- توابع با دسترسی private نمی‌توانند virtual باشند.
- توابع بدون پیاده‌سازی (Implementation) باید در خارج از رابط‌ها (Interface) با virtual علامت‌گذاری شوند. در رابط‌ها، تمام توابع به طور خودکار virtual در نظر گرفته می‌شوند.
وضعیت بازار در مورد بیت و اتریوم از نظر شخصی من 🕯

- 🪙 بیت‌کوین در شکستن کانالی که انتظار داشتیم، تا حد بسیاری نا موفق بوده؛ پس انتظار میره در صورت بسته شدن کندل ماهانه به شکل منفی، اصلاح بیشتری ازش ببینیم. البته طبیعی هست! کل وضعیت بیت‌کوین نرمال و سالمه چون به هر حال سقف‌های قبلی خودش رو پودر کرده.

- 🔷 اما متأسفانه نظرم در مورد اتریوم اصلاً خوب نیست! با وجود اینهمه تبلیغ و زحمت و تلاش روی شبکهٔ اتریوم، حتی موفق نبوده تا سقف سال‌ها قبل خودش رو بشکنه! این فاجعست!!! اگه حمایتی شکل بگیره، همین نقطه‌ها وقتشه! اما به نظر میرسه اتریوم دیگه همون اتریوم زمان ۲۰۲۱ نیست! در حالی که بیت، خیلی راحت ATH زده و این اصلاح هرچقدر هم عمیق باشه، حتی تا کانال ۶۰، باز هم منطقیه! چون تازه می‌رسیم به سقف قبلی خودش.

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

- من معتقدم که برای پیش‌روی بهتر، شبکهٔ L1 اتریوم باید تقویت بشه.
- شبکهٔ L2 روی Base باید روی پروژه‌های واقعی متمرکز بشه، نه اینهمه اسکم و چرت و پرت که اطمینان به شبکه‌های مبتنی بر اتریوم رو به این روز انداخته.
- لایهٔ L3 می‌تونه یک تعادل برای بهبود و جذب نظر سرمایه‌گذاران بین شبکه لایه ۱ و ۲ باشه، در صورتی که واقعاً ایده‌های کاربردی خوبی پیاده‌سازی کنیم وضعیت اتر می‌تونه بهبود پیدا کنه.

نظر شخصی، DYOR با خودتون.
Please open Telegram to view this post
VIEW IN TELEGRAM
😢2
COMPΞZ 🧬
در حد اینکه فکر کنم و احتمال بدم، من ۱۰۰۰ و زیر هزار دلار یعنی بازهٔ ۹۰۰ تا ۸۰۰ دلار رو هم برای اتریوم می‌بینم. اما همش احتمال هست! ممکنه هیچ‌وقت رخ نده. به هیچ عنوان روش حساب باز نکنید که این فقط احتمال شخصیِ بلند مدت با توجه به ادامهٔ روند فعلیش هست. 😉😊
متأسفانه به این تحلیل هنوز هم معتقدم.
وقتی اینجا برسه، آلت‌های بعد از اتریوم پودر می‌شن.

هرچی آت‌آشغال باشه تو بازار به فنا میره و الک میشه. لایهٔ ۱ باید حمایت بشه، لایهٔ ۲ بیش از حد و اندازه برای هر کسی شده منبع کلاه‌برداری تا خدمات!

یکی از دلایل عدم پایداری اتریوم همین هست که هر احمقی می‌تونه روش توکن بسازه سر مردم شیره بماله.

کی به کیه! قرارداد بنویس بگو من توکن دادم بیرون! مخصوصاً این توکن‌های مبتنی بر هوش مصنوعی که دیگه شده تاناکورا طرف تو عمرش یه خط برنامه‌نویسی نکرده ولی ادعای خفن بودن می‌کنه!😐
👍1
https://warpcast.com/compez.eth/0xf92e41e4

اینجا ۱۰ مورد که خودم تجربه کردم و بهش معتقد هستم، به‌ویژه در مورد تکنولوژی‌ها 🗣️

۱) تسلط به یک تکنولوژی می‌تواند شما را به طور جدی محدود کند و فقط به یک حوزه خاص و حل مشکلات با همان تکنولوژی می‌پردازید.
۲) برای درک واقعی پتانسیل تکنولوژی، باید با ابزارها و فریم‌ورک‌های مختلف کار کنید تا بتوانید دیدگاه جامع‌تری پیدا کنید.
۳) دانستن عمیق یک تکنولوژی مهم است، اما درک چگونگی تعامل و تکمیل شدن تکنولوژی‌های مختلف در حل مشکلات واقعی اهمیت بیشتری دارد.
۴) اگر فقط به یک تکنولوژی محدود شوید، بسیاری از فرصت‌ها و همکاری‌های دیگر در سایر حوزه‌های تکنولوژی را از دست خواهید داد.
۵) تمرکز بیش از حد روی یک تکنولوژی می‌تواند فهم شما از نحوه عملکرد کلی منظومه تکنولوژی (چه در سطح سخت‌افزار و چه نرم‌افزار) را به شدت محدود کند.
۶) باورها و روش‌های شما در صورتی که آماده نباشید تا با پیشرفت‌های جدید تکنولوژی یا تجربیات تازه تطبیق پیدا کنید، به مرور زمان از رده خارج می‌شوند.
۷) تعصب تکنولوژیک یکی از مشکلات رایج است؛ اگر به فریم‌ورک یا زبان برنامه‌نویسی خاصی وابسته باشید، ممکن است در ارزیابی راه‌حل‌ها دچار اشتباه شوید.
۸) در ارزیابی یا حل مشکلات فنی، تنها با استفاده از روش‌هایی که به آنها آشنا هستید، احتمالاً راه‌حل‌های بهتری که ممکن است موجود باشد را از دست خواهید داد.
۹) استفاده مداوم از تکنولوژی یا فریم‌ورک مشابه می‌تواند پس از مدتی برای شما خسته‌کننده و تکراری شود. تنوع در دانش و ابزارهای شما می‌تواند هیجان و نوآوری بیشتری به ارمغان آورد.
۱۰) به تکنولوژی‌ها و ابزارها مانند اعضای یک جامعه نگاه کنید. هر چقدر ارتباط شما با ابزارهای مختلف و رفتارها و ویژگی‌های متنوع‌تر بیشتر باشد، توانایی شما در استفاده مؤثر از آنها و تطبیق با شرایط مختلف افزایش می‌یابد.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
شبی به روشنیِ درخشان‌ترین ستارهٔ آسمان و فردایی سرشار از تلاش و موفقیت برای‌تان آرزومندم.

شبتون شیک و پر از آرامش! 🌑

https://warpcast.com/compez.eth/0x2b58c970
3🔥1
تابع std::ranges::find_last یک عضو جدید در استاندارد ۲۳ است که به شما کمک می‌کند تا آخرین عنصر را در یک محدوده که معیار خاصی را برآورده می‌کند، پیدا کنید. این تابع به دنبال آخرین عنصر در یک محدوده (مانند بردار یا رشته) می‌گردد که یک شرط خاص را برآورده می‌کند. بر خلاف std::find که به تکرار کننده‌های (iterator) دوطرفه نیاز دارد، std::ranges::find_last می‌تواند با iteratorهای رو به جلو کار کند و این امر موجب تطبیق‌پذیرتری با انواع مختلف محدوده‌ها می‌شود.

import std;

auto main() -> int {

std::vector<int> numbers = {1, 3, 5, 7, 2, 7, 4};

// Find the last element equal to 7
auto it = std::ranges::find_last(numbers, 7);

if (it != numbers.end()) {
std::println("Last element equal to 7: {}", *it);
} else {
std::println("No element equal to 7 found.");
}
}


تابع std::ranges::find_last یک ابزار قدرتمند و کارآمد برای یافتن آخرین عنصر مطابق در یک محدوده است و استفاده از آن می‌تواند در موارد مختلفی مفید باشد.


#cpp20 #cpp23 #ranges #find_last
COMPΞZ 🧬
تابع std::ranges::find_last یک عضو جدید در استاندارد ۲۳ است که به شما کمک می‌کند تا آخرین عنصر را در یک محدوده که معیار خاصی را برآورده می‌کند، پیدا کنید. این تابع به دنبال آخرین عنصر در یک محدوده (مانند بردار یا رشته) می‌گردد که یک شرط خاص را برآورده می‌کند.…
بخش تخصصی دوم (به‌روز رسانی Solidity) | بلاک اسمبلی درون خطی (Inline Assembly)

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

- یک بلاک اسمبلی درون خطی با کلمه کلیدی assembly و آکولاد { ... } مشخص می‌شود. کد داخل آکولاد، کد نوشته‌شده به زبان Yul است.
- کد اسمبلی درون خطی می‌تواند به متغیرهای محلی سالیدیتی، همانطور که در ادامه توضیح داده می‌شود، دسترسی داشته باشد.
- بلاک‌های مختلف اسمبلی درون خطی هیچ فضانام مشترکی ندارند، به این معنی که فراخوانی یک تابع Yul یا دسترسی به یک متغیر Yul که در یک بلاک اسمبلی درون خطی دیگر تعریف شده است، امکان‌پذیر نیست.

در اینجا مثالی ارائه شده است که کد کتابخانه‌ای را برای دسترسی به کد قرارداد دیگری و بارگذاری آن در یک متغیر از نوع bytes نشان می‌دهد. این کار با استفاده از دستور زیر انجام می‌شود:

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;

library GetCode {
function at(address addr) public view returns (bytes memory code) {
assembly {
// retrieve the size of the code, this needs assembly
let size := extcodesize(addr)
// allocate output byte array - this could also be done without assembly
// by using code = new bytes(size)
code := mload(0x40)
// new "memory end" including padding
mstore(0x40, add(code, and(add(add(size, 0x20), 0x1f), not(0x1f))))
// store length in memory
mstore(code, size)
// actually retrieve the code, this needs assembly
extcodecopy(addr, add(code, 0x20), 0, size)
}
}
}



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

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;


library VectorSum {
// This function is less efficient because the optimizer currently fails to
// remove the bounds checks in array access.
function sumSolidity(uint[] memory data) public pure returns (uint sum) {
for (uint i = 0; i < data.length; ++i)
sum += data[i];
}

// We know that we only access the array in bounds, so we can avoid the check.
// 0x20 needs to be added to an array because the first slot contains the
// array length.
function sumAsm(uint[] memory data) public pure returns (uint sum) {
for (uint i = 0; i < data.length; ++i) {
assembly {
sum := add(sum, mload(add(add(data, 0x20), mul(i, 0x20))))
}
}
}

// Same as above, but accomplish the entire code within inline assembly.
function sumPureAsm(uint[] memory data) public pure returns (uint sum) {
assembly {
// Load the length (first 32 bytes)
let len := mload(data)

// Skip over the length field.
//
// Keep temporary variable so it can be incremented in place.
//
// NOTE: incrementing data would result in an unusable
// data variable after this assembly block
let dataElementLocation := add(data, 0x20)

// Iterate until the bound is not met.
for
{ let end := add(dataElementLocation, mul(len, 0x20)) }
lt(dataElementLocation, end)
{ dataElementLocation := add(dataElementLocation, 0x20) }
{
sum := add(sum, mload(dataElementLocation))
}
}
}
}


#solidity #web3 #update #ether #اتریوم
COMPΞZ 🧬
خب! درود بر برنامه‌نویس عالم! چالش سی روزه رو آغاز می‌کنم 🫵🏼✍🏼 اما هدف آموزش نحوهٔ کد‌نویسی با C++23 و Solidity. شما هم می‌تونید نکته برداری کنید، منم هدفم اینه هرچی به روز رسانی کردم رو یادداشت کنم تا دوباره برای خودم مرور بشه. هیچ سخت نیست، تنهایی پیش…
خب، برنامهٔ چالش از رمضان تموم شد (یه چشم بهم زدن)، در این بازهٔ زمانی سعی من این بود مهم‌ترین به‌روز رسانی‌ها رو نکته برداری کنم.

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

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

بحث در‌مورد این دو زبان بسیار هست و هرکس مشتاق بود میره دنبالش.⚡️
🙏1
در زمان پیش رویمان، موانع و چالش‌هایی پر از فرصت‌های سازنده برای دنیایی بهتر وجود دارد!
هرآنچه که در توان دارید برای یادگیری به کار ببرید، مطمئن باشید هیچ‌گاه از آموزش و یادگیری پشیمان نخواهید شد.

https://warpcast.com/compez.eth/0xde6b835c
در سبک و سطح‌ شناسی زبان‌های برنامه‌نویسی سطوح رو بر مبنای دو شاخه ارزیابی می‌کنیم:

۱) نحو (سینتکس)
۲) ساختار و ویژگی‌ها زبان

بر اساس این موضوع زبانی مثل سی‌پلاس‌پلاس از نوع نحو (اساساً سطح‌بالاست) این زبان اساساً از نظر نحو اصولاً در محیط توسعه High Level تشریف داره :) به خصوص در استاندارد‌های جدید‌تر که دیگه کاملاً واضح هست.

یک کدی مثل تصویری که می‌بینید در سی++ می‌تونه به دو سطح در سه حالت نوشته بشه.

۱) سطح پایین (سبک خود ++C و نه C)
۲) سطح بالا (کلاسیک)
۳) سطح بالا (مدرنیزه‌تر)

اما از نظر ساختاریِ ذاتی و ویژگی‌ها به دلیل ارائه برنامه‌نویسی در لایه پایین‌تر به شما امکان برنامه‌نویسی سطح پایین رو ارائه می‌کنه؛ بنابراین بر مبنای ساختار بهش می‌گیم سطح میانی یا Mid Level چون هم Low Level و هم High Level رو برای شما ارائه میده، در واقع تنها زبانیه که در سطوح مختلف امکان برنامه‌نویسی رو ارائه می‌کنه.
👍1
COMPΞZ 🧬
در سبک و سطح‌ شناسی زبان‌های برنامه‌نویسی سطوح رو بر مبنای دو شاخه ارزیابی می‌کنیم: ۱) نحو (سینتکس) ۲) ساختار و ویژگی‌ها زبان بر اساس این موضوع زبانی مثل سی‌پلاس‌پلاس از نوع نحو (اساساً سطح‌بالاست) این زبان اساساً از نظر نحو اصولاً در محیط توسعه High Level…
این موضوع رو برای این مثال زدم که بارها در مورد سطح‌بالا صحبت کردیم، اما توضیح در مورد نحو و ساختار زبان‌ها رو شفاف نکرده بودیم.

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

- برای مثال، درسته که ++C سطح بالا هم هست، اما CSharp یک زبان برنامه‌نویسی سطح بالای خالص نسبت به ++C هست؛ هم سبک کار باهاش سطح بالاست و هم سبک ساختاری خود زبان، درسته که تعامل خوبی با سیستم‌عامل ویندوز داره، اما ABI‌ها و API‌های سیستم‌عامل همگی بر مبنای ++C انشعاب پیدا کردن به زبان‌های مبتنی بر دات‌نت که تحت فریمورک به راحتی می‌تونید با لایه‌های زیرین سیستم‌عامل تعامل داشته باشید.

- زبانی مثل JavaScript یک زبان کاملاً سطح‌بالاست! هم از نظر زیرساختی (به دلیل جنس اسکریپتی بودنش) و هم از نظر ساختار و نحو! پس CSharp نسبت به JS سطح پایینه (از نظر ساختار) اما از نظر نحو هر دو راحت هستن و نزدیک به زبان کلامی هستن نه ماشین جفتشم سطح بالان. :)

- زبانی مثل پایتون قطعاً سطح بالاست! نزدیک به زبان انگلیسی و ساختارش هم لایه بالاست :) همین دلیل هم باعث شده عموم مردم ازش استقبال کنن (چون برای درکش نیازی به دانش عمیقی از تخصص مهندسی نرم‌افزار و کامپیوتر ندارید).

دو مبحث بیشتر نداریم:
۱) تشخیص سطح زبان از نظر سبک نوشتن کد‌ها (ساده قابل درک هست یا سخت).
۲) تشخیص ساختار زبان از نظر زیرساخت‌ها و جنس ذاتی (کامپایلری، کامپایلری مجازی یا مفسری و اسکریپتی).

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

هیچ‌وقت یک زبان رو فقط بر اساس یکی از این دو حالت با یک زبان دیگه مقایسه نکنید.
یعنی این درست نیست بگیم ++C قابل مقایسه با پایتون هست! نه! این غلطه، شاید بگیم خب الآن سی++ ۲۰ مگه نمیگی خیلی ساده‌تر و شیک‌تر شده! قابل فهم‌تر شده و بهتر میشه درکش کرد، اما خب من می‌گم نه!!! قابل مقایسه نیستن و نخواهند بود چون ساختارشون متفاوته (یعنی از نظر گزینهٔ دوم ۱۸۰ درجه باهم فرق دارن).

تموم شد رفت. غیر از این نیست.
2
محیط دانشگاه رو من به عنوان کسب تجربهٔ آکادمی پیشنهاد می‌کنم نه به عنوان کسب سواد واقعی یا دانش فنی و تخصصی.

دانشگاه حتماً برو، چرا می‌گم برو؟ برای اینکه باور کنی چیزی توش بهت یاد نمیدن، مگر اینکه از اینایی باشی که به دنبال جیره‌خواری در کارهای دولتی باشه که در این صورت ۱۰۰٪ باید چندین سال عمرت رو صرفش کنی چاره‌ای نداری.

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

توی کشور ما حالا حالا‌ها کنکور و مافیا‌های کودن پروری هم نخواهند گذاشت ملت پیشرفت کنند.


در مورد خودآموز بودن من...

بله هر دانش و سوادی که دارم ۱۰۰٪ خود‌آموز هستم، حتی ۱ کلمش رو از دانشگاه یاد نگرفتم، تا جایی که یادم میاد من به اساتید یاد می‌دادم نه اساتید به من.
👎1
پاسخ بخش اول:
۱) وب‌سایتی که معرفی شده بر مبنای مستندات ارائه شده و برای یادگیری به صورت پایه‌ای (اما ساده) مناسب هست.

۲) کتاب C++ Crash Course برای کسانی که تجربهٔ برنامه‌نویسی دارند مناسبه؛ بنابراین، کمک می‌کنه که در استاندارد‌های ۱۷ ارتقاء پیدا کنید و بخش‌هایی از کتابخانهٔ Boost رو هم براتون توضیح میده.

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

این خیلی خوبه که شما شک و تردید داشته باشید، چون موجب می‌شه تحقیق کنید، بیشتر در موردش فکر کنید و بعد تصمیم بگیرید.
در مورد امنیت سی‌پلاس‌پلاس بارها بحث شده، توی خیلی از گروه‌ها دیدم اما من حوصلهٔ شرکت در بحث‌هایی که توش پر از تعصب هست رو ندارم؛ همیشه هم توی گروه و کانالی که خودم بودم صحبت کردم و گفتم ابزار‌ها همشون ابزارن و غیر این نیستن و برای اینکه یه چیزی رو عمیقاً درک کنی باید وقت بذاری. بدم میاد یکی بیاد به جای یادگیری جفت پاشو بکنه تو یه کفش بره سمت تعصب و همش سعی کنه تبلیغات منفی ساطع کنه اون هم در گروه‌هایی که مربوط به چیزی که بهش تعصب داره نیست!!! این چه معنایی داره به جز سم‌پراکنی؟!

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

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

دوماً با وجود سطح بالا بودن این زبان نسبت به C، امکان ارائه برنامه‌نوسی سطح پایین رو به خوبی ارائه می‌کنه؛ در حد سی و حتی فراتر از اون.
پس چی شد؟ این یک زبان سطح بالا با امکان ارائه سطح‌پایین هست.

سطوح زبان رو همیشه باید نسبت به زبان‌های دیگه بسنجی! مثلاً C صرفاً یک زبان سطح‌پایین هست نه سطح بالا. و امکان ارائه برنامه‌نویسی سطح بالا رو هم به شما نمیده! اما این موضوع در مورد سی++ برعکسه، ذاتاً سطح بالاست و امکان برنامه‌نویسی سطح پایین رو به برنامه‌نویس میده.

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

مرجع رسمی استاندارد‌سازی و مستندات آرشیو شده در Open STD به لینک رسمی زیر هست:

https://www.open-std.org

وظیفش چیه؟ این مجموعه تحت مدیریت استانداردهای جهانی (ISO) و کمیته فنی TC1 (Technical Committee 1) فعالیت می‌کنه.
وظیفه اصلی این وب‌سایت اطلاع‌رسانی دربارهٔ فعالیت‌های گروه کاری ۲۱، مشارکت‌کنندگان در توسعه استانداردها، پیشرفت‌های اخیر، اسناد فنی، و سایر اطلاعات مرتبط با استانداردهای ++C و چندین استاندارد دیگست مثل، POSIX، ISLISP، Java، لینوکس و ...


لینک بعدی از زیر مجموعه‌ٔ همین گروه به صورت زیر هست:
https://www.open-std.org/jtc1/sc22/wg21/docs/standards

این چیه؟ اصلاً WG21 چی هست؟ WG21 به کمیته فنی از سازمان استانداردهای جهانی (ISO) که به توسعه استانداردهای زبان برنامه‌نویسی ++C اختصاص داره. بنابراین، WG21 به گروه کاری ۲۱ مربوط به استانداردهای سی‌پلاس‌‌پلاس اطلاق می‌شه. این یعنی این زبان مثل هر اسبا‌ب‌بازی ای که مدام باهاشون سر و کار دارید پیش نمیره! این یک ابزار و فناوری به شدت مهم و حساس هست نه یک ابزار که اگه همین الآن حذفش کنی دنیا عین خیالشم نباشه. پس مهمه که مسئولیت‌ها و همهٔ سیر تا پیاز‌های توسعهٔ چنین چیزی اصولی و با حساسیت پیش بره و طبق استاندارد سازمان جهانی معرفی بشه.

حالا بریم سر استاندارد‌ها و پیش‌نویسه‌ها که می‌خوام ببینم اون‌های یکه مدعی هستن و داستان می‌گن دقیقاً چقدر از این مستندات رومطالعه کردن:

من عادت ندارم یه چیزی رو با پیشنهاد این و اون یا نمی‌دونم همینطوری الکی با جو تبلیغاتی پیگیر باشم، اما چیزی که می‌دونم در مورد این زبان اولین مستندات و مقالاتی که در موردش ارائه شدن از سال ۱۹۸۹ بوده! دقیقاً سالی که من به دنیا اومدم! هم سنیم!!! :) ۳۴ سال پیش! و خیلی از شماها هم که شاید بودین اما تو باغ نبودین! مستنداتش در این لینک موجوده:

https://www.open-std.org/jtc1/sc22/wg21/docs/papers/1989

لینک اصلی برای دسترسی به همهٔ مستنداتی که در دسترس قرار گرفتن اینجاست:


https://www.open-std.org/jtc1/sc22/wg21/docs/papers
از سال ۱۹۸۹ تا به الآن هرچی که بوده مستند شده.
پیشنهاد نمی‌کنم برید همرو بخونید چون لازم نیست! اما موضوعی که خلاصه می‌خوام بگم اینه که همهٔ بازخورد‌ها از سراسر جهان از افراد متخصص و خبره که دانششون خیلی سرتر از من و شماست سال‌هاست برای کمیتهٔ استاندارد‌سازی ارسال میشه.

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

https://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html

مهم‌ترین عناوین استاندارد شده که ارائه و به تصویب نهایی رسیدن به صورت زیر هستند:

N1316 : 1989/2003
N3242 : 2011
N3797 : 2014
N4659 : 2017
N4849 : 2020



این‌ها مستندات مجموعاً به صورت خلاصه‌وار چندین هزار صفحه هستن که طی سال‌ها روشون کار شده! همه چیز اونطور که باید خیلی فراتر از حرف‌های پیش و پا افتادهٔ بچه‌گانهٔ بعضی‌ها که توی گروه‌ها دارن دست به دست می‌کنن بررسی شده که نظر شما حتی توش معنا نداره!

چیزی که مسخرست اینه که بین این چندین هزار مستند مدعی‌ها حتی ۱ صفحش رو نخوندن بعد میان اینجا صحبت از مشکل حافظه، نمی‌دونم مشکل امنیت و این مسائل می‌کنند! آخه بچه جان هر موقع نصف عمرت رو گذاشتی روی یه تخصص و بارها مستنداتش رو خوندی و متوجه بودی که جریان چی هست و راهکار چه چیزی، اون موقع توی گروه‌ها داستان بنویس. این‌که هیچی در مورد هیچ چیزی نمی‌دونید رو می‌خواین ثابت کنید؟! کدوم زبان بچه‌بازی‌ای با همچین مستنداتی و با این عمق از اطلاعات از سر تا سر دنیا در حال توسعست که هر روز یه داستان در میارید توی گروه‌های فارسی؟ فکر کردین کشکه که در موردش نظر میدین.

در مورد همهٔ موضوعاتی که هر روز بحثش هست، از مشکل مدیریت وابستگی‌ها گرفته تا مسائل مربوط به حافظه و ده‌ها داستان دیگه.
اولاً که هیچ چیزی کامل نیست و نسخه‌نگاری رو برای همین گذاشتن! کسی که وارد مهندسی نرم‌افزار میشه دیگه نباید بحث‌های چرند این شکلی رو هر روز تکرار کنه چون می‌دونه فناوری بر مبنای بازخورد در حال پیشرفته.

خلاصهٔ کلی این مستندات و نتیجش به عنوان پیشنهاد من این هست:

برنامه‌نویسی مدرن و جدید با استاندارد حداقل ۱۷ به بعد رو یاد بگیر، به خصوص استاندارد ۲۰ اصلاً یک دنیای جدیدی از برنامه‌نویسی هست:

۱) استفاده از مدیریت هوشمند حافظه، تکنیک RAII و ... این روشی مثل GC نیست، چرندیاتی که بعضی‌ها تو سایت‌ها نوشتن رو بذار کنار، قبلاً در موردش توضیح دادم، سایت رو شخم بزنید پیداش می‌کنید.

۲) از ویژگی‌های Contracts که این امکان رو فراهم می‌کنه تا شرایط پیش‌فرض و پس‌فرض برای توابع مشخص شده و در زمان اجرا بررسی بشه رو یاد بگیر.

۳) از Concepts‌ها استفاده کن، مفاهیم در استاندارد ۲۰ به عنوان یک ویژگی مهم معرفی شده است. Concepts به برنامه‌نویسان این امکان را میده که شرایط مورد نیاز برای یک الگو رو در زمان کامپایل مشخص کنه. این اهمیت اجازه میده تا خطاهای کامپایلی بهتری در زمان کامپایل تشخیص داده بشه و اطمینان حاصل بشه که یک الگو فقط برای نوع‌هایی که شرایط معین را دارا هستند، استفاده می‌شود.

۴) مدیریت وابستگی‌ها؟ از CMake استفاده کن! یا به هر روشی که دلت می‌خواد وابستگی‌ها رو مدیریت کن یا از vcpkg یا conan استفاده کن! این واقعاً چرند‌ترین موضوعه که می‌گن سخته! بله برای کسی که متخصص نیست طبیعیه که سخت باشه، قرار نیست همه متخصص باشن! من برای خودم PT رو دارم!

۵) سادگی بیشتر؟! از استاندارد ۱۷ به بعد رو یاد بگیر و در استاندارد‌های جدیدتر با توالی‌ها (ranges) با متداول‌ترین عملیات‌های جستجو، تغییر، و فیلتر که کدهای حلقه رو ساده‌تر و خواناتر کن.

۶) کروتین‌ها رو یاد بگیر! اضافه شدن ویژگی کروتین‌ها (Coroutines) که اجازه میده تا کدهای همروندی و موازی را با استفاده از نحوی ساده‌تر و خواناتر پیاده‌سازی کنی بسیار کارآمد هستند.

۷) شاکی هستی از مدیریت فایل سنتی؟! من مشکلی با این موضوع ندارم! ولی خب ماژول‌ها (Modules) به شما این امکان رو میده که کدهای تقسیم شده‌ای داشته باشی و کاهش تداخل‌های نام (name collisions) رو فراهم می‌کنه و کم کم این روش رو می‌تونی یاد بگیری.

۸) بحث constexpr رو جدی بگیر، بهبود‌های بسیاری می‌تونی به واسطهٔ این ویژگی در کدت اعمال کنی که در زمان کامپایل مطمئن‌تر خواهد بود.

۹) روش‌های بهینه‌نویسی، ساده‌نویسی رو یاد بگیر! برنامه‌نویسی خلاقیت می‌خواد نه اینکه بشینی هرچی تو کتاب نوشت رو یاد بگیری بگی تموم شد!

۱۰) به دنیای هیولای زبان‌های برنامه‌نویسی خوش اومدی. 👊🏼 لامصب عین همون گودزیلا تو هر نسخهٔ جدیدش خوشگل‌تر و با ابوهت می‌شه. ☺️😎
بای بای جینقولیا، تا پند‌هایی دیگر به درود. 😜👊🏼

#cpp #moderncpp #advancedproramming #notes
1👍1
این محتوا همرو از کانال قبلی بازیابی کردم... 😍
هزاران پست هست چه تخصصی چه غیر تخصصی! 😢
Please open Telegram to view this post
VIEW IN TELEGRAM