it-roy-ru.com

Редактирование программ "пока они запущены"? Зачем?

В последнее время я стал больше понимать языки LISP и Lispy, и считаю их достаточно мощными.

Одна вещь, которую я читал по всей сети, заключается в том, что преимущество написания на LISP, Clojure и т.д. Заключается в том, что вы можете редактировать свою программу "во время ее работы".

Возможно, я что-то упускаю, но какой в ​​этом смысл?

Конечно, это может сэкономить несколько секунд, но это все? Всякий раз, когда я изменяю свою программу, я просто останавливаю ее, затем запускаю ее снова, и это работало нормально десятилетиями.

Должна быть и другая причина, чем просто экономия времени - что это?

Может кто-нибудь дать мне хороший пример, который заставит меня пускать слюни из-за этой функции? :)

Ждем слюни!

64
MikeC8

Есть несколько очень интересных вариантов использования. Один пример - в программировании с графическим интерфейсом - я видел это при разработке приложения с графическим интерфейсом в реальном времени, когда оно работало рядом с моим Emacs: я добавил код для новой кнопки и нажал "Cc Cc", чтобы скомпилировать эту единственную функцию, и кнопка просто появился в окне! Не нужно было закрывать и снова открывать приложение. Затем я начал настраивать виджеты и манипулировать компоновкой, и открытое окно мгновенно перестраивалось - кнопки перемещались, появлялись новые текстовые поля и т.д., Как только я выполнял каждое небольшое изменение, которое я внес.

Другим примером является превосходный скринкаст о библиотеке OpenjL Clojure "Penumbra", где программист создает 3D-игру в тетрис в реальном времени. Он начинает с пустого окна OpenGL рядом со своим emacs. Он определяет объект куба - C-M-x - и он на экране. Запускает команду на вращение, сразу же начинает вращаться. Запускает цикл, определяющий еще 5 кубов в разных местах, pop-pop-pop-pop-pop они появляются. Это все сразу реагирует, полный набор инструментов OpenGL прямо здесь, чтобы играть с. Добавьте новую текстуру поверхности в свой куб и сразу увидите, как она появляется. Это становится гибким трехмерным миром - код динамически изменяет существующий мир вместо того, чтобы закрывать и открывать трехмерное полотно при каждом изменении.

Penumbra Livecoding Screencast - скачать HD версию для лучшего опыта.

Также есть отличная презентация/скринкаст о аудиотеке "Overtone" для Clojure. Библиотека представляет собой набор инструментов для синтезатора, где у вас есть набор функций синтезатора для управления звуковой волной. Во время презентации разработчик пишет немного кода, который запускает воспроизведение тона. Затем он тратит десять секунд, записывая цикл, который воспроизводит этот звук в 10 раз, но с каждым разом увеличивает частоту, и снова C-M-x, и вы слышите его, ноты поднимаются выше. В течение 20 минут в режиме реального времени он запускает песню. Это выглядит как тонна веселья.

Ссылка на Обертон Презентация

Другими применениями могут быть, например: веб-сканирование/извлечение данных - разработка и уточнение алгоритмов извлечения информации в режиме реального времени, отслеживание данных, возвращаемых на каждом этапе; Программирование робототехники - отправляйте команды роботу, пока он жив; Распознавание лиц/изображений - с такой библиотекой, как OpenCV, вы можете мгновенно обновлять то, что библиотека распознает на изображении/видео, когда вы разрабатываете код; Математическая работа (у Clojure есть "Заклинатель" для статистики); и любую среду, в которой вы хотите сразу увидеть, как ваши изменения повлияли на данные, с которыми вы работаете.

Так что это самый забавный аспект - иметь перед собой REPL. Вещи, которые не были материальными, податливыми, интерактивными, начинают становиться. Дизайн графического интерфейса, 3D-графика, программное звуковое производство, извлечение и преобразование данных - все это обычно делается на расстоянии вытянутой руки. Но с Clojure (и, в некоторой степени, с другими динамическими языками) это стало действительно осязаемым и незамедлительным; вы видите каждое изменение, как только пишете код, и если что-то не работает или вы не получаете ожидаемый результат, вы просто меняете то, что пропустили, и немедленно повторяете его.

