Вот код для реализации Game of Fifteen.

for(the I : from-1-to-15)
{
    the Tile = "tile_" & I;
    if( Tile-is-clicked )
        if( abs((Tile-x) - ("tile_16"-x)) 
          + abs((Tile-y) - ("tile_16"-y)) == 105 )
            slide-Tile-on-"tile_16"-in-200-ms,
            teleport-"tile_16"-on-Tile;
}
teleport-"cursor"-to-(mouse-x)-(mouse-y);

Что вы можете сказать о языке, на котором написано это произведение?

Возможно, вы сделаете вывод, что это какой-то DSL. У него есть некоторые очень специфичные для приложения функции, такие как slide и teleport. Это многословно, но предназначено для чтения тем, кто не знает всех соглашений, таких как установка времени в часах или миллисекундах. Он имеет некоторую динамическую типизацию, и его функции могут получать аргументы с обоих концов.

Но что это за язык вообще?

It’s C++.

Здесь вы можете убедиться в этом сами. Это полностью корректный фрагмент кода C++, написанный на языке внутри языка. И этот вложенный язык полностью отличается от основного. Он имеет другую типизацию и другой синтаксис. Но это все еще С++.

Впрочем, не обращайте внимания на этот кусок. Это не важно, это просто пример того, как глубоко можно зайти. И «можно» не значит «должно». Скорее наоборот. Важно то, что грань между созданием нового языка и расширением старого довольно тонкая.

Вам не нужно заседать в комитете или быть разработчиком компилятора, чтобы создать язык. На самом деле создание языка — это часть повседневной работы каждого программиста. Каждый раз, когда вы вводите новое слово: пишете функцию, или тип данных, или класс типов, — вы делаете что-то вроде нового языка. И хотя мысль о том, что каждый член команды вносит свой вклад во всю систему, написав на своем собственном языке, таком как Forth, Python и Java, ужасает, реальность того, что каждый член команды создает свой собственный язык, не дав ему названия, несколько менее ужасна.

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

Действительно ли этот уровень абстракции неизбежен? Полезны ли эти обертки? Кто выиграет от этого переопределения типов данных? Вам действительно нужен этот метод IsZero()?

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

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

Hacker Noon — это то, как хакеры начинают свой день. Мы являемся частью семьи @AMI. Сейчас мы принимаем заявки и рады обсудить возможности рекламы и спонсорства.

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