Вот код для реализации 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. Сейчас мы принимаем заявки и рады обсудить возможности рекламы и спонсорства.
Если вам понравилась эта история, мы рекомендуем прочитать наши последние технические истории и актуальные технические истории. До следующего раза, не принимайте реалии мира как должное!