Прекрасный обзор литературы по ФП на русском и английском, включает также обзор книг по функциональным языкам программирования: Haskell, Lisp, ML, Prolog.
http://alexott.net/ru/fp/books/
вторник, 19 июня 2012 г.
четверг, 14 июня 2012 г.
Это просто праздник какой-то!
Подробный обзор исходного кода DOOM 3 с картинками и диаграммами
http://fabiensanglard.net/doom3/index.php
В качестве бонуса интервью Кармака.
PS: более ранняя статья того же автора с обзором кода Doom iPhone
http://fabiensanglard.net/doomIphone/index.php
В качестве бонуса интервью Кармака.
PS: более ранняя статья того же автора с обзором кода Doom iPhone
http://fabiensanglard.net/doomIphone/index.php
вторник, 5 июня 2012 г.
C++ библиотека базовых классов от Facebook
Компания Facebook открыла C++11 библиотеку Folly.
https://github.com/facebook/folly
Код библиотеки заточен под производительность и эффективное использование памяти, например: есть аналоги std::string и std::vector - fbstring и fbvector.
В авторах числится сам Андрей Александреску.
Код заточен под GCC и новый стандарт C++, есть подозрение, что под VS не соберётся.
- для строк меньше 23 символов размещаются на месте, не используя динамической памяти
- для строк от 24 до 255 символов, используется динамически выделяемая память. При копировании строк, копируется и внутреннее хранилище
- для всех остальных строк используется Copy-On-Write стратегия (потокобезопасность гарантируется)
- для выделения памяти используется malloc, allocator-ы не используются
- эффективный алгоритм поиск подстроки (Boyer-Moore algorithm)
- нулевой символ в конце строке дописывается только при вызове методов c_str() и data(). Этим поведением можно управлять макросами:
FBSTRING_PERVERSE
FBSTRING_CONSERVATIVE
В коде обильно используются assert-ы для проверки различных инвариантов.
Используется вспомогательный внутренний класс для проверки ненарушения методом инварианта класса.
Вспомогательная функция, для проверки входных параметров
Пример использования:
Код интересный и познавательный, содержит различные приёмы и трюки.
Вот пример:
https://github.com/facebook/folly
Folly (acronymed loosely after Facebook Open Source Library) is a
library of C++11 components designed with practicality and efficiency
in mind. It complements (as opposed to competing against) offerings
such as Boost and of course std
. In fact, we embark on defining our
own component only when something we need is either not available, or
does not meet the needed performance profile.
Код библиотеки заточен под производительность и эффективное использование памяти, например: есть аналоги std::string и std::vector - fbstring и fbvector.
В авторах числится сам Андрей Александреску.
Код заточен под GCC и новый стандарт C++, есть подозрение, что под VS не соберётся.
FBString
Собственная реализация строк. Особенности реализации:- для строк меньше 23 символов размещаются на месте, не используя динамической памяти
- для строк от 24 до 255 символов, используется динамически выделяемая память. При копировании строк, копируется и внутреннее хранилище
- для всех остальных строк используется Copy-On-Write стратегия (потокобезопасность гарантируется)
- для выделения памяти используется malloc, allocator-ы не используются
- эффективный алгоритм поиск подстроки (Boyer-Moore algorithm)
- нулевой символ в конце строке дописывается только при вызове методов c_str() и data(). Этим поведением можно управлять макросами:
FBSTRING_PERVERSE
FBSTRING_CONSERVATIVE
В коде обильно используются assert-ы для проверки различных инвариантов.
Используется вспомогательный внутренний класс для проверки ненарушения методом инварианта класса.
struct Invariant; friend struct Invariant; struct Invariant { #ifndef NDEBUG explicit Invariant(const basic_fbstring& s) : s_(s) { assert(s_.isSane()); } ~Invariant() { assert(s_.isSane()); } private: const basic_fbstring& s_; #else explicit Invariant(const basic_fbstring&) {} #endif Invariant& operator=(const Invariant&); };
Использование (в начале метода):
Invariant checker(*this); (void) checker;Таким образом инвариант будет проверен при входе и при выходе из метода.
Вспомогательная функция, для проверки входных параметров
static void enforce( bool condition, void (*throw_exc)(const char*), const char* msg) { if (!condition) throw_exc(msg); }
Пример использования:
void reserve(size_type res_arg = 0) { enforce(res_arg <= max_size(), std::__throw_length_error, ""); store_.reserve(res_arg); }
Код интересный и познавательный, содержит различные приёмы и трюки.
Вот пример:
// Layout is: Char* data_, size_t size_, size_t capacity_ /*static_*/assert(sizeof(*this) == sizeof(Char*) + 2 * sizeof(size_t)); /*static_*/assert(sizeof(Char*) == sizeof(size_t)); // sizeof(size_t) must be a power of 2 /*static_*/assert((sizeof(size_t) & (sizeof(size_t) - 1)) == 0); // If data is aligned, use fast word-wise copying. Otherwise, // use conservative memcpy. if (reinterpret_cast<size_t>(data) & (sizeof(size_t) - 1)) { fbstring_detail::pod_copy(data, data + size, small_); } else { // Copy one word (64 bits) at a time const size_t byteSize = size * sizeof(Char); if (byteSize > 2 * sizeof(size_t)) { // Copy three words ml_.capacity_ = reinterpret_cast<const size_t*>(data)[2]; copyTwo: ml_.size_ = reinterpret_cast<const size_t*>(data)[1]; copyOne: ml_.data_ = *reinterpret_cast<Char**>(const_cast<Char*>(data)); } else if (byteSize > sizeof(size_t)) { // Copy two words goto copyTwo; } else if (size > 0) { // Copy one word goto copyOne; } }
воскресенье, 3 июня 2012 г.
InteLib
InteLib - реализация EDSL лиспа на C++ (oh shi)
http://www.intelib.org/intro.html
http://www.intelib.org/intro.html
LSymbol ISOMORPHIC("ISOMORPHIC"); static LFunctionalSymbolDEFUN("DEFUN"); static LFunctionalSymbol COND("COND"); static LFunctionalSymbol ATOM("ATOM"); static LFunctionalSymbol AND("AND"); static LFunctionalSymbol CAR("CAR"); static LFunctionalSymbol CDR("CDR"); static LListConstructor L; void LispInit_isomorphic() { static LSymbol TREE1("TREE1"); static LSymbol TREE2("TREE2"); //////////////////////////////////////////////// // (L|DEFUN, ISOMORPHIC, (L|TREE1, TREE2), (L|COND, (L|(L|ATOM, TREE1), (L|ATOM, TREE2)), (L|(L|ATOM, TREE2), NIL), (L|T, (L|AND, (L|ISOMORPHIC, (L|CAR, TREE1), (L|CAR, TREE2)), (L|ISOMORPHIC, (L|CDR, TREE1), (L|CDR, TREE2)) )))).Evaluate(); // //////////////////////////////////////////////// } // end of file
Новый проект от Mozilla: Low Level JavaScript
LLJS - это низкоуровневый диалект JavaScript. Язык поддерживает простую типизацию, плоскою модель памяти, структуры. Вообщем, похоже на дитё C и JavaScript-а (ещё напоминает unsafe в C#).
Основная цель проекта - предоставить возможность писать на JavaScript-а эффективный код не страдающий от пауз GC. Код на LLJS преобразуется в обычный JS. Думаю, если реализовать поддержку непосредственно в движке JS (как планирует Google поступить с Dart), может получиться весьма занимательная в плане производительности штука.
Пример:
http://mbebenita.github.com/LLJS/
Основная цель проекта - предоставить возможность писать на JavaScript-а эффективный код не страдающий от пауз GC. Код на LLJS преобразуется в обычный JS. Думаю, если реализовать поддержку непосредственно в движке JS (как планирует Google поступить с Dart), может получиться весьма занимательная в плане производительности штука.
Пример:
extern timer; // Declare timer as an external variable. let x; // Declare 'x' as dyn. let int y; // Declare 'y' as int. y = (int)(x); // Assignment of 'x' to 'y' requires an explicit // cast. let int z = y + 1; // Although 'y' is of type int, the binary // expression y + 1 is of type num and // requires an implicit cast. let uint w = z; // Unsigned integer types are supported but // are discouraged because JavaScript engines // usually store numbers that are larger than // max signed int in doubles rather than 32-bit // ints. timer.begin("Empty For loop with signed integers."); for (let int i = 0; i < 50000000; ++i) { } timer.begin("Empty For loop with unsigned integers."); for (let uint i = 0; i < 50000000; ++i) { } timer.begin("Empty For loop with untyped integers."); for (let i = 0; i < 50000000; ++i) { }
http://mbebenita.github.com/LLJS/
вторник, 31 января 2012 г.
git добавление нового файла и коммит одной командой
Добавляем alias в .git/config или "C:\Program Files (x86)\Git\etc\gitconfig" для Windows.
Используем:
Подсмотренно здесь http://www.vogella.de/blog/2010/12/25/git-alias-add-commit/
[alias]
ac = !git add -A && git commit
Используем:
git ac -m "it's alive!!!"
Подсмотренно здесь http://www.vogella.de/blog/2010/12/25/git-alias-add-commit/
понедельник, 19 декабря 2011 г.
Simon Peyton-Jones: Closer to Nirvana
Интервью SPJ на channel 9: http://channel9.msdn.com/Blogs/Charles/YOW-2011-Simon-Peyton-Jones-Closer-to-Nirvana
на реддите: http://www.reddit.com/r/haskell/comments/nf4kg/simon_peytonjones_closer_to_nirvana/
на реддите: http://www.reddit.com/r/haskell/comments/nf4kg/simon_peytonjones_closer_to_nirvana/
Ярлыки:
functional programming,
haskell,
simon peyton-jones
Подписаться на:
Сообщения (Atom)