Uploaded avatar of iHiD

Це Обʼєктно-орієнтований жовтень

@iHiD
Майже 3 роки тому
Відео

Вступ

Привіт усім. Сподіваюся, у всіх усе гаразд. Вересень видався насиченим місяцем. Ми випустили багато нових покращень і можливостей для сайту, переважно повʼязаних із наставництвом і процесами навколо нього. Як наслідок, тепер до нас надходить удвічі більше запитів на наставництво, ніж чотири тижні тому, і це чудово. Якщо ще не доводилося отримувати відгук на свій код від наставника, обовʼязково варто спробувати: це дивовижний спосіб навчатися. А якщо хочеться допомогти іншим, у чергах на нас чекає багато запитів. Зареєструватися як наставник можна за посиланням «Наставництво» в меню «Долучитися»! Ми також провели велике оновлення бази даних із MySQL 5.6 до MySQL 8, яке я записав і яке доступне в розділі «Insiders», тож якщо є статус Insider і цей запис ще не переглянуто, обовʼязково варто його подивитися!

Гаразд, переходимо до #12in23. Вересень був цікавим місяцем: ми досліджували лаконічні, стислі мови. Цього місяця рушаємо в інший бік і беремося за значно більших звірів. Ми зосереджуємося на обʼєктно-орієнтованих мовах, а саме на C#, Crystal, Java, Pharo, Ruby та PowerShell. Ми вже говорили про Pharo і Java (у травні та серпні відповідно), тож не розповідатимемо про них знову в цьому відео, але якщо цікаво почути вступ до цих мов, варто подивитися відео за попередні місяці. А в цьому відео ми розглянемо C#, Crystal, Ruby і PowerShell, і, як завжди, Erik розповість, що робить ці мови цікавими та особливими.

Значки

Як завжди, значок «Обʼєктно-орієнтований жовтень» можна отримати, виконавши будь-які 5 вправ цими мовами. У нас також є значок «За весь рік», до якого, як я знаю, прагне багато хто. Для нього ми підготували 5 вибраних вправ, які добре підходять для розвʼязання в обʼєктно-орієнтованому стилі. Ось вони:

  • Двійкове дерево пошуку: вставляти числа в двійкове дерево та шукати їх
  • Кільцевий буфер: реалізувати наскрізно звʼязану структуру даних
  • Годинник: реалізувати годинник, який працює з часом без дат
  • Матриця: повертати рядки та стовпці матриці, поданої як рядок тексту (англ. string)
  • Простий шифр: реалізувати шифр заміни

Огляди

C#

  • Розробив Андерс Гейлсберг у Microsoft 2000 року
  • Мова та віртуальна машина мають офіційні специфікації. 2002 року мова стала офіційним стандартом ECMA, а 2003 року - стандартом ISO
  • Компілятор, .NET Framework (стандартна бібліотека) та Visual Studio (редактор) спочатку були із закритим кодом, але компілятор і .NET Framework відкрили 2014 року
  • Хоча C# багато синтаксису запозичила з Java (яка вийшла кількома роками раніше), вона не була копією Java один-в-один (наприклад, підтримка властивостей, типів значень і відсутність перевірених винятків)
  • Компілюється в байт-код, а компіляція в машинний код підтримується з .NET 7 (її досі вдосконалюють)
  • Використовується в безлічі програм, від вебсайтів до вбудованих систем, від застосунків (Xamarin) до ігор (Unity)

Crystal

  • Crystal розробили Арі Боренцвейг (який має акаунт на Exercism), Хуан Вайнерман і Браян Кардіфф (спочатку мова називалася Joy, але за 3 дні її перейменували на Crystal :))
  • Створена, щоб мати елегантність і продуктивність Ruby, але зі швидкістю, ефективністю та типобезпечністю сучасної компільованої мови.
  • Мова з відкритим кодом, яку розробляє організація Manas.
  • Версію 1.0 випущено 2021 року.
  • Компілюється в машинний код за допомогою LLVM (як Rust)
  • Компілятор спочатку був написаний на Ruby, але згодом його переписали на саму Crystal
  • Використовується компанією з виробництва вантажівок Nikola, організацією Manas та іншими, переважно для вебсайтів, а також для хмарних сервісів, консольних застосунків і скриптів

