Есть ли какой-нибудь язык программирования, который может объединить редактирование и компиляцию / запуск? - PullRequest
2 голосов
/ 19 апреля 2010

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

Ответы [ 7 ]

4 голосов
/ 19 апреля 2010

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

Как отмечалось выше, многие языки предлагают интерактивный цикл чтения / редактирования / оценки / печати, но вы запрашиваете что-то большее. Машины Symbolics Lisp 1980-х годов предлагали функциональность почти такую ​​же, как вы описали; вам пришлось нажать одну клавишу, чтобы обновить работающую систему. Вы даже можете заменить функцию, не нарушая старых активаций предыдущих версий в стеке вызовов.

1970-е и 1980-е годы были золотым веком для интерактивных сред разработки, и с тех пор эта область ослабла. В настоящее время люди думают о Visual Studio как о высокоинтерактивной среде программирования - и это так, но менее динамично.

Я думаю, что наиболее близким сегодня к репликации такого рода динамического опыта является Squeak Smalltalk , который имеет сложную среду IDE, очень тесно основанную на среде Smalltalk-80, созданной в Xerox PARC (и те же люди).

3 голосов
/ 19 апреля 2010

То, что вы ищете, иногда называют живой системой, инкрементной системой или самоподдерживающейся системой (S³).

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

Например, почти все среды Smalltalk и многие среды Lisp живы, хотя я не знаю ни одной живой среды C или C ++,Раньше существовала живая среда Java, называемая IBM Visual Age for Java (которая на самом деле была написана в Smalltalk подразделением IBM Smalltalk и основана на IBM Visual for Smalltalk, так что в этом нет ничего удивительного), но когда она была переписана на Javaкак Visual Age для Java Micro Edition (который вы, вероятно, лучше знаете под его нынешним названием Eclipse), он потерял свою жизнеспособность.

Вы спрашиваете о «одновременном кодировании и одновременном выполнении».Ну, в живой системе они даже не «бок о бок», они на самом деле одно и то же: нет различия между кодированием и выполнением, нет различия между IDE и приложением, нет различия между компиляциейвремя и время выполнения.

То, как вы часто разрабатываете программное обеспечение в Smalltalk, заключается в том, что вы просто записываете то, что хотите, и запускаете его:

aCalculator ← Calculator new.
aCalculator compute: '1 + 1'.

(КСТАТИ: просто запустите "означает запись этого небольшого фрагмента кода в любую текстовую область в любом месте экрана, выделите его и нажмите «Выполнить».)

[Примечание: стрелка влево - это назначение (представьте =)стрелка вверх return.Оригинальные системы Smalltalk имели их на клавиатуре, современные системы обычно используют вместо них := и ^.Кроме того, пробел является отправкой сообщения («точка» в Java), а точка завершает предложение (;) в большинстве языков.Аргументы методов передаются внутри сообщения непосредственно после двоеточия, а не в скобках.]

Конечно, это не работает, потому что класс Calculator еще не существует.Итак, появляется отладчик (я уже упоминал, что между запуском и отладкой нет различий?), И один из вариантов, который он предлагает, - создать этот класс.Вы не перезапускаете программу, она просто продолжает работать.Теперь вы получаете ошибку new , потому что метод compute: не существует.Опять же, отладчик предлагает создать метод для вас, и вы можете прямо ввести код прямо здесь: (Я упоминал, что нет никакого различия между отладчиком и редактором?)

compute: aString
    ↑ 2.

Система уже заполненаимя метода для вас и выбрал (несколько) разумное имя для параметра метода.Вам нужно всего лишь набрать вторую строку.

(Кстати: если этот рабочий процесс звучит для вас знакомо, он должен. Кент Бек основал объектную модель и модель выполнения своих двух платформ тестирования (SUnit и JUnit), так кака также практики тест-ориентированной разработки и цикла Red-Green-Refactor именно на этом рабочем процессе.)

Обратите внимание, что ни разу в этом процессе мы не останавливали и не перезапускали запущенную программу. Мы всегда редактировали исходный код работающей системы изнутри системы во время ее работы. Фактически, вы не можете остановить программу Smalltalk или систему Smalltalk! Даже если вы выключите систему Smalltalk, она фактически сериализует все состояние системы (каждый класс, каждый объект, каждую переменную, каждый поток, каждое окно, даже положение указателя мыши) на диск и когда вы запустите его снова, вы точно , где вы остановились. Система никогда не останавливалась, она была просто заморожена. (Если вы знакомы с VMWare, Parallels, VirtualBox или чем-то в этом роде, это все равно что сделать снимок виртуальной машины. Или подумать о спящем режиме или приостановке работы вашего компьютера.)

Фактически, если вы скачаете версию Squeak сегодня, вероятно, там есть объекты, которые буквально работают в течение 30 лет. (Это еще одно различие между Smalltalk и другими системами. Smalltalkers считают, что, как и вина, объекты становятся лучше с возрастом. Это резко контрастирует, например, с PHP или Ruby on Rails, где объекты выбрасываются в значительной степени после каждый веб-запрос.)

Один из самых известных примеров этого живого редактирования взят из ключевой «Apple Demo», когда Стив Джобс, Джеф Раскин и другие члены команды Lisa посетили Xerox PARC в 1979 году, чтобы получить демонстрацию системы Smalltalk:

Одной из лучших частей демонстрации было то, что Стив Джобс сказал, что ему не нравится прокрутка в стиле blt, которую мы использовали, и спросил, делаем ли мы холодную плавную непрерывную работу. Менее чем за минуту Дэн [Ингаллс] нашел используемые методы, внес (относительно крупные) изменения, и прокрутка теперь стала непрерывной! Это шокировало посетителей, особенно программистов, так как они никогда раньше не видели действительно мощную инкрементальную систему. & Mdash; Ранняя история Smalltalk от Алана Кея, HOPL-II, & copy; 1993 ACM

О, да, вы все правильно прочитали: Дэн Ингаллс переписал видеодрайвер в работающей системе, изнутри действующей системы, даже не перезагружая систему и даже не останавливая приложение. Менее чем за 60 секунд. (Я упоминал, что нет никакого различия между языком программирования и операционной системой?)

Одно из лучших объяснений свойств живости можно найти в видео Self; Фильм (Self - производная от Smalltalk). Кроме того, взгляните на Lively Kernel Дэна Ингаллса (одного из первоначальных дизайнеров Smalltalk), который в основном является портом идей Smalltalk для JavaScript, работающего внутри сети. стр.

Как я писал выше, это действительно особенность среды, а не языка. Таким образом, хотя я использовал Smalltalk здесь в качестве примера, вы могли бы реализовать живую систему для любого языка. Я уже упоминал Лисп как язык, для которого существует множество оживленных сред, и я привел пример для JavaScript. Системы APL и Forth также имеют тенденцию быть живыми. Factor - хороший пример живой системы. Самым экстремальным примером может быть операционная система реального времени VxWorks, которая содержит полуживую систему для C (!), Которая использовалась для диагностики и исправления проблемы инверсии приоритетов, приводящей к ложным сбросам системы на ровере Sojourner на другой чертовой планете!

3 голосов
/ 19 апреля 2010

LISP, Scheme, Haskell, Perl, Python, Ruby, Maple, Mathematica, MATLAB и т. Д. Большинство интерпретируемых языков могут делать это. Ваш код интерпретируется и запускается, как только вы заканчиваете вводить его.

Черт, даже командная оболочка действительно имеет значение.

Цитата из Википедия: Интерпретатор командной строки :

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

- Брайан Керниган и Роб Пайк


Для демонстрации видео смотрите Игра жизни Конвея в APL .

1 голос
/ 19 апреля 2010

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

1 голос
/ 19 апреля 2010

Я не думаю, что это обязательно вопрос языка, так как это вопрос IDE и тому подобное. Даже скомпилированные языки, такие как C, имеют для них интерпретаторы.

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

0 голосов
/ 13 августа 2010

Ну, я работаю над чем-то вроде этого в хобби-проекте. Он использует статический типизированный скомпилированный язык с именем Eiffel.

Отличие от традиционных компиляторов заключается в том, что компилятор работает как сервер, а не как программа командной строки. Он хранит все данные, анализируемые в памяти, и на самом деле делает для них пошаговую компиляцию. Вместе с инкрементным компоновщиком в памяти идея состоит в том, чтобы цикл компиляции / компоновки / запуска менее 2 секунд.

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

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

0 голосов
/ 19 апреля 2010

Хм, а вы действительно хотите что-то подобное?!

Давайте представим, что у вас есть такая система, настроенная для вашей языковой среды Си. Итак, ваш редактор настроен так, что при каждом нажатии клавиши он проверяет, «ведет ли он к правильному коду» ... как? Если ваш редактор избыточно не использует всю ту же логику, что и компилятор / интерпретатор при разборе кода, вам придется вызывать компилятор. (Давайте проигнорируем издержки на сохранение файла на диск и представим, что ваш компилятор может напрямую читать содержимое буфера вашего редактора.) Таким образом, при каждом нажатии клавиши он компилирует код. Вы, вероятно, будете получать ошибки в 99% случаев, просто потому, что вы еще не завершили ввод имени переменной или ключевого слова. Как ваша система узнает, происходит ли ошибка из-за этого или из-за "настоящей" ошибки?

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

Большинство интерпретируемых языков имеют цикл Read-Evaluate-Print Loop (REPL), где вы можете определять функции, которые затем сохраняются в среде интерпретатора, и вы можете вызывать эти функции по имени и даже переопределять функции так, чтобы ранее определенные функции тот вызов их тогда выполнит новые версии. Но даже в этом случае ваша программа не выполняется, если у вас есть приглашение и, таким образом, вы можете дать ему что-то новое для интерпретации.

...