Как стать автором
Обновить
7
0

трубкозуб

Отправить сообщение

Тернистый путь Hello World

Время на прочтение16 мин
Количество просмотров33K

Вдохновение на написание данной статьи было получено после прочтения похожей публикации для архитектуры x86 [1].


Данный материал поможет тем, кто хочет понять, как устроены программы изнутри, что происходит до входа в main и для чего всё это делается. Также я покажу как можно использовать некоторые особенности библиотеки glibc. И в конце, как и в оригинальной статье [1] будет визуально представлен пройденный путь. В большинстве своём статья представляет собой разбор библиотеки glibc.


Итак, начнём наш поход. Будем использовать Linux x86-64, а в качестве инструмента отладки — lldb. Также иногда будем дизассемблировать программу при помощи objdump.


Исходным текстом будет обычный Hello, world (hello.cpp):


#include <iostream>
int main()
{
        std::cout << "Hello, world!" << std::endl;
}
Читать дальше →
Всего голосов 76: ↑75 и ↓1+74
Комментарии4

Понимаем декораторы в Python'e, шаг за шагом. Шаг 2

Время на прочтение12 мин
Количество просмотров227K

И снова доброго времени суток всем читателям!
Спасибо, за проявленый интерес к первой части перевода, надеюсь, вторая вас так же не разочарует.


Итак, в первой части данной статьи мы совершили базовое знакомство с декораторами, принципами их работы и даже написали свой вручную.
Однако, все декораторы, которые мы до этого рассматривали не имели одного очень важного функционала — передачи аргументов декорируемой функции.
Что ж, исправим это недоразумение!
Читать дальше →
Всего голосов 73: ↑67 и ↓6+61
Комментарии25

Про техники оптимизации

Время на прочтение24 мин
Количество просмотров11K
Поучительная история о техниках оптимизации наглядно.

Техзадание

Объявим в рамках топика небольшой конкурс по архитектурно-ориентированной оптимизации программного обеспечения.
Вкратце, код состоит из пачки функций, производящих невнятные на первый взгляд манипуляции с исходными данными, и примочки-драйвера, который n раз запускает неоптимизированную версию, затем оптимизированную, сравнивает насчитанные циферки, и, в случае их совпадения, выдает отношение времени выполнения. Вот так:

Executing original code… done
Executing optimized code… done
Checking results… PASSED
Number of runs: 3
Original code average time: 11.954537 sec.
Optimized code average time: 1.052994 sec.
Speedup: 11.35

Разрешено использовать любые техники оптимизации, компилятор GCC с любыми опциями, и, скажем, сервер с двумя четырехъядерными процессорами Intel Xeon E5420 2.5 GHz.
Вот, кстати, код:
Читать дальше →
Всего голосов 108: ↑93 и ↓15+78
Комментарии66

Про компоновку, dependency hell и обратную совместимость

Время на прочтение11 мин
Количество просмотров22K
В данной статье речь пойдёт о высокоуровневом взгляде на компоновку. Где ищутся разделяемые библиотеки на Linux, BSD*, Mac OS X, Windows, от которых зависят приложения? Что делать с обратной совместимостью? Как бороться с адом зависимостей?

Читать дальше →
Всего голосов 50: ↑47 и ↓3+44
Комментарии19

Практическое применение LD_PRELOAD или замещение функций в Linux

Время на прочтение4 мин
Количество просмотров43K
Всем привет!
В 2010 году, shoumikhin написал замечательную статью Перенаправление функций в разделяемых ELF-библиотеках. Та статья очень грамотно написана, полная, но она описывает более харкордный способ замещения функций. В этой статье, мы будем использовать стандартную возможность динамического линкера — переменную окружения LD_PRELOAD, которая может загрузить вашу библиотеку до загрузки остальных.

Как это работает?

Да очень просто — линкер загружает вашу библиотеку с вашими «стандартными» функциями первой, а кто первый — того и тапки. А вы из своей библиотеки можете загрузить уже реальную, и «проксировать» вызовы, попутно делая что вам угодно.

Реальный Use-Case #1: Блокируем mimeinfo.cache в Opera


Мне очень нравится браузер Opera. А еще я использую KDE. Opera не очень уважает приоритеты приложений KDE, и, зачастую, так и норовит открыть скачанный ZIP-архив в mcomix, PDF в imgur-uploader, в общем, вы уловили суть. Однако, если ей запретить читать файл mimeinfo.cache, то она все будет открывать через «kioclient exec», а он-то уж лучше знает, в чем я хочу открыть тот или иной файл.

