Обновить
256K+

C++ *

Типизированный язык программирования

350,09
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Newtoo — разработка полноценного браузерного движка с нуля в 2018?

Время на прочтение4 мин
Охват и читатели52K
image

Привет! Меня зовут Дмитрий Козичев.

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

Мой движок называется Newtoo.

Что за Newtoo


Итак, Newtoo. Зачем я его создал?

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

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

Идеология Newtoo — показать страницу быстрее, чем остальные.

Как Newtoo работает быстрее


Как я говорил ранее, основные браузерные движки развиваются не первый год. Те ошибки, которые были допущены на начальных стадиях разработки остаются в проекте до конца. Самый яркий пример этому — умные указатели в C++ — это еще более сложный синтаксис, большой оверхед при работе, создании и удалении умных указателей. Кроме того, есть очень много типов умных указателей и нужно знать, какой когда использовать, ведь у каждого есть свои сюрпризы ньюансы. Посмотрите на этот файл из WebKit. Когда видишь такой код, синтаксис умных указателей, пытаешься успокоится и дышать ровно, но такого рода код — это весь вебкит с ног до головы. В моем движке нет таких недостатков.
Читать дальше →

Вычисляем «магические квадраты» с помощью GPU

Время на прочтение16 мин
Охват и читатели32K
Привет, habr.

Тема «магических квадратов» достаточно интересна, т.к. с одной стороны, они известны еще с древности, с другой стороны, вычисление «магического квадрата» даже сегодня представляет собой весьма непростую вычислительную задачу. Напомним, чтобы построить «магический квадрат» NxN, нужно вписать числа 1..N*N так, чтобы сумма его горизонталей, вертикалей и диагоналей была равна одному и тому же числу. Если просто перебрать число всех вариантов расстановки цифр для квадрата 4х4, то получим 16! = 20 922 789 888 000 вариантов.

Подумаем, как это можно сделать более эффективно.


Читать дальше →

Почему компилятор превратил мой цикл с условием в бесконечный?

Время на прочтение4 мин
Охват и читатели22K
Один из пользователей компилятора Visual C++ привёл следующий пример кода и спросил, почему его цикл с условием выполняется бесконечно, хотя в какой-то момент условие должно перестать выполняться и цикл должен закончиться:

#include <windows.h>

int x = 0, y = 1;
int* ptr;

DWORD CALLBACK ThreadProc(void*)
{
  Sleep(1000);
  ptr = &y;
  return 0;
}

int main(int, char**)
{
 ptr = &x; // starts out pointing to x

 DWORD id;
 HANDLE hThread = CreateThread(nullptr, 0, ThreadProc, 0, &id);

 // Ждём, пока другой поток изменит значение по указателю ptr
 // на некоторое ненулевое число
 while (*ptr == 0) { }

 return 0;
}
Читать дальше →

C++11 и обработка событий

Время на прочтение50 мин
Охват и читатели64K
Думаю, обработка событий как способ взаимодействия объектов в ООП, известен почти каждому, кто вообще хоть раз касался ООП. По крайнее мере, такой подход весьма удобен в весьма широком, на мой взгляд, спектре задач. Во многих языках программирования механизм обработки событий является встроенным; однако в C++ такого механизма нет. Давайте посмотрим, что можно с этим сделать.
Читать дальше →

Работа с API КОМПАС-3D → Урок 12 → Составные строки

Время на прочтение4 мин
Охват и читатели3.6K
На предыдущем уроке мы рассмотрели отображение простых строк. На этом поговорим о формировании составных строк, включающих в себя отклонения и дроби. Формировать такие строки мы будем с помощью метода ksText, который изучили ранее. Строго говоря, данный метод не предназначен для вывода сложных строк. Тем не менее на сегодняшнем уроке мы познакомимся с рядом флагов, которые играют ключевую роль при формировании составных строк.



Читать дальше →

Распределённые приложения на C++ с минимумом усилий

Время на прочтение8 мин
Охват и читатели8.3K

Цель моего поста — рассказать о C++ API распределенной базы данных Apache Ignite, который называется Ignite C++, а также о его особенностях.


О самом Apache Ignite на хабре писали уже не раз, так что наверняка некоторые из вас уже примерно представляют, что это такое и зачем нужно.


Кратко об Apache Ignite для тех, кто пока с ним не знаком


Не буду вдаваться в подробности о том, как появился Apache Ignite и чем отличается от классических баз данных. Все эти вопросы уже поднимались тут, тут или тут.


Итак, Apache Ignite — это по сути быстрая распределённая база данных, оптимизированная для работы с оперативной памятью. Сам Ignite вырос из дата грида (In-memory Data Grid) и до недавнего времени позиционировался как очень быстрый, находящийся полностью в оперативной памяти распределённый кэш на основе распределенной хэш-таблицы. Вот почему, кроме хранения данных, в нем есть множество удобных фич для их быстрой распределенной обработки: Map-Reduce, атомарные операции с данными, полноценные ACID транзакции, SQL запросы по данным, так называемые Continues Queries, дающие возможность следить за изменением определённых данных и другие.


