Более чем год назад мы публично представили нашу открытую и бесплатную платформу lsFusion. Многие тогда задавали нам вопрос : зачем мы создавали свой собственный язык, ведь уже существует огромное множество других популярных языков.
Да, мы прекрасно понимали, что собственный язык значительно увеличивает порог входа в технологию. Нет, нам нужен был специализированный синтаксис не потому, что все остальные обладают фатальным недостатком. Мы - не сторонники изобретения велосипедов, и при разработке платформы, в отличие от 1С, старались максимально использовать уже готовые открытые решения.
Но оглядываясь назад я, к сожалению, не вижу вариантов, как мы могли поступить иначе. В этой статье я попытаюсь объяснить почему.
Текущее положение дел
Предположим, что вы хотите разработать небольшое приложение по учету ИТ-активов, рассмотрению каких-либо заявок, простому финансовому учету, бюджетированию, обычному складскому учету или любое другое бизнес-приложение. Данные в этом приложении должны храниться в РСУБД - для надежности и скорости работы. Пользователю необходимо предоставить простой и удобный веб-интерфейс.
Для реализации этой задачи будем использовать, например, Java-stack технологий (хотя ничего принципиально не изменится, если это будет тот же Python). Посмотрим, знание каких языков нам для этого понадобится :
Java. Основной язык, на котором будет реализовано большинство логики приложения.
XML. Мало кто считает его языком, тем не менее, даже с точки зрения названия (Extensible Markup Language) он им является. Хотя конечно же, это не язык программирования, а язык разметки. Нам он так или иначе понадобится, поскольку именно его используют для конфигурирования множество библиотек (например, Spring, log4j или тот же Apache Tomcat). Кроме того, при разработке фронтенда придется использовать HTML, который, можно сказать, является разновидностью XML.
SQL. Теоретически можно обойтись без него, и использовать какую-нибудь ORM технологию (например, Hibernate). Однако, при обработке хоть сколько-нибудь большого объема информации все равно придется переходить или на плоский SQL, или на псевдо-SQL (вроде HQL).
JavaScript. Придется использовать, так как мы хотим современный, быстрый и удобный веб-интерфейс, а не перегружать страницу при любом действии как в древние времена.
CSS. Тоже язык разметки со своим специфическим синтаксисом (хоть и довольно простым).
Проблемы
Каждый из этих языков имеет свой отличительный синтаксис, кардинально отличающийся от остальных. Разве что JavaScript похож на Java, но если мы возьмем более модный Python, то будет еще один совершенно новый синтаксис.
Следует отметить, что за каждым из этих языков своя архитектура и логика, которую потребуется изучить перед началом использования. Да, большинство современных разработчиков привыкло к текущему положению вещей, и для них это кажется нормальным.
Но представьте себя на месте человека, который только “вошел в ИТ”, и не хочет глубоко заниматься программированием, а просто хочет разрабатывать бизнес-приложения. Например, до этого он был бизнес-аналитиком, системным администратором или просто менеджером. При первом взгляде на то, что ему придется знать, у человека может легко случиться приступ депрессии, и он просто бросит эту затею.
Многие конечно возразят, что нечего непрофессионалам браться за разработку приложений. Каждый должен заниматься своим делом, и для реализации такой задачи нужно взять фронтенд, бэкенд и SQL разработчиков, где каждый будет специалистом в своей области и языке. Более подробно эту проблему мы описывали в этой статье.
Во-первых, это то же самое, что сказать, что для того, чтобы вырыть яму на дачном участке нужно обязательно пригласить проектировщика, бульдозериста и разнорабочего. Все-таки разные задачи требуют решений разной сложности.
Во-вторых, каждый, кто когда либо занимался управлением проектом знает, что взаимодействие нескольких человек - это всегда дополнительные проблемы, которые ведут к удорожанию и задержкам проекта. Недаром в последнее время в цене Full-stack разработчики.
Решение
Оценивая все вышесказанное, при разработке платформы возник резонный вопрос : а что если мы хотим, чтобы вся логика задавалась в одном универсальном языке, где задается и доменная логика, и логика вычислений и пользовательский интерфейс.
Во-первых, это будет проще для изучения новичку.
Во-вторых, при разработке определенной обособленной функциональности можно будет всю логику, связанную с ней, положить в один файл (модуль). В нем будет как описание доменной логики, так и описание действий, событий, ограничений и интерфейса. Пример того, как это выглядит, был описан в этой статье.
В-третьих, языки всегда описывают некоторую архитектуру. Платформа имеет декларативную функциональную логику, и существующие императивные языки не очень хорошо подходят для ее описания.
Приняв решение о том, что для решения такой проблемы без собственного языка никак не обойтись, нужно было решить какой синтаксис из уже имеющихся взять за основу. Вариантов по большому счету было два : C-ишный синтаксис, который используется в Java/JavaScript (построенный на специальных символах), или SQL-подобный синтаксис (построенный на ключевых словах).
Мы выбрали второй вариант, так как одной из целей была простота языка, а SQL изначально создавался для бизнес-пользователей, а не разработчиков. Кроме того, SQL, как и lsFusion, описывает декларативную логику, а не императивную, как Java и другие универсальные языки. Еще одним фактором такого решения стало то, что мы хотели встроить в язык достаточно большое количество возможностей, и нужно было много ключевых слов для этого. Сложное сочетание спецсимволов и ключевых слов могло быть не очень интуитивно понятно. Стоит отметить, что похожий синтаксис использовался в ранее популярном языке для работы с данными и бизнес-приложениями FoxPro.
Выбрав решение с ключевыми словами, нужно было еще определиться ,в каком регистре они должны быть. Для SQL на эту тему ведется много баталий. Для первоначальной реализации мы все-таки выбрали схему с большими буквами для ключевых слов, чтобы отделять их от идентификаторов при работе без IDE. Именно такая схема была в первоначальной логике SQL и того же FoxPro, и лишь потом начали практиковаться разные виды регистров. В следующих версиях lsFusion мы также планируем разрешить использовать разный регистр букв для ключевых слов.
Дальше было лишь делом техники реализовать свой язык. Для этого мы взяли ANTLR для разбора языка, а также реализовали плагин для IntelliJ IDEA. Как именно это было сделано, мы возможно расскажем в будущих статьях.
Язык lsFusion получился достаточно похожим на SQL, с той лишь поправкой, что SQL описывает таблицы и запросы, а lsFusion - функциональную логику. Пример того, как логика, описанная в SQL, соответствует такой же логике в lsFusion описана в статье Функциональная СУБД. Примеры остального синтаксиса можно увидеть вот здесь : императивная логика, GUI. Более подробное описание языка можно найти в одних из первых трех статей блога (1, 2, 3).
Надеюсь, что у читателя статьи создалось представление, почему мы решили использовать свой собственный язык, а не создавать очередной Java/Python/Ruby-framework.
TargetSan
В этом КМК одна из основных проблем. Представьте себя на месте человека, который только "вошёл в строительство", и не хочет глубоко заниматься вопросами проектирования планировки, заливки фундамента, возведения стен, внутренних работ, кровли, а хочет просто строить коттеджи. Чтобы что-то хорошо делать в любой сфере деятельности, надо вникать. Результаты "Фигак-фигак, и так сойдёт" можно посмотреть в незабвенном мультфильме "Вовка в тридевятом царстве".
EDIT: Как обычно, чукча не читатель. Подкорректирую. Вышесказанное остаётся в силе. Касательно вашей аналогии. "Вырыть яму на дачном участке" примерно соответствует "поднять простенький сервер для отдачи статики". И то, даже яму надо уметь копать. Как и поднимать простенький сервер. Множество языков существуют не просто так. Каждый из них выполняет определённую задачу. Представьте себе, что вместо отдельных молотка, плоскогубцев, дрели, шуруповёрта, кусачек, обжимных клещей у вас один универсальный Починятор. Если вы смогли покрыть свою предметную область одним языком — замечательно. Проблемы начнутся, когда вам понадобится сделать шаг за её пределы.
Oxyd
Вот да. КМК авторы идут ровно по тем-же граблям, что и создатели языка 1C (язык для не программистов, ага). А до этого создатели COBOL. В результате что для кобола, что для 1C, нужны специально обученные люди.
Veidt
Скорее уж ABAP, SQL или Foxpro. Хотя прикол в том, что практически во всех продуктах сейчас есть свои языки или мини-диалекты. .Net начал LINQ встраивать в язык, React — JSX и т.п. В узкоспециализированных продуктах языков еще больше. Например в том же NSIS (самой популярной технологии для создания инсталляторов) свой язык, тот же Jenkins и Gradle использует Groovy (весьма редкий диалект Java), GrammarKit, JFlex и ANTLR (для создания парсеров и лексеров) имеют свои языки и т.п.
Так что я бы сказал, что использование языков достаточно общая практика.
Ivan22
ну учитывая популярность 1С, как бы это подтверждает правильность выбора
Oxyd
Популярность языка или монополия платформы в одной отдельно взятой стране?
Barbaresk
Я разработчик различных сайтов на ASP.NET, а также работал несколько лет программистом С++, пиля всякий кровавый энтерпрайз. И так получилось, что год назад я еще начал и с 1С работать, писать различные обработки, загрузку-выгрузку данных, подружил 1С с некоторыми своими разработками. Так вот, я не считаю 1С злом. Мало того, я считаю платформу 1С и некоторые конфигурации, с которыми я работал — однозначно положительным явлением в области разработки ПО. 1С может и монополия, но не потому, что он там кого-то гнобит и вытаптывает. Просто продукты (конфигурации), хоть и имеют ряд проблем (и кириллица — это минимальная проблема, которую забываешь через 5 минут), но эти продукты хороши. Я работал с УТ, Розницей и немного с Бухгалтерией и они учитывают современные реали в плане законов, требований к кассовой дисциплине, к товарообороту и прочим противным вещам. И монополия у них не потому что они плохие, а потому что остальные так сделать не могут. Сделать с одной стороны гибкую платформу (хоть и с плохо архитектурой), а с другой неплохие конфигурации, учитывающие особенности РФ.
icecube092
По-моему, все языки создавались «чтобы было просто писать» или «чтобы могли писать непрограммисты». И ни у кого не получилось.
Prysmak Автор
Сейчас только у нас на фирме на lsFusion разрабатывают 20 человек. Ни один из них никогда не писал ни на Java, ни на Python, ни на C++, ни на любом другом классическом языке программирования. Пишут просто, только иногда конечно срабатывает «with great power comes great responsibility» и приходится немного оптимизировать.
Ivan22
так у них какая должность — разработчики lsFusion? Как на счет «простого бухгалтера» ??
Prysmak Автор
Нет, кстати, у многих из них должность — «бизнес-аналитик». Но Вы же понимаете, что это не важно. Между программированием и настройкой/конфигурированием очень тонкая грань. Я в статье давал ссылку на другую нашу статью, где мой коллега это описывал.
Prysmak Автор
Абсолютно согласен. Но дело в том, что есть еще такое понятие как экономическая эффективность. И часто нужно делать не самым лучшим способом, а лучшим по соотношению цена/качество.
Классический пример: Макдональдс. С точки зрения еды — не самый лучший. Но тем не менее, он пользуется огромной популярностью и востребован на рынке.
Кстати, есть например универсальные швейцарские ножи. Каждая его составляющая — хуже специализированной вещи. Но тем не менее, тоже пользуется спросом.
Или, например, фотоаппарат в телефоне хуже, чем профессиональный. Но сколько людей фотографируют на телефон, а сколько на фотоаппараты?
Именно это мы и старались сделать.
Да, именно так и есть. Но у нас и не было цели делать универсальный язык.
qrKot
Разрешите вас покритиковать. Процитированное выше предложение — просто сказка… хм, намекающая на то, что под выбором «своего языка» таки не лежит каких-то особых исследований по теме.
3 наводящих вопроса:
1. Чем похожи Java и Javascript (за исключением букв «Java» в названии, конечно)?
2. Давно ли Python перешел в разряд «более модных»?
3. К чему вообще упоминание Python в контексте Javascript'а? Где точка пересечения, и как вы собираетесь JS Python'ом заменять?
Prysmak Автор
Например, синтаксисом for'ов, if'ов. Вот цитата из википедии: «На JavaScript оказали влияние многие языки, при разработке была цель сделать язык похожим на Java».
В те времена, когда я начинал программировать, мэйнстримом был C++, а Java был новым и модным. Про Python тогда никто не слышал. Так что он явно «моднее», чем Java.
Python упоминался не в контексте JavaScriptа, а как замена Java на backend'е. При этом, на frontend вы же не можете писать на Python (браузер не умеет его выполнять). Так что Вам придется писать и на Python, и на JavaScript.
icecube092
То есть разработка собственного языка и обучение ему людей оказалась выгодней, чем найм специалистов в существующих языках? Сколько процентов выиграли?
Prysmak Автор
Проблема же не столько в специалистах. Нужна была платформа, чтобы быстро разрабатывать и дорабатывать приложение. Собственный язык — это следствие.
Смотря в чем считать. Затраты давно отбили, и уже давно прибыль.
Veidt
Стоп, давайте уточним разработка языка или парадигмы? Теоретически и SQL можно было сделать библиотекой и как-то натянуть на существующие синтаксисы. Но фокус SQL (как и lsFusion) что они фундаментально другие. Это function-level (не путать с functional) программирование, в противовес value-level программированию. То есть построенное на ограниченном множестве функций высших порядков (операторов, где при этом все функции чистые), а не на архитектуре ноймана (с состояниями, переменными, потоком выполнения и вот этим всем). Такая супер-функциональщина.
В простоте и скорости разработки, производительности, поддерживаемости, модульности выигрыш на порядок. И естественно оказалось выгоднее, так как в противном случае получился бы второй .Net, SAP, 1С, которым ты по определению будешь проигрывать, так как у них бюджеты гораздо больше.