Визуальный язык программирования L-2D (лямбда-2Д), где вместо текстового способа написания кода используется графический способ |
||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2024-12-20 12:50 Исследование рисования как языка программирования с использованием идей из лямбда-исчисления Как можно кодировать посредством рисования? Область невербальных языков программирования не была неисследованной. Существуют языки на основе 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 Комментарии: |
|