REPL

Сегодня я буду проповедовать. Вы все живете неправильно. Вы живете без REPL-а, а надо с REPL-ом.

Как выглядит рабочий цикл программиста С++? Написал 2 строчки, отправил на компиляцию, поставил чайник, поговорил с коллегами, попил чай, и вот уже почти и скомпилялось. Поэтому программисты С++ очень общительные и у них много хобби (нет).

Дальше идут языки с номинальным REPL-ом. Таких много. Python, Ruby, даже Scala и Haskell даже вроде что-то “предлагают”. Ну это такой программный интерпретатор, где можно что-то потыкать палочкой, примеры какие-то позапускать. Продукт, идентичный натуральному — на бумаге есть, поиграться можно, но для работы всерьез никто не пользуется. Это важно — я сегодня НЕ о таких REPL-ах.

Ну и на вершине возвышаются ЛИСП-ы. Что такого особенного в ЛИСП REPL-е?

Ну во-первых под него сделан весь язык. То есть нет двух режимов — интерактивного игрушечного и прозаического настоящего. Всё, что можно в проекте, можно и в REPLе, и наоборот. Исходники проекта — это одновременно и как бы батч-набор команд, которые в автоматическом режиме скармливаются интерпретатору. Последовательно, форма за формой.

Во-вторых интеграция и inline eval. Вы в REPL-е сидите в терминале, а надо редактор к нему подключать. Исчезает переключение контекста. Исходник это одновременно такой блокнотик-черновик, в которым ты что-то пробуешь, смотришь результат, правишь по ситуации. Написал, проверил, уточнил какие-то моменты, посмотрел как работает, запросик в БД сделал, АПИ подергал-посмотрел, гипотезу проверил, скорость прикинул, контракт набросал. Цикл обратной связи нулевой практически. Потому что это не написал — отправил — дождался, это всё прямо в редакторе происходит, это часть редактирования текста. Только кроме текста у тебя есть доступ прям к рантайму проекта, прям там же.

inline eval выглядит как-то так

Ощущение, как будто в редактор вывалили прям работающую программу и ты ее щупаешь. Код не просто текст, записанный в блокнотике, а это и есть программа, ее потроха. Как будто эти все данные, их можно пальцами потрогать, как будто их все в руках вертишь.

Цитата:

Live programming. The instant gratification of seeing your program run as you code it, with the tight REPL integration and everything being reified and having the ability to be redefined live. I find it more like jamming to an instrument, while Haskell gives me the feeling I’m composing on music sheets.

В-третьих, бесконечная динамичность. Особенно хорошо для интерактивных приложений, UI и так далее. Важно, что стейт не разрушается, а код обновляется. Можно открыть любую страницу, залогиниться, дойти до куда нужно, все правильно выставить и потом точечно править код, который именно нужную форму рендерит, доводить до совершенства. Грубо говоря, двигать кнопку в коде и сразу видеть результат, без необходимости как-то перезапускать и воспроизводить нужный стейт, чтобы подвинуть кнопку _ещё на два пикселя_.

В-четвертых, если продолжить эти принципы на более длительные периоды времени, ты лепишь программу как бы на ходу. Т.е. запустил почти ни с чем, подключил REPL, что-то дописал, вычислил, вот уже и что-то умеет, потом еще что-то дописал, и так пока не будет готово, ни разу процесс не останавливая. Код и процесс это одно и то же. Выглядит как-то так (англ):

Теперь про подвох. Вы мне не поверите. И это нормально. Это ожидаемо. Вот почему:

Most programmers do not have an experience of what inline-eval is. They have nothing to compare it to. They have not used LISPs and SEXPs. You can describe inline eval and demonstrate it to them until you're blue in the face and they won't get it. It is not until a programmer actually experiences inline-eval as a programming tool that the light goes on.

Но это нормально, надо просто про это помнить. Т.е. моя задача максимум — не убедить вас, что REPL это круто, а убедить вас, что пока не попробуете, решить круто или нет нет способа. Когда подвернется возможность попробовать REPL, вспомните про bias и подойдите к этому хотя бы непредвзято, всё о чем я прошу. Ценность REPL трудно представить, не попробовав. Ну и если вы поигрались с номинальным REPL в какой-нибудь Scala или даже Ruby и не поняли, зачем это нужно, всё равно подождите, когда получится попробовать настоящую REPL-разработку. Я тоже не понимаю, зачем в Scala REPL.

Но всё-таки уточню: возможность REPL-разработки это не еще одна галочка в фич-листе. Это не nice to have. Не надо думать, что у Scala 38 таких фич, а у Clojure 27 таких, у всех примерно равный вес и REPL просто одна из них, но по совокупности мне нравятся те что у Scala. Баланс немножко не такой, скорее такой:

Причины, по которым я люблю язык Clojure:

1. REPL
2. REPL
3. REPL
4-99. REPL
100+. Все остальные причины (иммутабельность, ФП, структуры данных, etc)

REPL — это основной режим работы. Это способ писать программы качественно лучший, чем как вы пишете их сейчас. Быстрее, проще, приятнее, удобнее, лучшего качества. С REPL я бы и на Rust писал бы с удовольствием. И на С++ даже. Пофиг, что там за язык, любые языковые фичи меркнут с возможностью _так_ взаимодействовать с кодом и рантаймом.

Короче, REPL.


Previous
← Ctrl ← Alt
Next
Ctrl → Alt →

Error

default userpic
When you submit the form an invisible reCAPTCHA check will be performed.
You must follow the Privacy Policy and Google Terms of use.
Previous
← Ctrl ← Alt
Next
Ctrl → Alt →