понедельник, 10 января 2011 г.

улучшение compile-mode в emacs

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

Для меня таким инструментом, стал emacs. И операцией, которую мне всегда хотелось улучшить - была компиляция. Связка: "сохранить текст + скомпилировать/собрать и запустить тесты" выполняется мною в день очень часто и оптимизировать ее очень хотелось.

Чего хочется добиться:


  • автоматически сохранять все буфера перед началом компиляции: это избавит нас от надоедливых вопросах о необходимости сохранить измененные буфера
  • в некоторых каталогах проектов над которыми я работаю используются makefile из каталогов верхнего уровня: хочется, что бы при компиляции автоматически происходил поиск нежного файла - это избавит от необходимости переключаться на другой буфер перед компиляцией
  • хочется что бы после успешного завершения компиляции/тестирования окно compile автоматически закрывалось, а при ошибках оставалось бы для  дальнейших разбирательств
  • компиляцию и тестирование запускать различными комбинациями клавиш
Вооружившись следующими ссылками:

получилось следующее решение, удовлетворяющее вышеозначенным требованиям:

(defun upward-find-file (filename &optional startdir)
  "Move up directories until we find a certain filename. If we
  manage to find it, return the containing directory. Else if we
  get to the toplevel directory and still can't find it, return
  nil. Start at startdir or . if startdir not given"

  (let ((dirname (expand-file-name
 (if startdir startdir ".")))
(found nil) ; found is set as a flag to leave loop if we find it
(top nil))  ; top is set when we get
   ; to / so that we only check it once

    ; While we've neither been at the top last time nor have we found
    ; the file.
    (while (not (or found top))
      ; If we're at / set top flag.
      (if (string= (expand-file-name dirname) "/")
 (setq top t))
      
      ; Check for the file
      (if (file-exists-p (expand-file-name filename dirname))
 (setq found t)
; If not, move up a directory
(setq dirname (expand-file-name ".." dirname))))
    ; return statement
    (if found dirname nil)))


