Какие функции языка программирования хорошо подходят для разработки живой среды программирования? - PullRequest
13 голосов
/ 25 октября 2011

Я хотел бы создать «живую структуру кодирования».

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

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

В этом случае приложение представляет собой оконное приложение с циклом обновления / отрисовки, наиболее вероятно использующее OpenGL для графики, аудиобиблиотеку для обработки звука (SuperCollider?) И в идеале сетевую библиотеку.

Конечно, я предпочел языки, хотя я не уверен, что какой-либо из них хорошо подойдет для такой архитектуры. В идеале я бы использовал Python, Lua, Ruby или другой язык более высокого уровня. Однако недавно один из моих друзей предложил вариант Clojure, поэтому я тоже рассматриваю его.

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

Ответы [ 8 ]

5 голосов
/ 07 июня 2012

Я реализовал функцию живого кодирования в Lua как часть ZeroBrane Studio IDE . Он работает точно так же, как вы описали, перезагружая приложение после внесения изменений в код. Я работаю над возможными улучшениями, чтобы изменить значения во время выполнения, чтобы избежать полной перезагрузки приложения. Это чисто решение на основе Lua и не требует каких-либо модификаций для виртуальной машины.

Вы можете увидеть демонстрацию живого кодирования, как в настоящее время реализовано здесь: http://notebook.kulchenko.com/zerobrane/live-coding-in-lua-bret-victor-style.

Что касается используемых / необходимых языковых функций, я полагаюсь на:

  1. возможность прерывать / возобновлять работающее приложение (это основано на вызовах debug.hook и error ()),
  2. возможность удаленного взаимодействия с (немодифицированным) приложением (это делается на основе debug.hook, поддержка взаимодействий TCP с select (), чтобы определить, отправляется ли новый запрос с хост-машины, а также с сопрограммами для переключения между основным приложением и модулем кодирования в реальном времени) и
  3. возможность внедрения нового кода в приложение (этот механизм также использует сопрограммы, но я уверен, что есть альтернативы). Существует также возможность добавить только модифицированный фрагмент, но он должен быть на уровне функции, и если эта функция является локальной для какой-либо другой функции, вам необходимо включить ее и так далее.
4 голосов
/ 01 ноября 2011

В Clojure есть почти все, что вы, вероятно, захотите использовать в качестве живого языка кодирования. Основные моменты:

  • Интерактивный REPL - так что вы можете напрямую взаимодействовать с запущенной программой. Даже когда я занимаюсь «традиционным программированием», я обычно пишу код в интерактивном режиме и позже копирую нужные мне фрагменты в исходный файл. Clojure просто создан для такой работы - практически все в вашей программе проверяемо, модифицируемо и заменяемо во время выполнения.
  • Отличная поддержка параллелизма - вы можете запускать параллельные фоновые задачи тривиально с помощью кода, подобного (future (some-function)). Что еще более важно, STM Clojure и акцент на высокопроизводительных неизменяемых структурах данных позаботятся о более тонких аспектах параллелизма (например, что произойдет, если я обновлю живую структуру данных, пока она находится в процессе рендеринга ??)
  • Доступность библиотеки - это язык JVM, поэтому вы можете использовать все аудио, визуальные, IO или вычислительные инструменты, которые вам требуются в экосистеме Java. Их легко обернуть в одну или две строки Clojure, чтобы вы получили краткий интерфейс с нужными вам функциями
  • Макросы - поскольку Clojure является гомоиконическим языком , вы можете воспользоваться способностью Lisp писать мощные макросы, расширяющие язык. Вы можете эффективно создать точный синтаксис, который вы хотите использовать в реальной среде, и позволить компилятору выполнить всю тяжелую работу по созданию полного кода за кулисами.
  • Динамическая типизация - о преимуществах этого можно утверждать обоими способами, но это, безусловно, огромное преимущество при попытке написать код быстро и кратко.
  • Активное сообщество с множеством интересных проектов - вы, скорее всего, найдете много людей, заинтересованных в подобных методах живого кодирования в сообществе Clojure.

Несколько ссылок, которые могут вас заинтересовать:

4 голосов
/ 26 октября 2011

Единственное, что необходимо для этой работы, - это форма динамического связывания, например, передача сообщений на языке Erlang или eval во многих других языках.

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

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

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

2 голосов
/ 26 октября 2011

Хорошо и хорошо иметь «живое кодирование» на вашем устройстве разработчика, но способ прямого взаимодействия с развернутым сервером делает его намного ближе к «реальному».Для этого вам необходимо REPL с поддержкой сети.

clojure обеспечивает это в виде сокета repl .Это позволяет вам удаленно подключаться к работающей версии вашего кода на вашем развернутом сервере Tomcat (например).Затем вы можете прикрепить ваш любимый инструмент разработки с поддержкой swank и взломать его.

1 голос
/ 17 апреля 2016

Smalltalk, вероятно, является лучшим выбором для этого. В отличие от других, он имеет целую IDE для живого кодирования, а не просто REPL

1 голос
/ 07 сентября 2012

Я работаю над функцией живого кодирования для редактора PyDev's Python.Это было вдохновлено выступлением Брета Виктора Inventing on Principle , и я реализовал отображение состояния программы, а также графику черепах.Они оба обновляются при вводе кода Python в Eclipse.

Проект размещен на GitHub , и я разместил демонстрационное видео , а также tutorial .

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

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

1 голос
/ 06 февраля 2012

Python на Google Appengine имеет repote_api_shell.py. это не полный набор live-кодирования - у clojure в emacs w / swank-clojure было гораздо больше использования в реальной жизни, поскольку он интегрировал «livecoding» в ритмы повседневной разработки - но многие люди не понимают, что это возможно в определенных средах Python.

$ PYTHONPATH=. remote_api_shell.py -s dustin-getz.appspot.com
App Engine remote_api shell
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)]
The db, users, urlfetch, and memcache modules are imported.

dustin-getz> import models
dustin-getz> models.BlogPost(title='a modern take on automated testing', link='https://docs.google.com/document/pub?id=1DUxQogBg45rOTK4c5_SfEHiQcvL5c207Ivcy-gDNx2s', dont_publish_feed=False).put()

dustin-getz> items = models.BlogPost.all().filter('dont_publish_feed =', False).order('-published_date').fetch(100)

dustin-getz> len(items)
58

dustin-getz> for item in items[:5]: print item.title
a modern take on automated testing
Notes: Running a startup on haskell
the [un]necessity of superstar middle management in bigcos
"everything priced above its proper value"
stages of growth as a software engineer
1 голос
/ 26 октября 2011

У Tcl уже есть такая вещь. Например, вы можете написать программу с графическим интерфейсом, которая создает отдельное окно с интерактивной подсказкой. Оттуда вы можете перезагрузить свой код, ввести новый код и т. Д.

Вы можете сделать это с помощью любого набора инструментов графического интерфейса, хотя некоторые будут намного сложнее, чем другие. С питоном все должно быть просто, хотя наличие отступов - ИМХО - усложняет интерактивное использование. Я вполне уверен, что большинство других динамических языков могут сделать это без особых проблем.

Посмотрите на это так: если ваш инструментарий позволяет открывать более одного окна, нет причины, по которой одно из этих окон не может быть интерактивной подсказкой. Все, что вам нужно, - это возможность открыть окно и какая-то команда «eval», которая запускает код, переданный ему в виде строки.

...