PowerShell

  • Створила команда на чолі з Джеффрі Сновером у Microsoft; уперше випущено 2006 року.
  • Поштовхом до розробки став Intel, який хотів перенести свої скрипти KornShell із Sun RISC на іншу платформу, щоб допомогти з розробкою своїх процесорів. Зрештою Intel вибрав іншу платформу, але Microsoft продовжила працювати над своєю новою оболонкою PowerShell, бо вона давала змогу покращити адміністрування Windows (яке на той час було не дуже зручним і часто вимагало графічних інтерфейсів)
  • Синтаксис надихався KornShell, а також PHP, Perl та іншими
  • Перша версія працювала лише на .NET Framework, тобто лише на Windows. Але PowerShell 6.0 (випущена 2018 року) працювала на .NET Core, який є кросплатформним і з відкритим кодом.
  • Використовується насамперед для адміністрування систем, а також для надання утиліт командного рядка або обгорток навколо інших інструментів. Ми активно застосовували її для масової роботи з репозиторіями Exercism

Ruby

  • Розробив Юкіхіро Мацумото (він же Мац); уперше випущено 1995 року
  • Мац хотів працювати зі справжньою обʼєктно-орієнтованою скриптовою мовою, але йому не подобалися наявні варіанти (як-от Perl і Python), тож він створив нову мову: Ruby
  • Мац описує Ruby як просту мову Lisp у своїй основі, з обʼєктною системою, як у Smalltalk, блоками, натхненними функціями вищого порядку, і практичністю, як у Perl.
  • Зазвичай інтерпретується, але також може компілюватися в машинний код (JIT).
  • Крім офіційного інтерпретатора, є альтернативні реалізації, як-от JRuby (працює на JVM), Rubinius (використовує LLVM) і YJIT, компілятор JIT, який постачається разом з офіційним інсталяційним пакетом
  • Переважно використовується для вебсайтів (за допомогою Ruby on Rails), як-от GitHub, Stripe, Shopify та багато інших (зокрема Exercism і форум Exercism!). Ruby також застосовують для автоматизації

А як вони відрізняються з погляду програмування?

Усі вони належать до обʼєктно-орієнтованих мов, хоча реалізують це не однаково (наприклад, Crystal і Ruby використовують модель передавання повідомлень зі Smalltalk для виклику методів).

C#

  • Зі строгою статичною типізацією
  • Також підтримує імперативну та декларативну парадигми і дедалі більше стає функціональною

Crystal

  • Зі строгою статичною типізацією (на відміну від Ruby)
  • Також підтримує функціональне та імперативне програмування

PowerShell

  • Зі строгою типізацією
  • Також підтримує імперативне, функціональне та конвеєрне програмування.

Ruby

  • З динамічною типізацією
  • Також підтримує функціональне та імперативне програмування

І попри це, усі ці мови насамперед належать до обʼєктно-орієнтованих.

Що робить ці мови чудовими?

C#

  • Працює (майже) всюди, зокрема в застосунках через Xamarin. Спочатку працювала лише на Windows, що породило Mono, безкоштовну реалізацію компілятора й середовища виконання C# з відкритим кодом, кросплатформну. 2015 року зʼявився .NET Core, повністю кросплатформний і з відкритим кодом.
  • Загального призначення: підходить майже для будь-яких задач, зокрема застосунків, вебсайтів та ігор
  • Виразна: багато чого можна зробити відносно невеликим обсягом коду на C#. Особливо LINQ чудово підвищує продуктивність, і з ним дуже цікаво працювати
  • Чудовий інструментарій, як для IDE, так і для інших інструментів на кшталт систем збірки. Visual Studio працює лише на Windows, а JetBrains Rider і VS Code працюють на всіх платформах
  • .NET Compiler Platform (часто званий Roslyn) - чудовий спосіб розбирати, перетворювати й генерувати код на C# (ми широко використовуємо його в test runner, analyzer і representer для C#)
  • Документація велика, детальна й добре написана
  • Велика спільнота: доступно багато ресурсів, зокрема блоги, форуми тощо

Crystal

  • Елегантний і читабельний синтаксис, завдяки якому код на Crystal легко читати й писати
  • Виразність. Як і Ruby, Crystal дуже виразна: багато чого можна зробити малим обсягом коду. Почасти це завдяки чудовій і великій стандартній бібліотеці.
  • Швидкість. Статична типізація дає змогу компілювати ефективний машинний код за допомогою LLVM, а просте керування памʼяттю забезпечує збирач сміття.
  • Чудова обʼєктно-орієнтована реалізація. Усе є обʼєктом, зокрема класи та примітивні типи, як-от числа й булеві значення (англ. Boolean)
  • Усе включено: велика стандартна бібліотека, вбудований форматер, рушій шаблонів, фреймворк для тестування та багато іншого
  • Взаємодія. Легка взаємодія з бібліотеками C
  • Кросплатформність: працює на Linux, macOS і Windows, хоча Windows поки не є першокласною платформою

