Поделиться через


Работающий программист

Язык, улавливающий Важную Бизнес-Логику

Тэд Ньюард

 

Тэд НьюардУчитывая, что эта рубрика была написана в апреле и что первое апреля в США и западных странах часто называют «April Fool’s Day», мне показалось вполне подходящим написать статью о языках, способных улавливать Важную Бизнес-Логику. (Обратите внимание на то, что слова пишутся с заглавных букв; именно так все бизнесмены называют любые новшества, которые им нужны, какими бы смехотворными они ни были, поэтому мы просто обязаны называть их с той же степенью благоговения и почтения.) И когда мы улавливаем упомянутую Важную Бизнес-Логику, мы делаем это со всей серьезностью и искренностью на языке, который способны понять бизнесмены и представители заказчиков (а также большинство сотрудников отдела маркетинга).

Поэтому я со всей серьезностью и искренностью представляю вам важный язык в арсенале .NET-средств программирования: LOLCODE.

LOLCODE

Хотя ученые, а заодно и хозяева собак долгое время полагали, что кошки на самом деле не умеют общаться со своими хозяевами, хозяева кошек давно знали, что они делают это за милую душу — просто спросите любого, у кого есть кошка, как она каждый день информирует о том, что, несмотря на пять утра, ее пора покормить. (Для непосвященных: такие действия обычно сопровождаются громким мяуканьем, боданием головой в нос и очень легким покалыванием когтями наиболее чувствительных частей человеческого тела.)

Однако с тех пор, как кошки открыли для себя механическую мышь, в Интернете свершилась тихая революция: кошки стали постоянно расширять свои способности к общению, публикуя снимки самих себя с заголовками, написанными на чем-то, что, по общему согласию антропологов и историков (все они любители кошек, а антропологи и историки, любители собак, оказались «недоступны» для комментариев по этому поводу), является фундаментальными строительными блоками языка, на котором разговаривают люди. Этот основополагающий язык люди иногда не совсем правильно называют «лолспик» («LOLspeak»)1 . (Соответствующие примеры можно найти в Facebook и Twitter, так что не притворяйтесь, что вы не знаете, о чем я говорю.)

1 LOLspeak — LOL сокр. от «laughing out loudly» («катаюсь по полу от смеха»), а «speak» — глагол «говорить». Вариант языка для интернет-общения, основными принципами которого являются намеренное употребление орфографических и грамматических ошибок, а также чрезмерное употребление сокращений. — Прим. ред.

К счастью, действующие из лучших побуждений и любящие кошек инженеры, знакомые с платформой .NET, озаботились расширением этого языка, чтобы включить его в платформу .NET; две таких попытки действительно имели место, но, как это ни грустно, до наших дней дожил лишь один проект. Первый был реализацией, основанной на Dynamic Language Runtime (DLR), от Мартина Мейли (Martin Maly) и Джона Лэма (John Lam) в те дни, когда DLR была новинкой (2007 год), но сейчас он, похоже, исчез. Второй — это проект, датируемый примерно теми же временными рамками, но в нем осуществлялась компиляция кода в .NET-сборки вместо прямой интерпретации исходного кода. Этот проект размещен на странице по ссылке bit.ly/AJeM, и, будучи проектом с открытым исходным кодом, легко доступен через Subversion с помощью единственной команды «svn checkout http://lolcode-dot-net.googlecode.com/svn/trunk/», введенной в окне командной строки на вашем локальном компьютере. После сборки вы можете приступать к исследованию этого восхитительного и мощного языка.

Все подробности по языку LOLCODE вы найдете на веб-сайте LOLCODE (lolcode.com). И, в частности, прочитайте на lolcode.com/specs/1.2 спецификацию языка LOLCODE, которая целиком соответствует стандартам ECPA (European Cat Programmers’ Association). LOLCODE.NET реализует большую часть (если не всю) LOLCODE 1.2, который является новейшим стандартом LOLCODE.

HAI

Конечно, первая программа, которую любой пишет на новом языке, обязательно должна быть соответствующей версией «Hello World», и наше погружение в LOLCODE ничем не будет отличаться от принятых стандартов:

HAI
  BTW Greet the people
  VISIBLE "Hello, world!"
KTHXBYE

Любая программа на LOLCODE начинается с традиционного приветствия «HAI» и заканчивается традиционным «KTHXBYE»2. Как и все ключевые слова в LOLCODE, эти тоже чувствительны к регистру букв и должны набираться целиком в верхнем регистре. «VISIBLE» — это, как можно догадаться, команда записи в стандартный поток вывода, а «BTW»3 — однострочный комментарий. (Многострочные комментарии открываются «OBTW»4 и заканчиваются «TLDR»5.)

Использование компилятора lolc, собранного из дерева исходного кода LOLCODE.NET, дает нам традиционную .NET-сборку, которой (в лучших традициях всех .NET-компиляторов) присваивается название файла исходного кода, поэтому, если предыдущий код хранился в hello.lol, то в hello.exe будет содержаться код на Intermediate Language (IL).

2 KTHXBYE — сокращение от «OK, Thanks, Bye» («все в порядке, спасибо, пока»). — Прим. ред.

3 BTW — сокращение от «By The Way» («кстати»). — Прим. ред.

4 OBTW — сокращение от «Oh, By The Way» («о, кстати»). — Прим. ред.

5 TLDR — сокращение от «too long, didn't read» («слишком длинно, не осилил»). — Прим. ред.

I HAS YARN

LOLCODE6 распознает только четыре типа в мире: строки (YARN), числа (NUMBR), булевы значения (TROOF) и массивы (BUKKIT), но, поскольку кошки никогда ничему не доверяют до самого последнего момента, объявление переменной в LOLCODE (с использованием синтаксиса «I HAS A») не типизируется, пока этой переменной не будет присвоено значение. Более того, так как кошки не несут ответственности за свои поступки, переменные в LOLCODE гибко типизируются, а значит, переменная может хранить любое значение, изменяя свой тип под новое значение:

6 LOLCODE — эзотерический язык программирования, созданный под влиянием интернет-мема о lolcat’ах. Интернет-мем — название или фраза, часто бессмысленная, спонтанно приобретшая популярность в интернет-среде посредством распространения в Интернете всеми возможными способами. Мемами могут считаться как слова, так и изображения. Lolcat (от LOL и cat) — смешная фотография кота или кошки, подписанная каким-либо текстом юмористического характера. Часто в подпись осознанно вносят грубые грамматические и орфографические ошибки. — Прим. ред.

I HAS A COOLVAR ITZ THREE
LOL COOLVAR R 3

В первой строке кода объявляется переменная COOLVAR, и ей присваивается строка (YARN) со значением «THREE». Во второй строке кода той же переменной присваивается значение 3 типа NUMBR. Любая неинициализированная переменная содержит null-значение «NOOB».

Как и в ключевых словах, имена переменных чувствительны к регистру букв и могут записываться буквами смешанных регистров, хотя идиоматический LOLCODE предлагает писать все с заглавных букв для большей четкости. Подобно C# имена переменных могут начинаться с буквы, но включать еще и числа и знаки подчеркивания.

Чтение из консоли осуществляется командой GIMMEH, поэтому вторая программа, которая приветствует пользователя, спрашивает его имя и выводит его на экран, выглядит так:

HAI
  I HAS A NAME ITZ "Ted"
  VISIBLE "d00d type in ur name"
  GIMMEH NAME
  VISIBLE "d00d ur name is " NAME
KTHXBYE

Хотя l33tspeak7 в консоли не является обязательной частью языка, она считается идиоматически правильной и хорошей формой.

Управление потоком

Конструкции if/then создаются размещением «O RLY?» после выражения, а затем следует YA RLY, определяющее ветвление, если условие истинно, NO WAI, определяющее ветвление, если условие ложно, и OIC8, указывающее конец конструкции if/then. Несколько выражений в одной строке могут отделяться запятыми, если это эстетически приемлемо. Если вам требуется более двух ветвлений (что в других, менее дружественных к кошкам языках называется else if), используйте блоки MEBBE, определяемые между блоками YA RLY и NO WAI. Операции сравнения полностью перечислены в спецификации LOLCODE 1.2, но, вероятно, наиболее часто используются операторы SAEM (равенство) и DIFFRINT (неравенство) — так же, как и в большинстве современных языков программирования. Для булевых операций «BOTH OF <x> AN <y>» дает нам логическое AND, «EITHER OF <x> [AN] <y>» — логическое OR и «WON OF <x> [AN] <y>» — логическое XOR.

7 Пояснения см. по ссылке http://www.urbandictionary.com/define.php?term=l33tspeak. — Прим. ред.

8 OIC — сокращение от «Oh, I See» («О, я вижу»). Подробнее об этом и других сокращениях см. по ссылке http://www.urbandictionary.com/define.php?term=oic. — Прим. ред.

Циклы обозначаются ключевым словом «IM IN YR <метка>», которое открывает цикл, а завершает цикл конструкция «IM OUTTA YR <метка>»; без завершающего условия в начале цикла, определяемого выражением TIL или WILE, цикл будет выполняться бесконечно, пока его не прервет выражение GTFO, которое возвращает управление немедленно после ключевого слова IM OUTTA YR.

Собирая все воедино, можно написать, например, такую программу:

HAI
  I HAS A NAME ITZ ""
  IM IN YR LOOP
    VISIBLE "Gimmeh ur name or 'gtfo' to GTFO"
    GIMMEH NAME
    SAEM NAME AN "gtfo", O RLY?
      YA RLY, VISIBLE "L8r!", GTFO
      NO WAI, VISIBLE "Yo " NAME
    OIC
  IM OUTTA YR LOOP
KTHXBYE

Обратите внимание на то, что цикл LOOP является бесконечным, не содержит условия завершения и использует GTFO в ветвлении YA RLY в выражении сравнения по условию «SAEM ... O RLY?», чтобы завершить программу в случае ввода «gtfo» пользователем.

HOW DUZ I...

Хороший стиль программирования требует разделения кода на легко используемые блоки, и LOLCODE не стал бы серьезным языком для бизнесменов без аналогичной возможности. С помощью пар ключевых слов «HOW DUZ I» и «IF U SAY SO», вы можете определять функции, вызываемые для выполнения каких-либо операций:

HAI
  HOW DUZ I GREET
    I HAS A NAME ITZ "Ted"
    VISIBLE "d00d type in ur name"
    GIMMEH NAME
    VISIBLE "d00d ur name is " NAME
  IF U SAY SO
  GREET
KTHXBYE

Это определение одной функции, GREET, которая потом используется основной программой для приветствия пользователя и вывода его имени в консоли. Параметры передаются функции парами «YR»-имя.

I CAN HAZ LIBRAY?

Конечно, настоящее преимущество LOLCODE кроется не в написании скучных и утомительных частей программы (настоящая кошка никогда не станет скучать и утомляться), а в улавливании Важной Бизнес-Логики и предоставлении ее через веб-сервис, Windows Presentation Foundation (WPF) GUI или что-то другое. По этой причине компилятор LOLCODE также поддерживает вездесущий параметр /target:library для генерации стандартной сборки .NET-библиотеки. Однако это все равно дает нам сборку с расширением .exe, с методом Main, присутствующим в программе, даже если Main ничего не делает. На самом деле это вполне согласуется с другими современными языками, которые предполагают, что начало файла является точкой входа в программу в целом; LOLCODE просто делает дополнительный шаг и всегда предоставляет Main, пусть даже и пустой.

Компилируя код как библиотеку или исполняемый файл, LOLCODE всегда обертывает сгенерированный код в класс Program. Функциональности пространств имен в нем нет — ни одна уважающая себя кошка никогда не воспримет больше одной клички.

Вскоре этот язык станет по-настоящему важным

Хотя LOLCODE — весьма мощный язык, увы, его распространенность пока не достигла той точки, когда преимущества выражения бизнес-логики на нем стала понятной бизнес-аналитикам и представителям заказчиков. К счастью, этот язык имеет открытый код, поэтому его легко расширять, и ожидается, что к 2014 году он станет промышленным стандартом в написании критически важных для бизнеса приложений. Для достижения лучших результатов архитекторам рекомендуется демонстрировать мощь LOLCODE на практических занятиях по кодированию, предпочтительно на встречах с высокопоставленными руководителями без заблаговременного предупреждения или предварительного уведомления. Удачи в кодировании!


Тэд Ньюард (Ted Neward) — выдумал все, кроме той части, которая относится к языку LOLCODE, — эта часть абсолютно правдива. Автор и соавтор многочисленных книг, в том числе «Professional F# 2.0» (Wrox, 2010), более сотни статей, часто выступает на многих конференциях по всему миру; кроме того, имеет звание Microsoft MVP в области F#. Ему настоятельно советовали не публиковать свои адреса, по которым с ним можно было бы связаться, чтобы избежать вала гневных писем от архитекторов, последовавших его последнему совету в этой статье, но давние читатели этой рубрики и так отлично знают, как с ним связаться.

Выражаю благодарность за рецензирование статьи экспертам Scooter, Shadow, Princess и Mr. Fluff Fluff из семьи Ньюардов.