Однако недавно в платформе появилась поддержка постоянного хранилища данных на диске. После чего Apache Ignite получил все преимущества полноценной объектно ориентированной базы данных, сохранив при этом удобство, богатство инструментария, гибкость и быстроту дата грида.

Читать дальше →

Готовимся к С++20. Coroutines TS на реальном примере

Время на прочтение9 мин
Охват и читатели35K
В C++20 вот-вот появится возможность работать с корутинами из коробки. Нам в Яндекс.Такси эта тема близка и интересна (под собственные нужды мы разрабатываем асинхронный фреймворк). Поэтому сегодня мы на реальном примере покажем читателям Хабра, как можно работать с C++ stackless корутинами.

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


void FuncToDealWith() {
    InCurrentThread();

    writerQueue.PushTask([=]() {
        InWriterThread1();

        const auto finally = [=]() {
            InWriterThread2();
            ShutdownAll();
        };

        if (NeedNetwork()) {
            networkQueue.PushTask([=](){
                auto v = InNetworkThread();
                if (v) {
                    UIQueue.PushTask([=](){
                        InUIThread();
                        writerQueue.PushTask(finally);
                    });
                } else {
                    writerQueue.PushTask(finally);
                }
            });
        } else {
            finally();
        }
    });
}

Читать дальше →

Асинхронная бизнес-логика в наши дни

Время на прочтение19 мин
Охват и читатели16K

Вкратце:


  • Пруф уже реализован на C++, JS и PHP, подходит для Java.
  • Быстрее чем coroutine и Promise, больше фич.
  • Не требует выделения отдельного программного стека.
  • Дружит со всеми средствами безопасности и отладки.
  • Работает на любой архитектуре и не требует особых флагов компилятора.

Читать дальше →

Модернизация IDA Pro. Исправляем косяки процессорных модулей

Время на прочтение10 мин
Охват и читатели6.2K


Привет всем,


Спустя довольно-таки продолжительное время с момента написания первой статьи я всё-таки решил, пусть и по чуть-чуть, но писать статьи на тему модификации/улучшения IDA Pro.


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

Читать дальше →

Легко ли добавлять новые фичи в старый фреймворк? Муки выбора на примере развития SObjectizer-а

Время на прочтение16 мин
Охват и читатели1.9K


Разработка бесплатного фреймворка для нужд разработчиков — это специфическая тема. Если при этом фреймворк живет и развивается довольно долго, то специфики прибавляется. Сегодня я попробую показать это на примере попытки расширить функциональность «акторного» фреймворка для C++ под названием SObjectizer.

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

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

И вот нам, как разработчикам фреймворка, приходится делать выбор в пользу одного или другого решения. Или же нужно признать, что ни одно из них удовлетворительным не является и, поэтому, нужно придумывать что-то другое. Такие решения за время истории SObjectizer-а приходилось принимать неоднократно. Если кому-то интересно почувствовать себя в шкуре разработчика подобного фреймворка, то милости прошу под кат.
Читать дальше →

Открытый вебинар «Cтранно рекурсивный шаблон»

Время на прочтение1 мин
Охват и читатели2.8K
Всем привет!

Дима Шебордаев — основатель нашего курса «Разработчик C++», провёл открытый урок о работе с техникой перевёрнутого наследования. На вебинаре разбирали статический полиморфизм, CRTP и многое другое в рамках сохранения производительности в данном методе.



Как всегда ждём вопросы и комментарии тут или их можно задать напрямую Диме, зайдя на день открытых дверей.

Короткая заметочка про PVS Studio в CI (и чего не хватает)

Время на прочтение9 мин
Охват и читатели3.2K

Я думаю, нет смысла в очередной раз рекламировать замечательный инструмент для статического анализа — PVS Studio. На хабре уже немало статей ей посвящённых, но я хочу коснуться ещё одного аспекта — использование данного инструмента в системе непрерывной интеграции.

Читать дальше →

В очередной раз анализатор PVS-Studio оказался внимательнее человека

Время на прочтение2 мин
Охват и читатели24K
Возьми баг

Изучая предупреждения анализатора PVS-Studio в процессе проверки различных открытых проектов, мы вновь и вновь убеждаемся, сколь полезен может быть этот инструмент. Анализатор кода невероятно внимателен и никогда не устаёт. Он указывает на ошибки, которые ускользают даже при внимательном обзоре кода. Рассмотрим очередной такой случай.
Читать дальше →

Ближайшие события

Что внутри XGBoost, и при чем здесь Go

Время на прочтение7 мин
Охват и читатели14K
В мире машинного обучения одними из самых популярных типов моделей являются решающее дерево и ансамбли на их основе. Преимуществами деревьев являются: простота интерпретации, нет ограничений на вид исходной зависимости, мягкие требования к размеру выборки. Деревья имеют и крупный недостаток — склонность к переобучению. Поэтому почти всегда деревья объединяют в ансамбли: случайный лес, градиентный бустинг и др. Сложными теоретическими и практическим задачами являются составление деревьев и объединение их в ансамбли.

