Forwarded from Geek Engineers ([ Taha. Dostifam ])
این هم از زبان برنامه نویسی Cyrus که ما موفق به ساختش شدیم.
قدیمیای کانال از روند توسعه ش خبر دارن :)
منتها حقیقتا راه دور و درازی در پیش داریم که توسعه کامپایلر مصیبت های خودشو داره. منتها با کمک و همراهی شما دوستان پیشرفت خیلی زیادی داشتیم و امیدواریم که از پس جبران حمایت های شما بر بیایم.
در حال حاضر داریم type system رو تست میکنیم تا اینکه تا حدی stable بشه. هر موقع استیبل بشه به ادامه دولوپ فیچر های high level مثل error handling و macro ها و generic type ها خواهیم پرداخت انشالله.
#cyrus
@cyrus_lang
https://github.com/cyrus-lang/Cyrus
قدیمیای کانال از روند توسعه ش خبر دارن :)
منتها حقیقتا راه دور و درازی در پیش داریم که توسعه کامپایلر مصیبت های خودشو داره. منتها با کمک و همراهی شما دوستان پیشرفت خیلی زیادی داشتیم و امیدواریم که از پس جبران حمایت های شما بر بیایم.
در حال حاضر داریم type system رو تست میکنیم تا اینکه تا حدی stable بشه. هر موقع استیبل بشه به ادامه دولوپ فیچر های high level مثل error handling و macro ها و generic type ها خواهیم پرداخت انشالله.
#cyrus
@cyrus_lang
https://github.com/cyrus-lang/Cyrus
❤1😁1
Forwarded from EBooks World
اگر همیشه کنجکاو بودهاید که پشت صحنهی مدلهای زبانی بزرگ مثل ChatGPT چه میگذرد، کتابی که به دنبالش بودید همینجاست!
کتاب Build a Large Language Model (From Scratch) نوشتهی Sebastian Raschka، فرصتی بینظیر برای یادگیری ساخت یک مدل زبانی از صفر است—کاملاً کاربردی، گامبهگام، و مناسب اجرا روی لپتاپ شخصی شما.
در این کتاب، نهتنها با مفاهیم اصلی مانند معماری ترنسفورمر و مکانیزم توجه آشنا میشوید، بلکه از پیشپردازش دادهها تا آموزش و تنظیم دقیق مدل برای وظایف خاص مثل طبقهبندی متن و پاسخ به دستورات انسانی را بهصورت کامل پیادهسازی خواهید کرد.
🔗https://www.ebooksworld.ir/post/index/1032
کتاب Build a Large Language Model (From Scratch) نوشتهی Sebastian Raschka، فرصتی بینظیر برای یادگیری ساخت یک مدل زبانی از صفر است—کاملاً کاربردی، گامبهگام، و مناسب اجرا روی لپتاپ شخصی شما.
در این کتاب، نهتنها با مفاهیم اصلی مانند معماری ترنسفورمر و مکانیزم توجه آشنا میشوید، بلکه از پیشپردازش دادهها تا آموزش و تنظیم دقیق مدل برای وظایف خاص مثل طبقهبندی متن و پاسخ به دستورات انسانی را بهصورت کامل پیادهسازی خواهید کرد.
🔗https://www.ebooksworld.ir/post/index/1032
❤3
خط بریل برای نابینایان:
در دهههای اخیر، خط بریل برای عموم مردم آشناتر شده است، زیرا آسانسورها و دستگاههای خودپرداز از بریل برای دسترسی آسانتر استفاده کردهاند(نمومش در آدامس های ایرانی )
این سیستم از الگویی از نقاط برجسته روی کاغذ ضخیم استفاده میکنه و برای استفاده سربازان در هنگام یادداشتبرداری به یکدیگر در تاریکی زمانی که سکوت ضروری بود در نظر گرفته شده بود سربازان میتوانستند این نقاط را با استفاده از یک قلم درفش(نوعی قلم خاص) در پشت کاغذ فرو کنند سپس نقاط برجسته را میشد با انگشتان خواند
نحوه کد گذاری:
در بریل، هر نمادی که در زبان نوشتاری معمولی استفاده میشود به طور خاص، حروف، اعداد و علائم نگارشی - به صورت یک یا چند نقطه برجسته در یک خانه دو در سه کدگذاری میشود
نقاط خانه معمولاً از ۱ تا ۶ شمارهگذاری میشوند
در دهههای اخیر، خط بریل برای عموم مردم آشناتر شده است، زیرا آسانسورها و دستگاههای خودپرداز از بریل برای دسترسی آسانتر استفاده کردهاند(نمومش در آدامس های ایرانی )
این سیستم از الگویی از نقاط برجسته روی کاغذ ضخیم استفاده میکنه و برای استفاده سربازان در هنگام یادداشتبرداری به یکدیگر در تاریکی زمانی که سکوت ضروری بود در نظر گرفته شده بود سربازان میتوانستند این نقاط را با استفاده از یک قلم درفش(نوعی قلم خاص) در پشت کاغذ فرو کنند سپس نقاط برجسته را میشد با انگشتان خواند
نحوه کد گذاری:
در بریل، هر نمادی که در زبان نوشتاری معمولی استفاده میشود به طور خاص، حروف، اعداد و علائم نگارشی - به صورت یک یا چند نقطه برجسته در یک خانه دو در سه کدگذاری میشود
نقاط خانه معمولاً از ۱ تا ۶ شمارهگذاری میشوند
❤2
TheCodəPod
خط بریل برای نابینایان: در دهههای اخیر، خط بریل برای عموم مردم آشناتر شده است، زیرا آسانسورها و دستگاههای خودپرداز از بریل برای دسترسی آسانتر استفاده کردهاند(نمومش در آدامس های ایرانی ) این سیستم از الگویی از نقاط برجسته روی کاغذ ضخیم استفاده میکنه…
مثال :
نقاط ۱، ۳ ،۵ برجسته هستند و نقاط ۲، ۴ و ۶ برجسته نیستند
دلیل اینکه این موضوع مطرح کردم و برای ما جالب هست این موضوع است، که نقاط دودویی هستند(مثل 0 و 1) یک نقطه یاصافه یا برجسته
نقاط ۱، ۳ ،۵ برجسته هستند و نقاط ۲، ۴ و ۶ برجسته نیستند
دلیل اینکه این موضوع مطرح کردم و برای ما جالب هست این موضوع است، که نقاط دودویی هستند(مثل 0 و 1) یک نقطه یاصافه یا برجسته
❤3
TheCodəPod
مثال : نقاط ۱، ۳ ،۵ برجسته هستند و نقاط ۲، ۴ و ۶ برجسته نیستند دلیل اینکه این موضوع مطرح کردم و برای ما جالب هست این موضوع است، که نقاط دودویی هستند(مثل 0 و 1) یک نقطه یاصافه یا برجسته
اگه به کد مورس هم دقت کنیم همین موضوع باینری بودن رو میبینیم یا نقطه یا خط تیره
2❤3👍1
وقتی کسی ازت میپرسه "با چه زبانی برنامه نویسی رو شروع کنم؟"
صرفا زبان مورد علاقه خودت رو بهش پیشنهاد نده!
بهتره که اول از اون شخص بپرسی دوست داره تو چه حوزهای فعالیت کنه. برای مثال:
فرانت اند: جاوااسکریپت
بک اند: جاوااسکریپت
موبایل: جاوااسکریپت
بازی: جاوااسکریپت
هوش مصنوعی: جاوااسکریپت
خلاصه که درست راهنمایی کنید 🫡
صرفا زبان مورد علاقه خودت رو بهش پیشنهاد نده!
بهتره که اول از اون شخص بپرسی دوست داره تو چه حوزهای فعالیت کنه. برای مثال:
فرانت اند: جاوااسکریپت
بک اند: جاوااسکریپت
موبایل: جاوااسکریپت
بازی: جاوااسکریپت
هوش مصنوعی: جاوااسکریپت
خلاصه که درست راهنمایی کنید 🫡
🤣3🤝3🖕1
TheCodəPod
Photo
خب خب خب… داستان این منطق عجیب جاوااسکریپت چیه؟! 🤔
برای اینکه بفهمیم چه اتفاقی میفته، باید یه کمی عملگرهای
💡 عملگر
عملگر
• وقتی هر دو operand عدد باشن ← ساده و منطقی جمع میکنه:
• وقتی هر دو operand رشته (string) باشن ← اونها رو به هم میچسبونه (concat):
• اما وقتی یکی عدد و یکی رشته باشه…
اینجاست که داستان عجیب میشه:
دلیلش اینه که عملگر
💡 عملگر
داستان عملگر
• وقتی هر دو operand عدد باشن ← درست مثل تفریق ریاضی عمل میکنه:
• وقتی یکی یا هر دو operand رشته باشن ← جاوااسکریپت اونها رو به عدد تبدیل میکنه و بعد تفریق میکنه:
🔑 جمعبندی رفتار
• عملگر
• باقی عملگرها مثل
📚 چند مثال جذاب
مثال ۱ – عدد ساده:
مثال ۲ – ترکیب رشته و عدد:
اینجا ابتدا عملگر
✅ جمعبندی نهایی
• عملگر
• عملگر
• اولویت اجرای عملگرهای
برای اینکه بفهمیم چه اتفاقی میفته، باید یه کمی عملگرهای
+ و - رو زیر ذرهبین ببریم.💡 عملگر
+ یا Binary Plusعملگر
+ رفتار متفاوتی نسبت به نوع داده operandها داره:• وقتی هر دو operand عدد باشن ← ساده و منطقی جمع میکنه:
2 + 2 = 4
• وقتی هر دو operand رشته (string) باشن ← اونها رو به هم میچسبونه (concat):
"2" + "2" = "22"
• اما وقتی یکی عدد و یکی رشته باشه…
اینجاست که داستان عجیب میشه:
"2" + 2 = "22"
دلیلش اینه که عملگر
+ وقتی نوع operandها یکی نباشه، اونها رو به رشته تبدیل میکنه."2" + 2 → "2" + "2" → "22"
💡 عملگر
- یا Binary Minusداستان عملگر
- کمی فرق داره:• وقتی هر دو operand عدد باشن ← درست مثل تفریق ریاضی عمل میکنه:
10 - 2 = 8
• وقتی یکی یا هر دو operand رشته باشن ← جاوااسکریپت اونها رو به عدد تبدیل میکنه و بعد تفریق میکنه:
"10" - 4 → 10 - 4 → 6
"10" - "4" → 10 - 4 → 6
🔑 جمعبندی رفتار
+ و - در جاوااسکریپت• عملگر
+ ← وقتی نوعها یکی نباشن، operandها رو تبدیل به string میکنه.• باقی عملگرها مثل
- * / operandها رو تبدیل به number میکنن و عملیات ریاضی انجام میدن.📚 چند مثال جذاب
مثال ۱ – عدد ساده:
2 + 2 - 2 → 4 - 2 → 2
مثال ۲ – ترکیب رشته و عدد:
"2" + 2 - 2 → "22" - 2 → 22 - 2 → 20
اینجا ابتدا عملگر
+ رشته و عدد رو تبدیل به "22" میکنه، بعد - اونها رو به عدد تبدیل میکنه و نتیجه 20 میشه.✅ جمعبندی نهایی
• عملگر
+ ← ترکیب رشتهها یا جمع اعداد. وقتی نوع operand ها ترکیبی از رشته و عدد باشه، هر دو به رشته تبدیل میشن.• عملگر
- ← تفریق اعداد. اگه هر دو operand یا یکی از اونها رشته باشن، جاوااسکریپت اونها رو به عدد تبدیل میکنه.• اولویت اجرای عملگرهای
+ و - از چپ به راست هست و همین باعث میشه بعضی ترکیبها عجیب به نظر برسن!👍2👏2
TheCodəPod
خب خب خب… داستان این منطق عجیب جاوااسکریپت چیه؟! 🤔 برای اینکه بفهمیم چه اتفاقی میفته، باید یه کمی عملگرهای + و - رو زیر ذرهبین ببریم. 💡 عملگر + یا Binary Plus عملگر + رفتار متفاوتی نسبت به نوع داده operandها داره: • وقتی هر دو operand عدد باشن ← ساده…
این موضوع توی پایتون هم اینجوریه که :
وقتی تو پایتون مینویسید
توجه کردید چرا خروجی 4 است و نه 22 ؟ در واقع پشت این اتفاق ساده یک فلسفه قدرتمند در پایتون پنهان شده است فلسفه ای به نام
Object-Oriented Programming
یا برنامه نویسی شئ گرایی
در پایتون همه چیز یک شئ (Object) است از اعداد و رشتهها گرفته تا توابع هر شیء دارای نوع (Type) و متدهای (Methods) خاص خودشو داره
مکانیسم داخلی پایتون
شناسایی نوع داده:
وقتی شما عبارت 2 + 2 را مینویسید، پایتون ابتدا دادههای اطراف عملگر + را بررسی میکند. پایتون تشخیص میدهد که هر دو 2 شیءهایی از نوع int (عدد صحیح) هستند
❗️فراخوانی متد add:
با توجه به اینکه هر دو شیء از نوع int هستند پایتون به سراغ کلاس int و متد مخصوص add رو که مربوط به این کلاس هست رو اجرا میکنه
این متد کد اجرا میکنه که عملیات جمع ریاضی را انجام میده
حالا فرض کنید کد زیر را بنویسید:
این حالت، پایتون نوع دادهها را از نوع str (رشته) تشخیص میده حالا پایتون به سراغ کلاس str میره و متد add مربوط به این کلاس را اجرا میکنه متد add در کلاس str که کد اون دو رشته به یکدیگر میچسبونه نه جمع ریاضی که تو متد add از کلاس int هست به همین دلیل خروجی این کد 22 خواهد بود
توجه کردید تو هردوتا مسله + بود ولی جواب متفاوت ؟
ویژگی پلی مورفیسم (Polymorphism):
سعنی یک عملگر(مثل +) رفتارهای مختلف داره
این ویژگی پایتون که یک عملگر (مثل +) رفتارهای متفاوتی بر اساس نوع دادههای اطراف خود داره، پلیمورفیسم (Polymorphism) نام دارد
پلیمورفیسم باعث میشود که کدهای پایتون بسیار انعطافپذیر و قابل فهم باشه چون عملگرها رفتار خود را با توجه به نوع شیء مورد نظر تنظیم میکنند
وقتی تو پایتون مینویسید
print(2 + 2)
توجه کردید چرا خروجی 4 است و نه 22 ؟ در واقع پشت این اتفاق ساده یک فلسفه قدرتمند در پایتون پنهان شده است فلسفه ای به نام
Object-Oriented Programming
یا برنامه نویسی شئ گرایی
در پایتون همه چیز یک شئ (Object) است از اعداد و رشتهها گرفته تا توابع هر شیء دارای نوع (Type) و متدهای (Methods) خاص خودشو داره
مکانیسم داخلی پایتون
شناسایی نوع داده:
وقتی شما عبارت 2 + 2 را مینویسید، پایتون ابتدا دادههای اطراف عملگر + را بررسی میکند. پایتون تشخیص میدهد که هر دو 2 شیءهایی از نوع int (عدد صحیح) هستند
❗️فراخوانی متد add:
با توجه به اینکه هر دو شیء از نوع int هستند پایتون به سراغ کلاس int و متد مخصوص add رو که مربوط به این کلاس هست رو اجرا میکنه
این متد کد اجرا میکنه که عملیات جمع ریاضی را انجام میده
حالا فرض کنید کد زیر را بنویسید:
print("2" + "2")این حالت، پایتون نوع دادهها را از نوع str (رشته) تشخیص میده حالا پایتون به سراغ کلاس str میره و متد add مربوط به این کلاس را اجرا میکنه متد add در کلاس str که کد اون دو رشته به یکدیگر میچسبونه نه جمع ریاضی که تو متد add از کلاس int هست به همین دلیل خروجی این کد 22 خواهد بود
توجه کردید تو هردوتا مسله + بود ولی جواب متفاوت ؟
ویژگی پلی مورفیسم (Polymorphism):
سعنی یک عملگر(مثل +) رفتارهای مختلف داره
این ویژگی پایتون که یک عملگر (مثل +) رفتارهای متفاوتی بر اساس نوع دادههای اطراف خود داره، پلیمورفیسم (Polymorphism) نام دارد
پلیمورفیسم باعث میشود که کدهای پایتون بسیار انعطافپذیر و قابل فهم باشه چون عملگرها رفتار خود را با توجه به نوع شیء مورد نظر تنظیم میکنند
❤🔥3👍2
TheCodəPod
این موضوع توی پایتون هم اینجوریه که : وقتی تو پایتون مینویسید print(2 + 2) توجه کردید چرا خروجی 4 است و نه 22 ؟ در واقع پشت این اتفاق ساده یک فلسفه قدرتمند در پایتون پنهان شده است فلسفه ای به نام Object-Oriented Programming یا برنامه نویسی شئ گرایی در…
این موضوع Polymorphism تو دنیای واقعی مثل ادمی که هرجا ی رنگی داره
پیش من بد تورو میگه پیش تو بد منو 😶🌫️
پیش من بد تورو میگه پیش تو بد منو 😶🌫️
👏4🤣4💩1👌1
تبدیل آبجکت به Primitive توی جاوااسکریپت
خب خب خب…
تا حالا فکر کردی وقتی دو تا آبجکت رو با هم جمع میکنی (
✋ اول اینو بدون
برخلاف زبانهایی مثل پایتون یا ++C، توی جاوااسکریپت نمیتونی بیای رفتار عملگرها رو مستقیم تغییر بدی.
یعنی خبری از متدهای جادویی (Magic Methods) مثل
پس نمیتونی بگی: "آبجکت من وقتی با + جمع شد، فلان کارو بکن!"
👈 جاوااسکریپت قبل از هر عملیات، آبجکتهارو خودکار تبدیل به primitive میکنه. بعد تازه میره سراغ اجرای اون عملگر.
📌 حالا اصلا primitive یعنی چی؟
توی جاوااسکریپت دو نوع داده اصلی داریم:
نوع اول 👈 Primitive ها: سادهترین نوع دادهها مثل number, string, boolean, null, undefined, symbol, bigint.
نوع دوم 👈 Objects: هر چیزی غیر از primitive ها! مثل object
حالا وقتی جاوااسکریپت نیاز داره روی یه آبجکت عملیاتی انجام بده (مثل جمع، تفریق، یا پرینت)، باید اون رو تبدیل کنه به یکی از primitive ها.
🔑 ماجرا با هینت (hint) شروع میشه
جاوااسکریپت بسته به شرایط مختلف، از سه تا hint استفاده میکنه تا بفهمه آبجکت رو به چی تبدیل کنه:
حالت اول 👈 "string": وقتی انتظار رشته داره.
مثال:
حالت دوم 👈 "number": وقتی نیاز به عدد هست.
مثال:
حالت سوم 👈 "default": وقتی جاوااسکریپت مطمئن نیست (مثل عملگر + که هم جمع عددی انجام میده هم رشتهها رو بهم میچسبونه).
مثال:
⚙️ الگوریتم تبدیل
وقتی یه آبجکت توی همچین موقعیتی باشه، جاوااسکریپت این مراحل رو میره جلو:
اگه متد obj[Symbol.toPrimitive](hint) وجود داشته باشه 👈 از همون استفاده میکنه.
اگه هینت string باشه 👈 اول متود toString() رو صدا میزنه، اگه وجود نداشت میره سراغ متود valueOf().
اگه هینت number یا default باشه 👈 اول متود valueOf() رو صدا میزنه، و اگه وجود نداشت میره سراغ متود toString().
📦 اگه چیزی پیادهسازی نکنیم چی؟
متود toString() برای یه آبجکت معمولی به صورت پیش فرض این رو برمیگردونه:
مثال:
متود valueOf() هم خود آبجکت رو برمیگردونه (که بیمصرفه) 🫤
🔧 مثال کاستومایز شده
حالا اگه بخوای رفتار رو کنترل کنی:
⚠️ نکته مهم:
متود های
📊 مقایسه با زبانهای دیگه
توی پایتون یا ++C میتونی مستقیماً رفتار عملگرها رو تغییر بدی (
ولی توی جاوااسکریپت، عملگرها دستکاری نمیشن.
فقط میتونی تعیین کنی وقتی آبجکت به primitive تبدیل شد، دقیقا چه مقداری برگرده.
📝 جمعبندی
جاوااسکریپت همیشه آبجکتها رو قبل از عملیات تبدیل به primitive میکنه.
سه حالت داره: "string", "number", "default".
متدهای کلیدی: Symbol.toPrimitive, toString, valueOf.
خب خب خب…
تا حالا فکر کردی وقتی دو تا آبجکت رو با هم جمع میکنی (
obj1 + obj2) یا از هم کم میکنی (obj1 - obj2) چه اتفاقی میفته؟ 🤔✋ اول اینو بدون
برخلاف زبانهایی مثل پایتون یا ++C، توی جاوااسکریپت نمیتونی بیای رفتار عملگرها رو مستقیم تغییر بدی.
یعنی خبری از متدهای جادویی (Magic Methods) مثل
__add__ یا __sub__ تو پایتون نیست.پس نمیتونی بگی: "آبجکت من وقتی با + جمع شد، فلان کارو بکن!"
👈 جاوااسکریپت قبل از هر عملیات، آبجکتهارو خودکار تبدیل به primitive میکنه. بعد تازه میره سراغ اجرای اون عملگر.
📌 حالا اصلا primitive یعنی چی؟
توی جاوااسکریپت دو نوع داده اصلی داریم:
نوع اول 👈 Primitive ها: سادهترین نوع دادهها مثل number, string, boolean, null, undefined, symbol, bigint.
نوع دوم 👈 Objects: هر چیزی غیر از primitive ها! مثل object
{} و array []حالا وقتی جاوااسکریپت نیاز داره روی یه آبجکت عملیاتی انجام بده (مثل جمع، تفریق، یا پرینت)، باید اون رو تبدیل کنه به یکی از primitive ها.
🔑 ماجرا با هینت (hint) شروع میشه
جاوااسکریپت بسته به شرایط مختلف، از سه تا hint استفاده میکنه تا بفهمه آبجکت رو به چی تبدیل کنه:
حالت اول 👈 "string": وقتی انتظار رشته داره.
مثال:
alert(user);
anotherObj[user] = 123;
حالت دوم 👈 "number": وقتی نیاز به عدد هست.
مثال:
let n = +obj;
let delta = date1 - date2;
let bigger = user1 > user2;
حالت سوم 👈 "default": وقتی جاوااسکریپت مطمئن نیست (مثل عملگر + که هم جمع عددی انجام میده هم رشتهها رو بهم میچسبونه).
مثال:
let total = obj1 + obj2;
if (user == 1) { ... }
⚙️ الگوریتم تبدیل
وقتی یه آبجکت توی همچین موقعیتی باشه، جاوااسکریپت این مراحل رو میره جلو:
اگه متد obj[Symbol.toPrimitive](hint) وجود داشته باشه 👈 از همون استفاده میکنه.
اگه هینت string باشه 👈 اول متود toString() رو صدا میزنه، اگه وجود نداشت میره سراغ متود valueOf().
اگه هینت number یا default باشه 👈 اول متود valueOf() رو صدا میزنه، و اگه وجود نداشت میره سراغ متود toString().
📦 اگه چیزی پیادهسازی نکنیم چی؟
متود toString() برای یه آبجکت معمولی به صورت پیش فرض این رو برمیگردونه:
[object Object]
مثال:
let user = { name: "Ali" };
alert(user); // [object Object]
alert(user + 1); // [object Object]1متود valueOf() هم خود آبجکت رو برمیگردونه (که بیمصرفه) 🫤
🔧 مثال کاستومایز شده
حالا اگه بخوای رفتار رو کنترل کنی:
let user = {
name: "Ali",
money: 100,
[Symbol.toPrimitive](hint) {
return hint === "string" ? `{User: ${this.name}}` : this.money;
}
};
alert(user); // "{User: Ali}" (string hint)
alert(+user); // 100 (number hint)
alert(user + 50); // 150 (default hint)⚠️ نکته مهم:
متود های
[Symbol.toPrimitive](hint)، toString() و valueOf() باید به عنوان خروجی یک primitive برگردونن📊 مقایسه با زبانهای دیگه
توی پایتون یا ++C میتونی مستقیماً رفتار عملگرها رو تغییر بدی (
__add__، __str__ و …).ولی توی جاوااسکریپت، عملگرها دستکاری نمیشن.
فقط میتونی تعیین کنی وقتی آبجکت به primitive تبدیل شد، دقیقا چه مقداری برگرده.
📝 جمعبندی
جاوااسکریپت همیشه آبجکتها رو قبل از عملیات تبدیل به primitive میکنه.
سه حالت داره: "string", "number", "default".
متدهای کلیدی: Symbol.toPrimitive, toString, valueOf.
❤3