Чем может приложение открывать файл? На ум приходят две функции: fopen и open. В моем случае, opera использовала 64-битный аналог fopen — fopen64. Определить это можно, воспользовавшись утилитой ltrace, или просто посмотрев таблицу импорта утилитой objdump.
Читать дальше →
Всего голосов 75: ↑74 и ↓1+73
Комментарии14

Перенаправление функций в разделяемых ELF-библиотеках

Время на прочтение22 мин
Количество просмотров34K
Все мы пользуемся динамически-компонуемыми билиотеками. Их возможности поистине великолепны. Во-первых, такая библиотека загружается в физическое адресное пространство только один раз для всех процессов. Во-вторых, можно расширять функционал своей программы, подгружая дополнительную библиотеку, которая и будет этот функционал обеспечивать. И все это без перезапуска самой программы. А еще решается проблема обновлений. Для динамически компонуемой библиотеки можно определить стандартный интерфейс и влиять на функционал и качество своей основной программы, просто меняя версию библиотеки. Такие методы повторного использования кода даже получили название «архитектура plug-in’ов». Но топик не об этом.

Кстати, нетерпеливые могут все скачать и попробовать прямо сейчас.

Осторожно, много текста!
Всего голосов 81: ↑75 и ↓6+69
Комментарии30

Linux WiFi из командной строки с wpa_supplicant

Время на прочтение10 мин
Количество просмотров173K

В этой статье я расскажу, как можно настроить WiFi с помощью wpa_supplicant, без всяких Xorg/X11 утилит. Это необходимо для того, чтобы базовые службы ОС исправно работали с минимальным набором технических средств удаленного доступа. Программа будет исполняться как служба, настройки сделаны правкой конфиг файлов.


По-быстрому, установить соединение с открытой точкой доступа можно таким образом.


[root@home ~]$ wpa_cli
> add_network
> set_network 0 ssid "MYSSID"
> set_network 0 key_mgmt NONE
> enable_network 0

Если же надо всерьез и надолго, то прошу внутрь.

Читать дальше →
Всего голосов 24: ↑21 и ↓3+18
Комментарии29

Оптимизация кода: процессор

Время на прочтение18 мин
Количество просмотров114K
Все программы должны быть правильными, но некоторые программы должны быть быстрыми. Если программа обрабатывает видео-фреймы или сетевые пакеты в реальном времени, производительность является ключевым фактором. Недостаточно использовать эффективные алгоритмы и структуры данных. Нужно писать такой код, который компилятор легко оптимизирует и транслирует в быстрый исполняемый код.

image

В этой статье мы рассмотрим базовые техники оптимизации кода, которые могут увеличить производительность вашей программы во много раз. Мы также коснёмся устройства процессора. Понимание как работает процессор необходимо для написания эффективных программ.
Читать дальше →
Всего голосов 107: ↑102 и ↓5+97
Комментарии142

Visual Studio 2010: 4 полезнейших расширения

Время на прочтение3 мин
Количество просмотров15K
image

Буквально на днях для Visual Studio 2010 выпущено два набора официальных обновлений. Первый – Power Tools – нацелен на добавление множества мелких функциональных вещей увеличивающих продуктивность труда. Второй — Modeling Feature Pack добавляет к архитектурным инструментам Visual Studio массу полезных возможностей.

Кроме этих инструментов, в этой статье я расскажу еще о двух полезнейших расширений Visual Studio. Кстати, число расширений в онлайн-хранилище доступном из Extension Manager постоянно растет и уже приближается к 2000 штук.

Читать дальше →
Всего голосов 92: ↑74 и ↓18+56
Комментарии31

Лекции Технопарка. 1 семестр. С/С++

Время на прочтение6 мин
Количество просмотров110K
Мы продолжаем наши еженедельные публикации учебных материалов Технопарка. Предыдущие лекции были посвящены web-технологиям в целом, а также алгоритмам и структурам данных. В третьем блоке лекций рассказывается о языках С и С++.

Лекция 1. Язык С. Основы организации и использования оперативной и сверхоперативной памяти