PowerShell

  • Потужність: PowerShell - потужний інструмент для адміністраторів. Він добре інтегрується з багатьма іншими системами, як-от ОС Windows (компоненти, служби й налаштування), іншими продуктами Microsoft, зокрема Exchange, SharePoint, Azure тощо. Також може взаємодіяти з багатьма іншими технологіями: REST API, базами даних, вебсервісами та іншим.
  • Доступність: PowerShell попередньо встановлено в кожній сучасній версії Windows, і його можна встановити на будь-яку систему, де працює .NET (зокрема macOS, Linux і багато систем Unix)
  • Безпека: PowerShell має можливості для захисту скриптів і обмеження їх виконання на основі підписаних скриптів і політик виконання. Це критично важливо для безпеки процесів автоматизації.
  • Графічний інтерфейс: його можна поєднувати з іншими фреймворками, як-от Windows Forms або Windows Presentation Foundation, щоб проєктувати й будувати графічні інтерфейси для своїх скриптів PowerShell і зробити їх зручнішими для користувача.
  • Конвеєр: подібно до Bash у системах Unix, PowerShell дає змогу зчіплювати cmdlets разом, щоб виконувати складні операції та завдання, передаючи вихідні дані одного cmdlet як вхідні дані іншому

Ruby

  • Елегантний і читабельний синтаксис, завдяки якому код на Ruby легко читати й писати
  • Виразність. Ruby - дуже виразна мова: багато чого можна зробити малим обсягом коду. Почасти це завдяки чудовій і великій стандартній бібліотеці
  • Величезна екосистема з безліччю доступних бібліотек (gems)
  • Чудова обʼєктно-орієнтована реалізація. Усе є обʼєктом, зокрема класи та примітивні типи, як-от числа й булеві значення.
  • Прагматичність. Ruby і більшість її бібліотек дуже прагматичні й зосереджені на розвʼязанні реальних задач.
  • Взаємодія. Легка взаємодія з бібліотеками C, яку часто використовують, коли продуктивність особливо важлива. Наприклад, gem Nokogiri дає змогу працювати з XML дуже швидко, обгортаючи бібліотеки C, які виконують основну роботу
  • Багато інновацій. Наприклад, Stripe створив Sorbet, перевіряльник типів для Ruby, а Shopify розробив YJIT, компілятор JIT для Ruby (входить до Ruby 3.1+), і триває робота над підтримкою WASM

Особливі риси

C#

  • Чудова продуктивність, особливо для керованої мови. І мова, і середовище виконання мають безліч можливостей для підвищення продуктивності, наприклад тип Span<t> і доступ до інтринсиків процесора (як-от інструкції AVX). CLR - зріла, стабільна й дуже швидка віртуальна машина, яку постійно вдосконалюють</t>
  • Величезна екосистема з безліччю доступних бібліотек. Ці бібліотеки, як і C#, зрілі, стабільні й багатофункціональні
  • Сучасна й така, що розвивається: мова і середовище виконання досі еволюціонують, а мова дуже регулярно оновлюється, стаючи сучаснішою. Ось приклади:
  • async/await для простої конкурентності
  • span<t> для ефективного використання памʼяті</t>
  • Типи посилань, які допускають null (виправлення помилки на мільярд доларів)
  • Середовище виконання теж регулярно оновлюють, наприклад .NET AOT для прямої компіляції в машинний код
  • Менше альтернатив, ніж у багатьох інших мов чи екосистем. Для більшості задач можна обійтися типовими рішеннями від Microsoft, які часто включають і IDE. Хтось міг би назвати це й недоліком, але це може бути чудово, особливо коли ми тільки починаємо вивчати мову

Crystal

  • Найкраще з обох світів. Поєднання глобального виведення типів і обʼєднаних типів надає Crystal відчуття динамічно типізованої мови, де часто майже не потрібно вказувати типи, але водночас зберігаються продуктивність і додаткові гарантії безпеки (зокрема перевірка на nil під час компіляції), властиві статично типізованій мові
  • Метапрограмування. Замість динамічного метапрограмування Ruby під час виконання, Crystal має макроси, які працюють під час компіляції. Макроси працюють з вузлами AST і породжують код. Їх досить легко визначати й використовувати. Embedded Crystal (ECR) - вбудований рушій шаблонів, який використовує макроси, щоб вбудовувати код Crystal в інший текст
  • Чудова конкурентність. Нею легко користуватися завдяки моделі конкурентності, схожій на Go, яка використовує файбери (легковагові одиниці виконання), що спілкуються через канали
  • Продуктивність і задоволення. Ruby відома тим, що створена для продуктивності й радості розробників, з елегантним читабельним синтаксисом і чудовою ергономікою. Оскільки синтаксис і дизайн Crystal дуже схожі на Ruby, це стосується й Crystal (цікавий факт: чимало коду Ruby є водночас дійсним кодом Crystal).

PowerShell

  • Cmdlets: PowerShell використовує cmdlets (вимовляється «command-lets») як свої будівельні блоки. Це невеликі, орієнтовані на конкретну задачу команди, які обгортають наявну функціональність і надають адміністраторам узгоджений (наприклад, Get-Help для показу довідки будь-якого cmdlet) зручний інтерфейс. Є cmdlets для найрізноманітніших «бекендів», як-от усі класи .NET, Windows Management Instrumentation, Azure та багато інших. Cmdlets можна визначати будь-якою мовою .NET, і вони описуються дуже декларативно: легко задати параметри, їхню перевірку, вимоги (required true/false), альтернативні (switch) назви тощо.
  • Обʼєктно-орієнтованість: майже все в PowerShell - обʼєкт із багатьма різними властивостями. Файли, процеси, ключі реєстру й навіть прості типи даних, як-от рядок тексту та число, вважаються обʼєктами. Такий підхід спрощує роботу й взаємодію з різними типами даних і службами. Він буде добре знайомий усім, хто працював із .NET
  • Віддалене керування: підтримує віддалене керування серверами й системами Windows, а також хмарними ресурсами в Azure, AWS і GCP, що критично важливо для керування масштабною автоматизацією та розгортаннями.
  • Розширюваність: має чудову вбудовану систему модулів, а також дає змогу створювати власні cmdlets, функції та модулі й працювати з іншими мовами програмування та бібліотеками, щоб за потреби розширювати можливості.

Ruby

  • Продуктивність і задоволення. Ruby відома тим, що створена для продуктивності й радості розробників. Хоча це важко виміряти, ентузіазм людей, які користувалися Ruby, говорить сам за себе
  • Метапрограмування. Ruby надзвичайно динамічна й дозволяє метапрограмування під час виконання. Чи то зміна наявних класів (monkey-patching), чи динамічне додавання або виклик методів, Ruby усе це вміє
  • Ruby on Rails - чудовий багатофункціональний фреймворк для створення вебсайтів. Із коробки він містить шаблонізацію, кешування, ActiveRecord (спосіб взаємодії з базою даних через обʼєкти), міграції, скафолдинг, WebSockets і багато іншого.

Що обрати

  • Якщо знайомі з обʼєктно-орієнтованим програмуванням, але хочеться побачити інший підхід до нього, варто спробувати Pharo
  • Якщо є досвід із Java чи C#, але давно не доводилося їх торкатися, варто повернутися до них. Обидві мови дуже змінилися, тож варто поглянути на ці блискучі нові можливості!
  • C# і Java (а меншою мірою й Ruby) також чудово підійдуть тим, хто шукає роботу, адже це одні з найпопулярніших мов серед роботодавців
  • Якщо є досвід із Ruby, варто спробувати Crystal, щоб побачити, який вигляд і які відчуття мала б статично типізована Ruby
  • Якщо подобаються динамічні мови, але водночас хочеться високої продуктивності, варто поглянути на Crystal
  • Якщо знайомі з Bash або бат-файлами Windows, варто спробувати PowerShell як інший, обʼєктно-орієнтований підхід до написання скриптів
  • Якщо цікавлять скриптові мови загалом, хорошим вибором будуть Ruby, Crystal і PowerShell
  • Pharo, Crystal і Ruby чудово підійдуть, якщо хочеться трохи зайнятися метапрограмуванням (C# теж потроху набуває можливостей для метапрограмування)
  • Якщо хочеться відчути, яке це - програмувати мовою, що не спирається на текстові файли, варто спробувати Pharo і його унікальну й потужну IDE
  • Якщо цікавить створення вебсайтів, варто спробувати Ruby з її фреймворком Ruby on Rails
Translation missing: uk.number.nth.ordinalized Oct 2023 · Виявилося корисним?