Англійська для розробників кристалічних мов

Словник для розробників, які використовують Crystal — виведення типів під час компіляції, макроси, модель одночасності на основі волокон і розмова про залежності шардів для команд, які надсилають швидкі, схожі на Ruby бінарні файли.

Crystal читає як Ruby, але компілює як системна мова, і ця комбінація створює певний прогал у словнику: розробники, які походять з Ruby, вже мають синтаксичний словник, але не мають словника часу компіляції і одночасності, який Crystal потребує для того, щоб обговорити його поведінку.

Ключовий словник

** Виведення типів (під час компіляції) ** — процес Crystal, який визначає тип кожної змінної під час компіляції без явних анотацій у більшості випадків, саме тому код Crystal виглядає як код Ruby, але поводиться як код компіляції мови зі статичними типами. “Вам не потрібно анонсувати повернутий тип — виведення типу вже розв’ язує його під час компіляції з двох гілок, і компілятор відхиляє збірку, якщо вони не об’ єднані в один послідовний тип.”

** Union type ** — тип, що представляє « один з декількох можливих типів », який компілятор Crystal точно відстежує, щоб кожна операція вниз по течії була перевірена на всіх членах союзу, а не тільки на спільному випадку. “Ця змінна закінчується типом об’ єднання String | Nil через те, що вона повертається занадто рано — компілятор змушує вас явно обробляти випадки nil, перш ніж ви зможете викликати на ній рядковий метод.”

** Макро (під час компіляції) ** — Кристалічний код, який виконується під час компіляції для створення іншого коду, відмінного від виклику функції під час виконання, використовується для виключення типової схеми без жодних витрат під час виконання. “Ми використовуємо макрос для створення методів getter і setter для всіх дванадцяти полів під час компіляції, замість написання їх від руки або відображення на об’ єкті під час виконання, як це робила б Ruby.”

** Fiber ** — легкий, спільно розкладаний блок одночасності Crystal, подібний до горо- рутину, який дозволяє виконувати тисячі одночасних завдань без накладання навантаження на потоки ОС.

  • “Не створювати потоки ОС для кожного вхідного з’ єднання — замість цього створювати волокна. Планувальник Crystal мультиплексує тисячі волокон на невелику кількість потоків ОС для вас.”*

Shard — термін Crystal для пакунка/залежності, керується за допомогою команд shard.yml і shards, аналогічний до Ruby gem, але розв’ язується і статично компілюється в кінцевий бінарний файл. “Прикріпити цей шард до точної версії в shard.yml — оскільки Crystal компілює залежності безпосередньо до бінарного файла, оновлення неприкріпленого шарда може змінити поведінку під час виконання на вашій наступній збірці, а не тільки на наступній bundle install.”

Звичайні фрази

  • Чи визначення типу вирішує це під час компіляції, чи нам потрібна явна анотація тут?»
  • «Чи це є союзний тип, який нам потрібно сузити, чи компілятор вже знає, що це лише один тип?»
  • Чи є це макросом часу компіляції, чи звичайним викликом методу часу виконання?
  • Чи слід цьому породити волокно, чи воно насправді потребує справжнього потоку ОС?»
  • Чи є цей шард прикріплений до точної версії в shard.yml?

Приклади висловлювань

Пояснення помилки компілятора співробітнику команди: “Компілятор скаржиться, тому що це закінчується об’ єднанням типу Int32 | String, а ви викликаєте метод, який існує тільки на Int32. Вам потрібно зменшити об’єднання з перевіркою типу перед викликом його.”

Опис вибору швидкодії: “Ми використовуємо макроси для створення методів серіалізації під час компіляції замість використання відображення під час виконання — Crystal не робить відображення під час виконання так, як робить Ruby, тому це справді ідіоматичний підхід, а не просто оптимізація.”

Пояснення проектування одночасності: “Кожен вхідний запит породжує власне волокно, і планувальник Crystal обробляє їх мультиплексування на декілька потоків ОС - саме тому ми можемо обробляти десятки тисяч одночасних з’єднань без надлишку пам’яті одного потоку на з’єднання.”

