Визуальный язык программирования L-2D (лямбда-2Д), где вместо текстового способа написания кода используется графический способ

МЕНЮ


Главная страница
Поиск
Регистрация на сайте
Помощь проекту
Архив новостей

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


Исследование рисования как языка программирования с использованием идей из лямбда-исчисления

Как можно кодировать посредством рисования?

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

  • Использовать тот факт, что программа является нарисованной, чтобы включить в нее функции, которые в противном случае были бы невозможны в текстовых языках программирования.
  • Не иметь ни слишком малого количества инструкций, ни слишком большого: в первом случае становится трудоемким создание даже самых простых программ, а во втором случае становится неминималистичным и сложным для реализации компьютерного зрения.
  • Уметь рисовать программы, которые сами по себе выглядят визуально привлекательными, такими, что их захочется поместить в рамку и повесить на стену.

Хотя я обычно императивный и низкоуровневый человек, я был вынужден использовать лямбда-исчисление, или функциональное программирование в его самой примитивной форме, как основу для языка, поскольку мне показалось, что идеи очень похожи на типичный рисунок. В нем нет понятия «исполнения», а есть только понятие «оценки», очень похоже на то, как глаза зрителей могут задерживаться на любой части рисунка без определенного порядка, и, следуя за множеством точек, они видят линию, линии — форму, а формы — композицию.

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

Кредит:

 Лингдонг Хуан

Лямбда-исчисление — настолько лаконичный язык, что в нем всего две инструкции: применение функции и определение функции. Я быстро придумал рабочие символы для каждой: форма «чашки» для первой (для глупой интуиции, что применение функции похоже на помещение аргумента в «чашку»), и одноименная греческая буква для второй (что немного невообразимо и, возможно, слишком часто используется, но, по крайней мере, понятно). Так же, как и ванильное лямбда-исчисление, функции всегда принимают один аргумент и производят один вывод; чтобы получить больше, вы можете объединить несколько функций вместе, что называется «каррированием».

Кредит:

Лингдонг Хуан 

Затем появились провода для соединения символов и передачи данных. Технически язык на данный момент является полным по Тьюрингу, но его будет мучительно трудно использовать, нарушая мое правило дизайна № 2. Поэтому я добавил гораздо больше других символов, которые вы ожидаете от своих любимых языков программирования, таких как числа и математические операторы. Считайте их просто синтаксическим сахаром: вы по-прежнему можете придерживаться чисел Чёрча (они довольно крутые) и других «чистых» конструкций лямбда-исчисления, если хотите.

Кредит:

 Лингдонг Хуан

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

Кредит:

 Лингдонг Хуан

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

Каждый символ сделан размером 5x5 пикселей, его удобно штамповать на сетчатом холсте, в то время как пользователь может также рисовать «от руки» с помощью инструмента, похожего на «карандаш». То, что изначально начиналось как временная мера, выросло в почти полноценный редактор со множеством функций. 

Кредит:

Лингдонг Хуан 

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

Базовый парсер работает, транспилируя (переводя) всю программу ?-2d в эквивалент javascript. Результирующий однострочник javascript — это одно ужасно непостижимое мегавыражение, которое содержит столько скобок, что лишайник содрогнулся бы. Но самое крутое в нем то, что он работает (хотя и неэффективно)!

Кредит:

 Лингдонг Хуан

Я работаю над улучшением языка, создавая больше примеров программ, и по мере этого обнаруживаю недостатки дизайна, которые нужно исправить. Это было очень весело, поскольку я сам не знаком со своим собственным творением: я знаю только базовые правила и то, что в теории это должно работать, но о том, как на самом деле программировать на нем, я так же невежественен, как и любой другой новичок в изучении языков программирования. Постепенно я начинаю понимать его характер, то, каково это — программировать на этом очень странном языке, основанном на рисовании. Вначале я использовал синтаксис неуклюже, пытаясь подчинить все своей воле; позже я становлюсь более искусным и выразительным в нем. Кодирование в ?-2D чем-то похоже на игру в Minecraft или Factorio, но это даже лучше, потому что я могу назвать это исследованием.

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

Кредит:

Лингдонг Хуан 

Кредит:

 Лингдонг Хуан

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

Кредит:

 Лингдонг Хуан

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

В итоге получилось что-то вроде сумасшедшей компьютерной игры из 8-битной эпохи. Вы можете посмотреть ее в онлайн-демо  (Меню > Программа > Анимированный забег).

-2D начинался как часть более масштабного исследования по разработке системы, в которой пользователь рисует программы ручкой и бумагой и получает интерактивную обратную связь через дополненную реальность. Однако становилось все интереснее, когда он сам по себе стал полноценным проектом. Хотя я очень горжусь этим аккуратным маленьким языком, он еще не полностью соответствует некоторым первоначальным целям. Например, программы слишком похожи на принципиальные схемы и недостаточно похожи на, ну, чертежи. Кроме того, я не слишком оптимистичен относительно того, насколько легко человеку (исключая меня) изучить его, а системе компьютерного зрения — сканировать его без ошибок.

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

Вы можете попробовать бета-версию ?-2D онлайн здесь . Исходный код парсера и редактора вскоре будет доступен на GitHub.


Источник: www.media.mit.edu

Комментарии: