Pull to refresh
26
0
Александр Дербенёв @alexac

Senior Software Engineer

Send message
Я нормально запускал Docker на Cubietruck, очень странно, что у вас не получилось его запустить.
хром сейчас на всех платформах по дефолту собирается с помощью ninja. Разве что на ios, кажется, используется xcodebuild, но не уверен. От всего остального сейчас отказываются. А с переходом от gyp к gn других вариантов кроме ninja не останется вовсе.
Ну на линуксе он побыстрее собирается, на маке будет медленнее, на винде вообще медленно.
У вас немножко неверные данные. Хромиум с нуля собирается за полтора часа на i7 16GB RAM, чуть больше чем за час на 2x Xeon (по 16 ядер) 32GB RAM или чуть меньше двух часов на i5 16GB RAM (все с SSD). За час можно собрать только с distcc или dist-clang с билд-фермой. А релизный некомпонентный билд с LTO может линковаться только минут сорок в некоторых случаях. На i3 с HDD я как-то ждал сборки >8 часов и не дождался, прервал.
Пожалуйста уберите try/catch вокруг чтения файла. Он там бесполезен. Вы используете только функции libc, которые не бросают исключения. Единственная ошибка, которую в этом коде еще можно было бы получить — ошибка выделения памяти, что в текущем виде все равно приведет к segmentation fault, а не к исключению. Тот кусок стоило написать как-то так:

const char fileName[] = "../forTest.cl";
size_t source_size;
std::unique_ptr<char[]> source;

try {
  std::ifstream stream;
  stream.exceptions(std::ios_base::bad_bit | std::ios_base::fail_bit | std::iOS_base::eof_bit);
  stream.open(fileName, std::ios_base::in);
  stream.seekg(0, std::ios_base::end);
  size_t source_size = stream.tellg();
  stream.seekg(0, std::ios_base::beg);
  source.reset(new char[source_size]);
  stream.read(source.get(), source_size);
} catch (const std::exception& e) {
  std::cerr << "Can't read kernel: " << e.what() << std::endl;
  exit(1);
}
Мне одному кажется, что последний пример

sum += array[i] + array[++i];


Это явное UB? Я не удивляюсь, что там прирост скорости вдвое, там компилятор имел право вообще пол системы снести во время трансляции.

Упрощенный пример и предупреждение: codepad.org/U2jK5eIo
Сафари в последнем релизе так делать стал, раньше там тоже был один профиль на все инкогнито вкладки. Но не скажу, что от этого стало удобнее. Да, часть кейсов благодаря этому упростились, но часть наоборот стала сильно сложнее.
Емнип, номер версии хромиума сохранился на страничке chrome://version.
Заголовок окна — действительно обычная не клиентская область, поэтому там можно использовать системные функции рисования (и то, это как правило не используется, потому что рисовать через toolkit views заметно проще, так как приходится писать меньше кода и портируемость есть из коробки.

Я не знаю, как именно это реализовано в FF, но в хромиумных браузерах контент рисуется в отдельном процессе рендеринга, и приезжает в основной процесс в виде готовых картинок-квадов. Основной процесс просто отрисовывает эти квады в правильных местах экрана. И встроить в эту схему системные контролы уже практически не реально. Можно пытаться визуально мимикрировать под них, но для этого придется поддерживать контролы для каждой отдельной версии каждой поддерживаемой операционки и еще как-то согласовывать это с установленными у пользователя темами. Поддерживать две с половиной версии шапки окна для разных версий Windows (а еще не забываем про hidpi) — уже большая головная боль, а если так будет с каждым контролом — получится очень много работы практически на пустом месте и с минимальной пользой.
Именно так. Aura сильно улучшила отрисовку интерфейса, а также упростила разработку — теперь ui код пишется один для Windows и Linux. Но добились этого ценой отказа от нативной отрисовки в пользу openGL/DirectX, из-за чего рисовать нативные контролы стало невозможно.
Нашел себя… Радуюсь, что с момента регистрации там я успел дважды сменить почту и один раз телефонный номер.
Поддерживаю, начинать надо с понимания работы компьютера на низком уровне, и лучше чем ассемблер в этом ничто не поможет. Лично видел много примеров, когда люди банальные указатели в C не могли понять, пока до ассемблера не спускались и о C ABI не узнали.
Ну вот на практике гораздо удобнее использовать простые редакторы, чем десять раз на дню переиндексировать половину проекта, когда список нужных модулей меняется.
Да в том и дело, что открытыми держится несколько файлов, а навороченные ide индексируют весь проект, чтобы работали всякие автодополнения и прочее.
А Вы не хотите показать мастер-класс по модулям? chromium.googlesource.com/chromium/src/+/master
Забыт аргумент, который лично я всегда привожу против использования навороченных IDE. Если исходники в проекте измеряются гигабайтами, количество файлов сотнями тысяч, а время сборки часами, то очень быстро начинаешь люто ненавидеть все умные семантические автодополнения и прочие фичи полноценных IDE, потому что, не справляясь с объемами кода, они начинают сильно тормозить даже на топовых компах.
Мой изначальный посыл в том, что Yaml — на любителя, и JSON с комментариями может быть гораздо удобнее.

Собственно на js и так есть транслятор из коробки:
JSON.parse(JSON.minify(text))

Для других языков существуют специальные парсеры (как тот же jsoncpp).

А вот что касается трансляции в другии форматы с сохранением комментариев, имхо, во-первых, проблема надуманная, так как автоматически сгенерированное и не должно содержать комментариев, во-вторых, js не самый подходящий язык для подобных действий.

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

Сравните разницу в фрагменте:
Обратный порядок:
    | dictionary_element COMMA dictionary_list
    {
      $$ = $3;
      $$->Set($1->key, $1->value);
      delete $1;
    }
    ;


Прямой порядок:
    | dictionary_list COMMA dictionary_element
    {
      $$ = $1;
      $$->Set($3->key, $3->value);
      delete $3;
    }
    ;


Если не брать во внимание возможность того, что ключи в словаре могут повторяться (а с чего бы собственно это предусматривать?), то как именно писать — без разницы и скорее дело привычки того, кто пишет грамматику для лексического анализатора.
Может, если лексер будет обрабатывать значения в словаре справа на лево, что в случае с json — вполне допустимое поведение:

yacc/bison:
dictionary: LBRACE dictionary_list RBRACE
    {
      $$ = $2;
    }
    | LBRACE RBRACE
    { return new Dictionary(); }

dictionary_list: dictionary_element
    {
      $$ = new Dictionary();
      $$->Set($1->key, $1->value);
      delete $1;
    }
    | dictionary_element COMMA dictionary_list
    {
      $$ = $3;
      $$->Set($1->key; $1->value);
      delete $1;
    }
    ;

dictionary_element: string COLON value
    {
       $$ = new DictionaryElement($1, $3);
    }
    ;

Information

Rating
Does not participate
Date of birth
Registered
Activity

Specialization

Software Developer
Senior
From 100,000 €