Вступ
Привіт усім. Вітаю в грудні. Сподіваюся, у всіх усе добре.
Жовтень у нас був надзвичайно насиченим. Ми щойно випустили велике покращення для рішень спільноти. Тепер ми прибираємо дублікати, тож схожі рішення показуються лише один раз, ми додали нові варіанти впорядкування й можливість пошуку за кодом, а якщо зазирнути в C#, то побачимо, що ми також додали фільтрування за різними концепціями програмування. Тож можна шукати рішення, які використовують побітовий зсув, рекурсію чи будь-що інше на власний смак. Ми розгорнемо це і в інших треках протягом тижня спільноти.
Але поки що зосередьмося на #12in23. Листопад був цікавим місяцем з дослідженням мов асемблера, але цього місяця ми беремося за дуже різноманітний набір мов, а саме ColdFusion, Groovy, Lua, VimScript і Wren. Як завжди, Ерік розповість нам, що робить ці мови цікавими та унікальними.
Значки
Як і завжди, значок «Грудневі розваги» можна отримати, виконавши будь-які 5 вправ цими мовами. У нас також є значок за весь рік, до якого, як я знаю, багато з нас прагне. Для нього ми підготували 5 вибраних вправ, які варто виконати. Ось вони:
- Уся ваша база: перевести число, подане як послідовність цифр, в іншу систему числення.
- Сплющення масиву: узяти вкладену колекцію й повернути одну, невкладену колекцію.
- Атака ферзя: визначити, чи можуть дві ферзі на шахівниці атакувати одна одну.
- Персонаж D&D: випадково генерувати персонажів Dungeons & Dragons.
- Кодування довжин серій: реалізувати кодування й декодування довжин серій.
Огляди
ColdFusion
- Створено 1995 року компанією Allaire Corporation, яку 2001 року купила Macromedia, а її своєю чергою 2005 року купила Adobe.
- Задумано як платформу для швидкої веброзробки
- Працює на віртуальній машині Java (JVM)
- Є два окремі синтаксиси, які мають різний вигляд, але семантично ідентичні:
- Старіший синтаксис розмітки на основі тегів, який розширює HTML для показу динамічного вмісту.
- Новіший, схожий на ECMAScript синтаксис можна використовувати там, де використовується синтаксис на основі тегів, а також в окремих файлах скриптів. Мета полягала в тому, щоб винести бізнес-логіку з розмітки в окремий файл скрипта
- CFScript - це мова загального призначення, що працює на JVM, саме так її використовує Exercism. На практиці вона так і не відійшла далеко від своїх витоків у вебсервері.
- ColdFusion - це платний продукт, але Lucee Foundation (неприбуткова організація зі Швейцарії) досі активно розробляє свій сервер ColdFusion з відкритим кодом, і саме їхній Lucee Server ми використовуємо для треку Exercism.
- Досі активно розробляється
- Використовується переважно в корпоративному програмному забезпеченні; серед клієнтів є Apple, Adobe, General Motors та інші
Groovy
- Розробку почав Джеймс Стречен 2003 року. 2015 року проєкт перейняла Apache.
- Мета полягала в тому, щоб створити динамічно типізовану мову на JVM (на противагу статично типізованій Java), яка також зменшувала б обсяг шаблонного коду
- Хоча більшість коду Java також є коректним кодом Groovy, між ними багато відмінностей (наприклад, Groovy допускає динамічну типізацію та розвинене метапрограмування). На мову також сильно вплинули Python і Ruby.
- Використовується для написання скриптів, інструментів збірки (Gradle), неперервної інтеграції (CI, Jenkins), вебзастосунків (Grails), тестування (Spock). Популярний сторонній додаток для інструментів Atlassian дає змогу писати скрипти мовою Groovy.
Lua
- Lua створили 1993 року Роберту Ієрузалімскі, Луїс Енріке де Фігейреду та Валдемар Селес у Папському католицькому університеті Ріо-де-Жанейро, у Бразилії.
- Назва вимовляється як ЛУ-а, що португальською означає «Місяць», і відсилає до мови Sol, яка частково надихнула Lua і чия назва португальською означає «Сонце»
- Створена насамперед для вбудовування, з акцентом на швидкість, переносимість, розширюваність і простоту використання під час розробки.
- Зазнала впливу Modula, CLU, C++, SNOBOL і AWK. Подібно до того, як LISP і Scheme мали єдиний повсюдний механізм структур даних (список), Lua має такий у вигляді своєї таблиці.
- Інтерпретується через байткод, зазвичай під час запуску, але це можна зробити й заздалегідь.
- Використовується переважно для написання скриптів, наприклад у таких іграх, як World of Warcraft, Dota 2 і Crysis, або в застосунках на кшталт Adobe Lightroom і деякому системному програмному забезпеченні FreeBSD. Також часто використовується для розширюваності, наприклад у Redis, Neovim і Nginx.
VimScript
- VimScript (також Vim Script, через пробіл, або VimL, скорочено від Vim Language) - це мова скриптів, яку використовують у текстовому редакторі Vim.
- Походить від ex, орієнтованого на рядки візуального редактора, що передував Vi
- Не мова загального призначення, а спеціалізована, що надає ефективне й оптимізоване середовище для скриптів, аби розширювати й налаштовувати функціональність Vim через плагіни, конфігурації, макроси та функції.
- Хоча Vim переважно написано мовою C, Vimscript дає змогу налаштовувати й розширювати Vim за допомогою високорівневої мови скриптів.
- Використовується у, власне, Vim, а також у NeoVim, форку Vim
Wren
- Створена 2016 року Бобом Ністромом, автором книжки «Crafting Interpreters»
- Цілі: компактність, простота, швидкість.
- Задумана для вбудовування в інші застосунки. Автор вважав наявні варіанти (як-от Lua і TCL) недостатніми й хотів просту вбудовувану мову, яка була б природною для людей з обʼєктно-орієнтованим досвідом
- Використовується в:
- TIC-80 - фантазійний компʼютер для створення, гри та обміну крихітними іграми (схожий на PICO8)
- DOME - кросплатформний фреймворк для створення ігор.
- luxe - кросплатформний ігровий рушій для швидкої розробки ігор.
- Wren Console - REPL і CLI для Wren, значною мірою написані самою мовою Wren давнім контрибʼютором Exercism Джошем Ґебелем; саме їх ми використовуємо для треку Wren
А чим вони різняться з погляду програмування?
ColdFusion
- Динамічна типізація
- Мультипарадигмова, передусім обʼєктно-орієнтована, але дедалі більше функціональна.
Groovy
- Зазвичай динамічна типізація, але буває й статична (і поступова)
- Може бути і інтерпретованою, і скомпільованою (починаючи з версії 2). Саме тому її часто використовують у скриптах
- Мультипарадигмова: передусім обʼєктно-орієнтована, а також імперативна, функціональна, декларативна
Lua
- Динамічна типізація, зазвичай інтерпретується, але може бути попередньо скомпільована
- Мультипарадигмова: процедурна, обʼєктно-орієнтована (щоправда, трохи інакше), функціональна та керована даними
VimScript
- Динамічна типізація, інтерпретована
- Мультипарадигмова: імперативна, функціональна та проста форма обʼєктно-орієнтованого програмування
Wren
- Динамічна типізація, але статичне визначення; це дає змогу зробити компілятор дуже швидким.
- Передусім обʼєктно-орієнтована мова, але також імперативна і трохи функціонального програмування
Що робить ці мови такими чудовими?
ColdFusion
- Чудове розділення між керуванням сервером і створенням застосунку. Консоль адміністратора налаштовує зʼєднання з базою даних і моніторинг сервера (та будь-що інше), а творцям застосунку потрібна лише назва джерела даних (обʼєкт CF з потрібними методами, заздалегідь зʼєднаний з відповідними частинами СУБД) і доступ на запис до каталогу з файлами застосунку.
- Використовує потужність JVM і екосистеми Java, зокрема можливість імпортувати будь-яку бібліотеку Java і використовувати її в CF
Groovy
- Загального призначення: підходить майже для будь-яких задач, зокрема застосунків і вебсайтів.
- Оскільки вона працює на JVM, усі її переваги тут теж діють: зріла, надзвичайно продуктивна віртуальна машина й величезна кількість доступних бібліотек. Добре взаємодіє з Java
- Помʼякшує багато проблем, які можуть виникати в людей із Java, як-от перевірювані винятки,
- безпека щодо null, багатослівність і брак розвиненого метапрограмування
- Сучасна мова: розвинене виведення типів, замикання, вбудований синтаксис для регулярних виразів, автоматична генерація гетерів і сетерів
- Чудова підтримка функціонального програмування: замикання (як блоки в Ruby), каррінг (часткове застосування), ліниве обчислення, незмінність тощо
Lua
- Загального призначення: використовується у вбудованих системах, для прототипування, написання скриптів, розробки ігор, вебу та бекенду.
- Проста: порівняно мало синтаксису, тож мову легко вивчити. Лише кілька атомарних типів даних і лише один вбудований складений тип даних: таблиця. Памʼять прибирає збирач сміття
- Переносима: інтерпретатор написано на ANSI C, для якої компілятор існує майже для будь-якої платформи
VimScript
- Проста: легкий синтаксис, який легко вивчити й використовувати.
- Взаємодія: легкий доступ до файлів, оболонок та інших програм. Уся потужність зовнішнього інструментарію, не виходячи з Vim.
- Виразна: багато робити малим. Писати компактні й водночас дуже читабельні скрипти.
- Потужний рушій регулярних виразів: реалізація регулярних виразів у Vimscript натхненна Emacs Lisp і дає потужний інструмент для роботи з текстом.
Wren
- Малий: віртуальну машину реалізовано менш ніж за 4000 рядків коду
- Зразковий: реалізацію віртуальної машини любовно прокоментовано, написано на C, і читати її не так уже й складно. Чудовий спосіб навчитися створювати мову. Більшість стандартної бібліотеки реалізовано самим Wren, тож можна побачити, як зроблено і її.
- Звична: завдяки синтаксису швидше опановуєш мову. Тим, хто знайомий із Java чи C++, буде як удома. Дозволяє перевантаження методів за арністю
- Дуже хороша документація: документація мови й стандартної бібліотеки легка для читання, вичерпна й має багато прикладів.
- Мала, але напрочуд повна стандартна бібліотека.
Найпомітніші можливості
ColdFusion
- Усе з коробки: безліч речей вбудовано: робота з PDF, ZIP, Excel, XML, JSON, створення API, електронна пошта, інтеграція з S3, безліч різних баз даних… без встановлення додаткових пакетів. Чудово зменшує несумісність версій
- Масштабована й безпечна, чудово підходить для корпоративного програмного забезпечення
- Просте, інтуїтивне програмування, завдяки якому новачки можуть дуже швидко запускати складні вебсторінки, керовані даними. Інтеграція з DreamWeaver чудова.
Groovy
- Гнучкий синтаксис: крапки й дужки можна опускати, що дає змогу створювати дуже зручні предметно-орієнтовані мови
- Метапрограмування: підтримує метапрограмування як під час виконання, так і під час компіляції. Наприклад, анотація @ToString згенерує реалізацію ToString під час компіляції, а зміна метакласу обʼєкта під час виконання дає змогу робити мавпʼяче патчення.
- Білдери: швидко обробляти й будувати JSON, XML, HTML за допомогою коду, що має гарний вигляд. Будувати зі Swing для швидкої розробки GUI.
- Трейти: трейти Groovy дають змогу поєднувати поведінку й властивості в багаторазово використовувані блоки. Схоже на міксини в Ruby.
Lua
- Вбудовувана: задумана так, щоб її було легко вбудувати. Має порівняно простий C API для легкого вбудовування. Розмір не проблема: повний довідковий інтерпретатор займає лише 247 кБ!
- Розширювана: базову мову навмисно тримають порівняно малою, але при цьому вона легко розширюється. Це робить мову простішою для вивчення, легшою для вбудовування й дуже гнучкою
- Швидка: Lua часто належить до найшвидших динамічних мов, особливо з інтерпретатором LuaJit
VimScript
- Розширюваність: Vimscript дає змогу розширювати редактор новою функціональністю
- Налаштовуваність: налаштувати редактор так, як нам зручно (самі плагіни Vimscript переважно написані мовою Vimscript)
- Керованість подіями: автоматичне виконання коду за певних подій чи умов, як-от відкриття файлу чи збереження буфера.
- Використання потужності Vim: вбудований доступ до можливостей та API Vim, що дає скриптам змогу керувати текстом, буферами, вікнами тощо.
Wren
- Швидка: чудова продуктивність для динамічної мови
- Вбудовувана: легко вбудувати в інше програмне забезпечення. Творець мови раніше був розробником ігор: хотів мати змогу додавати скриптові можливості до ігор. C API досить чистий і простий.
- Конкурентна: легка конкурентність і корутини через файбери, дуже легковагі конструкції (як-от горутини чи процеси Erlang), які легко спілкуються між собою
Що обрати
- Якщо хочеться створювати вебзастосунки, то ColdFusion і Groovy - хороший вибір
- Якщо цікавить мова, яку можна вбудувати, то основними варіантами будуть Lua і Wren, але на Groovy теж варто поглянути
- Ті самі три мови, Lua, Wren і Groovy, підійдуть і для написання скриптів загального призначення
- Якщо працюємо з JVM, то природним вибором будуть ColdFusion і Groovy
- Якщо важлива продуктивність, то найкращими варіантами, найімовірніше, будуть Lua і Wren
- Якщо основний редактор - Vim чи NeoVim, то VimScript, очевидно, чудовий вибір
- Якщо цікаво вивчати або створювати компілятор і віртуальну машину, Wren - ідеальний варіант
- За обʼєктно-орієнтованого досвіду Wren, найімовірніше, виявиться найлегшою мовою для вивчення
- Якщо сподобався єдиний повсюдний механізм структур даних у LISP, спробуйте Lua
- Якщо хочеться спробувати програмування, кероване подіями, погляньте на VimScript