مقدمه
سلام به همگی. به دسامبر خوش آمدید. امیدوارم حالتان خوب باشد.
اکتبر بسیار پرکاری داشتیم. همین تازگی یک بهبود بزرگ در راهحلهای جامعه عرضه کردیم. حالا آنها را حذف تکراری میکنیم، بنابراین راهحلهای مشابه فقط یکبار نمایش داده میشوند؛ گزینههای جدید مرتبسازی و امکان جستجو بر اساس کد را اضافه کردهایم؛ و اگر C# را بررسی کنید، میبینید که امکان فیلتر کردن بر اساس مفاهیم مختلف برنامهنویسی را هم اضافه کردهایم. پس میتوانید به دنبال راهحلهایی بگردید که از شیفت بیتی، بازگشت یا هر چه که دوست دارید استفاده میکنند. این را در هفتهی جامعه به مسیرهای دیگر هم عرضه میکنیم.
اما فعلاً بیایید روی #12in23 تمرکز کنیم. نوامبر ماه جالبی بود و در آن زبانهای اسمبلی را کاوش کردیم، اما این ماه به سراغ مجموعهی بسیار متنوعی از زبانها میرویم، بهطور مشخص ColdFusion، Groovy، Lua، VimScript و Wren. طبق معمول، Erik قرار است دربارهی آنچه این زبانها را جالب و منحصربهفرد میکند برایمان صحبت کند.
نشانها
طبق همیشه، میتوانید با تکمیل هر ۵ تمرین در این زبانها نشان «تفریحات دسامبر» را به دست آورید. ما یک نشان «سراسر سال» هم داریم که میدانم بسیاری از شما برای رسیدن به آن تلاش میکنید. برای آن، ۵ تمرین ویژه برای تکمیل داریم. اینها عبارتاند از:
- همهی پایههای شما: یک عدد را که بهصورت دنبالهای از ارقام نمایش داده شده، به پایهی دیگری تبدیل کنید.
- مسطحسازی آرایه: یک مجموعهی تودرتو بگیرید و یک مجموعهی تکی و بدون تودرتویی برگردانید.
- حملهی وزیر: تعیین کنید که آیا دو وزیر روی صفحهی شطرنج میتوانند به یکدیگر حمله کنند.
- شخصیت D&D: بهصورت تصادفی شخصیتهای Dungeons & Dragons را تولید کنید.
- کدگذاری طول اجرا: کدگذاری و رمزگشایی طول اجرا را پیادهسازی کنید.
بررسیهای کلی
ColdFusion
- در سال ۱۹۹۵ توسط شرکت Allaire ساخته شد؛ شرکت Macromedia در سال ۲۰۰۱ آن را خرید و سپس Adobe در سال ۲۰۰۵ آن را خرید.
- بهعنوان یک پلتفرم توسعهی سریع وب طراحی شد
- روی ماشین مجازی جاوا (JVM) اجرا میشود
- دو نحوهی نگارش جداگانه دارد که متفاوت به نظر میرسند اما از نظر معنایی یکسان هستند:
- نحوهی نگارش قدیمیتر و مبتنی بر برچسب که HTML را برای نمایش محتوای پویا گسترش میدهد.
- نحوهی نگارش جدیدتر و شبیه به ECMAScript میتواند همان جایی که نحوهی نگارش مبتنی بر برچسب به کار میرود استفاده شود، اما در فایلهای اسکریپت جداگانه هم قابل استفاده است. هدف این بود که منطق تجاری از نشانهگذاری به یک فایل اسکریپت جداگانه منتقل شود
- CFScript یک زبان همهمنظوره است که روی JVM اجرا میشود و Exercism از آن همینگونه استفاده میکند. در عمل، هرگز چندان از ریشههای وبسروری خود دور نشد.
- ColdFusion یک محصول پولی است، اما بنیاد Lucee (یک سازمان غیرانتفاعی مستقر در سوئیس) هنوز فعالانه سرور ColdFusion متنباز خود را توسعه میدهد، که ما از Lucee Server آن برای مسیر Exercism استفاده میکنیم.
- هنوز فعالانه در حال توسعه است
- عمدتاً در نرمافزارهای سازمانی استفاده میشود؛ مشتریان آن شامل Apple، Adobe، General Motors و دیگران است
Groovy
- از سال ۲۰۰۳ توسط James Strachan توسعه یافت. پروژه در سال ۲۰۱۵ توسط Apache پذیرفته شد.
- هدف، توسعهی یک زبان با نوعدهی پویا روی JVM بود (در تقابل با Java که نوعدهی ایستا دارد) که بتواند کد قالبی را هم کاهش دهد
- در حالی که بیشتر کد Java یک کد Groovy معتبر هم هست، تفاوتهای زیادی وجود دارد (مثلاً Groovy نوعدهی پویا و فرابرنامهنویسی پیشرفته را ممکن میکند). این زبان از Python و Ruby هم بسیار تأثیر گرفته است.
- برای اسکریپتنویسی، ابزارهای ساخت (Gradle)، یکپارچهسازی مستمر (Jenkins)، اپلیکیشنهای وب (Grails) و تست (Spock) استفاده میشود. یک افزونهی محبوب شخص ثالث برای ابزارهای Atlassian امکان اسکریپتنویسی با Groovy را فراهم میکند.
Lua
- Lua در سال ۱۹۹۳ توسط Roberto Lerusalimschy، Luiz Henrique de Figueiredo و Waldemar Celes در دانشگاه کاتولیک پونتیفیکال ریو دو ژانیرو در برزیل ساخته شد.
- نام آن LOO-ah تلفظ میشود که در پرتغالی به معنای ماه است و اشارهای است به زبان Sol که تا حدی از آن الهام گرفته شده و در پرتغالی به معنای «خورشید» است
- عمدتاً برای جاسازی طراحی شده و بر سرعت، قابلیت حمل، قابلیت توسعه و سهولت استفاده در توسعه تمرکز دارد.
- از Modula، CLU، C++، SNOBOL و AWK تأثیر گرفته است. همانطور که LISP و Scheme یک سازوکار تک و همهجا حاضر برای ساختار داده داشتند (لیست)، Lua این را با جدول خود دارد.
- از طریق بایتکد تفسیر میشود، معمولاً در حین اجرا، اما میتوان از پیش هم این کار را انجام داد.
- عمدتاً برای اهداف اسکریپتنویسی استفاده میشود، مثلاً در بازیهایی مانند World of Warcraft، Dota 2 و Crysis یا برنامههایی مانند Adobe Lightroom و برخی نرمافزارهای سیستمی FreeBSD. همچنین بسیار برای افزودن قابلیت توسعه استفاده میشود، مثلاً در Redis، Neovim و Nginx.
VimScript
- VimScript (که با فاصله Vim Script یا برای Vim Language بهصورت VimL هم خوانده میشود) زبان اسکریپتنویسی مورد استفاده در ویرایشگر متن Vim است.
- برگرفته از ex، ویرایشگر بصری خطمحوری که پیش از Vi بود
- یک زبان همهمنظوره نیست، بلکه زبانی تخصصی است که محیطی کارآمد و بهینهشده برای اسکریپتنویسی فراهم میکند تا بتوان از طریق افزونهها، پیکربندیها، ماکروها و توابع، کارکردهای Vim را گسترش داد و سفارشی کرد.
- در حالی که Vim عمدتاً با C نوشته شده، Vimscript به کاربران امکان میدهد تا Vim را از طریق یک زبان اسکریپتنویسی سطح بالا سفارشی کنند و گسترش دهند.
- در خب، Vim استفاده میشود، اما در NeoVim هم که یک انشعاب از Vim است
Wren
- در سال ۲۰۱۶ توسط Bob Nystrom، نویسندهی کتاب Crafting Interpreters، نوشته شد
- اهداف: کوچک، ساده، سریع.
- برای جاسازی در برنامههای دیگر طراحی شده است. نویسنده گزینههای موجود (مانند Lua و TCL) را ناکافی یافت و زبانی ساده و قابل جاسازی میخواست که برای افراد با پیشینهی شیءگرا طبیعی به نظر برسد
- استفاده شده در:
- TIC-80، یک کامپیوتر خیالی برای ساخت، بازی و اشتراکگذاری بازیهای کوچک (شبیه PICO8)
- DOME، یک چارچوب چندسکویی برای ساخت بازی.
- luxe، یک موتور بازی چندسکویی برای توسعهی سریع بازی.
- Wren Console، یک REPL و CLI برای Wren که عمدتاً خودش با Wren توسط Josh Goebel، مشارکتکنندهی دیرینهی Exercism، نوشته شده و ما از آن برای مسیر Wren استفاده میکنیم
و از منظر برنامهنویسی، چه تفاوتی دارند؟
ColdFusion
- با نوعدهی پویا
- چندپارادایمی، عمدتاً شیءگرا اما بهطور فزاینده تابعی.
Groovy
- معمولاً با نوعدهی پویا، اما میتواند ایستا (و بهصورت تدریجی) هم نوعدهی شود
- هم میتواند تفسیر و هم کامپایل شود (از نسخهی ۲). به همین دلیل اغلب در اسکریپتها استفاده میشود
- چندپارادایمی: عمدتاً شیءگرا، اما دستوری، تابعی و اعلانی هم هست
Lua
- با نوعدهی پویا و معمولاً تفسیر میشود، اما میتواند از پیش کامپایل شود
- چندپارادایمی: رویهای، شیءگرا (هرچند کمی متفاوت)، تابعی و دادهمحور
VimScript
- با نوعدهی پویا و تفسیری
- چندپارادایمی: دستوری، تابعی و شکل سادهای از برنامهنویسی شیءگرا
Wren
- با نوعدهی پویا، اما ایستا تعریف شده؛ همین به کامپایلر امکان میدهد بسیار سریع باشد.
- زبانی عمدتاً شیءگرا، اما دستوری و کمی هم برنامهنویسی تابعی
چه ویژگیهایی این زبانها را عالی میکند؟
ColdFusion
- جداسازی عالی میان مدیریت سرور و ساخت برنامه. کنسول مدیریت، اتصالات پایگاهداده و پایش سرور (و هر مورد دیگری) را تنظیم میکند، و سازندگان برنامه فقط به اسم یک منبع داده نیاز دارند (یک شیء CF با متدهای لازم که از پیش به بخشهای مناسب DBMS متصل شده است)، بهعلاوهی دسترسی نوشتن به یک پوشه برای فایلهای برنامه.
- بهرهگیری از قدرت JVM و اکوسیستم Java، که شامل امکان وارد کردن هر کتابخانهی Java و استفاده از آن در CF است
Groovy
- همهمنظوره: تقریباً برای هر بار کاری قابل استفاده است، از جمله اپلیکیشنها و وبسایتها.
- چون روی JVM اجرا میشود، همهی مزایای آن هم برقرار است: ماشین مجازی بالغ و بسیار کارآمد و شمار عظیمی از کتابخانههای در دسترس. تعامل خوبی با Java دارد
- بسیاری از مشکلاتی را که ممکن است افراد با Java داشته باشند کاهش میدهد، مانند استثناهای بررسیشده،
- ایمنی در برابر null، پرگویی و نبود فرابرنامهنویسی پیشرفته
- زبان مدرن: استنتاج نوع پیشرفته، بستارها، نحوهی نگارش توکار برای عبارات باقاعده، تولید خودکار getter و setter
- پشتیبانی عالی از برنامهنویسی تابعی: بستارها (مانند بلوکهای Ruby)، کارینگ (اعمال جزئی)، ارزیابی تنبل، تغییرناپذیری و بیشتر
Lua
- همهمنظوره: در سیستمهای جاسازیشده، برای نمونهسازی، اسکریپتنویسی و توسعهی بازی، وب و بکاند استفاده میشود.
- ساده: نحوهی نگارش نسبتاً کم، که یادگیری زبان را آسان میکند. فقط چند نوع دادهی اتمی و تنها یک نوع دادهی ترکیبی توکار: جدول. حافظه بهصورت خودکار جمعآوری میشود
- قابل حمل: مفسر آن با ANSI C نوشته شده که تقریباً برای هر سکویی کامپایلر دارد
VimScript
- ساده: نحوهی نگارش سبک که یادگیری و استفاده از آن آسان است.
- قابلیت تعامل: دسترسی آسان به فایلها، پوستهها و برنامههای دیگر. تمام قدرت ابزارهای بیرونی بدون ترک کردن Vim.
- گویا: با کم، زیاد انجام دهید. اسکریپتهای فشردهای بنویسید که بسیار خوانا هستند.
- موتور قدرتمند عبارات باقاعده: پیادهسازی عبارت باقاعده در Vimscript از پیادهسازی Emacs Lisp الهام گرفته و ابزاری قدرتمند برای دستکاری متن فراهم میکند.
Wren
- کوچک: ماشین مجازی آن با کمتر از ۴۰۰۰ خط کد پیادهسازی شده است
- الگو: پیادهسازی ماشین مجازی آن با دقت و عشق کامنتگذاری شده، با C نوشته شده و خواندنش چندان سخت نیست. راهی عالی برای یادگیری نحوهی ساختن یک زبان. بیشتر کتابخانهی استاندارد با خود Wren پیادهسازی شده، پس میتوانید ببینید آن هم چگونه پیادهسازی شده است.
- آشنا: نحوهی نگارش آن کار یادگیری را سریعتر میکند. اگر با Java یا C++ آشنا باشید، احساس راحتی میکنید. امکان سربارگذاری متد بر اساس تعداد آرگومانها را میدهد
- مستندات واقعاً خوب: مستندات زبان و کتابخانهی استاندارد خوانا، گسترده و پر از مثال هستند.
- کتابخانهی استاندارد کوچک اما بهطور شگفتآوری کامل.
ویژگیهای برجسته
ColdFusion
- همهچیز از پیش آماده: کلی قابلیت بهصورت توکار وجود دارد: کار با PDF، ZIP، Excel، XML، JSON، ساخت API، ایمیل، یکپارچهسازی با S3، بسیاری از پایگاهدادههای مختلف… بدون نصب بستههای اضافی. عالی برای کاهش ناسازگاری نسخهها
- مقیاسپذیر و امن، عالی برای نرمافزارهای سازمانی
- برنامهنویسی ساده و شهودی که باعث میشود مبتدیها بتوانند خیلی سریع صفحات وب پیچیده و دادهمحور را راه بیندازند. یکپارچهسازی با DreamWeaver فوقالعاده است.
Groovy
- نحوهی نگارش انعطافپذیر: نقطهها و پرانتزها میتوانند حذف شوند، که امکان ساخت زبانهای دامنهمحور بسیار خوب را فراهم میکند
- فرابرنامهنویسی: هم فرابرنامهنویسی زمان اجرا و هم زمان کامپایل را پشتیبانی میکند. برای مثال، حاشیهنویسی @ToString یک پیادهسازی ToString در زمان کامپایل تولید میکند و تغییر metaclass یک شیء در زمان اجرا امکان monkey-patching را میدهد.
- سازندهها: با کدی خوشنما JSON، XML و HTML را سریع بسازید و مدیریت کنید. با Swing برای توسعهی سریع رابط گرافیکی کاربر بسازید.
- Traits: Traits در Groovy به شما امکان میدهد رفتارها و خصوصیات را در تکههای قابل استفادهی مجدد ترکیب کنید. مشابه mixin در Ruby.
Lua
- قابل جاسازی: طوری طراحی شده که جاسازی آن آسان باشد. یک API سادهی C دارد که جاسازی آسان را ممکن میکند. اندازه مشکلی نیست: مفسر مرجع کامل آن فقط ۲۴۷ کیلوبایت است!
- قابل توسعه: زبان پایه عمداً نسبتاً کوچک نگه داشته شده، اما همان چیزی که ممکن میکند، توسعهی آسان زبان است. این کار یادگیری زبان را سادهتر، جاسازی آن را سبکتر و آن را بسیار انعطافپذیر میکند
- سریع: Lua اغلب یکی از سریعترین زبانهای پویا است، بهویژه هنگام استفاده از مفسر LuaJit
VimScript
- قابلیت توسعه: Vimscript به شما امکان میدهد ویرایشگر خود را با کارکردهای جدید گسترش دهید
- قابل سفارشیسازی: ویرایشگر خود را دقیقاً همانطور که میخواهید تنظیم کنید (خود افزونههای Vimscript عمدتاً با Vimscript نوشته شدهاند)
- رویدادمحور: اجرای خودکار کد بر اساس رویدادها یا شرایط خاص، مانند باز شدن فایل یا ذخیرهی بافر.
- استفاده از قدرت Vim: دسترسی توکار به ویژگیها و APIهای Vim، که به اسکریپتها امکان میدهد متن، بافرها، پنجرهها و موارد دیگر را دستکاری کنند.
Wren
- سریع: کارایی عالی برای یک زبان پویا
- قابل جاسازی: جاسازی آن در نرمافزارهای دیگر آسان است. سازندهی زبان پیشتر توسعهدهندهی بازی بود: میخواست بتواند امکانات اسکریپتنویسی به بازیها اضافه کند. API زبان C کاملاً تمیز و ساده است.
- همروند: همروندی و کوروتینهای آسان با fiberها، که ساختاری بسیار سبک هستند (مانند goroutineها یا پردازشهای Erlang) و میتوانند بهراحتی با یکدیگر ارتباط برقرار کنند
کدام را انتخاب کنیم
- اگر میخواهید برنامههای وب بسازید، ColdFusion و Groovy انتخابهای خوبی هستند
- اگر به زبانی علاقهمند هستید که قابل جاسازی باشد، Lua و Wren گزینههای اصلی هستند، اما Groovy هم ممکن است ارزش یک نگاه را داشته باشد
- همان سه زبان، یعنی Lua، Wren و Groovy، اگر بخواهید اسکریپتهای همهمنظوره بنویسید هم منطقی هستند
- اگر با JVM کار میکنید، ColdFusion و Groovy انتخابهای طبیعی هستند
- اگر برایتان کارایی مهم است، Lua و Wren احتمالاً بهترین گزینههای شما هستند
- اگر ویرایشگر اصلی شما Vim یا NeoVim است، VimScript بدیهی است که انتخاب عالی است
- اگر به یادگیری دربارهی کامپایلر و ماشین مجازی یا ساختن آنها علاقه دارید، Wren برای شما بینقص است
- اگر پیشینهی شیءگرا دارید، Wren احتمالاً آسانترین زبان برای یادگیری است
- اگر طراحی ساختار دادهی تک و همهجا حاضر LISP را دوست داشتید، Lua را امتحان کنید
- اگر میخواهید برنامهنویسی رویدادمحور را امتحان کنید، VimScript را ببینید