Amin'sTechLab
🤯 Microsoft releases AI Engineering Coach as open-source! Need to supercharge your AI-assisted coding? This new extension for VS Code, Cursor, and Antigravity is exactly what you need. It analyzes your interactions with tools like GitHub Copilot and Claude…
🤯 مایکروسافت «AI Engineering Coach» را به صورت اوپنسورس منتشر کرد!
آیا میخواهید بهرهوری خود را در کدنویسی با هوش مصنوعی به سطح بالاتری ببرید؟ این افزونه جدید برای VS Code، Cursor و Antigravity دقیقاً همان چیزی است که به آن نیاز دارید. این ابزار تعاملات شما با دستیارهایی مثل GitHub Copilot و Claude Code را تحلیل میکند تا هوشمندتر از همیشه کد بزنید.
ویژگیهای کلیدی:
✅ ارزیابی گردش کار: کیفیت پرامپتها و نحوه مدیریت «زمینه» (Context) شما را امتیازدهی میکند.
✅ عیبیابی هوشمند: بیش از ۴۵ «عادت بد» رایج، مثل مصرف بیرویه توکنها را شناسایی میکند.
✅ بهینهسازی اختصاصی: الگوهای تکراری پرامپتهای شما را به مهارتهای ویژه برای عوامل هوش مصنوعی تبدیل میکند.
✅ شفافیت کامل: تمام قوانین در فایلهای Markdown ذخیره میشوند تا بتوانید آنها را مطابق نیاز خود شخصیسازی کنید.
دیگر حدس نزنید که آیا از هوش مصنوعی به درستی استفاده میکنید یا نه؛ وقت آن است که عملکرد خود را اندازهگیری و بهینه کنید.
🔗 لینک گیتهاب:
https://github.com/microsoft/AI-Engineering-Coach
@AminTechlab
آیا میخواهید بهرهوری خود را در کدنویسی با هوش مصنوعی به سطح بالاتری ببرید؟ این افزونه جدید برای VS Code، Cursor و Antigravity دقیقاً همان چیزی است که به آن نیاز دارید. این ابزار تعاملات شما با دستیارهایی مثل GitHub Copilot و Claude Code را تحلیل میکند تا هوشمندتر از همیشه کد بزنید.
ویژگیهای کلیدی:
✅ ارزیابی گردش کار: کیفیت پرامپتها و نحوه مدیریت «زمینه» (Context) شما را امتیازدهی میکند.
✅ عیبیابی هوشمند: بیش از ۴۵ «عادت بد» رایج، مثل مصرف بیرویه توکنها را شناسایی میکند.
✅ بهینهسازی اختصاصی: الگوهای تکراری پرامپتهای شما را به مهارتهای ویژه برای عوامل هوش مصنوعی تبدیل میکند.
✅ شفافیت کامل: تمام قوانین در فایلهای Markdown ذخیره میشوند تا بتوانید آنها را مطابق نیاز خود شخصیسازی کنید.
دیگر حدس نزنید که آیا از هوش مصنوعی به درستی استفاده میکنید یا نه؛ وقت آن است که عملکرد خود را اندازهگیری و بهینه کنید.
🔗 لینک گیتهاب:
https://github.com/microsoft/AI-Engineering-Coach
@AminTechlab
GitHub
GitHub - microsoft/AI-Engineering-Coach: better agentic engineering
better agentic engineering. Contribute to microsoft/AI-Engineering-Coach development by creating an account on GitHub.
👍4
درود بر تمام عزیزان
خوش حالم که انلاین شدید ، خوش حالم که هستید و بهم پیام دادید .
همیشه حال دلتون خوب باشه به امید اینکه به ازادی برسیم به ازادی اینترنت که نخوایم فیلتر شکن روشن کنیم.
به امید روزهای خوب .... خوشحالم دوستانی مثل شما دارم . ✨❤️
خوش حالم که انلاین شدید ، خوش حالم که هستید و بهم پیام دادید .
همیشه حال دلتون خوب باشه به امید اینکه به ازادی برسیم به ازادی اینترنت که نخوایم فیلتر شکن روشن کنیم.
به امید روزهای خوب .... خوشحالم دوستانی مثل شما دارم . ✨❤️
❤11
Forwarded from Linuxor ?
انقدر نگید زبان C منسوخ میشه زبان C اصلا پتانسیل منسوخ شدن نداره، منسوخ شدن یعنی مثلا بیان سایت پایتون رو جمع کنن یا ریپازیتوری هاشو جمع کنن ولی زبان سی نه سایتی داره نه ریپازیتوری نه چیزی همینطوری داره دست به دست نسل به نسل جلو میره؛ اینم یه منبع خوب برای یادگیری C اکثر آموزش هاش پروژه محوره :
github.com/7etsuo/project-based-tutorials-in-c
@Linuxor
github.com/7etsuo/project-based-tutorials-in-c
@Linuxor
🔥6❤2👍1👎1
The Linux Programming inTerface
A Linux and UNIX®
System Programming Handbook
Michael KerrisK
@Amin_TechLab
👇👇👇👇👇👇👇
A Linux and UNIX®
System Programming Handbook
Michael KerrisK
@Amin_TechLab
👇👇👇👇👇👇👇
👍4❤1
829755_The_Linux_programming_interface_a_Linux_and_UNIX_system_programming.pdf
6.9 MB
The Linux Programming inTerface
A Linux and UNIX®
System Programming Handbook
Michael KerrisK
@Amin_TechLab
A Linux and UNIX®
System Programming Handbook
Michael KerrisK
@Amin_TechLab
❤4🔥1
رفقا براتون یک سری رفرنس خوب برای آشنایی عمیق از لینوکس فرستادم .
اینکه چی میخونید برق یا کامپیوتر مهم نیست ، صفت بچسبید لینوکس یادبگیرید .
اگر لینوکس بلد بودید به نظرم میدونی کامپیوتر که جلوت هست چه جوری میتونی به بهترین و بهینه ترین شکل ممکن ازش استفاده کنید .
اینو من راجب تمام سیستم عامل های unix بیس میگم ، ولی اگر بلد نبودی به نظرم با اون حساب دار یا انبار داری که اکسل رو باز میکنه تو ویندوزش هیچ فرق نداریم .
اگر لینوکس بدونی ، یعنی سخت افزار رو درک کردی ،
اگر لینوکس بدونی یعنی میفهمی زبان برنامه سطح پایین چیه
اگر لینوکس بدونی یعنی سی بلدی
اگر لینوکس بدونی یعنی مدیریت تسک رو درک کردی
اگر لینوکس بدونی یعنی کامپیوتر رو فهمیدی ....
ارادمند تمام عزیزان 🫡🌹
@Amin_TechLab
اینکه چی میخونید برق یا کامپیوتر مهم نیست ، صفت بچسبید لینوکس یادبگیرید .
اگر لینوکس بلد بودید به نظرم میدونی کامپیوتر که جلوت هست چه جوری میتونی به بهترین و بهینه ترین شکل ممکن ازش استفاده کنید .
اینو من راجب تمام سیستم عامل های unix بیس میگم ، ولی اگر بلد نبودی به نظرم با اون حساب دار یا انبار داری که اکسل رو باز میکنه تو ویندوزش هیچ فرق نداریم .
اگر لینوکس بدونی ، یعنی سخت افزار رو درک کردی ،
اگر لینوکس بدونی یعنی میفهمی زبان برنامه سطح پایین چیه
اگر لینوکس بدونی یعنی سی بلدی
اگر لینوکس بدونی یعنی مدیریت تسک رو درک کردی
اگر لینوکس بدونی یعنی کامپیوتر رو فهمیدی ....
ارادمند تمام عزیزان 🫡🌹
@Amin_TechLab
👍8❤6👾2😢1
This media is not supported in your browser
VIEW IN TELEGRAM
🔍 Unlimited-OCR by Baidu
A powerful OCR model from Baidu that takes things a step beyond DeepSeek-OCR. It features long-horizon parsing, enabling one-shot processing of lengthy documents—including single images, multi-page documents, and entire PDFs.
The model supports Transformers and SGLang, and delivers high-quality structured outputs for document understanding and information extraction.
🔗 github.com/baidu/Unlimited-OCR
@Amin_TechLab
A powerful OCR model from Baidu that takes things a step beyond DeepSeek-OCR. It features long-horizon parsing, enabling one-shot processing of lengthy documents—including single images, multi-page documents, and entire PDFs.
The model supports Transformers and SGLang, and delivers high-quality structured outputs for document understanding and information extraction.
🔗 github.com/baidu/Unlimited-OCR
@Amin_TechLab
👍3
🐍 آشنایی با چند اپراتور کمتر شناختهشده در پایتون
در پایتون، مقادیری که روی آنها عملیات انجام میشود را Operand و نماد انجامدهنده عملیات را Operator مینامیم.
برای مثال در کد زیر:
متغیرهای
اما در میان اپراتورهای پایتون، موردی وجود دارد که خیلی از برنامهنویسها کمتر با آن آشنا هستند: Walrus Operator (
این اپراتور علاوه بر انجام مقایسه یا ارزیابی یک عبارت، همزمان مقدار آن را در یک متغیر نیز ذخیره میکند.
مثلاً معمولاً کدی شبیه این مینویسیم:
اما با استفاده از Walrus Operator میتوان همان کار را به شکل خلاصهتر انجام داد:
نکته جالب اینجاست که فارغ از نتیجه شرط، متغیر
حالا سراغ یک اپراتور عجیبتر برویم؛ چیزی که احتمالاً هرگز در کدهای واقعی ندیدهاید!
در نسخههای قدیمی پایتون، برای عملگر «نامساوی» بهجای
بعد از اجرای این دستور، پایتون شما را مجبور میکند به جای
نام این قابلیت از Barry Warsaw، یکی از توسعهدهندگان قدیمی پایتون، گرفته شده است.
البته کاربرد عملی خاصی ندارد و بیشتر یک شوخی تاریخی در دل زبان پایتون محسوب میشود. 😄
📚 منبع:
https://blog.imsadra.dev/10-python-easter-eggs
@Amin_TechLab
در پایتون، مقادیری که روی آنها عملیات انجام میشود را Operand و نماد انجامدهنده عملیات را Operator مینامیم.
برای مثال در کد زیر:
if x > y:
...
متغیرهای
x و y نقش Operand را دارند و علامت > یک Operator است.اما در میان اپراتورهای پایتون، موردی وجود دارد که خیلی از برنامهنویسها کمتر با آن آشنا هستند: Walrus Operator (
:=).این اپراتور علاوه بر انجام مقایسه یا ارزیابی یک عبارت، همزمان مقدار آن را در یک متغیر نیز ذخیره میکند.
مثلاً معمولاً کدی شبیه این مینویسیم:
length = len("test1234")
if length < 8:
print(f"Your password is {length} chars long.")اما با استفاده از Walrus Operator میتوان همان کار را به شکل خلاصهتر انجام داد:
if (length := len("test1234")) < 8:
print(f"Your password is {length} chars long.")نکته جالب اینجاست که فارغ از نتیجه شرط، متغیر
length پس از اجرای این دستور همچنان در دسترس خواهد بود.حالا سراغ یک اپراتور عجیبتر برویم؛ چیزی که احتمالاً هرگز در کدهای واقعی ندیدهاید!
در نسخههای قدیمی پایتون، برای عملگر «نامساوی» بهجای
!= از <> استفاده میشد. این سینتکس سالهاست منسوخ شده، اما هنوز بهعنوان یک ایستر اگ (Easter Egg) در پایتون وجود دارد.from __future__ import barry_as_FLUFL
بعد از اجرای این دستور، پایتون شما را مجبور میکند به جای
!= از <> استفاده کنید:>>> 2 != 3
SyntaxError: with Barry as BDFL, use '<>' instead of '!='
>>> 2 <> 3
True
نام این قابلیت از Barry Warsaw، یکی از توسعهدهندگان قدیمی پایتون، گرفته شده است.
البته کاربرد عملی خاصی ندارد و بیشتر یک شوخی تاریخی در دل زبان پایتون محسوب میشود. 😄
📚 منبع:
https://blog.imsadra.dev/10-python-easter-eggs
@Amin_TechLab
👾2❤1🔥1
🐍 چرا Generic Typing در پایتون اهمیت دارد؟
بسیاری از توسعهدهندگان هنگام استفاده از Type Hinting فقط سراغ انواع مشخصی مثل
به جای اینکه برای هر نوع داده یک تابع جداگانه تعریف کنید، میتوانید یک Type Variable بسازید و نوع ورودی و خروجی را به آن وابسته کنید. در این حالت ابزارهایی مانند MyPy و Pyright نیز میتوانند ناسازگاریهای نوعی را قبل از اجرای برنامه تشخیص دهند.
در مثال بالا، تابع
برای درک بهتر قدرت Genericها، به مثال زیر توجه کنید:
این تابع بسته به نوع دادهای که دریافت میکند، مقدار
حتی برای انواع تعریفشده توسط خودتان نیز همین اتفاق میافتد:
همانطور که میبینید، نوع
❓ چرا معمولاً از حرف
در واقع هیچ اجباری برای استفاده از
بنابراین کد زیر کاملاً معتبر است:
همچنین میتوانید از چند Generic Type بهطور همزمان استفاده کنید:
در این مثال، نوع
Generic Typing یکی از ابزارهای مهم برای نوشتن کدهای reusable، type-safe و قابل نگهداری در پروژههای بزرگ پایتونی است.
📚 منبع:
https://blog.imsadra.dev/generic-typing-in-python
@Amin_TechLab
بسیاری از توسعهدهندگان هنگام استفاده از Type Hinting فقط سراغ انواع مشخصی مثل
str، int یا list[str] میروند. اما وقتی یک تابع یا کلاس قرار است با چند نوع داده مختلف کار کند، Generic Typing به شما کمک میکند بدون از دست دادن Type Safety، کدی منعطفتر و قابلاستفادهتر بنویسید.به جای اینکه برای هر نوع داده یک تابع جداگانه تعریف کنید، میتوانید یک Type Variable بسازید و نوع ورودی و خروجی را به آن وابسته کنید. در این حالت ابزارهایی مانند MyPy و Pyright نیز میتوانند ناسازگاریهای نوعی را قبل از اجرای برنامه تشخیص دهند.
from typing import TypeVar
T = TypeVar("T")
def first(items: list[T]) -> T:
return items[0]
در مثال بالا، تابع
first میتواند لیستی از هر نوع دادهای را دریافت کند؛ اما نوع خروجی همیشه دقیقاً با نوع عناصر لیست یکسان خواهد بود.برای درک بهتر قدرت Genericها، به مثال زیر توجه کنید:
def select[T](items: list[T]) -> T:
...
این تابع بسته به نوع دادهای که دریافت میکند، مقدار
T را بهصورت خودکار تعیین میکند:select([1, 2, 3, 4, 5]) # T = int
select(["a", "b", "c"]) # T = str
select([1.2, 1.3, 1.4]) # T = float
حتی برای انواع تعریفشده توسط خودتان نیز همین اتفاق میافتد:
users = [User("Abby"), User("Chris"), User("Nick")]
select(users) # T = Userهمانطور که میبینید، نوع
T ثابت نیست و بر اساس نوع دادهای که به تابع ارسال میشود تعیین خواهد شد. این دقیقاً جوهره Generic Typing است.❓ چرا معمولاً از حرف
T استفاده میشود؟در واقع هیچ اجباری برای استفاده از
T وجود ندارد. این فقط یک قرارداد رایج بین برنامهنویسان است؛ درست مثل بسیاری از Conventionهای دیگر در دنیای توسعه نرمافزار.بنابراین کد زیر کاملاً معتبر است:
def duplicate[B](item: B) -> tuple[B, B, B]:
return (item, item, item)
همچنین میتوانید از چند Generic Type بهطور همزمان استفاده کنید:
def pair[A, B](first: A, second: B) -> tuple[A, B]:
return (first, second)
در این مثال، نوع
A و B مستقل از یکدیگر هستند و میتوانند هر نوع دادهای را نمایش دهند.Generic Typing یکی از ابزارهای مهم برای نوشتن کدهای reusable، type-safe و قابل نگهداری در پروژههای بزرگ پایتونی است.
📚 منبع:
https://blog.imsadra.dev/generic-typing-in-python
@Amin_TechLab
Sadra Yahyapour
Generic Typing in Python
Since Python introduced the ability to add generic types to functions, the language has become much more type-friendly and encourages you to follow this convention for more maintainable code. Obviously, this will lead to a better development experien...
🔥4
❌ پیام آخرین Commit رو اشتباه نوشتید؟
لازم نیست برای اصلاحش یک Commit جدید بسازید.
اگر میخواهید پیام آخرین Commit را تغییر دهید، میتوانید از Interactive Rebase استفاده کنید:
سپس در فایل بازشده، این خط را:
به این شکل تغییر دهید:
بعد از ذخیره و خروج، Git از شما میخواهد پیام جدید Commit را وارد کنید:
📌 دستورات مهم در Interactive Rebase:
💡 البته اگر فقط قصد دارید پیام آخرین Commit را تغییر دهید، معمولاً این دستور سریعتر و سادهتر است:
@Amin_TechLab
لازم نیست برای اصلاحش یک Commit جدید بسازید.
اگر میخواهید پیام آخرین Commit را تغییر دهید، میتوانید از Interactive Rebase استفاده کنید:
git rebase -i HEAD~1
سپس در فایل بازشده، این خط را:
pick abc123 Fix logni page
به این شکل تغییر دهید:
reword abc123 Fix logni page
بعد از ذخیره و خروج، Git از شما میخواهد پیام جدید Commit را وارد کنید:
Fix login page
📌 دستورات مهم در Interactive Rebase:
pick → استفاده از Commit بدون تغییرreword → تغییر پیام Commitedit → ویرایش Commitsquash → ادغام با Commit قبلیfixup → ادغام بدون نگه داشتن پیام Commitdrop → حذف Commit💡 البته اگر فقط قصد دارید پیام آخرین Commit را تغییر دهید، معمولاً این دستور سریعتر و سادهتر است:
git commit --amend -m "NEW MESSAGE"
@Amin_TechLab
👍2🙏2🔥1
💻 آشنایی با چند اپراتور کمتر شناختهشده در زبان C
در زبان C، مقادیری که روی آنها عملیات انجام میشود را Operand و نماد انجامدهنده عملیات را Operator مینامیم.
برای مثال در کد زیر:
متغیرهای
اما در میان اپراتورهای زبان C، چند مورد وجود دارد که شاید کمتر به آنها توجه کرده باشید.
یکی از آنها Comma Operator یا همان اپراتور ویرگول است.
در زبان C، ویرگول همیشه فقط برای جدا کردن آرگومانها یا متغیرها نیست؛ گاهی خودش یک اپراتور واقعی است.
این اپراتور چند عبارت را از چپ به راست اجرا میکند، اما مقدار نهایی آن برابر با مقدار آخرین عبارت است.
مثلاً:
در این کد، ابتدا دستور
یعنی بعد از اجرای کد بالا، مقدار
یک نمونه کاربردیتر:
در اینجا ابتدا مقدار
البته باید حواسمان باشد که استفاده زیاد از این اپراتور میتواند خوانایی کد را پایین بیاورد؛ برای همین معمولاً بهتر است فقط در جاهایی استفاده شود که واقعاً کد را تمیزتر میکند.
حالا سراغ یک مورد عجیبتر برویم؛ چیزی که خیلی از برنامهنویسهای C حتی اسمش را هم کمتر شنیدهاند: Digraphs.
در زبان C، برای بعضی از نمادها، شکلهای جایگزین وجود دارد.
مثلاً به جای
یعنی این کد:
میتواند به شکل زیر هم نوشته شود:
یا مثلاً به جای
که معادل این کد است:
این قابلیت در گذشته برای سیستمهایی کاربرد داشت که بعضی کاراکترهای خاص مثل
امروزه Digraphها تقریباً کاربرد عملی خاصی ندارند و بیشتر بهعنوان یک ویژگی تاریخی و عجیب در زبان C شناخته میشوند. 😄
@Amin_TechLab
در زبان C، مقادیری که روی آنها عملیات انجام میشود را Operand و نماد انجامدهنده عملیات را Operator مینامیم.
برای مثال در کد زیر:
if (x > y) {
...
}متغیرهای
x و y نقش Operand را دارند و علامت > یک Operator است.اما در میان اپراتورهای زبان C، چند مورد وجود دارد که شاید کمتر به آنها توجه کرده باشید.
یکی از آنها Comma Operator یا همان اپراتور ویرگول است.
در زبان C، ویرگول همیشه فقط برای جدا کردن آرگومانها یا متغیرها نیست؛ گاهی خودش یک اپراتور واقعی است.
این اپراتور چند عبارت را از چپ به راست اجرا میکند، اما مقدار نهایی آن برابر با مقدار آخرین عبارت است.
مثلاً:
int x;
x = (printf("Hello\n"), 10);
در این کد، ابتدا دستور
printf اجرا میشود و سپس مقدار 10 داخل متغیر x قرار میگیرد.یعنی بعد از اجرای کد بالا، مقدار
x برابر با 10 خواهد بود.یک نمونه کاربردیتر:
int i = 0;
int j = 0;
while (i < 5)
j += i, i++;
در اینجا ابتدا مقدار
i به j اضافه میشود و سپس i یک واحد افزایش پیدا میکند.البته باید حواسمان باشد که استفاده زیاد از این اپراتور میتواند خوانایی کد را پایین بیاورد؛ برای همین معمولاً بهتر است فقط در جاهایی استفاده شود که واقعاً کد را تمیزتر میکند.
حالا سراغ یک مورد عجیبتر برویم؛ چیزی که خیلی از برنامهنویسهای C حتی اسمش را هم کمتر شنیدهاند: Digraphs.
در زبان C، برای بعضی از نمادها، شکلهای جایگزین وجود دارد.
مثلاً به جای
{ و } میتوان از <% و %> استفاده کرد.یعنی این کد:
int main() {
return 0;
}میتواند به شکل زیر هم نوشته شود:
int main() <%
return 0;
%>
یا مثلاً به جای
[ و ] میتوان از <: و :> استفاده کرد:int arr<:3:> = <%1, 2, 3%>;
که معادل این کد است:
int arr[3] = {1, 2, 3};این قابلیت در گذشته برای سیستمهایی کاربرد داشت که بعضی کاراکترهای خاص مثل
{ یا [ روی کیبورد یا سیستمعاملشان بهراحتی در دسترس نبود.امروزه Digraphها تقریباً کاربرد عملی خاصی ندارند و بیشتر بهعنوان یک ویژگی تاریخی و عجیب در زبان C شناخته میشوند. 😄
@Amin_TechLab
❤2👍1🔥1
💻 یکی از خطرناکترین مفاهیم در زبان C: Undefined Behavior
در زبان C، همیشه اینطور نیست که هر کدی که کامپایل میشود، الزاماً رفتار مشخص و قابل اعتمادی داشته باشد.
گاهی برنامه از نظر ظاهری درست به نظر میرسد، کامپایلر هم هیچ خطایی نمیدهد، اما نتیجه اجرای برنامه میتواند کاملاً غیرقابل پیشبینی باشد.
به این حالت در زبان C میگوییم:
Undefined Behavior
یا به اختصار: UB
یعنی استاندارد زبان C هیچ تضمینی نمیدهد که برنامه دقیقاً چه رفتاری داشته باشد.
برای مثال به این کد دقت کنید:
شاید در نگاه اول فکر کنیم مقدار
اما مشکل اینجاست که در این عبارت، متغیر
نتیجه؟
ممکن است در یک کامپایلر عددی چاپ شود، در کامپایلر دیگر عددی متفاوت، و حتی با تغییر سطح optimization نتیجه عوض شود.
مثلاً اجرای برنامه با:
ممکن است یک خروجی بدهد، اما با:
خروجی متفاوتی ببینیم.
این یعنی برنامه وارد محدودهی Undefined Behavior شده است.
یک نمونه معروفتر:
اینجا ما در حال دسترسی به خانهای خارج از محدودهی آرایه هستیم.
زبان C جلوی ما را نمیگیرد، اما این به معنی درست بودن کد نیست.
ممکن است برنامه اجرا شود، ممکن است مقدار بیمعنی چاپ کند، ممکن است crash کند، یا حتی ظاهراً بدون مشکل کار کند.
و همین «ظاهراً بدون مشکل کار کردن» خطرناکترین بخش ماجراست.
در زبانهایی مثل Python یا Java معمولاً چنین خطاهایی سریعتر و واضحتر مشخص میشوند، اما در C مسئولیت زیادی روی دوش برنامهنویس است.
برای جلوگیری از Undefined Behavior بهتر است:
بهجای نوشتن عبارتهای پیچیده، تغییرات را مرحلهبهمرحله و خوانا بنویسیم.
زبان C بسیار سریع، قدرتمند و نزدیک به سختافزار است؛ اما همین قدرت باعث میشود کوچکترین بیدقتی، رفتار برنامه را غیرقابل پیشبینی کند.
پس در C فقط کامپایل شدن کد کافی نیست؛
باید مطمئن باشیم کد از نظر استاندارد زبان هم رفتار مشخصی دارد. ⚠️
@Amin_TechLab
در زبان C، همیشه اینطور نیست که هر کدی که کامپایل میشود، الزاماً رفتار مشخص و قابل اعتمادی داشته باشد.
گاهی برنامه از نظر ظاهری درست به نظر میرسد، کامپایلر هم هیچ خطایی نمیدهد، اما نتیجه اجرای برنامه میتواند کاملاً غیرقابل پیشبینی باشد.
به این حالت در زبان C میگوییم:
Undefined Behavior
یا به اختصار: UB
یعنی استاندارد زبان C هیچ تضمینی نمیدهد که برنامه دقیقاً چه رفتاری داشته باشد.
برای مثال به این کد دقت کنید:
#include <stdio.h>
int main() {
int x = 5;
int y = x++ + ++x;
printf("%d\n", y);
return 0;
}
شاید در نگاه اول فکر کنیم مقدار
y قابل محاسبه است.اما مشکل اینجاست که در این عبارت، متغیر
x بیش از یک بار بین دو نقطهی مشخص از اجرای برنامه تغییر کرده است و ترتیب دقیق این تغییرات تضمینشده نیست.نتیجه؟
ممکن است در یک کامپایلر عددی چاپ شود، در کامپایلر دیگر عددی متفاوت، و حتی با تغییر سطح optimization نتیجه عوض شود.
مثلاً اجرای برنامه با:
gcc main.c
ممکن است یک خروجی بدهد، اما با:
gcc main.c -O2
خروجی متفاوتی ببینیم.
این یعنی برنامه وارد محدودهی Undefined Behavior شده است.
یک نمونه معروفتر:
int arr[3] = {1, 2, 3};
printf("%d\n", arr[5]);اینجا ما در حال دسترسی به خانهای خارج از محدودهی آرایه هستیم.
زبان C جلوی ما را نمیگیرد، اما این به معنی درست بودن کد نیست.
ممکن است برنامه اجرا شود، ممکن است مقدار بیمعنی چاپ کند، ممکن است crash کند، یا حتی ظاهراً بدون مشکل کار کند.
و همین «ظاهراً بدون مشکل کار کردن» خطرناکترین بخش ماجراست.
در زبانهایی مثل Python یا Java معمولاً چنین خطاهایی سریعتر و واضحتر مشخص میشوند، اما در C مسئولیت زیادی روی دوش برنامهنویس است.
برای جلوگیری از Undefined Behavior بهتر است:
int x = 5;
x++;
int y = x;
x++;
y += x;
بهجای نوشتن عبارتهای پیچیده، تغییرات را مرحلهبهمرحله و خوانا بنویسیم.
زبان C بسیار سریع، قدرتمند و نزدیک به سختافزار است؛ اما همین قدرت باعث میشود کوچکترین بیدقتی، رفتار برنامه را غیرقابل پیشبینی کند.
پس در C فقط کامپایل شدن کد کافی نیست؛
باید مطمئن باشیم کد از نظر استاندارد زبان هم رفتار مشخصی دارد. ⚠️
@Amin_TechLab
❤1🔥1👾1
🐍 سه نقطه
شاید در بعضی از کدهای پایتون چیزی شبیه این دیده باشید:
در نگاه اول ممکن است فکر کنیم این سه نقطه فقط برای خالی گذاشتن بدنه تابع استفاده شده یا چیزی شبیه
در واقع
یعنی سه نقطه در پایتون نه کامنت است، نه صرفاً یک علامت نمایشی، بلکه یک آبجکت واقعی از نوع
اما سؤال اصلی اینجاست:
آیا
نه دقیقاً.
مثلاً:
اینجا
«فعلاً این بخش خالی است، ولی از نظر syntax مشکلی ندارد.»
اما
خروجی:
پس تفاوت مهم اینجاست:
هیچ مقداری تولید نمیکند.
ولی:
یک آبجکت واقعی به نام
یکی از کاربردهای رایج
این روش بهخصوص در نوشتن اسکلت اولیه کلاسها، توابع، اینترفیسها یا کدهایی که قرار است بعداً تکمیل شوند، کاربرد دارد.
البته از نظر خوانایی، اگر فقط میخواهید بگویید «اینجا هنوز کاری انجام نمیشود»، استفاده از
اما
مثلاً:
در اینجا
همچنین در type hinting و stub fileها هم زیاد دیده میشود؛ مخصوصاً در فایلهایی که فقط ساختار تابع یا کلاس را مشخص میکنند، اما پیادهسازی واقعی ندارند.
مثلاً:
در این حالت،
پس دفعه بعد که در کد پایتون با
@Amin_TechLab
... در پایتون فقط برای زیبایی نیست!شاید در بعضی از کدهای پایتون چیزی شبیه این دیده باشید:
def process_data():
...
در نگاه اول ممکن است فکر کنیم این سه نقطه فقط برای خالی گذاشتن بدنه تابع استفاده شده یا چیزی شبیه
pass است؛ اما در پایتون، ... یک مفهوم واقعی دارد.در واقع
... همان آبجکتی به نام Ellipsis است.>>> ...
Ellipsis
>>> type(...)
<class 'ellipsis'>
یعنی سه نقطه در پایتون نه کامنت است، نه صرفاً یک علامت نمایشی، بلکه یک آبجکت واقعی از نوع
ellipsis محسوب میشود.اما سؤال اصلی اینجاست:
آیا
... همان pass است؟نه دقیقاً.
pass یک statement خالی است. یعنی وقتی پایتون به آن میرسد، هیچ کاری انجام نمیدهد و فقط اجازه میدهد ساختار کد از نظر نحوی معتبر باقی بماند.مثلاً:
def process_data():
pass
اینجا
pass فقط میگوید:«فعلاً این بخش خالی است، ولی از نظر syntax مشکلی ندارد.»
اما
... یک expression است، یعنی خودش یک مقدار واقعی تولید میکند:x = ...
print(x)
خروجی:
Ellipsis
پس تفاوت مهم اینجاست:
pass
هیچ مقداری تولید نمیکند.
ولی:
...
یک آبجکت واقعی به نام
Ellipsis است.یکی از کاربردهای رایج
... این است که در زمان طراحی اولیه کد، جای بخشهایی را که هنوز پیادهسازی نشدهاند نگه داریم:class UserService:
def create_user(self):
...
def delete_user(self):
...
این روش بهخصوص در نوشتن اسکلت اولیه کلاسها، توابع، اینترفیسها یا کدهایی که قرار است بعداً تکمیل شوند، کاربرد دارد.
البته از نظر خوانایی، اگر فقط میخواهید بگویید «اینجا هنوز کاری انجام نمیشود»، استفاده از
pass همچنان رایجتر و واضحتر است.اما
Ellipsis فقط برای خالی گذاشتن تابع نیست. در بعضی کتابخانهها، مخصوصاً در حوزههایی مثل NumPy، از ... برای indexing و slicing پیشرفته استفاده میشود.مثلاً:
array[..., 0]
در اینجا
... معنای خاصی دارد و به کتابخانه کمک میکند با ابعاد مختلف آرایهها راحتتر کار کند.همچنین در type hinting و stub fileها هم زیاد دیده میشود؛ مخصوصاً در فایلهایی که فقط ساختار تابع یا کلاس را مشخص میکنند، اما پیادهسازی واقعی ندارند.
مثلاً:
def connect(host: str, port: int) -> bool: ...
در این حالت،
... یعنی امضای تابع مشخص شده، اما بدنه آن در جای دیگری تعریف میشود یا فعلاً اهمیتی ندارد.پس دفعه بعد که در کد پایتون با
... روبهرو شدید، بدانید که این سه نقطه فقط یک جایخالی ساده نیست.... در پایتون همان Ellipsis است؛ یک آبجکت واقعی، با کاربردهایی فراتر از چیزی که در نگاه اول به نظر میرسد.@Amin_TechLab
👾3👍2