• Весь веб на 60+ FPS: как новый рендерер в Firefox избавился от рывков и подтормаживаний
    0
    Вопрос был про загрузку. Этот тест на загрузку. Тест на плавность анимации приведен в статье.
  • Весь веб на 60+ FPS: как новый рендерер в Firefox избавился от рывков и подтормаживаний
    +1
    Нет. Посмотрите видео. Например, вот это:
  • Весь веб на 60+ FPS: как новый рендерер в Firefox избавился от рывков и подтормаживаний
    0
    Edge так же как и Safari — платформозависимые броузеры, которые договорились с ОС. Хром и Лиса вынуждены играть по общим правилам.
  • 160-терабитный трансатлантический кабель Marea закончен
    +1
    Посмотрите на гугловский Loon. Они летают выше погоды.
  • Как может вызваться никогда не вызываемая функция?
    +2
    Нет, вроде бы там было честное условие.
    Не думаю, что можно сделать так, чтобы обе ветви if'а исполнялись — то что исполнится только одна ветвь определяется строением SSA-дерева.
    Не факт. Думаю, что при выполнении loop peeling-а и loop unrolling-а, могут появляться дублирования выражений, которые дальше могут поехать по-разному из-за UB.
  • Как может вызваться никогда не вызываемая функция?
    +4
    Не UB, а если встречал в коде директиву #pragma, поскольку в стандарте на тот момент про это ничего сказано не было.
  • Как может вызваться никогда не вызываемая функция?
    0
    Не, там была именно конструкция вида if (x) { A } else { B } и при этом и А и B выполнялись (в неопределенном порядке).
  • Как может вызваться никогда не вызываемая функция?
    +3
    В моем списке маразмов выше только вызов обеих ветвей условия подряд. К сожалению, за давностью лет потерял артефакт, который приводил к такому поведению.
  • Go быстрее Rust, Mail.Ru Group сделала замеры
    0
    Я так понимаю, что речь о сравнении стандартного инструментария наиболее подходящего для решения поставленной задачи. Иначе можно докатиться до холиваров и сравнения того, что входит, а что не входит в стандартную библиотеку/поставку языка.
  • Go быстрее Rust, Mail.Ru Group сделала замеры
    +2
    str — это безразмерный (unsized) тип, представляющий строковое значение, а &str — ссылка на него. Примерно как void и void* в Си, только без костылей.

    Сишники вполне себе обращаются с void, но почему-то все становится плохо, когда эту идею пытаются развить и строго объяснить с позиции системы типов и идеологии языка.

    Вероятно потому, что с void сишник знакомится в младенчестве и просто принимает на веру, что «надо писать void, когда функция не возвращает значения, а void* это… ну просто указатель, когда не знаем, на что указываем». В итоге человек к этому привыкает и перестает об этом думать.
  • Go быстрее Rust, Mail.Ru Group сделала замеры
    +1
    Выше уже писали, что изначальная задумка была сравнить дефолтные инструменты в той и другой экосистеме, а не one shot велосипеды. В такой постановке вопроса это вполне имеет смысл (при корректном проведении и правильных выводах).
  • Go быстрее Rust, Mail.Ru Group сделала замеры
    +3
    mkpankov на реддите написал ретроспективный анализ своей реализации, где разобрал причины.

  • Удивительно полезный инструмент: lsof
    0
    Вопрос не в странности, а в том, что это устоявшееся выражение, которое используют в книгах. Например в переводе классической книги Стивенса «UNIX: разработка сетевых приложений», или в «Ядре Linux» за авторством Бовет и Чезати.
  • Удивительно полезный инструмент: lsof
    0
    Опция -U позволяет вывести все файлы сокетов домена Unix.
    Омг. Так доменные сокеты еще никто не называл. Неужели так сложно перед публикацией дать вычитать перевод специалисту?
  • Интернет вещей популярно: почему мы перестанем выгуливать собак
    0
    Можно подумать у нас люди убирают… печаль.
  • Попиксельная заливка экрана в Wolfenstein 3D
    +2
    На правах маразма: если забыть об эффективности, то похожий результат можно достичь, обходя квадрат по кривой Гильберта (или Мура), но не подряд, а с некоторым шагом :)
  • «Магическая константа» 0x5f3759df
    +2
    А самое главное, любой читающий код поймет, что тут происходит, даже без пояснений. Главное не подпускать к коду тех, кто вопит про неэффективность и упущенную прибыль возможность оптимизации :)

    Хотя, конечно, по-прежнему остается проблема разных размеров. Кэп подсказывает, что надо добавить ассерт, плюс использовать типы с фиксированным размером, вроде uint32_t.
  • «Магическая константа» 0x5f3759df
    0
    На том же Stackoverflow есть хороший вопрос после которого понятно, что ничего непонятно.

    Очевидно, что верить нужно стандарту, вот только пользуемся мы продуктами интерпретации оного, так что правильного ответа я не знаю.

    Но судя по изменениям, движемся мы в сторону разрешения type punning через union.
  • «Магическая константа» 0x5f3759df
    0
    Я видел. Это были мысли вслух, а не наезд :)
  • «Магическая константа» 0x5f3759df
    0
    Могу посоветовать две статьи: раз и два.
  • «Магическая константа» 0x5f3759df
    +2
    что конкретно не так в коде функции в статье?
    Код в статье нарушает стандарт С++ и провоцирует UB. Дальше можно уже не разбираться, ибо на этом месте заканчиваются все гарантии.

    Типы примитивные, массивов нет, компилятор поместит i и x в регистры или на стеке… и что не так?
    Что именно компилятор будет делать со значениями зависит от сотни-другой параметров, включая оценку весов при инлайнинге и register pressure в данной точке. Сама попытка объяснить, что сделает компилятор из общих соображений и «здравого смысла» уже обречена на провал.

    Ради интереса скомпилировал тест с -O3 и -O0 с включенным и выключенным алиасингом на g++ и clang++ (std=c++14) — результат выполнения одинаков.
    То что он одинаков здесь и сейчас не значит, что он будет одинаков всегда. В этом и засада. Пример того, что может случиться, озвучивается в докладе в районе 28 и 29 слайдов.

    К сожалению, самое страшное, что может сделать программист в непонятной ситуации, — «это проверить на практике и убедиться, что все хорошо».
  • «Магическая константа» 0x5f3759df
    +1
    Идя таким путем, вы вступаете на очень зыбкую почву. Неизвестно еще, что будет хуже.

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

    Другое дело, что вся эта машинерия может негативно сказаться на производительности и потерять в итоге смысл.

    Современные компиляторы достаточно умные, чтобы использовать весь набор доступных инструкций, включая уже названную rsqrtps. Главное просто не мешать и не считать себя умнее компилятора.
  • «Магическая константа» 0x5f3759df
    +4
    К сожалению, этого не достаточно. Программа, содержащая неопределенное поведение — некорректна. Не существует никаких критериев, позволяющих доказать корректность программы, кроме формального анализа и ручного разбора ассемблера в данном конкретном случае. Даже компилятор сам не знает, есть ли там UB или нет.

    Поменяв одно выражение в любой части кода вы можете повлиять на инлайнинг и как следствие на порядок выполнения проходов компилятора. Вам не доводилось видеть ситуацию, когда в программе выполняются обе ветви условия одновременно? Это один из возможных вариантов реакции компилятора на UB.

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

    Компилятор может изменять структуру программы так, чтобы сохранить наблюдаемое поведение и упростить себе жизнь. Под нож могут попадать выражения, условия, и даже целые функции. Представьте, что одним из таких условий был assert в вашем юнит тесте.

    Резюмируя, юнит тест в таком случае даст не больше, чем комментарий «мамой клянусь, оно работает!». Даже хуже, проход тестов может вселить только ложную уверенность в том, что все хорошо.
  • «Магическая константа» 0x5f3759df
    +8
    Вопрос не в том, пользуются или не пользуются. Любое трюкачество должно быть уместно. А если его таки применяют, должен быть большой жирный комментарий, почему оно здесь и какие условия нужны для того чтобы все работало, включая фазы луны и прочее.

    Код в статье будет работать, если компилятору передали ключ -fno-strict-aliasing, либо если эта опция умолчательная для компилятора.

    Если через n лет проект начнут портировать на другую архитектуру (или переедут на другой компилятор) и забудут про этот маленький трюк, последствия могут оказаться самыми печальными.
  • «Магическая константа» 0x5f3759df
    +8
    Подробный разбор по strict aliasing-у можно найти в тексте другой моей статьи.
  • «Магическая константа» 0x5f3759df
    +18
    Со всеми этими выкладками мы приблизились к пониманию того, что в коде в начале статьи нет никакой “магии”, “фокусов”, “интуиции”, “подбора” и прочих грязных хаков, а есть лишь чистая математика, во всей своей первозданной красоте. Для меня главным выводом из этой истории стала новость о том, что преобразование float в int и наоборот путем переинтерпретации одного и того же набора бит – это не ошибка программиста и не “хак”, а вполне себе иногда разумная операция.
    Ошибаетесь. В этом коде есть чудовищный и катастрофический хак, который просто обязательно надо было упомянуть. А именно, нарушение правила strict aliasing-а при разадресации указателя. Все беды в коде возникают оттого, что кто-то проникся «элегантным решением», не разобравшись во всех деталях, а потом начинает применять его к месту и не к месту.

    Эту и другие темы я разбирал в своем докладе на конференции C++ Russia. Кому интересно, можете заглянуть.
  • Исследование асинхронной схемы в ModelSim
    +1
    Действительно, спутал. Спасибо за исправление.
  • Исследование асинхронной схемы в ModelSim
    +2
    Я упорно не понимаю, почему вы называете себя первым, если тема асинхронной логики исследуется с 60х годов? И в Союзе и за рубежом. Одни работы Варшавского чего стоят. Одно время, в университете Чибы в Японии работала группа наших ученых, которая занималась именно вопросами асинхронной логики.
  • Специально для Хабра: интервью с Аланом Кеем
    0
    Да, если есть желание разобраться подробнее именно с точки зрения системы типов, могу посоветовать научную работу по формальному доказательству корректности языка и его стандартной библиотеки: RustBelt: Securing the Foundations of the Rust Programming Language.
  • Специально для Хабра: интервью с Аланом Кеем
    0
    Не забывайте, что язык позиционируется как системный. Соответственно, требования к контролю и управлению памятью совершенно другие, чем в эрланге или хаскеле.

    В целом не совсем понятно, почему не ограничиться lexical scope (со всеми традиционными батарейками в виде HOF и так далее) и агентами (как в Oz, например, ну или даже как в эрланге), или вообще пойти по пути хаскеля (раз уж и так что-то типа GADT и pattern matching уже есть). Видимо, крестовые корни не дают возможности делать просто (для программиста), а не сложно.

    У вас довольно своеобразное представление о том, что просто для программиста, а что сложно. Пойдя по пути хаскеля мы получим еще один хаскель. Раст же старается оставаться в рамках императивной парадигмы, понятной обывателю и удобной для системного программирования, в то же время вынося на бытовой уровень ФП-шные плюшки.

    С точки зрения теории типов, система типов раста — это что-то вроде системы F, расширенной понятиями лайфтаймов. Операторы над типами, насколько я знаю, сейчас не поддерживаются (хотя сейчас идет активная работа над специализацией и полиморфизмом высших порядков).

    Основное отличие по сравнению с хаскелем — это существование т.н. coherence rule, которое обеспечивает возможность изменения зависимостей без нарушения логики программы. То есть ситуация, когда после минорного обновления библиотеки в недрах дерева зависимостей код перестает компилироваться, практически исключена.

    Это требование налагает определенные ограничения и на программиста и на реализацию языка.

    Наконец, все это является довеском к основным задачам языка: memory safety и fearless concurrency. Вы утверждаете, что в этом ничего особенного. Назовите мне пожалуйста еще один императивный язык программирования, который статически на этапе компиляции контролирует отсутствие в программе состояния гонок и не допускает существования тухлых указателей. Притом, чтобы все это происходило без GC и VM.
  • Специально для Хабра: интервью с Аланом Кеем
    0
    На эти вопросы хорошо отвечает пост одного из идеологов языка: Fearless Concurrency.
  • ZFS — лучшая файловая система (пока)
    0
    Кому интересна ZFS могу посоветовать разрабатываемую в рамках проекта Redox файловую систему TFS.

    Набор заявленных фич очень впечатляет. Хотя, конечно, до релиза еще далеко.
  • Специально для Хабра: интервью с Аланом Кеем
    +1
    В контексте сравнения динамических и статических языков Алан как-то говорил, что все известные ему системы типов невообразимо отвратительны. Если я правильно помню, он не против самой концепции системы типов, но ему не нравятся имеющиеся реализации.

    Интересно услышать его мнение относительно системы типов языка Rust. Именно в контексте проблем с «плохими» языками и многопоточными системами. С моей точки зрения, это единственный на данный момент язык, который пытается решать проблему параллельного программирования на фундаментальном уровне.
  • Выпуск Rust 1.19
    +1
    Например вот таквот так).

    А видя все это, люди сами подтягиваются.
  • Выпуск Rust 1.19
    +1
    Я последнее время использую плагин от Калиты. В чем отличия и имеет ли смысл перелезать на официальный вариант?
  • Три дня как все кассы в стране должны стать онлайн (на самом деле нет)
    +4
    Интересно, а на возврат НДС таким образом подать можно будет? В идеале вообще автоматом.
  • Блокчейн + распределённое хранилище = Sia
    0
    Maidsafe? Да нет, буквально на той неделе с разработчиками общался.
  • Блокчейн + распределённое хранилище = Sia
    0
    Просто из описания у меня сложилось впечатление, чтобы начать работу нужно сначала закинуть средства, потом еще шуровать кошельками и т.д.
  • Блокчейн + распределённое хранилище = Sia
    +1
    Скажите, а в чем принципиальное отличие от других аналогов, например maidsafe? Ну кроме того, что Sia гораздо менее удобна и понятна конечному пользователю.

    Особенно в плане «запустил — работает».
  • Stack Overflow вывел из Vim уже больше миллиона пользователей
    0
    Ctrl+Alt+Shift+Reset :)