Ще один Brainfuck інтерпретатор

Brainfuck — мова програмування, створена з однією метою: написати для нього інтерпретатор. Їх було написано так багато, що навіть не буду давати на них посилання. У цій статті на пальцях пояснюється простий, але ефективний спосіб його оптимізації.
quine

Читати далі →

Читаємо tar за 26 рядків ANSI C коду

Архіватори — це страшно! Величезні і жахливі алгоритми, які звичайній людині ніколи в житті не зрозуміти! Rar, zip, gzip, tar — сучасні стандарти де-факто, а значить вкрай складні і наворочені штуки, які і намагатися зрозуміти не варто. Ну, tar виглядає простіше, може там все не так складно? Дивимося git з вихідними кодами. Бачимо десятки файлів, багато на десятки кілобайт. Мда. Мабуть, тупик.
__________________| |____________________________________________
,--. ,--. ,--. ,--.
|oo | _ \ `. | oo | | oo|
o o|~~ |(_) / ; | ~~ | | ~~|o o o o o o o o o o o
|/\/\| '._,' |/\/\| |/\/\|
__________________ ____________________________________________
| |dwb

насправді все не так складно. документації було описано, що tar — просто спосіб запису декількох файлів на стрічку. Тобто все має бути просто. За фактом — набір допоміжної інформації для кожного файлу і безпосередньо його вміст. Саме розуміння цього факту і дозволило зробити читач tar-файли в 26 рядків.
Читати далі →

Як створювати, збирати, встановлювати і використовувати пакети з програмами і бібліотеками для UNIX-подібних систем

Мова піде про програми та бібліотеки для UNIX-подібних систем, які розповсюджуються у вигляді вихідного коду (у тому числі у вигляді тарболлов), написаних зазвичай на C та C++ (хоча цей же порядок роботи може застосовуватися до софту на будь-якій мові). Багато речей у цій статті написані стосовно конкретно до GNU/Linux, хоча багато з статті може бути узагальнена і на інші UNIX-подібні ОС.

Під словом «пакет» я розумію в цій статті пакет з вихідними текстами, причому не пакет конкретного дистрибутиву GNU/Linux, а просто пакет, що виходить від оригінальних авторів софта.

У цій статті я розберу наступні питання:

  • От скачав програму або бібліотеку. Як її зібрати і встановити? Як скористатися бібліотекою?
  • Що таке префікс (prefix) установки? У чому різниця між складанням та встановленням? Куди зазвичай встановлюють програми?


Я розберу тільки зовсім базові речі. Ті, які типові учасники спільноти вільного ПЗ, що програмують на C та C++ під UNIX-подібні системи, зазвичай вже знають. Як створювати тарболлы (на прикладі «голого» make) і як встановлювати чужі тарболлы. Advanced поради щодо створення «хороших» пакетів я не дам. «Продвинуті» речі читайте в документації систем складання, у чудовій статті «Upstream guide» від Debian (в її кінці є ще купа посилань про створення «хороших» пакетів). Багато чого у цій статті можна було зробити по-іншому, моя мета: дати хоча б один спосіб, не намагатися осягнути неосяжне.

Читати далі →

Запропонуй проект для перевірки аналізатором PVS-Studio: тепер і на GitHub

<img src=«habrastorage.org/getpro/habr/post_images/5cf/ad1/812/5cfad18123abcb8f9b110600edc67133.png» alt=«Picture » 5" />
Перевірка проектів з допомогою статичного аналізатора і написання оглядових статей з знайденими в них помилками – завдання не з легких. Майже завжди це робота не однієї людини, а колективу. Велику роль в цьому процесі відіграє вибір проекту. Від нього безпосередньо залежить інтерес читачів до тієї чи іншої статті. У цій замітці я хочу розповісти, як можна запропонувати цікавий проект для аналізу через GitHub.

Читати далі →

Вбудований компактний веб-сервер Mongoose

У процесі розробки різних проектів на C/C++ часто виникає необхідність спілкуватися із зовнішніми системами або віддавати дані клієнтам по HTTP. Прикладом може служити будь-який веб-сервіс, а також будь-який пристрій з веб-інтерфейсом типу роутера, системи відеоспостереження, і т. д.

Що в такому випадку зазвичай роблять? Правильно, йдуть протоптаною доріжкою — Apache/nginx + PHP. А далі починається пекло, тому що:
1. Все це потрібно встановлювати і налаштовувати.
2. Все це жере пристойну кількість ресурсів.
3. З PHP якось треба отримувати дані від розроблюваної системи. Пощастить, якщо для цього достатньо просто залізти в СУБД.

Тож у мене, як думаю і багатьох інших розробників, є непереборне бажання впихнути всі ці функції безпосередньо в розроблювану систему. Це дасть незаперечні переваги:
1. Менше зовнішніх залежностей, а значить простіше встановлення та налаштування.
2. Теоретично менше споживання ресурсів.
3. Можна віддавати дані прямо з вашого продукту, без посередників.
Але при цьому ми не бажаємо морочитися всякими тонкощами обробки HTTP-з'єднань, парсинга і т. п.

Такі рішення є. І в цій статті я хотів би поверхнево познайомити вас з одним з них – вбудований сервер Mongoose (не плутати з MongoDB).


Читати далі →

Як працювати з JIT

enter image description here
У деяких внутрішніх системах для швидкого пошуку за великим бітовому масиву ми в Badoo використовуємо JIT. Це дуже цікава і не найвідоміша тема. І, щоб виправити таку прикру ситуацію, я перевів корисну статтю Елая Бендерски про те, що таке JIT і як його використовувати.
Читати далі →

Чому я не люблю синтетичні тести

Why I Dislike Synthetic Tests
Мені не подобається, коли хтось намагається використовувати створені вручну приклади коду для оцінки можливостей статичного аналізатора коду. Зараз на конкретному прикладі я покажу, чому негативно ставлюся до синтетичних тестів.

Не так давно Bill Torpey написав у своєму блозі замітку "Even Mo' Static", де розповів, як, на його погляд, показали себе інструменти Cppcheck і PVS-Studio при аналізі проекту itc-benchmarks. Проект itc-benchmarks — це static analysis benchmarks from Toyota ITC.

Мені не сподобалося, що після прочитання статті створюється враження, що аналізатори Cppcheck і PVS-Studio приблизно рівні у своїх можливостях. Зі статті випливає, що один аналізатор показує себе краще в одному, другий-в іншому, але в цілому їх діагностичні можливості схожі.

Я думаю, що це не так. Моя думка — наш аналізатор PVS-Studio в кілька разів могутніше, ніж Cppcheck. І взагалі, це не «думка», я знаю це!

Читати далі →