Лекция начинается с введения в язык С: рассказывается об истории его появления, особенностях, преимуществах и недостатках, о сферах применения. Описываются основы препроцессорной обработки, рассматриваются вопросы управления памятью (модели управления памятью, области видимости объектов хранения) и производительность программ на языке С. Обсуждается связывание объектов хранения и их инициализация. Затем рассказывается о классах памяти в языке С. Следующая часть лекции посвящена проблематике указателей, а также работе с одномерными массивами. В заключение рассматривается стандарт POSIX и вопросы переносимости.


Читать дальше →
Всего голосов 72: ↑70 и ↓2+68
Комментарии83

Пишите код, который легко удалять, а не дополнять

Время на прочтение14 мин
Количество просмотров52K
image«Всякая строка кода рождается без причины, продолжается в слабости и удаляется случайно», — Жан-Поль Сартр программирует на ANSI C.

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

Чем больше у вашего API пользователей, тем больше кода приходится переписывать для введения новых изменений. Верно и обратное: чем больше вы полагаетесь на сторонний API, тем больше проблем испытываете когда он изменяется. Упорядочивание взаимодействия и взаимосвязей разных частей кода является серьезной проблемой в больших системах. И по мере развития проекта, растет и масштаб этой проблемы.

Перевод статьи на русский язык подготовлен компанией PayOnline, провайдером платежных решений для вашего онлайн-бизнеса.
Читать дальше →
Всего голосов 61: ↑48 и ↓13+35
Комментарии25

Доказательное планирование

Время на прочтение13 мин
Количество просмотров40K
Примечание переводчика: оригинальная статья была написана в 2007-м году, однако, на мой взгляд, полностью сохраняет актуальность и сегодня.

Разработчики программного обеспечения не любят составлять план работ. Обычно пытаются вовсе от него отказаться. «Закончу, когда закончу!», — говорят они, ожидая, что этот смелый и веселый поступок вызовет одобрение у босса, а о планировании будет успешно забыто.

Большая часть расписаний, с которыми вы встретитесь, будет представлять из себя бездушные отписки. Совершенно забытые, они хранятся в каком-нибудь общем каталоге. После выпуска продукта с опозданием на пару лет странный парень, в чьем офисе, говорят, видели картотеку, принесет на обсуждение причин провала старую распечатку, которую все засмеют. «Только гляньте! Мы запланировали две недели, на переписывание системы с нуля на Ruby!»
Читать дальше →
Всего голосов 59: ↑54 и ↓5+49
Комментарии24

Несколько недоразумений парного программирования

Время на прочтение3 мин
Количество просмотров3.8K
У меня достаточно много опыта в программировании, накопленного за последние несколько лет. Часть опыта я приобрёл работая в своей команде, что-то при работе с клиентам, а некоторый опыт появился благодаря coding dojo и работе на open source проектах.
Для программистов знающих как использовать парное программирование оно предоставляет возможность улучшить свою производительность. Но при этом не стоит ожидать, что программисты значительно улучшат свою производительность с самого начала работы. Парное программирование требует постоянного обучения, а также осознания самими программистами чёткой разницы между исполнителем (тот кто стучит по клавиатуре), и штурманом. Ниже приведено более детальное описание.
Читать дальше →
Всего голосов 22: ↑17 и ↓5+12
Комментарии3

Сравнение методик обзора кода

Время на прочтение7 мин
Количество просмотров25K
Думаю, многие разработки знакомы с понятием code review или обзор кода по-русски (также данный термин переводят как просмотр кода, инспектирование кода или рецензирование кода – далее, для единообразия, будет использоваться вариант «обзор кода»). Недавно я столкнулся с необходимостью «разложить по полочкам» и классифицировать знания по этой теме. Результат – данная статья. Надеюсь, она окажется полезной, а также поможет внедрить обзоры кода в свой производственный процесс тем, кто только об этом задумывается.
wtf per minute
Обзор кода является одним из наиболее эффективных методов поиска и устранения дефектов программы. Обзоры проводятся человеком, что позволяет находить широкий класс ошибок, в том числе с трудом детектируемых или вообще не детектируемых автоматическими средствами. Безусловно, обзор кода, не отменяет использование анализаторов кода или других методик обнаружения ошибок, например, unit-тестирования. К сожалению, не существует метода, который один обеспечил бы обнаружение всех дефектов программы (в исследованиях эффективность обзора кода обычно оценивается как 30-50% обнаруженных ошибок в приложении).
Читать дальше →
Всего голосов 18: ↑17 и ↓1+16
Комментарии18

Информация

В рейтинге
Не участвует
Откуда
Нижний Новгород, Нижегородская обл., Россия
Зарегистрирован
Активность