Професійні поради

  • Нехай type inference зробить роботу у більшості випадків, і додавайте лише явні анотації типів на відкритих межах методів, де вони подвійні як документація для викликаючих — надмірне анотування внутрішнього коду просто додає шуму.
  • Розглядати ** тип об’ єднання **, який повідомляє компілятор, як корисну інформацію, а не перешкоду — суттєво зменшити його за допомогою перевірки типу або case, а не досягати небезпечного перетворення, щоб замовкнути компілятор.
  • Використовуйте ** макро ** під час компіляції тільки тоді, коли ви виключаєте справжній типовий код з багатьох подібних визначень — макроси важче зневаджувати, ніж прості методи, тому виплата повинна бути реальною.
  • Типове значення для створення ** волокна ** для одночасної роботи, а не потоку ОС — волокна є ідіоматичним примітивом одночасності Crystal, і змішування у справжніх потоках має бути навмисним, обґрунтованим винятком.
  • Завжди прив’ язуйте ** shard ** до точної версії для будь- чого, що надсилається до виробничого середовища, оскільки Crystal статично компілює залежності до бінарного файла — не прив’ язана версія означає, що ваша наступна збірка може безпідставно змінити поведінку.

Практичні вправи

  1. Пояснити різницю між виведенням типу під час компіляції і перевіркою типу під час виконання.
  2. Описати, коли ви використовуєте макрос часу компіляції замість звичайного методу.
  3. Напишіть речення, у якому поясните, чому для одночасного вводу/ виводу у Crystal краще використовувати волокна, а не потоки ОС.

Навигація по лінії — практичний підхід

Сильні сторони Crystal — безпека під час компіляції, швидка ітерація за допомогою макросів і ефективна одночасність — часто призводять до захоплюючих результатів. Однак, ті ж самі функції можуть ввести нюанси в спілкуванні при обговоренні коду з іншими. Коли ви працюєте спільно, особливо з різними командами або з різними рівнями досвіду, важливо ефективно формувати зворотній зв’ язок, а не просто вказати, що * ви * бачите як проблему. Метою не обов’язково є бути критичним, але забезпечити спільне розуміння і стимулювати поліпшення. Задумайтеся над тим, як ви можете пояснити переваги виведення типів комусь, хто не знайомий з Crystal — підкреслення його здатності виявити помилки на ранньому етапі запобігає марнування зусиль пізніше. Аналогічно, при обговоренні використання складних макросів, чіткість є найважливішою. Уникайте жаргонних слів, які можуть відволікти переглядача; замість цього зосередьтеся на * намірі * макроса і його впливі на базу коду.

Поширена пастка для розробників, які переходять від динамічно-типованих мов, таких як Ruby, полягає в тому, що вони вважають, що всі розуміють наслідки рішень під час компіляції. Простий коментар на зразок « Це неправильно введено », ймовірно, викликає плутанину. Замість цього, спробуйте сформулювати його так: « Я хвилююся, що ця функція явно не декларує свій тип повернення, що може призвести до помилок під час виконання, якщо реалізація трохи зміниться. Додання анотації returns: String може покращити ясність і допомогти запобігти несподіваній поведінці. » Аналогічно, при обговоренні залежностей шардів, уникайте надто технічних описів. Формуйте його з точки зору впливу на бізнес - “Ця зміна покращує локалізацію даних для користувачів в Європі, зменшуючи затримку і покращуючи час відповіді”

Ефективне спілкування також поширюється на опис змін коротко. Використовуйте чіткі дієслова дії і зосередьтеся на * що* і * чому*, а не на * як*. Наприклад, замість того, щоб сказати « Я переробив цей код », спробуйте сказати « Я поліпшив читабельність цієї функції, видобутивши її у окремий модуль ». Цей підхід особливо важливий під час документування запитів на завантаження — намагайтеся використовувати описи, які надають достатньо контексту, але не перевантажують переглядача.

Ось приклад використання crystal new для створення простої програми з деякими основними виводами типів:

# hello.cr
def greet(name)
  "Hello, #{name}!"
end

puts greet("World")

Це демонструє, як виведення типів Crystal дозволяє отримати короткий і виразний код, все ще надаючи гарантії часу компіляції. Під час обговорення цього з менш досвідченим розробником, ви можете підкреслити відсутність явних декларацій типів — підкреслюючи, що компілятор автоматично виводить тип String на основі літералу рядка. Це ключова концепція, яку потрібно чітко пояснити, коли представляти іншим підхід Crystal.

Поширені запитання

Про що ця стаття "Англійська для розробників кристалічних мов"?

Словник для розробників, які використовують Crystal — виведення типів під час компіляції, макроси, модель одночасності на основі волокон і розмова про залежності шардів для команд, які надсилають швидкі, схожі на Ruby бінарні файли.

Чи безкоштовна ця стаття?

Так. Усі статті на CoderSlingo, включно з цією, доступні безкоштовно без реєстрації.

Скільки часу займає читання "Англійська для розробників кристалічних мов"?

Приблизно 8 min.