Редактирование программ "пока они запущены"? Зачем? - PullRequest
64 голосов
/ 22 февраля 2011

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

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

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

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

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

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

С нетерпением жду слюни!

Ответы [ 13 ]

57 голосов
/ 22 февраля 2011

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

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

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

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

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

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

56 голосов
/ 25 февраля 2011

Есть несколько очень интересных вариантов использования. Один пример - в программировании с графическим интерфейсом - я видел это при разработке приложения с графическим интерфейсом в реальном времени, когда оно работало рядом с моим 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-синтезатора в реальном времени, несмотря на то, что вы никогда не могли в Java, Penumbra использует привязки Java OpenGL и т. Д. Это потому, что Rich Hickey разработал Clojure, чтобы он мог компилироваться в байт-код JVM на лету. Это удивительный язык - Clojure внес огромный вклад в то, насколько невероятно увлекательным и продуктивным может быть программирование.

27 голосов
/ 22 февраля 2011

Для Lisp существует маркетинговый слоган:

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

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

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

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

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

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

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

21 голосов
/ 22 февраля 2011

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

  1. персональный программист просветления блаженства *
  2. истинное непрерывное развертывание.
  3. Ноль запланированных простоев Соглашения об уровне обслуживания.
  4. отладка производственных серверов.

* не гарантия.


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


одна большая ничья в эти дни - постоянное развертывание.

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

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


Еще один момент, вызывающий восторг, - это идея получить исправления безопасности без необходимости декларировать любое время простоя . Вы можете выполнить обновление без затрат, и ваш SLA обойдется любому из вас в «драгоценное время по расписанию». Если вам нужно запланировать запланированное время простоя на шесть месяцев заранее, и вы получите только два часа, тогда (для этих бедных душ) это действительно может заставить их пускать слюни.
Если у вас есть доступ repl к запущенному приложению по мере его развертывания (возможно (с разрешения) на сайте клиента), вы можете подключиться к приложению во время его работы и запустить тесты для существующего кода в существующем контексте без необходимости останавливать и подключать отладчик. Вы также не получите потери скорости от отладчика. Это можно сделать без REPL, хотя, когда вы получите туда repl, вы можете легко создать новый код (некоторые скажут, что внедрение динамических загрузчиков классов через отладчик легко), а затем все исправить. Таким образом, вы можете подключиться к работающему серверу. обнаружите, что функции не удалось повторно подключиться к базе данных после кратковременного простоя, а затем повторно подключить ее сразу и там.


как и во всех программных конструкциях, никогда не будет серебряной пулей , и это постоянное развертывание / разработка имеет интересный недостаток: ваша программа может быть правильной в памяти и неправильной на диске. если вы компилируете функцию, затем разбиваете ее и сохраняете, то единственной рабочей копией кода является та, которая выполняется. Мне бесполезно знать об этом и восстанавливать файлы сразу после их сохранения.
Это может показаться странным, поэтому посмотрите, как Вставить REPL Clojure в ваше производственное приложение
14 голосов
/ 22 февраля 2011

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

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

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

9 голосов
/ 22 февраля 2011

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

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

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

5 голосов
/ 22 февраля 2011

Потому что вы можете?

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

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

5 голосов
/ 22 февраля 2011

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

3 голосов
/ 22 февраля 2011

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

Но экономия времени поразительно важна.

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

2 голосов
/ 23 марта 2011

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

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

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

...