В данной же статье будут рассмотрены процедура формирования предсказаний по уже обученной модели ансамбля деревьев, особенности реализаций в популярных библиотеках градиентного бустинга XGBoost и LightGBM. А так же читатель познакомится с библиотекой leaves для Go, которая позволяет делать предсказания для ансамблей деревьев, не используя при этом C API оригинальных библиотек.
Читать дальше →

Давайте попробуем поговорить про иерархические конечные автоматы вообще и их поддержку в SObjectizer-5 в частности

Время на прочтение19 мин
Охват и читатели8.6K
Конечные автоматы — это, пожалуй, одно из самых основополагающих и широко используемых понятий в программировании. Конечные автоматы (КА) активно применяются во множестве прикладных ниш. В частности, в таких нишах, как АСУТП и телеком, с которыми доводилось иметь дело, КА встречаются чуть реже, чем на каждом шагу.

Поэтому в данной статье мы попробуем поговорить о КА, в первую очередь об иерархических конечных автоматах и их продвинутых возможностях. И немного рассказать о поддержке КА в SObjectizer-5, «акторном» фреймворке для C++. Одном из тех двухнескольких, которые открыты, бесплатны, кросс-платформенны, и все еще живы.

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

Struct и readonly: как избежать падения производительности

Время на прочтение7 мин
Охват и читатели23K
Использование типа Struct и модификатора readonly иногда может порождать падения производительности. Сегодня мы расскажем о том, как этого избегать, используя один Open Source анализатор кода — ErrorProne.NET.

Читать дальше →

Простейшая реализация Entity Component System

Время на прочтение6 мин
Охват и читатели15K
Всем привет!

У нас стартует четвёртый поток «Разработчик C++», один из самых активных курсов у нас, если судить по реальным встречам, где для того чтобы пообщаться с Димой Шебордаевым приходят далеко не только «крестоносцы» :) Ну и вообще в целом курс уже разросся до одного из крупнейших у нас, осталось неизменным то, что Дима проводит открытые уроки и мы подбираем интересные материалы перед стартом курса.

Поехали!

Вступление


Entity Component System (ECS, «сущность-компонент-система») — сейчас на пике популярности в качестве архитектурной альтернативы, которая подчеркивает принцип Composition over inheritance. В этой статье я не буду вдаваться в подробности концепции, так как уже существует достаточно ресурсов на эту тему. Есть множество способов имплементации ECS, и, я но, чаще всего, выбирают довольно сложные, которые способны запутать новичков и требуют много времени.

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

Читать дальше →

Знакомство с SOCI — C++ библиотекой доступа к базам данных

Время на прочтение7 мин
Охват и читатели25K

Вступление


Сама библиотека довольно таки зрелая, — первый релиз на гитхабе датируется аж 2004-ым годом. Я был удивлён когда Хабр в поисковике не выдал мне ни одной ссылки на статьи, в которых бы упоминалось об этой замечательной библиотеке.


Произносится как: сОцы, с ударением на первый слог.


SOCI поддерживает ORM, через специализацию soci::type_conversion.


Поддержка баз данных (БД) (бэкенды):



Я не стану переводить мануалы или приводить здесь код из примеров, а постараюсь адаптировать (с изменением структуры таблицы, и других упрощений) код из своего прошлого проекта, чтобы было нагляднее и интереснее.

Читать дальше →

О сборке JDK 8 на Ubuntu, качестве кода Hotspot и почему всё валят на C++

Время на прочтение11 мин
Охват и читатели27K

Хотел сегодня поспать, но опять не удалось. В Телеграме появилось сообщение, что у кого-то не собирается Java… и мы очнулись только через пару часов, уставшие и довольные.




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

Проблемы три:


  • Не собирается (уровень первый)
    Очень скучная часть, которую можно пропустить. Нужна только для тех, кто хочет полностью восстановить историю событий;
  • Не собирается (уровень второй)
    Интересней, потому что там есть пара типичных ошибок, некромантия, некрофилия, в чём BSD лучше GNU/Linux и почему стоит переходить на новые версии JDK.
  • Даже если собирается, падает в корку
    Более интересно. Йахууу, JVM упала в корку, давайте пинать её ногами!

Под катом показан подробный ход решения проблем, с разными побочными мыслями о жизни.


Будет много C++, кода на Java не будет вообще. Любой джавист в конце концов начинает писать только на C++…

Читать дальше →

Ещё один С++ plugin framework

Время на прочтение2 мин
Охват и читатели7.7K

Вступление


Кого не посещала, пользуясь open-source библиотеками, мысль: «Спасибо этим парням за эту крутую либу! Когда-нибудь и я напишу что-нибудь стоящее, и выложу это в public, чтоб другие пользовались!»


Да всех! Или не ?..

Читать дальше →