Программирование
Luna и визуальный способ создания программ
Luna может использоваться во многих областях, где обработка данных является главным приоритетом: data science, машинное обучение, IoT, биоинформатика, компьютерная графика или архитектура. Создатели open source языка рассуждают о принципах создания предметно-ориентированных языков и рассказывают о своем решении, позволяющем создавать программы при помощи визуальных диаграмм.
Вокруг нас живет множество программ для обработки данных. Беспилотные автомобили, автоматические дроны для доставки, следящие за здоровьем часы или лампочки, которые отслеживают ваше местоположение, чтобы вызвать лифт или включить кондиционер. Даже если вы нажимаете педаль газа в автомобиле, вы не контролируете дроссель напрямую — за вас это делает программа. Симбиоз человека и программ распространен повсеместно, и мы даже уже этого не замечаем.
Программы позволяют нам сделать невозможное. Компьютеры могут собирать и обрабатывать огромный объем информации за доли секунды. Более того, людям нужно визуализировать информацию, чтобы понять её. Нам проще использовать точки на карте, графики или визуализацию генома в CAD вместо длинного списка чисел и координат.
Разнообразие специфических требований к предметной области в значительной степени способствовало росту предметно-ориентированных языков (DSL — Domain Specific Languages). Если вы разработчик, вы, вероятно, знаете DSL в их наиболее популярной форме — текстовых языков программирования. Однако понятие DSL намного шире. Предметно-ориентированный язык представляет собой специально разработанный текстовый или визуальный интерфейс для управления данными в определенной области. Богатые графические пользовательские интерфейсы, предназначенные для работы с данными, специфичными для какой-либо области, такие как UML-диаграммы, интерактивные графики или обработка музыки, также должны рассматриваться как DSL. Хорошим примером является наиболее распространенный DSL, используемый графическими дизайнерами — это цифровые холсты с соответствующим набором инструментов, кистей, фигур, фильтров и так далее.
Что такое Luna?
Luna — это визуальный и текстовый, полностью функциональный WYSIWYG-язык для обработки данных (WYSIWYG — «что видишь, то и получишь»). Его цель — изменить способ того, как люди собирают, понимают данные и управляют ими.
Luna может использоваться во многих областях, где обработка данных является главным приоритетом: data science, машинное обучение, IoT, биоинформатика, компьютерная графика или архитектура. Каждая область требует качественных инструментов, и Luna предоставляет как единую основу для создания таких инструментов, так и растущую библиотеку уже существующих. По своей сути, Luna предоставляет мощную среду для моделирования потока данных и фреймворк для визуализации данных и управления ими.
Принципы создания языка
Хорошо спланированный предметно-ориентированный язык помогает людям выразить свои мысли быстро и точно, а также легко понять результат их действий. Это действительно важно исследовать, потому что это влияет на то, как быстро вы сможете тестировать новые идеи и получать результаты. Быстрые итерации делают возможным тестирование большого количества параметров, включая те, что вы не сочли подходящими с первого взгляда, и позволяют вам лучше понимать исследуемую область. Поэтому создание языка влияет не только на время решения проблемы, язык часто является ключом к нахождению самого решения.
Здесь появляется важный вопрос: что такое хороший язык? Существуют ли правила, которым должен следовать каждый предметно-ориентированный язык? Мы считаем, что существует два основных принципа:
- Люди должны видеть моментальную связь с тем, что они создают. Этот принцип был впервые предложен Бреттом Виктором во время его выступления Inventing on Principle. Любое отклонение от этого правила отделяет пользователей от проблем, которые они пытаются решить, что увеличивает количество ошибок.
- Люди не могут быть ограничены инструментом, который они используют. Люди обычно отказываются от инструментов, которые ограничивают их способность самовыражения. Это одна из причин, по которой многие WYSIWYG-решения, например, инструменты для создания сайтов или визуальные языки программирования, не становятся популярными. Каждый предметно-ориентированный язык, который является сложнее текстового WYSIWYG-редактора, может легко нарушить этот принцип, предоставив пользователям слишком ограниченный набор компонентов. Даже если эти компоненты можно расширить при помощи кода, необходимость обращаться к другому языку программирования портит дизайн языка и делает его сложным для аудитории с меньшим техническим опытом.
Нарушение принципов
Нарушение любого из этих принципов приводит к менее оптимальному решению. Рассмотрим графический дизайн. Использовать Photoshop лучше, чем писать код на HTML, CSS (Sass) и JavaScript? Вероятно. Но эти решения нарушают первый и второй принципы. Photoshop предоставляет цифровой холст с ограниченным набором предопределенных инструментов. HTML, CSS и JavaScript предоставляют текстовый интерфейс, который отделяет пользователя от его творения. Возьмем два случая:
- Дизайн сайта. В меню этого сайта всего пять объектов. Если вам нужно добавить новый объект или изменить цветовую палитру сайта, вам нужно лишь поменять одну строчку в HTML и переменную цвета в CSS. Независимо от сложности сайта, каждый элемент обновится автоматически. Та же операция в Photoshop потребует больше времени: создать новый объект меню, использовать выравнивание для расстановки элементов, вручную изменить цвета и добавить несколько трансформаций, если сайт достаточно сложен.
- Художественный рисунок. Используя HTML, SVG и CSS в текстовом редакторе, будет невозможно выразить художественное видение.
Возможно ли объединить оба подхода? В этом направлении уже есть успехи. Например, Sketch, который стал важной программой для дизайн на Mac OS. Почему многие люди предпочитают Sketch, а не Photoshop? Sketch меньше ограничивает способность пользователей к самовыражению Он позволяет вам создавать элементы дизайна и обновлять их параметры, как Sass, но в интерактивной среде.
Создание логотипа в Luna:
Проклятие DSL
Если мы знаем основные принципы для предметно-ориентированного языка, почему существует так мало подобных инструментов? Хотя DSL позволяют лучше понимать данные, они способствуют появлению неверных моделей создания программ. Существование множества небольших предметно-ориентированных языков в долгосрочной перспективе ведет к фрагментированному миру программного обеспечения.
В реальном мире между разными областями постоянно существует взаимодействие. Но в мире ПО такого сотрудничества нет. Разработчики должны писать один и тот же код снова и снова, что приводит к большим затратам на разработку и стагнации инноваций. Вы не можете просто взять редактор формы из любимого графического редактора, настроить его, связать с инструментами машинного обучения и получить инструмент с искусственным интеллектом для создания 3D-моделей. Вместо нескольких часов вам понадобятся месяцы на завершение данной задачи. Даже если вы найдете нужные библиотеки, вам придется сделать огромное количество работы, чтобы создать действительно гибкую среду. В результате вместо того, чтобы улучшать существующие компоненты или изобретать способы управления данными, разработчики переизобретают известные решения с нуля в каждом новом приложении.
Язык Luna
Первый принцип предметно-ориентированного языка довольно прост. Чтобы создать мгновенную связь между людьми и их творениями, языки должны сочетать визуализацию данных и интуитивное управление ими с бесшовным опытом взаимодействия. Это сильно зависит от области и предпочтений пользователя, что делает второй принцип ещё более важным.
Как создать язык, который не будет ограничивать способность людей к самовыражению? Как сделать так, чтобы пользователи могли создавать компоненты и модифицировать существующие, и сохранить интерфейс простым и понятным не только программистам? Идея заключается в возможности для пользователя изменять точку зрения. Вместо того, чтобы обращаться к языку программирования, лежащему в основе, мы позволяем пользователю погрузиться в каждый компонент и использовать тот же самый (или похожий) язык, чтобы описать коммуникацию субкомпонентов. Дальнейшее погружение позволяет пользователям переходить от высших уровней к низшим.
Именно это делает Luna. Он создан на основе трех концепций:
- Среда для визуализации данных и управления ими. Luna позволяет вам визуализировать данные и управлять ими при помощи интерактивных WYSIWYG-компонентов, которые можно расширить. Более того, Luna предоставляет способ простого создания новых компонентов, модифицирования существующих и распространения этих компонентов в сообществе.
- Диаграмма потока данных. Вы можете увидеть, как компоненты высшего уровня связаны в потоке данных. Вы можете разъединить их или добавить новые компоненты, чтобы изменить работу диаграммы. Luna предоставляет компоненты для всех уровней абстракции, от рисования статистических функций до битовых операций.
- Вложенные диаграммы потоков данных и репрезентация кода. Каждый компонент в Luna состоит из других компонентов. Вы всегда можете спуститься на уровень ниже и настроить компоненты, как вам нужно. Вы можете объединить несколько компонентов в один и поделиться им с другими людьми. Более того, вы всегда можете переключиться с диаграммы на код, и наоборот. Диаграмма при этом обладает такой же силой, что и код.
Luna создан как единая среда для создания визуально богатых предметно-ориентированных языков. Он стирает границы между сферами, позволяя инструментам из разных областей общаться и существовать совместно.