Clojure очень настроен на это. Самое странное, что вы можете использовать библиотеки Java в режиме реального времени одинаково - несмотря на то, что Java само не может! Таким образом, Overtone использует библиотеку Java synth в реальном времени, несмотря на то, что вы никогда не могли в Java, Penumbra использует привязки Java OpenGL и т.д. Это потому, что Rich Hickey разработал Clojure, поэтому он может скомпилировать в байт-код JVM на лету. Это удивительный язык - Clojure внес огромный вклад в то, насколько невероятно увлекательным и продуктивным может быть программирование.

56
Jeremy Rayman

Должна быть и другая причина, чем просто экономия времени - что это?

Нет, нет Я имею в виду, что никогда есть: вся причина использование компьютера вообще означает экономию времени. Компьютер ничего не может сделать, чего нельзя сделать вручную. Это займет немного больше времени.

В этом случае я бы не отказался от "нескольких секунд", учитывая, что это одна из вещей, которые я делаю чаще, чем что-либо еще, целый день, за всю мою карьеру программиста. Несколько секунд для перекомпиляции, несколько секунд для повторного запуска, несколько секунд для воссоздания состояния, в котором была моя программа в прошлый раз - даже на быстрой рабочей станции это может быть легко минутой между итерациями. (Раньше это было намного хуже, но более быстрое оборудование сделало его менее ужасным, не очень хорошим. Перекомпиляция всего файла или хуже - связана с вводом/выводом и может никогда не соответствовать скорости более детальной компиляции.)

В LISP перекомпиляция одной функции в уже запущенном процессе происходит практически мгновенно (я никогда не видел ее даже 0,1 секунды, даже на своем 5-летнем ноутбуке), а перезапуски означают, что мне не нужно воссоздавать свое состояние даже когда что-то сигнализирует.

Вот инструмент, который дает мне более чем 100-кратное ускорение одной из самых медленных и самых распространенных вещей, которые я делаю как программист. Я не знаю, что еще тебе нужно. Мы, вероятно, можем привести некоторые причины, но если этого недостаточно, я не знаю, что будет. Хм, это тоже довольно круто? :-)

(* Всякий раз, когда кто-то говорит "никогда" о чем-то, касающемся технологий, этот человек неизменно в конечном итоге выглядит как полный придурок 2 года спустя, и, несмотря на долговечность LISP, я, конечно, не буду исключением.)

57
Ken

Для LISP есть маркетинговый слоган:

При использовании LISP и метода его поэтапной разработки стоимость изменения в программной системе зависит от размера изменения, а не от размера всего программного обеспечения.

Даже если у нас большая программная система, стоимость (время, ...) для изменения остается в зависимости от размера изменения. Если мы добавим новый метод или изменим новый метод, усилия по-прежнему будут зависеть от усилий по редактированию метода, поэтапной компиляции метода и поэтапной загрузке метода.

Во многих традиционных программных средах для изменения метода может потребоваться частичная перекомпиляция, новый связанный исполняемый файл, перезапуск, перезагрузка и т.д. Чем больше программное обеспечение, тем дольше оно занимает.

Для человека это означает, что мы можем выйти из состояние потока. Это часть производительности хороших сред LISP: можно быстро внести множество изменений в программную систему, как только программист почувствует себя комфортно и перейдет в это состояние потока . Я предполагаю, что многие испытали это, когда работа выполняется за короткое время - в отличие от времен, когда кто-то сидит перед системой, которая не отвечает, и мы сталкиваемся со временем ожидания.

Также существует небольшая когнитивная дистанция между нами и программой, над которой мы работаем. Например, если вы редактируете класс в пакетной среде, вы должны представить, как эти изменения повлияют. В LISP вы редактируете класс и одновременно меняете сами объекты. Это означает, что вы изменяете поведение объектов напрямую, а не новую их версию после цикла пакетного редактирования-компиляции-ссылки-запуска-тестирования.

В системе LISP вы изменяете класс в системе CAD, после чего он может быть немедленно активирован. Когда люди спрашивают, работает ли LISP для больших групп разработчиков программного обеспечения, ответ может быть таким: большая группа разработчиков программного обеспечения не нужна, если вы работаете постепенно. Проблема тогда заключалась в том, что действительно хорошие опытные разработчики программного обеспечения, знакомые с поэтапной разработкой, были (являются?) Редкими.

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

27
Rainer Joswig

Я помню, кто-то из НАСА описал свой опыт. Его команда внедрила софт, используемый на космическом корабле, еще в 70-х годах. И они эффективно модифицировали свое программное обеспечение на лету, когда были обнаружены некоторые ошибки.

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

Еще один пример. Вы находитесь на этапе интеграции, и вам нужно сделать много небольших изменений. И снова их много. Я мечтаю о такой возможности в Java, потому что в настоящее время мне требуется 30-40 минут, чтобы пересобрать и переустановить мое приложение (чтобы перестроить его снова через 10 минут).

14
Oleg Pavliv

Если вы посмотрите на что-то вроде Эрланга, смысл в том, чтобы избежать простоев.

Он работает на таких вещах, как телефонные коммутаторы, которые нельзя просто отключить на несколько секунд.

Для более нормального использования, однако, это функция "приятно иметь", но да, вероятно, не критично.

9
David N. Welton

Вы видите реальные данные. Это большое преимущество. Тогда вам не нужно спекулировать.

5
Flinkman

Потому что ты можешь?

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

Мгновенная обратная связь, простота проведения быстрых тестов без необходимости настройки ложного состояния программы в вашем тестовом приборе, возможность проверки состояния запущенной программы (каково значение этой переменной). Все это в реальном времени.

5
Marko

Это в основном для разработки, где это просто экономит время.

Но экономия времени потрясающе важна.

Как только вы привыкнете к этому, возвращаясь к старому, вы почувствуете, как летите на плавание в смоле.

3
John Lawrence Aspden

В промышленных системах это используется для программирования ПЛК, чтобы уменьшить время простоя и небезопасные условия.

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

Это похоже на ответ Эрланга для телефонных коммутаторов.

2
earlNameless

Ну, представьте, что вам нужно исправить сервер и не остановить его.

Если вы делаете это на "типичном" языке, это потребует некоторой тяжелой магии. Вы должны разбираться с "позади" исполняемого кода. Я думаю, что потребуется исправление таблиц функций и т.д., Все в сборке и манипулирование указателями на функции. Хорошее место для ошибок.

В LISP идея обновления без простоев встроена в языковую модель. Хотя есть некоторые сложности обновления, от которых вы не можете избавиться (как вы справляетесь с долго работающим соединением), это не требует тяжелой магии скомпилированного языка.

Хотя я не потратил на это много времени (то есть чего-нибудь полезного), я разработал прототип сервера в Common LISP, который по крайней мере выполнял бы некоторые исправления в реальном времени по сети без простоев.

1
Paul Nathan

Кейси Муратори только что сделал несколько уроков о том, как это сделать с помощью C и Microsoft C/C++ compiler. На самом деле это довольно просто, всего несколько десятков строк кода. Проверьте видео 22/24/25:

https://www.youtube.com/watch?v=WMSBRk5WG58

В игровом дизайне обоснование состоит в том, чтобы иметь возможность быстрее настраивать константы, чтобы найти эмоциональный тенор, к которому вы стремитесь. Такие вещи, как игровые ощущения, сценарии поведения, не связанные с игроками, и освещение/обстановка, которые можно использовать в игре, очень выигрывают от этого.

0
user755921

Еще одна хорошая вещь, помимо изменения программы "на лету" без необходимости перезапуска всего (проделав это десятилетиями, не значит, что это лучше, не так ли?), Это то, что вы можете проверить свою программу в ее текущем состоянии и состоянии. в состоянии выяснить, что происходит.

0
Mariano Montone