четверг, 16 апреля 2009 г.

Кстати, о языке Curl

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

В первый раз я услышал о языке Curl в 2001-м году. В белорусской компьютерной газетке “Компьютерные вести” промелькнула очень коротенькая заметочка:

Создатель Всемирной Паутины Тим Бернерс-Ли предложил использовать разработанный Дэвидом Кранцем язык Curl (выглядящий как смесь C, Tcl и Lisp) в качестве замены комбинации HTML, Java и JavaScript.

(чуть позже в этой же газете тема нашла свое продолжение – сейчас забавно читать тот прогноз)

Мне захотелось узнать, что же это за Curl такой. Как раз тогда я оказался в EPAm-е и, поэтому, не было проблем с поиском Curl-а в Интернете (нужно отметить, что в начале 2001-го более-менее нормальный доступ в Интернет в Гомеле имели далеко не все организации). Так я нашел небольшой отчетик об экспериментальном языке Curl, который был разработан в MIT. Что-то типа вот этого: Curl: A Gentle Slope Language for the Web. А уже потом – сайт curl.com, с которого загрузил и среду исполнения, и средства разработки Curl.

Не то, чтобы меня впечатлил сам язык. Хотя сама идея о том, чтобы сделать и использовать специально предназначенный язык для Web-приложений вместо жуткой смеси из Java, HTML и JavaScript (с чем я тогда столкнулся в EPAm-е) казалась мне очень здравой. Помнится, я сильно недоумевал, почему же эта идея не выстрелила (это теперь-то я знаю, что совершенство технологии к ее широкой востребованности имеет очень и очень посредственное отношение).

Удивили меня в языке несколько вещей. Во-первых, это был, наверное, первый язык, в котором я увидел встроенные типы данных для различных метрических величин. Например, можно было записать один метр как 1m. И это значение нельзя было присвоить переменной типа Time. Такие вещи были зашиты в язык:

{let a:Angle = 2deg} || 2 degrees
{let c:Distance = 1m} || 1 meter
{let d:Mass = 6g} || 6 grams
{let f:Time = 5s} || 5 seconds

А в документации по Curl была подколка в адрес разработчиков программного обеспечения марсианских спутников – мол, если бы они использовали Curl, одним кратером на Марсе было бы меньше:

Because Curl language quantities include the unit of measurement as part of the value, it is easy for you to work with values that have different units of measurement. For example, you can easily compare quantities such as four centimeters (4cm) and two inches (2in). The translation between measurements systems is transparent. Had a certain government agency used the Curl language, there would probably be one less crater on Mars...

Еще меня впечатлило, что язык разметки и язык программирования были очень хорошо выражены в едином синтаксисе. Более того, оба эти языка были настолько хорошо увязаны друг с другом, и сама концепция Curl была настолько ориентированной на это дело, что разработчик получал возможность определять собственные теги разметки, которые были обычными конструкциями языка. Например, если нужно было объявлять параграф, в котором текст был бы написан красным цветом, можно было либо использовать стандартный тег {paragraph} и параметр color:

{paragraph
  color="red",
  This is a text }

или же определить свой собственный тег {red-font-paragraph} (который бы использовал {paragraph} и color внутри себя):

{define-text-format red-font-paragraph as paragraph with
  color="red"}
{red-font-paragraph This is a text }

Все это было насколько просто и элегантно по сравнению с JSP/JavaScript (с которыми тогда бодались мои коллеги), что это впечатляло. Хотя ничего нового в этом не было – в Lisp-е и TeX-е такие приемы уже давно были повседневностью.

Еще очень меня поразила такая возможность Curl-а, как передача фрагмента кода как параметра в функцию. Помнится, там был какой-то специальный синтаксис для такого рода аргументов. И на этом деле в документации к Curl-у был построен прикольный фокус. Сама документация в среде разработки Curl-а (если не ошибаюсь, называлась она Surge Lab) была выполнена в виде обычных Curl-документов. И местами в этих документах встречались небольшие окошки. Внутри окошек располагался фрагмент программы-примера и кнопочка “Исполнить”. Нажимаешь на кнопочку – пример выполняется и ты видишь его результат:

