The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Открыт код Sorbet, системы статической проверки типов для Ruby

21.06.2019 10:31

Компания Stripe, специализирующаяся на разработке платформ для online-платежей, открыла исходные тексты проекта Sorbet, в рамках которого подготовлена система статической проверки типов для языка Ruby. Код написан на языке С++ и распространяется под лицензией Apache 2.0.

Информация о типах в коде может вычисляться динамически, а также задаваться в форме простых аннотаций, которые могут указываться в коде при помощи метода sig (например, "sig {params(x: Integer).returns(String)}") или размещаться в отдельных файлах с расширением rbi. Возможен как предварительный статический анализ кода без его выполнения, так и проверка по мере выполнения (включается через добавление в код "require 'sorbet-runtime'").

Предусмотрена возможность постепенного перевода проектов на использование Sorbet - в коде могут сочетаться как снабжённые аннотациями типизированные блоки, так и нетипизированные участки не охваченные проверкой. Из особенностей также отмечается очень высокая производительность и возможность масштабирования для кодовых баз, включающих миллионы строк кода.

В состав проекта входит ядро для статической проверки типов, инструментарий для создания новых проектов с использованием Sorbet, инструментарий для поэтапного перевода на применение Sorbet существующих проектов, runtime с предметно-ориентированным языком для написания аннотаций о типах и репозиторий с готовыми определениями типов для различных gems-пакетов на Ruby.