;; Helper for compilation. Close the compilation window if
;; there was no error at all.
(setq compilation-finish-functions 'compile-autoclose)
(defun compile-autoclose (buffer string)
  (cond ((and 
          (string-match "finished" string) 
          (not (string-match "*grep*" (buffer-name (get-buffer buffer)))))
         (bury-buffer "*compilation*")
         (winner-undo)
         (message "Build successful."))
        (t                                                                    
         (message "Compilation exited abnormally: %s" string))))

;;функция сохраняет содержимое всех буферов
;;и затем вызывает make из католога где находится текущий файл
(defun my-compile-file ()
  "Save all files and compile"
    (interactive)
    (save-some-buffers 1)
    (let ((default-directory (or (upward-find-file "Makefile") ".")))
      (compile (format "cd %s && make -k -j8" default-directory))
      )
  )

;; support for compile tests
(defun my-compile-tests-file ()
  "Save all files and compile"
    (interactive)
    (save-some-buffers 1)
    (let ((default-directory (or (upward-find-file "Makefile") ".")))
      (compile (format "cd %s && make -k -j8 check" default-directory))
      )
  )
;;устанавливаем нашу функцию
(global-set-key  [f7] 'my-compile-file)
(global-set-key  [(shift f7)] 'my-compile-tests-file)

Из недостатков:
если во время компиляции/тестирования переключать окна, то после успешного завершения процесса состояние окон может вернуться в другое состояние, что было перед началом процесса. В идеале было бы конечно создавать новое окно для компиляции, но тут надо разбираться дальше.

вторник, 28 декабря 2010 г.

моя конфигурация emacs

Опубликовал свою текущую конфигурацию emacs:

https://github.com/ai81/emacs-configuration.

Она представляет собой клон конфигурации

http://eschulte.github.com/emacs-starter-kit/

которая в свою очередь является переработкой в стиле литературного программирования конфигурации

http://github.com/technomancy/emacs-starter-kit/.

Я несколько переработал  оригинал убрав найденные конфликты, добавив свои настройки (например для erlnag) и значительно расширив поддержку C++/C -  в частности интегрирован cedet. Так же много добавлено для git.

Тестировалась на паре linux - на win требует доработки (если будет время, то сделаю). Может кому пригодится.

воскресенье, 28 ноября 2010 г.

Обзор книги "Объектно-ориентированное конструирование программных систем"

Итак это свершилось. Рубеж пройден. Самая лучшая книга по ОО-программированию изучена от корки до корки. Книга старая - автор (Бертран Мейер) писал ее в середине 90-х, а перевели ее на русский поти через 10 лет - в 2005.

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

Освещены все важные темы: АТД, типизация, наследование, исключения, универсализация (шаблоны в С++), управление памятью. Особенное место занимает Проектирование по Контракту -книга считается фундаментальным трудом на эту тему.

Часто когда я читал проскакивала мысль - как же без это штуки я живу в контексте С++?! это просто не возможно! И почему язык Eiffel (который создал Мейер и на котором написано большинство примеров из книги) так и не стал по настоящему популярным? Может быть у него были неудачные реализации? Может быть его синтаксис, напоминающий pascal, является громоздким? Может быть он закрыт? Или может просто он появился не в свое время и эта ниша была уже намертво занята такими монстрами как C++ и Java (которых поддерживали огромные корпорации). Вообще мир не справедлив.

В общем эту книгу поздно я прочитал - надо было в 2005, у лучше в 90-x на английском...

Из недостатков: книга огромная, тяжело постоянно таскать с собой, что бы читать в транспорте; библиография зачем то вынесена на диск - очень не удобно.

p.s.
Поставил среду Eiffel Studio- неплохая IDE, хотя не emacs конечно, и даже под linux x64 отлично работает. Эх, что же помешало этому языку по настоящему зажечь? Вроде же автор делал все правильно...

среда, 20 октября 2010 г.

сравнение clang и g++

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


из плюсов:
- нашел несколько ошибок, пропущенных gcc
- намного приятнее сообщения об ошибках - особенно для шаблонов

минусы:
- упал пару раз. стабильно падает при сборке одного теста (с участием boost::test)
- при линковке ошибся связав деструкторы разных классов с одинаковым именем - в итоге runtime падения
- обещанного повышения скорости компиляции нет :(
для debug сборки (-g2 -O0):

gcc 4.4.4:
real    3m38.647s
user    13m12.810s
sys     0m53.407s

clang:
real    3m42.877s
user    14m3.109s
sys     0m58.220s

качество оптимизации не проверял.
p.s.
а вот и тесты сравнения производительности:
http://www.phoronix.com/scan.php?page=article&item=llvm_gcc_dragonegg28&num=1

воскресенье, 17 октября 2010 г.

Впечатления о книге C++ Template Metaprogramming

После ознакомления с Beyond the C++ Standart Library сразу начал читать C++ Template Metaprogramming. Что хочу сказать: эта книга must read для любого уважающего себя программиста на С++ (жаль что мне она попалась так поздно).

Теперь подробности. В отличии от Beyond the C++ Standart Library книга написана намного более интересным и сложным английским языком. Это естественно можно рассматривать как плюс или минус в зависимости от уровня знания языка :).

Книга описывает метапрограммирование начиная с самых основ (что такое шаблонный метод, шаблонная функция и т.п.) и заканчивая созданием своего собственного DESL  по поддержки state machine в коде C++.

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

Есть очень полезное приложение о программирование препроцессора - есть надежда что большая часть этой черной магии будет не нужна при появлении C++0x.

Метапрограммирование является альфой и омегой библиотеки boost, а mpl - его основной библиотекой, на которой построены многие другие. Может быть mpl и не понадобится сразу в каждодневном программировании (мой случай), но знать как это все устроено и при необходимости уметь применять - просто необходимо, я считаю.

суббота, 28 августа 2010 г.

Beyond the C++ Standart Library

Почитав в очередной раз своего любимого Алекса Отта очень захотелось изучить две книги по С++, которые он рекомендует. Так как наверное всю хорошую литературу по С++ я уже успел почитать, то книги на английском по такой фундаментальной штуке как boost не могут не интересовать. Порывшись немного в интернете так и не смог найти русские варианты этих книг. зато нашел на озоне их английские оригиналы - каждый за вполне кругленькую сумму. Хм, подумалось мне, неужели меня задушит жаба и я их не прочитаю.. Но тут вспомнилось, что в нашей замечательной фирме есть библиотека! И даже эту библиотеку можно пополнять! Написав письмо с аргументами в пользу приобретения данных творений я, к моему большому восторгу, получил одобрение на их покупку. Ждать этих книг от озона пришлось с месяц, но это время было потрачено с толком: в изучении фундаментального труда Меера (и даже оболочки по Eiffel) - об этом я напишу позднее.

Итак наконец книги пришли, и я принялся за изучение первой из них: Beyond the C++ Standart Library An Introduction to Boost. Первое впечатление: простовато, и почти все мне известно. Обзор библиотек boost не добавил ничего нового - это все можно получить из электронной документации. Ладно, почитаем про те 12 библиотек, которые описаны подробно (smart pointers, conversion, utility, operators, regex, any, variant, tuple, bind, lambda, function, signals).

Со всеми этими библиотеками я был знаком и использовал в своих проектах с разной степенью интенсивность (разве что кроме signals). Так что общий смысл и описания в каждой главе не представляли большого откровения. НО вот некоторые малозначительные детали, о которых никогда не задумываешься, если не припрет жизнь, не давали заскучать и извлечение крупиц этих новых знаний стало для меня настоящим приключением при перелистывании этой книги. Вот примерный список того, что нового я извлек для себя:

  1. Использование shared_ptr для блокировки создания объектов,не хоронящихся в самом shared_ptr - получается очень элегантно - и клиенты класса уже не могут создавать объекты на стеке, по недоразумению, например.
  2. Использование shared_ptr вместе с fclose в качестве деструктора - вот это красиво!
  3. Использование polymorphic_cast - все-таки не хочется проверять на 0 результат dynamic_cast
  4. polymorphic_downcast - оптимизация.. вот это кажется сомнительным
  5. оказывается к unsigned типу можно присвоить любой numeric тип. и не знал, что они являются особым случаем
  6. никогда не встречался и не задумывался над проблемой, которую решает checked_delete - век живи - век учись!
  7. Шаманство с перегрузкой/специализацией функций (классов) и борьба с проблемами с помощью enable_if. Наверное я слишком мало занимался шаблонным програмированием... Ну ничего! Все впереди!
  8. Оказывается отправление названия наследуемого класса в шаблон базового - это есть трюк Бартона-Некмана (Barton-Nackman). Во как.
  9. Разница между Equality и Equivalence. Вроде знаешь, а освежить никогда не лишне.
  10. использование sregex_iterator/sregex_token_iterator для работы с набором значений в строке - это кажется довольно удобным - обязательно надо будет попробовать на практике.
  11. Вывод значений из any с помощью кастомного класса any_out - очень красивый пример связи полиморфизма и шаблонных классов.
  12. Вообще к tuple у меня было несколько предвзятое отношение, так как в одном из наших проектов он использовался в одном месте кривым образом и постоянные обращения через get<3> и т.п. вызывали настоящий ужас. но тут почитав про них я узнал много нового, что даже заставило, в некотором роде, зауважать эту библиотеку: оказывается у них имеется развитая поддержка вывода в поток, большие возможности метапрограммирования и даже аналоги cdr и car из lisp. в общем с этой библиотекой можно неплохо поразвлечься при желании - так что надо найти время и переписать тот ужасный кусок в нашем проекте.
  13. Оказывается в bind можно привязываться к переменным класса. хм - и даже у меня в проекте я наткнулся на такой код. в каком же состоянии я его писал?!
  14. Вложенные bind - тут автор явно перебрал. Код ооочень быстро становится не читаемым. Только не так! Для production такие вещи не нужны.
  15. Использование labmda у меня ограничивалось только небольшими кусками. Те монстры, которые приведены в книге не внушают доверия - кажется часто проще написать функтор. Да к тому же в недрах spirit зародилась библиотека которая вроде как сделала lambda устаревшей. Но все таки окунуться в этот оазис функционального программирования в С++ очень приятно (иногда).
  16. использование function вместе с указателями на функции класса - это для меня что-то новенькое. хотя не думаю, что это используется хоть сколь-нибудь часто.
  17. описание примерной реализации function было довольно интересно

У книжки конечно есть недостатки: зачастую слишком тривиальным вещам уделяется много внимания, примеры часто довольно примитивны, не затрагиваются многие проблемы библиотек - например нет ничего про проблемы в variant при возникновении исключений во время присвоения или про signals в многопоточной среде (signals2 ау!). И конечно описывается уже несколько устаревшая версия, хотя это почти не коснулось описываемых библиотек. Но в итоге книга произвела на меня положительное впечатление: по телу раливается приятное тепло когда вычитываешь из книги что-тоновое и интересное.

вторник, 13 июля 2010 г.

Когда руководителя весь день нет

Недавно мой руководитель по работе ушел в отпуск. И вот что я заметил (уже не в первый раз) - мой КПД на работе резко пошел вверх - уж на 30-40% точно. Думаю это не связанно напрямую с личностью руководителя - человек он хороший и не устраивает постоянный прессинг, который бы совсем выбивал бы из колеи (впорчем тогда бы врят ли я смог бы так работать), но с другой стороны опредленно эффект от отсутствия/присутствия начальника на рабочем месте удивительный (для меня во всяком случае).

У нас офис в стиле open-space и как результат всех всегда видно - думаю это одна из не маловажных причин давления. Вообще будь тут компактные комнаты с небольшими коллективами все было бы намного проще и лучше. Но не судьба.

Вот сижу и думаю неужели и я так же влияю на свою команду? Уйду-ка я тут в отпуск на пару дней - погода отличная, а дел у нас тут выше крыши - глядит и поможет ускорить процесс.