А когда заглядываешь в исходник документации – видишь там вызов какого-то тега, скажем, {example}, с тем самым кодом примера внутри. Все было просто – в тег {example} код передавался как параметр.

В 2001-м году Curl был во младенческом возрасте. Тогда как раз только образовалась компания Curl Corp. (президентом которой, если мне не изменяет мой склероз, был тот самый Тим Бернерс-Ли). И было понятно, что в ближайшее время Curl не станет заметным игроком. Но я надеялся, что заложенная в него замечательная идея быстро обеспечит ему успех. Однако, все оказалось не так просто. Curl Corp. был продан и в конце-концов им завладели японцы. Которые, надо полагать, хорошо поняли, что на просторах Интернета Curl-у ловить нечего, зато есть неплохие шансы в Интранет-проектах. Судя по тому, что сейчас пишут на сайте Curl-а, разработка внутрикорпоративных информационных систем является основной нишей Curl-а. И, похоже, Curl там постепенно получает признание. Что лично меня радует, т.к. неприятно видеть, как хорошие технические идеи погибают под давлением различных исторических и политических факторов.

В истории с Curl-ом есть и вторая линия романа. В процессе знакомства с языком я больше всего впечатлился тому простому факту, что на самом языке можно было очень удобно и просто описывать данные для программы. Например, тогда мне приходилось делать на XML описания Web-приложения. Т.е. приложение на Java, а конфигурация для его развертывания пишется на XML. Читабельность которого гораздо ниже плинтуса. Вообще, маразм по запихиванию XML везде и всюду заслуживает отдельного разговора… Но вернемся к Curl-у. На нем тоже самое описание выглядело, как мне казалось, на пару порядков проще и компактнее, чем на XML. О чем я и написал (в приступе восторга от собственного открытия) профессору Стиву Уорду (Steve Ward), курировавшему эксперимент с Curl-ом в MIT. И он даже мне ответил: мол да, описание на Curl выглядит симпатичнее XML.

Вот тогда я и попал на крючок Curl-овского синтаксиса. Настолько, что сделал свою маленькую библиотечку для работы с конфигурационными файлами в синтаксисе Curl-а (под названием Cls – Curl Like Syntax). Ее первую версию я написал на C++ в 2001-м. С тех пор практически во всех моих C++ных программах конфиги оформляются в Curl-синтаксисе. Да и не только в C++ных, т.к. я портировал ее и под Ruby – ClsRuby.

Вот, например, в SObjectizer можно отсылать сообщения глобальных (и не только) агентов через SOP протокол в приложение через коммуникационный канал с помощью специальной утилиты so_send_stdin. Эта утилита воспринимает данные в Cls-формате:

{send-msg
 {agent aag_3::smpp_smsc::bserver.trx::a_channel }
 {msg msg_imit_deliver }
 {field m_count {uint-stream 1 } }
 {field m_sequence_number {uint-stream 12 } }
 {field m_data
  {byte-stream 0x06 0x00 0x04 0x80 0x81 0x82 0x83 0x03 0x04 0x05 } }
 {field m_source_addr {string-stream "7926XXXXXXX" } }
 {field m_dest_addr {string-stream "YYYYYY" } }
 {field m_esm_class {uint-stream 0x40 } }
}

send
exit

Что интересно. Как программисты, так и не программисты, осваивают Cls-формат очень быстро и без проблем. Либо же я просто не замечаю их жалоб ;)

В общем, для меня Curl стал отличным языком для конфигурационных файлов. Гораздо более удобным и практичным, чем XML, YAML или JSON. Вот какая вот история.

PS. Да, я уже знаю про десятое правило Гринспуна об половинчатой и глючной реализации Lisp-а в любой нетривиальной C/C++ программе. Я думаю, что ко мне и Cls оно не имеет отношения. Хотя, говорят, оно распространяется даже на тех, кто в него не верит :)

1 комментарий:

Анонимный комментирует...

я в лиспоподобной семантике описываю схему бд - практически один в один. Для этого пришлось написать свою маленькую реализацию лиспа на пхп (Гринспун, прости..)