Изначально Sorbet развивался для проверки внутренних проектов компании Stripe, большая часть платёжных и аналитических систем в которой написана на языке Ruby, и был переведён в разряд открытых после полутора лет разработки и внедрения. Перед открытием кода было проведено бета-тестирование, в котором приняли участие более 30 компаний. На текущем этапе развития Sorbet поддерживает запуск большинства типовых проектов на Ruby, но могут наблюдаться отдельные несовместимоcти.

  1. Главная ссылка к новости (https://sorbet.org/blog/2019/0...)
  2. OpenNews: Mozilla развивает ScanJS, статический анализатор кода для JavaScript
  3. OpenNews: Facebook открыл код статического анализатора Infer
  4. OpenNews: Открыт код статического анализатора Code Climate
  5. OpenNews: Facebook открыл RacerD, статический анализатор для многопоточного кода на Java
  6. OpenNews: Релиз свободного статического анализатора кода frama-clang 0.0.5
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/50921-ruby
Ключевые слова: ruby, static, type
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (51) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 11:13, 21/06/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Если нужен ruby с типизацией то лучше уже на crystal смотреть.
     
     
  • 2.29, Junior frontend developer (?), 23:54, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Как раз на кристал-то лучше не смотреть. Люди важным делом занимаются, а не в игрушки играют.
     

  • 1.2, Аноним (2), 11:19, 21/06/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    Чего только не придумают, лижь бы на СИ-89 не писать
     
     
  • 2.13, Аноним (13), 14:42, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Чего только сищники не придумают, только чтобы оправдать свое невежество и неумение подбирать инструмент под задачу
     
     
  • 3.24, YetAnotherOnanym (ok), 20:44, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    И что же такого особого в задаче "написать платёжную систему", что Руби для неё предпочтительнее си?
     
     
  • 4.33, Илья (??), 06:29, 22/06/2019 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Для подсчёта денег лучше всего годятся статически типизированные, защищённые от небезопасного поведения языки.

    Практика показывает, что это не си и не руби

     
     
  • 5.39, Аноним (39), 16:06, 22/06/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Практика показывает, что это не си и не руби

    Практика подсказывает, что это не зависит от языка, но многие берут жабу.

     
  • 4.48, Аноним (48), 09:47, 25/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    То, что для платежной системы надо сосредоточиться на бизнес-логике, а не на низкоуровневых приблудах.
     
     
  • 5.49, YetAnotherOnanym (ok), 11:02, 25/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > То, что для платежной системы надо сосредоточиться на бизнес-логике, а не на
    > низкоуровневых приблудах.

    Если для разработчика принципиально важно не знать, что происходит "под капотом" (хотя бы в самых общих чертах) - гнать такого разработчика мокрыми тряпками.


     
     
  • 6.50, Аноним (50), 23:51, 26/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Вы таки не понимаете разницу между "знать что под капотом" и "ковыряться целыми днями под капотом вместо того, за что деньги платят".
     
     
  • 7.51, Andrey Mitrofanov_N0 (??), 08:57, 27/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > Вы таки не понимаете разницу между "знать что под капотом" и "ковыряться
    > целыми днями под капотом вместо того, за что деньги платят".

    Я знаю разницу.  Я даже бесплатно тебе расскажу.  Страдай.

    Ковыряешься бесплатно под капотом пару-другую лет.  Потом внезапно за это тебе начинают платить.  Это сразу [относительно] становится скучно и неинтересно.  Профессионально тянешь резину ещё пару лет (опенет здесь -- для этого!).  ...в это время копаешь бесплатно под другим капотом.  Потом внезапно.... [см.п.2]   .....PROFFIT//

     
  • 3.30, _ (??), 01:26, 22/06/2019 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Чего только ребе не придумает, чтобы его совсем напрочь! не забыли :)
     
  • 2.36, Аноним (36), 10:30, 22/06/2019 [^] [^^] [^^^] [ответить]  
  • –2 +/
    >Чего только не придумают, лижь бы на СИ-89 не писать

    Ты ещё про K&R вспомни. Ну уж предложил бы C11 что-ли.

     

  • 1.3, hfgsd (?), 11:24, 21/06/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +21 +/
    Сначала делают динамическую типизацию, а затем начинают ее героически преодолевать по мере популяризации ЯП. Забавное явление.
     
     
  • 2.5, Аноним (5), 11:31, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • +3 +/
    взрослеют...
     
  • 2.6, Andrey Mitrofanov_N0 (??), 12:11, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Сначала делают динамическую типизацию, а затем начинают ее героически преодолевать по мере
    > популяризации ЯП. Забавное явление.

    Не, не так.

    Сначала понапишут курсовичков про не-динамические типзации, потом, такие талантливые!, работать пойдут, по-на-раз-работают этих своих не-динамических и... опаньки -- #Успех.

    Выкидываем это через стену:  гитхаб, новость на опенет, все дела.

    Теперь нужно набирать на работу новых студентов -- и всё по кругу.

     
  • 2.8, Аноним (8), 13:42, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Динамическая типизация больше подходит для ООП языков - без неё они теряют в гиб... большой текст свёрнут, показать
     
     
  • 3.10, Аноним (10), 14:03, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • –2 +/
    c#
     
  • 3.12, Аноним (12), 14:32, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > костылями, в виде [...] дженериков

    Ну я даже не знаю, что тут сказать. Значит, нормальные алгоритмы вывода типов, ко-/контравариантность, и все наработки начиная с ML – так, костыли и насмарку?

     
  • 3.15, Аноним (13), 14:53, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    >Динамическая типизация больше подходит для ООП языков - без неё они теряют в гибкости и обрастают костылями, в виде адаптеров и дженериков.

    Вы так говорите, как будто для функциональных языков она не подходит.

     
  • 3.16, Аноним (2), 14:57, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > Класс SomeMessage не реализует интерфейс IIndexedMessage, из-за этого, несмотря на то, что он имеет необходимый протокол, его нельзя передать в функцию storeMessage

    Пример надуманный. А даже если он и возникнет на практике, ничто не мешает сделать

    class IndexedSomeMessage extends SomeMessage implements IIndexedMessage {
      /*тут ничего нет. Буквально ничего нет. Ну может конструктор, не делающий ничего, кроме super()*/
    }

     
     
  • 4.44, Ordu (ok), 17:30, 22/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    В некотором смысле, это уже динамическая типизация, потому что если мы работаем с SomeMessage в коде, то статически мы не знаем какого типа этот объект. Это не совсем-совсем динамическая типизация, потому что что-то о его типе мы знаем, в конце-концов SomeMessage -- это уже тип. Но и всё же, мы приходим к динамическому диспатчу, вероятно, ещё и к dynamic_cast. А dynamic_cast -- это уже стопроцентов динамическая типизация.
     
  • 3.17, Аноним (2), 15:46, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > несмотря на то, что он имеет необходимый протокол

    Это предпосылка, взятая на веру. То, что методы имеют одинаковую сигнатуру, еще не говорит о том, что класс "по идее" реализует такой-то интерфейс. Часть требований к интерфейсу может быть оформлена не на ЯП, а в комментариях; к примеру, IIndexedMessage может иметь требование "getIndex должен возвращать исключительно положительные числа". А то, что SomeMessage никак не упоминает в себе IIndexedMessage, является индикатором того, что тебе нужно провести дополнительное исследование того, насколько успешным будет использование SomeMessage в качестве IIndexedMessage. Если бы этот implements был указан, тогда бы ты мог сказать, что автор SomeMessage действительно заявил работоспособность своего класса со всякими там storeMessage.

     
  • 3.19, Аноним (19), 16:14, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > Динамическая типизация больше подходит для ООП языков - без неё они теряют в гибкости и обрастают костылями, в виде адаптеров и дженериков.

    Это если в них утиной типизации нет.

     
  • 3.20, Аноним (20), 16:49, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    >Класс SomeMessage не реализует интерфейс IIndexedMessage, из-за этого, несмотря на то, что он имеет необходимый протокол, его нельзя передать в функцию storeMessage.

    И правильно. "Реализовал интерфейс" = "взял на себя обязательство гарантировать соответствие реализации интерфейсу", "не реализовал интерфейс" = "каким образом можно гарантировать, что именно нужно поведение реализовано за похожими именами функций?".

    >поверх динамической типизации грамотно приделана хорошая
    >статическая система типов

    Взаимоисключающие параграфы. Ты скажи: проверка типов где будет происходить - в рантайме или в компайлтайме?

     
     
  • 4.32, Аноним (32), 03:43, 22/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Он же написал:
    > хорошая статическая система типов, с runtime-проверками

    :)

     
  • 3.38, funny.falcon (?), 11:18, 22/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Посмотрите на Go: если объект реализует методы интерфейса, то он автоматически реализует интерфейс. И есть делегирование через "безымянные" поля.

    Не сказать, что это идеал. Но вполне юзабельно и имеет практически ценность.

     
  • 2.14, Аноним (13), 14:44, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Для прототипа или небольшого проекта, разрабатываемого одним автором, динамическая типизация удобнее, для большого проекта с кучей разработчиков, которые к тому же с годами меняются, удобнее статическая
     
     
  • 3.21, Аноним (20), 16:53, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Лол нет.

    Динамическая типизация подходит для мелких скриптов, если проект выше, то в нем ВНЕЗАПНО появляются тесты на передаваемые типы, которые теперь ВНЕЗАПНО нужно писать вручную и которые теперь отстреливают только в рантайме (если их стриггерить). Это такие бешенные неудобство, что я не понимаю зачем вообще нужна динамическая типизация

     
  • 2.18, user (??), 16:02, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    им платят за строчки тестов
     

  • 1.4, Аноним (4), 11:27, 21/06/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    На руби еще активно пишут? Прошла волна и что-то все затихло.
     
     
  • 2.7, НяшМяш (ok), 13:14, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Если этого не видно, не значит, что не пишут. Например, тот же гитхаб на рубях.
     
     
  • 3.9, Аноним (4), 13:47, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    гитхаб создавался и писался когда руби был на подъеме, тогда все восхищались им и пророчили рельсам славу убийцы пхп
     
     
  • 4.22, Аноним (22), 17:46, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    а потом они переехали на пхп и все заработало гораздо быстрее и дешевле
     
  • 2.25, Аноним (25), 22:16, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Он занял своё почётное место на свалке истории рядом с Perl. Но разумеется найдётся куча народу которая на нём активно пилит своё легаси, а кому-то это наверняка даже нравится.
     
     
  • 3.37, Аноним (37), 11:13, 22/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    >  Он занял своё почётное место на свалке истории рядом с Perl.

    Пишете так, как будто есть какая-то вменяемая альтернатива Ruby. Уж явно не Go его заменит.

     
     
  • 4.40, Аноним (39), 16:08, 22/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > Пишете так, как будто есть какая-то вменяемая альтернатива Ruby.

    Что в нем такого, что нельзя ничем заменить?

     
     
  • 5.47, Аноним (37), 08:20, 23/06/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Что в нем такого, что нельзя ничем заменить?

    синтаксис

     

  • 1.11, n1rdeks (ok), 14:04, 21/06/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Нет на Вас Haskell...
     
     
  • 2.41, Аноним (39), 16:09, 22/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    не все любят приседать со штангой... что мы дети малые? нам нужно деньги делать.
     

  • 1.23, Аноним (23), 19:47, 21/06/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Хочу писать на Lisp, как он был в универе на языках программирования, так я его полюбил, жаль только мало слышно про него
     
     
  • 2.26, Аноним (25), 22:17, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Это же бородатая шутка от ЯП, что вы хотели про неё нового услышать?
     
  • 2.28, Аноним (19), 23:50, 21/06/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ставь себе GuixSD и наслаждайся.
     
     
  • 3.34, Andrey Mitrofanov_N0 (??), 07:44, 22/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > Ставь себе GuixSD и наслаждайся.
    >GuixSD

    Они мажорно изменили в версии 1.0 теперь
    и пакадж-менеджер, и дистрибутив называют Guix.

     
  • 2.35, Canis Dirus Leidy (?), 09:22, 22/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    >Хочу писать на Lisp,

    Хочешь — купи себе(ц) https://common-lisp.net/downloads

     
  • 2.42, Аноним (39), 16:10, 22/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > так я его полюбил, жаль только мало слышно про него

    Теперь его любит кто-то другой, смирись.

     

  • 1.27, GentooBoy (ok), 22:29, 21/06/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Просто оставлю это здесь для тех кто все еще холиварит по поводу типизации:

    Dynamically typed languages give you a lot of flexibility. Type changes do not need manual propagation through your program. It also gives you more mental flexibility, as you can think more in terms of transformations, operations, and algorithms. Flexibility lets you move faster, change things quickly, and iterate at a faster velocity. But it comes at a cost. It’s a lot easier to miss potential problems and these problems are generally very hard to debug. Plus these features generally comes with a performance penalty.

     
     
  • 2.43, Аноним (39), 16:13, 22/06/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Никто не холиварит, цитатой ты доказал, что динамическая типизация для наколеночных, одноразовых поделий. Продакшен код - это тебе не олимипиадные задачки решать.
     
  • 2.46, IB (?), 18:50, 22/06/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Scala/Scheme/F#/Ocaml/Haskel и более новомодные смотрят на тебя как

    Они смеют говорить о трансформациях и алгоритмах @$%^&^$*$

     

  • 1.31, Аноним (31), 02:33, 22/06/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    Типизированный Ruby уже давно существует - называется Pascal.
    Ребята изобрели велосипед, причем хуже оригинала.
     
  • 1.45, IB (?), 18:47, 22/06/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Вот это я понимаю извращения.
     
     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру