مقدمه
سلام به همه! امیدوارم همهتان خوب باشید.
سال بهسرعت میگذرد و رسیدیم به Mindshifting May، احتمالاً ماهی که بیش از همه برایش هیجان دارم، عمدتاً به این دلیل که Prolog هم در آن هست!
امیدوارم از Analytical April لذت برده باشید. تعداد بسیار زیادی از شما شرکت کردید و به نظرم یکی از موفقترین ماهها تا اینجا بود. در آوریل با Simon Peyton Jones هم گفتوگو کردم، به عنوان یک مصاحبهی دیرهنگام برای Functional February. آن گفتوگو واقعاً عالی بود و قطعاً پیشنهاد میکنم دوباره تماشایش کنید، حتی اگر فقط برای این جملهی زیبا باشد: «وقتی سنگ آهک برنامهنویسی امری فرسوده شود، گرانیت برنامهنویسی تابعی از زیر آن نمایان خواهد شد».
بگذریم، برسیم به Mindshifting May! مثل همیشه، من و Erik یک مرور سریع از این که این ماهها دربارهی چه هستند و زبانهای مختلفی که بررسی میکنیم به شما میدهیم.
خب، این ماه شش زبان داریم: Ballerina، Pharo، Prolog، Red، Tcl (تیکل) و Unison. هر یک از این زبانها با زبانهای «جریان اصلی»تر تفاوت زیادی دارند، پس پیشنهاد میکنیم بیش از یکی را امتحان کنید تا حس کنید چطور با هم فرق دارند. قطعاً Prolog را پیشنهاد میکنم، چون یکی از زبانهایی است که در عمرم بیشترین لذت را از کدنویسی با آن بردهام. Erik هم برای Unison خیلی هیجان دارد، پس آن هم گزینهی خوبی برای امتحان کردن است.
نشانها
برای گرفتن نشان Mindshifting May باید در طول مه پنج تمرین دلخواه را در یکی از این زبانها کامل کنید.
نشان یکسالهی 12in23 هم هست. برای گرفتن آن باید پنج تمرین از تمرینهای ویژهی ما را در آن زبان حل کنید. اگر این را بعد از مه تماشا میکنید، میتوانید این بخش را در هر زمانی از سال انجام دهید، پس چیزی را از دست ندادهاید. انتخاب این تمرینها سخت بود، چون زبانها همه بسیار متفاوتاند، پس سراغ تمرینهای عمومیتری رفتیم که حل کردنشان لذتبخش است و بررسی رویکردهای مختلف در آنها جالب است.
- سرواژه: تبدیل یک عبارت به سرواژهاش
- ایزوگرام: بررسی این که آیا یک عبارت حرف تکراری دارد یا نه
- اعداد رومی: تبدیل یک عدد دهدهی به اعداد رومی
- قطرههای باران: تبدیل یک عدد به صداهای قطرهی باران
- عصر فضا: محاسبهی سن یک نفر روی سیارههای منظومهی شمسی ما
این تمرینها و تمرینهای ماههای قبل را میتوانید همه در صفحهی #12in23 پیدا کنید.
مرور کلی
بیایید جلو برویم و هر زبان را با یک مرور کلی بررسی کنیم.
Prolog:
- روشی متفاوت برای اندیشیدن. یک برنامه به صورت مجموعهای از رابطهها تعریف میشود. سپس با استفاده از یکسانسازی (تطبیق الگو) پایگاه دادهی رابطهها را «پرسوجو» میکنید تا پاسخها را پیدا کنید. عالی برای سیستمهای مبتنی بر قواعد
- نگارش آن اندک است، فقط یک نوع داده (term) و یک عنصر ساختاری زبانی (clause) دارد. clauseها کاملاً از termها ساخته میشوند و میتوانند واقعیتها یا قواعد را تعریف کنند.
- کاملاً اعلانی. کمتر نگران این باشید که محاسبات چطور انجام میشوند و بیشتر نگران این باشید که چه چیزی باید محاسبه شود. در بسیاری از موارد، این یعنی کد کمتر
- برای پرسوجو در فضاهای جستوجوی بزرگ طراحی شده است. راهبردهای جستوجوی متفاوت (عمقاول، پهنااول) و پشتیبانی از هرس خودکار
Unison
- در کد Unison هیچ تعارض نسخهای وجود ندارد! یک تابع Unison هش وابستگیهایش را میشناسد، پس میتواند نسخهی درست کدی را که لازم دارد پیدا کند.
- Unison مرور زندهی کد را در رابط کاربری توسعهی محلی و مخزنهای میزبانیشده پشتیبانی میکند، بنابراین همیشه میتوانید کلیک کنید و کد منبع کتابخانههایی را که به آنها وابستهاید ببینید.
- Abilities راهی برای مدیریت «اثرات» (مثلاً IO) به شیوهای کاملاً تابعی است
Pharo
- نگارش آن بسیار اندک است و کل نگارش روی یک کارت پستال جا میگیرد (فقط ۶ واژهی رزروشده!). نگارش پیامها شبیه زبانهای طبیعی است، با یک فاعل، یک فعل و مکملها (
between: 1 and: 2 +). معناشناسی هم ساده است (مثلاً قواعد تقدم بهشدت ساده). این یادگیری و خواندن را آسانتر میکند - بهرهوری عالی است، به شرطی که آدم از منحنی یادگیری اولیه بگذرد. دلایل متعددی برای این وجود دارد، از جمله معناشناسی ساده و نگارش اندک؛ همچنین برخی از ویژگیهای برجستهی Pharo که بعداً به آنها اشاره میکنیم
- روی بیشتر پلتفرمها (Windows، macOS، Linux + پشتیبانی از ARM) روی یک ماشین مجازی سریع (OpenSmalltalk) اجرا میشود
- فقط یک پیادهسازی Smalltalk نیست و هنوز فعالانه توسعه مییابد (آخرین نسخهی Smalltalk همان Smalltalk 80 از سال ۱۹۸۰ است)
- جامعهای صمیمی
Tcl (تلفظ «تیکل»)
- نگارش آن بسیار اندک است، فقط ۱۲ قاعده که روی یک تکه کاغذ جا میگیرد. معناشناسی هم نسبتاً سرراست است. این کار را برای خواندن و یادگیری برنامهها آسان میکند
- همروندی ساده از طریق coroutineها، که اجازه میدهد کد ناهمزمان مثل کد همزمان نوشته شود
- حلقهی رویداد توکار برای برنامهنویسی شبکه و ورودی/خروجی ناهمزمان فایل
- بالغ، اما هنوز در حال تحول
Ballerina
- پشتیبانی درجهیک از پردازش اعلانی و ایمن از نظر نوع JSON، XML و دادههای جدولی با پرسوجوهای یکپارچه با زبان
- انواع انعطافپذیر با غلبهی نوعدهی ساختاری (duck typing). انواع بسته راهی برای زیرنوعدهی هستند، در حالی که انواع باز با ظرافت با دادههای بیش از حد ارسالی کنار میآیند. اتصال و اعتبارسنجی داده بهصورت توکار، وقتی در منابع HTTP استفاده میشود
- پشتیبانی توکار از الگوهای رایج یکپارچهسازی و کانکتورها، از جمله تراکنشهای توزیعشده، جبرانسازی و مدارشکنها
- هر برنامهی Ballerina بهطور خودکار برای هر ابزار OpenTelemetry قابل مشاهده است، که کنترل و دید کامل نسبت به رفتار و کارایی کد به شما میدهد.
- همروندی عالی از طریق strandها که رشتههای سبکوزن هستند. فراخوانیهای IO غیرمسدودکننده آساناند. کامپایلر میتواند به بررسی فراخوانیهای ارسال و دریافت بین workerها کمک کند و از بنبست جلوگیری کند. تغییرناپذیری هم برای شبکه عالی است
- مدیریت خطای صریح از طریق انواع اتحادی و شکر نحوی
checkبرای کمک به این کار
Red
- سبکوزن. کل زنجیره ابزار حدود ۱.۵ مگابایت دانلود است، یک فایل اجرایی واحد.
- قابل حمل. کامپایل متقابل آسان. فایلهای اجرایی کوچک و بدون وابستگی تولید میکند. ردپای حافظهی کم.
- Red خودش یک فرازبان و قالب دادهی مستقل است (مثل LISPها). برنامهها میتوانند کد را تبدیل یا خواندن کنند.
- واکنشی: اشیاء را میتوان به هم پیوند داد تا اندازه و پیچیدگی برنامه کاهش یابد (به صفحههای Excel فکر کنید)
این زبانها کجا استفاده میشوند؟
Prolog:
- هوش مصنوعی (Watson شرکت IBM)
- پردازش زبان (طبیعی)
- پایگاه دادهی توزیعشده برای پایگاههای دانش (TerminusDB)
- حتی برای مشخص کردن قواعد نوع ماشین مجازی Java هم به کار رفته است
Unison
- برای نوشتن سیستمهای توزیعشده
- وبسرویسهای عمومی
- کارهای محاسباتی دستهای
Pharo
- برای ابزارهای تعاملی
- در حوزههای بسیار متفاوت: پلتفرم معاملات آنلاین و ابزار ابری مدیریت سرمایهگذاری
- نمونهسازی رابط کاربری و تعامل در صنعت دفاعی
- برنامهی وبمحور برای برنامهریزی رویداد
- ابزار محیط توسعهی شکلپذیر برای کاوش API، داده و سیستم
Tcl
- به عنوان کد چسب یا به صورت توکار
- در رابطهای کاربری روترهای CISCO
- سیستمهای تولیدی مختلف
- NASA در موارد بسیاری از آن استفاده کرده است
- شرکتهای بزرگ دیگر شامل Pixar، Boeing، Intel، NBC و بسیاری دیگر میشوند.
- Tk، جعبهابزار پنجرهسازی، توسط زبانهای «اسکریپتی» دیگری مثل perl/python/ruby هم پذیرفته شده است.
- Expect، ابزاری برای خودکارسازی برنامههای CLI تعاملی
Ballerina
- برای برنامههای بومی ابری
- MOSIP از آن استفاده میکند؛ MOSIP یک پلتفرم هویت بنیادی است که به دولتها و سازمانهای دیگر کمک میکند سیستمهای هویت دیجیتال و بنیادی را به شکلی مقرونبهصرفه پیادهسازی کنند.
چه چیزی این زبانها را از دیدگاه برنامهنویسی جالب میکند؟
Prolog:
- زبان برنامهنویسی منطقی (یکی از اولینها) که پارادایم خاص خودش است (مثل شیءگرایی و برنامهنویسی تابعی)
- دارای نوعدهی پویا
Unison
- زبان کاملاً تابعی
- دارای نوعدهی ایستا
Pharo
- زبان شیءگرا، اما به معنای Smalltalk. با زبانهای شیءگرای «معمولی» متفاوت است: بدون سازنده، بدون اعلان نوع، بدون واسط، بدون انواع اولیه.
- دارای نوعدهی پویا
Tcl
- چندپارادایمی: سبکهای شیءگرا، امری و تابعی پشتیبانی میشوند
- دارای نوعدهی پویا
Ballerina
- چندپارادایمی: شیءگرا، تابعی و اعلانی
- دارای نوعدهی ایستا
Red
- چندپارادایمی: امری، تابعی، شیءگرا، نمادین، واکنشی
- دارای نوعدهی ایستا
ویژگیهای برجستهی آنها چیست؟
Prolog:
- انعطافپذیر. بسیاری از گزارههای توکار در چند جهت کار میکنند. اجازه میدهد داده را با همان نحوهی نگارش هم پرسوجو کنید و هم بسازید. بعضی مسائلی که در زبانهای دیگر سختاند، اینجا پیشپاافتاده میشوند
- DCG مثل یک ترکیبکنندهی تجزیهگر توکار است که برای تجزیه، تولید، تکمیل و بررسی دنبالهها عالی است
- CLP روشی کارآمد برای تعریف برنامه بر اساس محدودیتها است
Unison
- کد متن نیست، بلکه داده (تغییرناپذیر) است. کد در یک پایگاه داده ذخیره میشود و از طریق Unison Codebase Manager به آن دسترسی پیدا میکند و بهروزرسانی میشود. فایلهای متنی فقط یکی از راههای وارد کردن کد به پایگاه داده هستند. دادهی تغییرناپذیر یعنی نتایج تست هم میتوانند کش شوند و بررسی نوع هم فقط یک بار لازم است انجام شود
- به تعریفها با هش ارجاع داده میشود، نه با اسم. به این کار کد «محتوامحور» میگویند. درخت نحوی یک تعریف، هش آن را تعیین میکند. بدون تعارض نسخه، و تغییر اسم هم پیشپاافتاده است.
- مستندات Unison یک موجودیت درجهیک در زباناند و همیشه با توابعی که توصیف میکنند همگاماند. میتوانید نمونههای زنده را در آنها بگنجانید و مطمئن شوید که کد نمونهتان کامپایل میشود.
- ایدهآل برای محاسبات ابری: هیچ بیلدی وجود ندارد، توابع میتوانند در لحظه توزیع شوند و زمان کمتری برای نوشتن کدگذار و کدگشا برای ارتباط سرویسبهسرویس Unison صرف میشود.
Pharo
- مدل اجرای سرراست: همهچیز یک شیء است و اجرا فقط از طریق پیامها انجام میشود (که آنها هم شیء هستند). حتی جریان کنترل هم با پیامها انجام میشود. این مدل هرچند ساده است، بسیار قدرتمند است. با سایر زبانهای شیءگرا کاملاً متفاوت است.
- کد شما در یک image از Pharo قرار دارد، نه در فایلهای متنی. یک image از Pharo کل وضعیت برنامهتان را در خود دارد و میتواند در یک ماشین مجازی Pharo اجرا شود. وقتی کارتان را ذخیره میکنید، Pharo کل وضعیت محیط را به صورت یک فایل image ذخیره میکند. این فایل شامل همهی اشیاء، رابطههایشان و بافت اجرا است. فایلهای image را میتوان با دیگران به اشتراک گذاشت و روی ماشینها یا پلتفرمهای مختلف بارگذاری کرد. این به توسعهدهندگان اجازه میدهد بهراحتی روی یک پروژه همکاری کنند یا برنامههای ساختهشده با Pharo را توزیع کنند
- زنده و غرقکننده، با بازخورد فوری هنگام اجرا از طریق IDE مخصوص Pharo. برنامهتان را در لحظه اجرا و تغییر دهید، حتی وقتی در حال اجراست! دیباگر قدرتمندی که راهاندازی مجدد متدها و رفع باگ در لحظه را پشتیبانی میکند
Tcl
- سیستم نوع سرراست: همهچیز یک رشته است. «همهچیز یک رشته است» روشی بود که Tcl قبلاً با آن پیادهسازی میشد. حالا در زیر پوسته، یک سیستم نوع قوی وجود دارد که در آن موجودیت Tcl (چه رشته باشد، چه عدد اعشاری، فهرست یا دیکشنری) هم یک نمایش مخصوص نوع خود دارد و هم یک نمایش رشتهای. این کار کارایی کد Tcl را بسیار بهبود میدهد، چون دیگر نیازی به تبدیل رفتوبرگشت از رشتهها ندارد.
- «همهچیز به صورت دستور اجرا میشود». هیچ دستور توکاری وجود ندارد. Tcl با یک «کتابخانهی استاندارد» از دستورها میآید، از جمله
ifوwhileو غیره. اضافه کردن دستورهای جریان کنترل جدید بسیار ساده است: مثلاً یک حلقهیuntil. بازنویسی دستورهای Tcl هم آسان است. - به دلیل فشرده بودن، معناشناسی ساده و پیادهسازی به صورت یک کتابخانهی C، جاسازی آن آسان است
Ballerina
- بومی ابر. تبدیلهای توکار از JSON به انواع تعریفشده توسط کاربر. نگارش بسیار سبک برای ساختن (میکرو)سرویسها. اجرای همروند توکار سرویسها. پشتیبانی از HTTP (۱ و ۲)، graphql و gRPC به صورت آماده
- بهطور خودکار artifactهایی برای استقرار کدتان در ابرهای مختلف تولید میکند. این artifactها میتوانند Dockerfile، imageهای Docker، فایلهای YAML مربوط به Kubernetes یا توابع بدونسرور باشند.
- مصورسازی توکار کد به صورت نمودارهای دنباله. برای مصور کردن جریان کد عالی است. حتی میتواند فراخوانیهای HTTP را هم مصور کند
Red
- برای ساختن و تجزیهی زبانهای خاص دامنه یا «گویشها» (اصطلاح Rebol) عالی است. چندین گویش توکار:
- Red/System: یک زبان برنامهنویسی سیستمی در سطح C که به کد بومی کامپایل میشود
- Parse: یک تجزیهگر PEG قدرتمند
- VID: یک گویش ساده برای ساخت چیدمان GUI
- Draw: یک گویش ترسیم برداری دوبعدی
- Rich-text: یک گویش توصیف متن غنی
- GUIهای آسان. کاملاً چندسکویی و بومی. از اتصال دوطرفه، بهروزرسانی زنده و رویدادها پشتیبانی میکند و دسترسی به قابلیتهای سیستمعامل را فراهم میکند
در طول مه کدامیک را امتحان کنیم؟
همهشان به خودی خود زبانهای جالبی هستند، پس میشود برای هر کدامشان دلیلی آورد.
- اگر به رایانش ابری علاقه دارید، Ballerina و Unison گزینههای عالیای هستند. Tcl هم ویژگیهای همروندی خوبی دارد
- اگر با برنامهنویسی شیءگرا آشنا هستید اما میخواهید نگاه متفاوتی به آن ببینید، Pharo را امتحان کنید
- اگر میخواهید تجربه کنید که برنامهنویسی با زبانی که پشتوانهاش فایلهای متنی نیست چه حسی دارد، یا Pharo و IDE یکتا و قدرتمندش را امتحان کنید، یا Unison را با Unison Codebase Manager.
- اگر مینیمالیسم را دوست دارید، Tcl، Prolog، Pharo و Red همه نگارش نسبتاً اندک و معناشناسی نسبتاً سادهای دارند
- اگر میخواهید ترکیب جالبی از پارادایمها را ببینید، Ballerina، Tcl و Red هر کدام پارادایمهای متفاوتی را پشتیبانی میکنند
- اگر میخواهید پارادایمهای غیرمعمولتری را امتحان کنید، برای برنامهنویسی منطقی Prolog، برای برنامهنویسی واکنشی Red و برای برنامهنویسی اعلانی Ballerina را امتحان کنید
- اگر برنامهنویسی تابعی را دوست دارید، Unison را ببینید، و بهویژه Abilities آن را.
- اگر به فرابرنامهنویسی علاقه دارید، Tcl، Prolog، Pharo و Red همه پشتیبانی خوبی دارند
البته اگر وقت دارید، پیشنهاد میکنم چند تا از آنها را امتحان کنید! همهشان کاملاً یکتا هستند. بروید یک تمرین یکسان را در چند زبان از زبانهای ویژه حل کنید و ببینید پیادهسازی چقدر متفاوت است.