مقدمه
سلام به همه. امیدوارم حالتان خوب باشد. سپتامبر ماه پرمشغلهای داشتیم. بسیاری از بهبودها و قابلیتهای جدید را روی سایت منتشر کردیم، عمدتاً در زمینهی بهبود منتورینگ و فرایندهای مرتبط با آن. در نتیجه، حالا دو برابر چهار هفته پیش درخواست منتور دریافت میکنیم که عالی است. اگر تا حالا امتحان نکردهاید که منتوری کدتان را بررسی کند، حتماً این کار را بکنید؛ روش فوقالعادهای برای یادگیری است. و اگر به دنبال کمک به دیگران هستید، درخواستهای زیادی در صفها منتظر کمک شماست. میتوانید از طریق لینک «Mentoring» در منوی «Contribute» بهعنوان منتور ثبتنام کنید! یک بهروزرسانی بزرگ پایگاهداده هم از MySQL 5.6 به MySQL 8 انجام دادیم که آن را ضبط کردم و در بخش Insiders در دسترس است؛ پس اگر Insider هستید و هنوز آن را ندیدهاید، حتماً تماشا کنید!
خب، برویم سراغ #12in23. سپتامبر ماه جالبی بود و به کاوش زبانهای مختصر و موجز گذشت. این ماه مسیر دیگری را میرویم و به سراغ موجودات بسیار بزرگتری میرویم. تمرکز ما روی زبانهای شیءگراست، بهطور خاص C#، Crystal، Java، Pharo، Ruby و PowerShell. قبلاً دربارهی هر دو زبان Pharo و Java صحبت کردهایم، بهترتیب در مه و اوت؛ پس در این ویدیو دوباره به آنها نمیپردازیم. اما اگر به معرفی آن زبانها علاقه دارید، ویدیوهای ماههای گذشته را ببینید. اما در این ویدیو به کاوش C#، Crystal، Ruby و Powershell میپردازیم و مثل همیشه اریک برایمان توضیح میدهد چه چیزی این زبانها را جالب و منحصربهفرد میکند.
نشانها
مثل همیشه، میتوانید با تکمیل هر ۵ تمرین در این زبانها نشان اکتبر شیءگرا را به دست آورید. یک نشان یکساله هم داریم که میدانم بسیاری از شما برایش تلاش میکنید. برای آن، ۵ تمرین ویژه داریم که باید کامل کنید و همهی آنها برای حل شدن به شیوهی شیءگرا مناسباند. اینها عبارتاند از:
- درخت جستوجوی دودویی: درج و جستوجوی اعداد در یک درخت دودویی
- بافر حلقوی: پیادهسازی یک ساختار دادهی متصل سرتاسری
- ساعت: پیادهسازی ساعتی که زمانها را بدون تاریخ مدیریت میکند
- ماتریس: بازگرداندن سطرها و ستونهای یک ماتریس که بهصورت یک رشته نمایش داده میشود
- رمز ساده: پیادهسازی یک رمز جانشینی
مرور کلی
C#
- در سال ۲۰۰۰ توسط Anders Hejlsberg در Microsoft ساخته شد
- زبان و ماشین مجازی مشخصات رسمی دارند. در سال ۲۰۰۲ استاندارد رسمی ECMA شد و در سال ۲۰۰۳ استاندارد ISO
- کامپایلر، .NET Framework (کتابخانهی استاندارد) و Visual Studio (ویرایشگر) همگی در ابتدا بسته بودند، اما کامپایلر و .NET Framework در سال ۲۰۱۴ متنباز شدند
- با آنکه بخش زیادی از نحوهی نگارش خود را با Java سهیم است (که چند سال پیشتر منتشر شده بود)، C# کپی موبهموی Java نبود (مثلاً پشتیبانی از
properties،value typesو نبودchecked exceptions) - به بایتکد کامپایل میشود و از .NET 7 کامپایل به کد ماشین پشتیبانی میشود (که همچنان در حال بهبود است)
- در حجم عظیمی از نرمافزارها به کار میرود، از وبسایتها تا سیستمهای نهفته و از اپلیکیشنها (Xamarin) تا بازیها (Unity)
Crystal
- Crystal توسط Ary Borenszweig (که حساب کاربری در Exercism دارد)، Juan Wajnerman و Brian Cardiff توسعه یافت (ابتدا Joy نام داشت، اما ۳ روز بعد به Crystal تغییر نام داد :))
- به گونهای طراحی شده که زیبایی و بهرهوری Ruby را داشته باشد، اما با سرعت، کارایی و ایمنی نوع یک زبان کامپایلشدهی مدرن.
- زبانی متنباز که سازمان Manas آن را توسعه داده است.
- نسخهی 1.0 در سال ۲۰۲۱ منتشر شد.
- با استفاده از LLVM به کد ماشین کامپایل میشود (مثل Rust)
- کامپایلر در ابتدا با Ruby نوشته شد، اما بعداً به نسخهای خودمیزبان تبدیل شد
- شرکت کامیونسازی Nikola، Manas و دیگران از آن استفاده میکنند، بیشتر برای وبسایتها، اما همچنین برای سرویسهای ابری، برنامههای خط فرمان و اسکریپتها
PowerShell
- توسط تیمی به رهبری Jeffrey Snover در Microsoft ساخته شد و نخستین بار در سال ۲۰۰۶ منتشر شد.
- توسعهی آن با انگیزهی Intel آغاز شد، که میخواست اسکریپتهای KornShell خود را از Sun RISC به پلتفرم دیگری منتقل کند تا به توسعهی CPUهایش کمک شود. در نهایت، Intel پلتفرم دیگری را برگزید، اما Microsoft به کار روی پوستهی جدیدش ادامه داد: PowerShell، چون امکان بهبود مدیریت سیستم Windows را فراهم میکرد (که در آن زمان چندان خوب نبود و اغلب به GUIها نیاز داشت)
- نحوهی نگارشش از KornShell الهام گرفت، اما همچنین از PHP، Perl و دیگران
- نسخهی اول فقط روی .NET Framework اجرا میشد، یعنی فقط روی Windows. اما PowerShell 6.0 (منتشرشده در سال ۲۰۱۸) روی .NET Core اجرا میشد که چندسکویی و متنباز است.
- عمدتاً برای مدیریت سیستم استفاده میشود، اما برای ارائهی ابزارهای CLI یا پوششهایی حول ابزارهای دیگر هم به کار میرود. ما از آن بسیار برای کارهای دستهجمعی روی مخازن Exercism استفاده کردهایم
Ruby
- توسط Yukihiro Matsumoto (معروف به Matz) توسعه یافت و نخستین بار در سال ۱۹۹۵ منتشر شد
- Matz میخواست با یک زبان اسکریپتی شیءگرای درست کار کند، اما گزینههای موجود (مانند Perl و Python) را نپسندید و بنابراین زبان جدیدی ساخت: Ruby
- Matz هستهی Ruby را زبانی ساده همچون Lisp توصیف میکند، با سیستم شیءای مانند Smalltalk، بلوکهایی الهامگرفته از توابع مرتبهبالا و کاربرد عملیای همچون Perl.
- معمولاً تفسیر میشود، اما میتواند بهصورت درجا به کد ماشین هم کامپایل شود
- افزون بر مفسر رسمی، پیادهسازیهای جایگزینی هم وجود دارد، مانند JRuby (روی JVM اجرا میشود)، Rubinius (از LLVM استفاده میکند) و YJIT، یک کامپایلر درجا که بهعنوان بخشی از بستهی نصب رسمی ارائه میشود
- بیشتر در وبسایتها (با Ruby on Rails) استفاده میشود، مثلاً GitHub، Stripe، Shopify و بسیاری دیگر (از جمله Exercism و انجمن Exercism!). Ruby برای مقاصد خودکارسازی هم به کار میرود
و از دید برنامهنویسی، چه تفاوتی دارند؟
همهی آنها زبانهای شیءگرا هستند، هرچند همه این را به یک شکل پیاده نمیکنند (مثلاً Crystal و Ruby برای فراخوانی متدها از مدل پیامفرستی Smalltalk استفاده میکنند).
C#
- نوعدهی قوی و ایستا
- از پارادایمهای امری و اعلانی هم پشتیبانی میکند و روزبهروز کارکردیتر میشود
Crystal
- نوعدهی قوی و ایستا (برخلاف Ruby)
- از برنامهنویسی کارکردی و امری هم پشتیبانی میکند
PowerShell
- نوعدهی قوی
- از برنامهنویسی امری، کارکردی و مبتنی بر خط لوله هم پشتیبانی میکند.
Ruby
- نوعدهی پویا
- از برنامهنویسی کارکردی و امری هم پشتیبانی میکند
با این وجود، همهی این زبانها پیش از هر چیز زبانهای شیءگرا هستند.
چه چیزهایی این زبانها را عالی میکند؟
C#
- تقریباً همهجا اجرا میشود، از جمله اپلیکیشنها از طریق Xamarin. در ابتدا فقط روی Windows اجرا میشد که باعث پدید آمدن Mono شد، پیادهسازی آزاد و متنبازِ کامپایلر و زمان اجرای C# که چندسکویی بود. در سال ۲۰۱۵، .NET Core معرفی شد که کاملاً چندسکویی و متنباز بود.
- هممنظوره: تقریباً برای هر بار کاری قابل استفاده است، از جمله اپلیکیشنها، وبسایتها و بازیها
- بیانگر: با کد C# نسبتاً کم میتوانید کارهای زیادی انجام دهید. بهویژه LINQ جهش بزرگی در بهرهوری است و کار با آن بسیار لذتبخش است
- ابزارهای عالی، هم برای IDEها و هم برای ابزارهای دیگر مانند سیستمهای ساخت. Visual Studio فقط برای Windows است، اما JetBrains Rider و VS Code چندسکویی هستند
- پلتفرم کامپایلر .NET (که اغلب Roslyn نامیده میشود) راه فوقالعادهای برای تجزیه، تبدیل و تولید کد C# است (ما از آن بهطور گسترده در test runner / analyzer / representer زبان C# استفاده میکنیم)
- مستندات گسترده، دقیق و خوشنوشت است
- جامعهی بزرگ: منابع بسیاری در دسترس است، از جمله وبلاگها، انجمنها و بیشتر
Crystal
- نحوهی نگارش زیبا و خوانا که کد Crystal را آسانخوان و آساننویس میکند
- بیانگر. مانند Ruby، Crystal بسیار بیانگر است و با کد کم میتوانید کارهای زیادی انجام دهید. این تا حدی به دلیل کتابخانهی استاندارد عالی و گستردهی آن است.
- سریع. نوعدهی ایستا امکان کامپایل به کد ماشین کارآمد با استفاده از LLVM را فراهم میکند، همراه با مدیریت سادهی حافظه از طریق جمعکنندهی زباله.
- پیادهسازی عالی شیءگرا. همهچیز یک شیء است، از جمله کلاسها و انواع اولیه مانند اعداد و مقادیر منطقی
- همهچیز از پیش همراه؛ کتابخانهی استاندارد بزرگ، قالببند توکار، موتور قالب، framework تست و بیشتر
- تعامل. تعامل آسان با کتابخانههای C
- چندسکویی: روی Linux، macOS و Windows اجرا میشود، هرچند Windows هنوز شهروند درجهیک نیست
PowerShell
- قدرتمند: PowerShell ابزاری قدرتمند برای مدیران سیستم است. با بسیاری از سیستمهای دیگر بهخوبی یکپارچه میشود، مانند سیستمعامل Windows (اجزا، سرویسها و تنظیمات)، دیگر محصولات Microsoft مانند Exchange، SharePoint، Azure و غیره. همچنین میتواند با بسیاری از فناوریهای دیگر مانند REST APIها، پایگاههای داده، سرویسهای وب و بیشتر تعامل داشته باشد.
- در دسترس بودن: PowerShell روی هر سیستمعامل Windows مدرن از پیش نصب شده است و روی هر سیستمی که .NET را اجرا میکند نصب میشود (از جمله macOS، Linux و بسیاری از سیستمهای Unix)
- امنیت: PowerShell قابلیتهایی برای ایمنسازی اسکریپتها و محدودکردن اجرای آنها بر اساس اسکریپتهای امضاشده و سیاستهای اجرا دارد. این برای تضمین امنیت فرایندهای خودکارسازی شما حیاتی است.
- رابط گرافیکی: میتوانید آن را با frameworkهای دیگری مانند Windows Forms یا Windows Presentation Foundation ترکیب کنید تا رابطهای گرافیکی برای اسکریپتهای PowerShell خود طراحی و بسازید و آنها را کاربرپسندتر کنید.
- خط لوله: مانند Bash در سیستمهای Unix، PowerShell به شما امکان میدهد cmdletها را به هم زنجیر کنید و با گذراندن خروجی یک cmdlet بهعنوان ورودی به دیگری، عملیات و کارهای پیچیده را انجام دهید
Ruby
- نحوهی نگارش زیبا و خوانا که کد Ruby را آسانخوان و آساننویس میکند
- بیانگر. Ruby زبانی بسیار بیانگر است و با کد کم میتوانید کارهای زیادی انجام دهید. این تا حدی به دلیل کتابخانهی استاندارد عالی و گستردهی آن است
- اکوسیستم عظیم، با شمار انبوهی از کتابخانههای در دسترس (gemها)
- پیادهسازی عالی شیءگرا. همهچیز یک شیء است، از جمله کلاسها و انواع اولیه مانند اعداد و مقادیر منطقی.
- عملگرا. Ruby و بیشتر کتابخانههایش بسیار عملگرا هستند و بر حل مسائل دنیای واقعی تمرکز دارند.
- تعامل. تعامل آسان با کتابخانههای C که اغلب وقتی کارایی اهمیت ویژهای دارد به کار میرود. برای نمونه، gem به نام Nokogiri با پوششدادن کتابخانههای C برای انجام کارهای سنگین، امکان کار با XML را به شکلی بسیار کارآمد فراهم میکند
- نوآوریهای زیادی در جریان است. مثلاً Stripe ابزار Sorbet را ساخته، یک بررسیکنندهی نوع برای Ruby، و Shopify کامپایلر درجای YJIT را برای Ruby توسعه داده (که در Ruby 3.1+ گنجانده شده) و روی پشتیبانی WASM کار میشود
ویژگیهای برجسته
C#
- کارایی عالی، بهویژه برای یک زبان مدیریتشده. هم زبان و هم زمان اجرا قابلیتهای بیشماری برای بهبود کارایی دارند، مثلاً نوع
Span<T>و دسترسی به دستورهای ذاتی CPU (مانند دستورهای AVX). CLR ماشین مجازی بالغ، پایدار و بسیار کارآمدی است که پیوسته بهبود مییابد - اکوسیستم عظیم، با شمار انبوهی از کتابخانههای در دسترس. این کتابخانهها مانند خود C# بالغ، پایدار و کاملاند
- مدرن و در حال تحول: زبان و زمان اجرا هنوز در حال تحولاند و بهطور منظم بهروزرسانی میشوند تا مدرنتر شوند. نمونههایی از اینها:
-
async/awaitبرای همروندی آسان -
Span<T>برای استفادهی کارآمد از حافظه - انواع ارجاعی تهیپذیر (رفع اشتباه میلیارد دلاری)
- زمان اجرا نیز بهطور منظم بهروزرسانی میشود، مثلاً .NET AOT برای کامپایل مستقیم به کد ماشین
- گزینههای جایگزین کمتر از بسیاری از زبانها/اکوسیستمهای دیگر دارد. برای بیشتر مقاصد میتوانید با راهحلهای پیشفرض ارائهشده توسط Microsoft که اغلب IDE را هم شامل میشود سر کنید. میتوان استدلال کرد که این یک نقطهضعف هم هست، اما میتواند عالی باشد، بهویژه وقتی تازه با یک زبان شروع میکنید
Crystal
- بهترین حالت هر دو جهان. ترکیب استنتاج نوع سراسری و انواع اجتماع باعث میشود Crystal مانند زبانی با نوعدهی پویا احساس شود که اغلب نیاز به مشخصکردن نوع کمی دارد، اما همچنان کارایی و تضمینهای امنیتی بیشتر (از جمله بررسی nil در زمان کامپایل) یک زبان با نوعدهی ایستا را دارد
- فرابرنامهنویسی. Crystal بهجای فرابرنامهنویسی پویا و زماناجرای Ruby، ماکروهایی دارد که در زمان کامپایل اجرا میشوند. ماکروها روی گرههای AST کار میکنند و کد تولید میکنند. تعریف و استفاده از آنها نسبتاً آسان است. Embedded Crystal (ECR) یک موتور قالب توکار است که با ماکروها کد Crystal را در متن دیگر جای میدهد
- همروندی عالی. همروندی با مدلی شبیه Go که از fiberها (واحد اجرای سبکوزن) استفاده میکند و از طریق کانالها ارتباط برقرار میکنند، آسان است
- پربازده و لذتبخش. Ruby بهطور مشهور برای بهرهوری و شادی توسعهدهنده طراحی شده است، با نحوهی نگارش زیبا و خوانا و ارگونومی عالی. چون نحوهی نگارش و طراحی Crystal بسیار شبیه Ruby است، این دربارهی Crystal هم صادق است (نکتهی جالب: بخش قابلتوجهی از کد Ruby، کد معتبر Crystal هم هست).
PowerShell
- Cmdletها: PowerShell از cmdletها (که «کامند-لت» تلفظ میشود) بهعنوان اجزای سازندهاش استفاده میکند. آنها دستورهای کوچک و کارمحور هستند که قابلیتهای موجود را میپوشانند و رابطی یکدست (مثلاً
Get-Helpبرای نمایش راهنمای هر cmdlet) و مدیرپسند برای مدیران سیستم فراهم میکنند. برای طیف گستردهای از «پشتوانهها» cmdlet وجود دارد، مانند همهی کلاسهای .NET، Windows Management Instrumentation، Azure و بسیاری دیگر. cmdletها را میتوان در هر زبان .NET تعریف کرد و به شیوهای بسیار اعلانی تعریف میشوند، با پارامترها، اعتبارسنجی، الزامات (required true/false) و نامهای جایگزین (switch) که بهآسانی تعریف میشوند. - شیءگرا: تقریباً همهچیز در PowerShell یک شیء با خواص گوناگون است. فایلها، فرایندها، کلیدهای رجیستری و حتی انواع دادهی ساده مانند string و number همه بهعنوان شیء در نظر گرفته میشوند؛ این رویکرد نحوهی کار و تعامل شما با انواع مختلف داده و سرویسها را ساده میکند. برای هر کسی که با .NET کار کرده باشد بسیار آشنا خواهد بود
- مدیریت از راه دور: از مدیریت از راه دور سرورها و سیستمهای Windows و حتی منابع ابری در Azure، AWS و GCP پشتیبانی میکند که برای مدیریت خودکارسازی و استقرارهای در مقیاس بزرگ ضروری است.
- قابل توسعه: سیستم ماژول توکار عالی دارد و به شما امکان میدهد cmdletها، تابعها و ماژولهای سفارشی بسازید و با دیگر زبانها و کتابخانههای برنامهنویسی کار کنید تا در صورت نیاز قابلیتهایش را بیشتر گسترش دهید.
Ruby
- پربازده و لذتبخش. Ruby بهطور مشهور برای بهرهوری و شادی توسعهدهنده طراحی شده است. هرچند سخت بتوان اندازهاش گرفت، شور و شوق کسانی که از Ruby استفاده کردهاند گویای همهچیز است
- فرابرنامهنویسی. Ruby بسیار پویاست و فرابرنامهنویسی در زمان اجرا را ممکن میکند. چه وصلهکاری کلاسهای موجود باشد، چه افزودن یا فراخوانی پویای متدها، Ruby همه را پوشش میدهد
- Ruby on Rails یک framework فوقالعاده و کاملاً مجهز برای ساخت وبسایت است. بهصورت پیشفرض شامل قالببندی، حافظهی نهان، ActiveRecord (روشی برای تعامل با پایگاه داده از طریق اشیا)، مهاجرتها، داربست، WebSocketها و بسیار بیشتر است.
کدام را انتخاب کنیم
- اگر با برنامهنویسی شیءگرا آشنایید اما میخواهید نگاهی متفاوت به آن ببینید، Pharo را امتحان کنید
- اگر Java یا C# میدانید اما مدتی است به آنها دست نزدهاید، دوباره سراغشان بروید. هر دو زبان بسیار تحول یافتهاند، پس نگاهی به آن قابلیتهای جدید و درخشان بیندازید!
- C# و Java (و تا حدی کمتر Ruby) اگر دنبال کار هستید نیز گزینههای عالیاند، چون از پرتقاضاترین زبانها نزد کارفرمایاناند
- اگر Ruby میدانید، Crystal را امتحان کنید تا ببینید یک Ruby با نوعدهی ایستا چه ظاهر و حسی دارد
- اگر زبانهای پویا را دوست دارید اما کارایی عالی هم میخواهید، سراغ Crystal بروید
- اگر Bash یا فایلهای دستهای Windows را میدانید، PowerShell را برای نگاهی متفاوت و شیءگرا به اسکریپتنویسی پوسته امتحان کنید
- اگر بهطور کلی به زبانهای اسکریپتی علاقه دارید، Ruby، Crystal و PowerShell همه گزینههای خوبی هستند
- اگر میخواهید کمی فرابرنامهنویسی کنید، Pharo، Crystal و Ruby عالیاند (C# هم دارد برخی قابلیتهای فرابرنامهنویسی را میگیرد)
- اگر میخواهید تجربه کنید که برنامهنویسی در زبانی که با فایلهای متنی پشتیبانی نمیشود چگونه است، Pharo و IDE یگانه و قدرتمندش را امتحان کنید
- اگر به ساخت وبسایت علاقه دارید، Ruby با framework Ruby on Rails ارزش امتحانکردن را دارد