مقدمه
سلام به همه! امیدوارم حال همهتان خوب باشد.
ماه اوت شلوغی در Exercism داشتیم. Premium و Insiders را ادغام کردیم، بازخورد خودکار را مستقیم در ویرایشگر اضافه کردیم، Track Trophies را راهاندازی کردیم و کلی بهبود کوچک هم در سایت ایجاد کردیم! اگر هنوز مسیرهایتان را بررسی نکردهاید تا ببینید چه جامهایی میگیرید، حتماً این کار را بکنید. برای همهی کسانی که یک یا چند جام دارند ایمیل فرستادهایم، پس حواستان به آن هم باشد. در ماه اوت در #12in23 کلی خوش گذشت و زبانهایی را کاوش کردیم که مردم معمولاً برای ساخت اپلیکیشنها از آنها استفاده میکنند.
این ماه سپتامبر جمعوجور است و در آن زبانهایی را کاوش میکنیم که معمولاً نحوهی نگارششان بسیار مختصر و فشرده است. بهطور خاص، 8th (از نوادگان Forth)، AWK، Bash، jq، Perl و Raku (که قبلاً با نام Perl 6 شناخته میشد) را بررسی میکنیم.
نشانها
برای گرفتن نشان سپتامبر جمعوجور باید در طول سپتامبر هر پنج تمرین را در یکی از آن زبانها کامل کنید.
نشان یکسالهی 12in23 هم وجود دارد. برای گرفتن آن باید پنج تا از تمرینهای ویژهی ما را در آن زبان حل کنید.
- گیگاثانیه: کار با تاریخها
- رمز آتباش: کار با رشتهها
- دارت: کار با اعداد و شرطها
- Luhn: کار با رشتهها، شرطها و اعداد
- Series: کار با رشتهها و دنبالهها
این تمرینها و تمرینهای ماههای قبل را میتوانید در صفحهی #12in23 پیدا کنید.
مرور کلی
بیایید شروع کنیم و با یک مرور کلی از هر زبان، آنها را بررسی کنیم.
8th
- توسط Ron Aaron توسعه داده شد.
- اسمش جناسی با زبان Forth است که الهامبخش اصلی آن بوده. البته تفاوتهای زیادی با Forth دارد:
- نوعدهی قوی
- چندسکویی
- امنیت بهبودیافته (بدون دسترسی مستقیم به حافظه یا اسمبلر داخلی)
- هر دو نسخهی رایگان و تجاری را ارائه میدهد، که نسخهی تجاری ویژگیهای بیشتری دارد.
- منبعبسته است، اما پس از خرید لایسنس سازمانی میتوان کد منبع را مشاهده کرد
AWK
- AWK در دههی ۱۹۷۰ در Bell Labs توسط Alfred Aho، Peter Weinberger و Brian Kernighan ساخته شد. این نام سرواژهای از نام خانوادگی نویسندگانش است.
- یک زبان خاص دامنه است که برای پردازش متن طراحی شده، اما میتوان از آن برای اهداف دیگر هم استفاده کرد
- AWK یک فیلتر یونیکس است، مانند
sedوgrep، و برای استفاده در خط لوله طراحی شده است - مشخصات Single UNIX و مشخصات Linux Standard Base هر دو لازم میدانند که در هر پیادهسازی گنجانده شود، به همین دلیل روی بیشتر ماشینهای *nix در دسترس است
- پیادهسازیهای مختلف زبان AWK:
-
awk(یاoawkبرای AWK اصیل): پیادهسازی اصلی - GNU AWK (
gawk)، منتشرشده در ۱۹۸۸ که زبان را بهطور قابلتوجهی بازنگری و گسترش داد - BWK AWK (معروف به
nawk)، منتشرشده در اواخر دههی ۹۰ -
mawk: پیادهسازی مفسر بایتکد سریع
-
- در بسیاری از سیستمهای *nix، دستور
awkیک پیوند نمادین بهgawkیاnawkاست
Bash
- Bash یک شل یونیکس است که توسط Brian Fox توسعه یافت و در ۱۹۸۹ منتشر شد.
- بهعنوان جایگزینی آزاد برای شل Bourne طراحی شد و به شل ورود پیشفرض بیشتر توزیعهای لینوکس تبدیل شده است. این یک ابرمجموعه از نحوهی نگارش دستورات شل Bourne است که انتقال را آسانتر میکند
- به روشهای متعددی شل Bourne را گسترش میدهد: بسط آکولاد، تکمیل خط فرمان، مدیریت سیگنال و بیشتر
jq
- توسط Stephen Dolan توسعه یافت و در ۲۰۱۲ منتشر شد
- برای کوئریگیری، تبدیل و دستکاری آسان اسناد JSON طراحی شده است («
sedبرای JSON») - ابزار
jq(که زبان را پیادهسازی میکند) ابتدا در Haskell پیادهسازی شد، اما بعداً به C منتقل شد. پورتهای مبتنی بر Go و Rust هم وجود دارند
Perl
- Perl توسط Larry Wall در اواخر دههی ۱۹۸۰ توسعه یافت و نخستین بار در ۱۹۸۷ منتشر شد.
- بهعنوان یک زبان اسکریپتی همهمنظوره طراحی شد تا پردازش گزارشها را آسانتر کند
- بسیار تأثیرگذار بود، بهویژه پشتیبانیاش از عبارت باقاعده (بعداً به آن برمیگردیم)
Raku
- توسط Larry Wall (خالق Perl) طراحی شد و در ۲۰۱۵ منتشر شد
- در ابتدا با نام Perl 6 شناخته میشد و قرار بود زبان را پاکسازی کند و برخی ویژگیها را که کمفایده یا گیجکننده تلقی میشدند حذف کند (نقل قول جالب: «در Perl 6، تصمیم گرفتیم بهتر است زبان را درست کنیم تا کاربر را.»، Larry Wall). در نهایت Perl 6 با Perl 5 سازگاری منبعی نداشت، بنابراین به Raku تغییر نام یافت
- فلسفهی طراحیاش حول محور لذتبخش و پربازده کردن برنامهنویسی میچرخد و در عین حال طیف وسیعی از ابزارها را برای رویارویی با مجموعهی متنوعی از چالشهای برنامهنویسی فراهم میکند (همهمنظوره)
- از آنجا که Raku یک مشخصه است، میتوانند (و دارند) پیادهسازیهای متعددی داشته باشد. تنها پیادهسازی فعال کنونی Rakudo است، اما پیادهسازیهای قدیمیتری مانند Pugs (نوشتهشده به Haskell)، v6-KindaPerl6 و Niecza (مبتنی بر CLR) هم وجود دارند
این زبانها کجا استفاده میشوند؟
8th
- متأسفانه نتوانستیم جایی که استفاده میشود را پیدا کنیم
AWK
- برای استخراج و گزارشگیری دادهها و بهطور کلی اسکریپتنویسی استفاده میشود
Bash
- عمدتاً برای مدیریت سیستم استفاده میشود، اما برای فراهم کردن ابزارهای CLI یا پوششهایی حول ابزارهای دیگر هم به کار میرود. ما از آن بهوفور برای کار انبوه با مخازن Exercism استفاده کردهایم
jq
- برای کوئری، تبدیل و دستکاری اسناد JSON استفاده میشود، اغلب در قالب اسکریپتهای شل.
Perl
- برای دستکاری دادهها، تجزیهی فایل، برنامهنویسی وب و وظایف مدیریت سیستم استفاده میشود. در روزهای آغازین وب به دلیل تواناییهای دستکاری رشته و اکوسیستم ماژول گستردهاش محبوبیت یافت.
Raku
- برای پردازش متن، مدیریت سیستم و بیشتر استفاده میشود
چه چیزی این زبانها را از دیدگاه برنامهنویسی جالب میکند؟
بیشتر این زبانها بهصورت پویا نوعدهی میشوند و تفسیر میشوند، که با ماهیت اسکریپتیشان جور است. با این حال، چند استثنا هم وجود دارد، بهویژه در پارادایمهای پشتیبانیشده.
8th
- نوعدهی قوی
- چندپارادایمی: رویهای، اما جالبتر اینکه مبتنی بر پشته (مدل اجرای مبتنی بر پشته)، بازتابی (توانایی بررسی و تغییر ساختار و رفتار خود) و الحاقی (همهی عبارات تابع هستند و کنار هم قرار گرفتن توابع نشاندهندهی ترکیب توابع است)
- به کد بومی کامپایل میشود، اما میتواند در REPL هم تفسیر شود
AWK
- پویا نوعدهی میشود و اغلب تفسیر میشود (بستگی به پیادهسازی مورد استفاده دارد)
- پارادایم اصلیاش دادهمحور است، جایی که برنامه را بهصورت دستوراتی توصیف میکنید که دادهی مورد تطبیق و پردازش لازم را توصیف میکنند، بهجای اینکه صریحاً دنبالهای از گامها را برای انجام تعریف کنید. AWK از برنامهنویسی رویهای هم پشتیبانی میکند
Bash
- زبانی پویا و تفسیری
- از برنامهنویسی امری و رویهای پشتیبانی میکند
jq
- زبانی پویا و تفسیری
- زبانی کاملاً تابعی (همهی مقادیر تغییرناپذیرند)، با تأکید بر «خط لولهها». حسابی یونیکسی است
Perl
- پویا نوعدهی میشود و تفسیر میشود
- چندپارادایمی است و از برنامهنویسی تابعی، شیگرا و امری پشتیبانی میکند
Raku
- پویا نوعدهی میشود، اما از نوعدهی تدریجی پشتیبانی میکند، جایی که میتوان در صورت نیاز نوعدهی ایستا افزود (Perl پویا است)
- زبانی چندپارادایمی: امری، رویهای، شیگرا و تابعی
چه چیزی آنها را زبانهای عالی میکند؟
8th
- نحوهی نگارش بسیار کم، یادگیری و درک زبان را آسانتر میکند. از JSON برای توصیف دادهها (مانند اشیاء و آرایهها) استفاده میکند. از دیگر ظرفها مانند پشتهها، صفها و هِپها هم پشتیبانی میکند
- هیچ کلیدواژهی رزروشدهای ندارد. زیرروالها «واژه» نامیده میشوند و میتوان بهراحتی واژههای جدید تعریف کرد. همهی واژهها میتوانند هنگام اجرا بازتعریف شوند، چه داخلی و چه کاربرتعریفشده
- چندسکویی. بهراحتی میتوان برای هر پلتفرم پشتیبانیشده یک فایل اجرایی تولید کرد
- امن. ویژگیهای امنیتی داخلی برای جلوگیری از طیف گستردهای از باگها (بدون دسترسی مستقیم به حافظه، زمان اجرا به کتابخانههای پویا پیوند نمیشود)
AWK
- نحوهی نگارش ساده با ساختار بسیار یکدست کد AWK، که یادگیری و خواندن کد AWK را آسان میکند. ساختارهای دادهاش هم ساده و انعطافپذیرند
- بسیار بیانگر است، جایی که با کد بسیار کم میتوانید کارهای زیادی انجام دهید. برای تکخطیها عالی است
- روی بیشتر ماشینهای *nix نصب است، یعنی میتوانید مهارتهای AWK خود را در جاهای زیادی به کار ببرید (در کنار
/bin/sh، تنها زبان اسکریپتی در یونیکس استاندارد) - در خط لولهها و اسکریپتهای شل خیلی خوب کار میکند، جایی که AWK خروجی ابزارهای دیگر را پردازش میکند یا برعکس
Bash
- روی بیشتر پلتفرمها قابل استفاده است. تقریباً روی همهی ماشینهای *nix، از جمله macOS، نصب است. با Windows Subsystem for Linux (WSL)، اکنون bash روی سیستمهای ویندوز هم در دسترس است.
- بهعنوان یک RE(P)L استفاده میشود، جایی که دستورات تکتک را اجرا میکنید یا کد را از فایلهایی میخوانید و اجرا میکنید (که به آنها اسکریپت شل میگویند). اگر از ترمینال لینوکس استفاده کرده باشید، بهاحتمال زیاد کد bash نوشتهاید، چون ترمینال معمولاً یک RE(P)L bash است
- Bash و اسکریپتهای شل بهطور گسترده برای مدیریت سیستم، دواپس و مدیریت کامپیوتر استفاده میشوند.
- بسیار متنوع و انعطافپذیر
- تواناییهای قدرتمند دستکاری رشته، از جمله درونیابی رشتهی بسیار سرراست
jq
- نحوهی نگارش ساده و کوتاه برای کار با JSON، که یادگیری را آسان میکند
- تعریف توابع سفارشی را برای عملیات پیچیدهتر ممکن میکند.
- از بهینهسازی بازگشت دنبالهای پشتیبانی میکند، که برای پردازش بازگشتی داده عالی است
- ابزار
jqبهصورت یک باینری تکفایل توزیع میشود که فقط حدود ۳۰ کیلوبایت حجم دارد - ابزار
yqدورjqپوشش میدهد تا بتوان از همان نحوهی نگارش برای دستکاری فایلهای XML، TOML و YAML استفاده کرد (در پشتصحنه آن انواع داده را به JSON تبدیل میکند) - هر دو پیادهسازی C و Go از جاسازی در برنامههای دیگر پشتیبانی میکنند
Perl
- روی بیشتر پلتفرمها اجرا میشود. برای نوشتن اسکریپتهای چندسکویی عالی است
- انعطافپذیری سنگبنای فلسفهی طراحی Perl است. شعار معروفش این است: «بیش از یک راه برای انجام آن وجود دارد» (TMTOWTDI). بسته به کار پیش رو میتوان از رویکردهای مختلف استفاده کرد
- جامعهی قوی و میراثی از پروژههای تأثیرگذار. بسیاری از اسکریپتها، ابزارها و برنامهها با Perl توسعه یافتهاند. زمانی به آن گفته میشد: «چسب نواری که اینترنت را کنار هم نگه میدارد»
- اکوسیستم غنی از ماژولها و کتابخانهها، که از طریق Comprehensive Perl Archive Network (CPAN) در دسترس است
Raku
- بزرگ، پیچیده و قدرتمند است، اما طوری طراحی شده که لازم نیست یکجا همهاش را یاد بگیرید. شروع با آن آسان است و میتوان بعداً به ویژگیهای قدرتمندترش وارد شد
- سیستم نوعدهی قدرتمند و قابل گسترش که شامل نوعدهی تدریجی است. این یعنی میتوانید سطح بررسی نوعی که میخواهید را مشخص کنید و بین نوعدهی پویا و ایستا تعادل برقرار کنید
- از چندارسالگی پشتیبانی میکند، که به شما امکان میدهد بدون ارثبری از چندریختی استفاده کنید
- یونیکد در Raku شهروند درجهیک است. پشتیبانی بومی برای کار با کدگذاریهای مختلف کاراکتر فراهم میکند
- ویژگیهای پیشرفتهی همزمانی و موازیسازی را فراهم میکند. پشتیبانی داخلی از برنامهنویسی ناهمزمان، برنامهنویسی واکنشی و اجرای موازی را شامل میشود
ویژگیهای برجستهشان چیست؟
8th
- به روش متفاوتی از تفکر نیاز دارد. ترکیب منحصربهفردش از پارادایمها با زبانهای دیگر بسیار متفاوت است و شما را به چالش میکشد تا روشهای متفاوتی برای نزدیک شدن به مسائل پیدا کنید
- نحوهی نگارش مبتنی بر پشته و نشانگذاری معکوس لهستانی (RPN) مدل ذهنی بسیار سادهای برای اجرای برنامه میسازد. مقادیر روی پشته گذاشته میشوند و بیشتر واژهها بر حسب تأثیرشان روی پشته تعریف میشوند
AWK
- پارادایم دادهمحور بسیار قدرتمند است. به روش متفاوتی از تفکر نیاز دارد، چرا که برنامهها بهصورت مجموعهای از جفتهای شرط/عمل تعریف میشوند و متن به رکوردها تقسیم میشود (معمولاً یک خط برای هر رکورد) و هر رکورد به فیلدها تقسیم میشود (مثلاً فیلدهای CSV یا یک واژه برای هر فیلد). وقتی به این روش عادت کنید، ظرافت و بیانگری این رویکرد را میپسندید و شروع میکنید به دیدن کاربردهایش در همهجا
- برای کار با متن عالی است. چه تجزیهی متن باشد، چه تبدیل متن، یا گزارشگیری، AWK کارتان را راه میاندازد. کارهایی مثل چاپ شل هر کاربر روی سیستم یا جمع زدن یک ستون CSV، شما از این که چقدر کد کم لازم دارید شگفتزده میشوید
Bash
- برای خودکارسازی عالی است. اسکریپتهای شل برای خودکارسازی کارهای تکراری فوقالعادهاند.
- اسکریپتهای Bash از خط لولهها استفاده میکنند و بهراحتی برنامههای دیگر را به هم میچسبانند. ساختن اسکریپتی که خروجی یک دستور را به دستور دیگر بفرستد، یا اسکریپتی که با شکست هر یک از دستورات اجراشده شکست بخورد، بسیار ساده است.
- قدرتمند. سهولتی که با آن میتوان از ابزارهای دیگر استفاده کرد، bash را به ابزاری فوقالعاده قدرتمند تبدیل میکند
jq
- برای استخراج/دستکاری آسان و تمیز دادههای JSON عالی است (که امروزه کلی از آن داریم). به ابزار دیفاکتو برای تبدیل دادههای JSON تبدیل شده است. حتی میتوانید با
jqدادهی JSON بسازید - از دادهی جریانی پشتیبانی میکند، یعنی میتوانید با دادههای «بینهایت» بدون مشکل حافظه کار کنید
- تأکید بر خط لولهها برای هر کسی که با جریانها آشناست، مثلاً ابزارهای یونیکس، یادگیریاش آسان است. همچنین استدلال دربارهی کد jq را نسبتاً آسان میکند
Perl
- به خاطر موجز بودن و بیانگریاش مشهور است. برای انجام کارهای زیاد به کد بسیار کمی نیاز دارید
- بهویژه برای کار با متن مناسب است، عمدتاً به خاطر پشتیبانی قدرتمندش از عبارت باقاعده. بهطور خاص Perl 5 ویژگیهای جدید زیادی معرفی کرد (مانند ارجاعهای عقب، گروههای گرفتن نامدار و سورهای تنبل). Philip Hazel کتابخانهی PCRE (عبارتهای باقاعدهی سازگار با Perl) را ساخت، یک کتابخانهی C که موتور عبارت باقاعدهی سازگار با Perl 5 را پیادهسازی میکند. حتی زبانهایی که روی PCRE ساخته نمیشوند هم اغلب پشتیبانی عبارت باقاعدهشان را سازگار با PCRE طراحی میکنند (و در نتیجه از نحوهی نگارش Perl 5 استفاده میکنند)
Raku
- از junctionهای خودکار-رشتهساز پشتیبانی میکند، که کار با موازیسازی را بسیار آسانتر میکنند
- از ارزیابی تنبل پشتیبانی میکند، که به شما امکان میدهد با فهرستها و دنبالههای بینهایت بدون برخوردن به مشکلات حافظه کار کنید. این بهویژه هنگام کار با مجموعهدادههای بزرگ یا الگوریتمهایی که شامل جریانهای دادهی بینهایت هستند مفید است
- برای پردازش متن عالی است، زیرا نحوهی نگارش عبارت باقاعدهی سادهتر، خواناتر و قدرتمندتری فراهم میکند
- پشتیبانی داخلی از تعریف زبانهای خاص دامنه (DSL) با استفاده از گرامرها. این به شما امکان میدهد برای قالبهای دادهی خاص یا زبانها تجزیهگر بسازید و کار با دادههای متنی پیچیده را آسانتر میکند
کدام را امتحان کنید؟
- اگر عمدتاً از سیستم یونیکس استفاده میکنید یا کار دواپس انجام میدهید، Bash زبانی بسیار ارزشمند برای یادگیری است. یادگیری AWK، Perl یا Raku هم میتواند واقعاً مفید باشد، و دو مورد اول روی بسیاری از سیستمها از پیش نصب هستند
- اگر با JSON (یا XML/YAML/TOML) کار میکنید،
jqانتخاب واضحی است - اگر میخواهید متن پردازش کنید، AWK، Perl و Raku انتخابهای واضحی هستند.
- اگر دوست دارید چیزی کمی متفاوت را امتحان کنید، 8th گزینهی عالیای است