вторник, 12 января 2010 г.

D : Практика программирования на языке D

Немногие слышали о молодом языке программирования, притендующим на звание языка-мэйнстрима - D. Однако о нем все чаще и чаще начинают писать в интернете. Я тоже хочу сделать свой вклад в распространение данного языка.
О самом языке можно достаточно легко найти информацию в интернете, поэтому я только приведу неполный список его особенностей:
  • Наличие сборщика мусора, однако остается возможность ручного выделения памяти, или полного отключения сборщика мусора.
  • Легкий доступ к функциям на С. Также поддерживает все типы С.
  • Встроенный ассемблер.
  • С-style синтаксис.
  • Очень быстрая компиляция.
  • Поддержка стандартными дебаггерами.
  • Контрактное программирование, юнит-тестирование и другие техники программирования являются частью языка.
  • Отсутствие макросов и заголовочных файлов.
Это далеко не все, но я закончу и добавлю от себя: язык достаточно отличается как от С/С++, так и от Java/C#. Однако писать на нем приятно и легко. Он одновременно позволяет быстро писать программы и оставляет возможность для глубокой оптимизации. Единственное что мешает, так это 2 несовместимых версии языка, 2 стандартных библиотеки и малое число книг по языку: я знаю о Learn Tango with D и The D programming language, которую Александреску собирается выпустить в марте. Кстати он выложил в открытый доступ 4 главу из будущей книги.

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

Суть проекта - получение актуального расписания электричек между двумя станциями на заданную дату/время. Т.к. при последнем изменении расписания(из-за запуска так называемого "сапсана") tutu очень долго не хотел обновляться, то пришла в голову идея о своего рода агрегаторе расписаний. На данный момент программа может тянуть данные с tutu.ru и rasp.yandex.ru. Данные об источниках расписания берутся из xml файла, поэтому если вы найдете еще какие-либо места, и при этом в строке запроса не будет каких-либо хитрых параметров(а тут впринципе им неоткуда взяться), то можете просто поправить файлик с конфигом без перекомпиляции программы(ну и конечно оповестить меня, чтобы я добавил его в дефолтный конфиг). Собственно это не все, что входит в рамки данного проекта. Как минимум есть планы на написание средства для более быстрой отправки смс с полученным расписанием. Да, я ленивый:), собственно именно из-за лени и пришлось писать такой агрегатор.

Напимер, получим расписание на завтра из Крюково в Москву с 11 до 13 часов(берется диапазон, расширенный на 2 часа, по часу в каждую сторону).
[byku@phenya rrtt]$ ./rrtt --stfrom kru --stto mos --date 1
--timefrom 11 --timeto 13
Получение данных с tutu...
Обработка полученных данных...
Получение данных с yandex...
Обработка полученных данных...
Расписание на 13.01.2010. С 11:00 До 13:00.
tutu yandex
10:24-11:23|10:24-11:23
11:18-12:12|11:19-12:12
12:10-12:53|12:10-12:53
12:15-13:06|12:15-13:06
12:22-13:10|12:23-13:10
12:41-13:38|12:41-13:38
13:24-14:19|13:24-14:19
13:58-14:55|13:58-14:55
14:14-15:01|14:15-15:01
14:48-15:21|14:48-15:21
14:57-15:48|14:58-15:48

И так, чем может быть полезен код этого проекта? Он писался с использованием D1 и Tango(trunk-r5273). На данный момент в нем можно посмотреть такие вещи как:
  • Работу с xml.
  • HttpGet запросами (думаю в скором времени появятся и Post).
  • Конвертирование строк из cp-1251 в Utf-8.
  • Парсинг аргументов командной строки.
  • Работу с регулярными выражениями.
  • Работу с внешними программами.
  • Условная компиляция.
  • Ну и мелочевка типа: форматированный I/O, ассоциативные массивы, динамические массивы, slicing, локальное время...

Нестоит смотреть на данный код как на какое-либо руководство, и тем более считать его качественным. При его написании был сделан упор на раскрытие языка, поэтому в нем можно легко найти какие-либо неоптимизированные участки кода или вообще ошибки (пару я уже знаю).

Проект выложен на FireForge под лицензией GPLv3. Также хочу отдельно поблагодарить fireball'а за оперативность и индивидуальный подход к каждому проекту. Так держать!

ЗЫ: Код тестировался на 32-битных линуксах(Arch+Kubuntu) и частично на WindowsXP. На 64-битном арче не работает конвертирование cp-1251 -> Utf-8. Но думаю компилирование исходников на родной машине дело исправит. На данный момент сборка доступна только под linux32, но надеюсь, что в ближайшее время сделаю сборку для win32. Есть сборки под Linux32/64 (приоритетнее 32 битная версия, т.к. в 64 битной заметное увеличение времени конвертирования кодировок) и Windows (проверено только для XP).

Upd: Из-за обновления шаблона на tutu.ru получение расписания с этого источника невозможно. Нужно подкрутить регулярку, но времени пока нет. Зато есть в этом событии и положительные стороны - они наконец-то таки перешли на Utf8:) Так что и конвертирование кодировки можно тоже выкидывать)

Комментариев нет: