• Как написать свой первый Linux device driver. Часть 3

      Добрый вечер, хаброчитатели!

      В предыдущих статьях (один, два) мы определили понятие символьного устройства и написали простейший пример символьного драйвера. Последняя часть посвещена проверки его работоспособности. На Хабре уже есть примеры как можно протестировать драйвер, например: тык.

      Я попытаюсь рассмотреть данный вопрос чуть подробнее, надеюсь, вам понравится.


      Читать дальше →
    • Пишем x86-64 JIT-комплятор с нуля в стоковом Python

      • Перевод
      В этой статье я покажу, как написать рудиментарный, нативный x86-64 just-in-time компилятор (JIT) на CPython, используя только встроенные модули.

      Код предназначен для UNIX-систем, таких как macOS и Linux, но его должно быть легко транслировать на другие системы, типа Windows. Весь код опубликован на github.com/cslarsen/minijit.

      Цель — сгенерировать в рантайме новые версии нижеприведённого ассемблерного кода и выполнить их.

      48 b8 ed ef be ad de  movabs $0xdeadbeefed, %rax
      00 00 00
      48 0f af c7           imul   %rdi,%rax
      c3                    retq

      В основном, мы будем иметь дело с левой частью кода — байтовой последовательностью 48 b8 ed ... и так далее. Эти 15 байтов в машинном коде составляют функцию x86-64, которая умножает свой аргумент на константу 0xdeadbeefed. На этапе JIT будут созданы функции с разными такими константами. Такая надуманная форма специализации должна продемонстрировать базовую механику JIT-компиляции.
      Читать дальше →
      • +11
      • 5,3k
      • 5
    • Андрей Карпов считает, что код проекта Manticore качественнее, чем код проекта Sphinx

        Sphinx vs ManticoreМои читатели попросили сравнить проекты Manticore и Sphinx с точки зрения качества кода. Я могу сделать это только одним освоенным мною способом — проверить проекты с помощью статического анализатора PVS-Studio и посчитать плотность ошибок в коде. Итак, я проверил C и C++ код в этих проектах и, на мой взгляд, качество кода Manticore выше, чем качество кода Sphinx. Естественно, это очень узкий взгляд, и я не претендую на достоверность своего исследования. Однако меня попросили, и я сделал сравнение так, как умею.
        Читать дальше →
        • +13
        • 5,9k
        • 7
      • Caesar3 все таки open



          Некоторое время назад, примерно с 2008 года, у меня был хобби-проект по воссозданию довольно знаменитого конце ХХ века ситибилдера Caesar III ©, в процессе работы над игрой был написан ряд статей по механике игры и её внутреннему устройству (например эта).
          Дайте же сорцы, наконец
        • Небольшая история о команде `yes` в Unix

          • Перевод
          Какую вы знаете самую простую команду Unix? Есть echo, которая печатает строку в stdout, и есть true, которая ничего не делает, а только завершается с нулевым кодом.

          Среди множества простых Unix-команд спряталась команда yes. Если запустить её без аргументов, то вы получите бесконечный поток символов "y", каждый с новой строки:

          y
          y
          y
          y
          (...ну вы поняли мысль)

          Хотя на первый взгляд команда кажется бессмысленной, но иногда она бывает полезной:

          yes | sh boring_installation.sh

          Когда-нибудь устанавливали программу, которая требует ввести "y" и нажать Enter для установки? Команда yes приходит на помощь! Она аккуратно выполнит эту задачу, так что можете не отвлекаться от просмотра Pootie Tang.
          Читать дальше →
        • UB-2017. Часть 1

          • Перевод
          От переводчика:
          Переводы статьи про неопределённое поведение в языке C от Криса Латтнера, одного из ведущих разработчиков проекта LLVM, вызвали большой интерес, и даже некоторое непонимание со стороны тех, кто не встречался с описываемыми явлениями на практике. В своей статье Крис даёт ссылку на блог Джона Реджера, и на его статью от 2010 года, посвящённую UB в C и C++. Но в блоге Реджера есть и гораздо более новые статьи на эту тему (что не отменяет ценность старых, однако).

          Я хочу предложить вашему вниманию свежую статью «Undefined Behavior in 2017». Статья в оригинале имеет очень большой объём, и я разбил её на части.

          В первой части речь пойдёт о разных инструментах поиска UB: ASan, UBSan, TSan и т.д.
          ASan — Address Sanitizer от компании Google, разработанный на основе LLVM.
          UBSan — Undefined Behavior Sanitizer, предназначен для обнаружения различных UB в программах на C и C++, доступен для Clang и GCC.
          TSan — Thread Sanitizer, предназначен для обнаружения UB в многопоточных программах.
          Если вам эта тема покажется далёкой от практики, я рекомендую дождаться продолжения, потому что в конце вас ждёт поистине огромный список UB языка С++ (их должно быть около 200!)
          И я рекомендую прочитать также старые статьи Реджера, они не утратили актуальности.
          Об авторе: Джон Реджер является профессором Computer Science в университете штата Юта в США.


          Мы часто слышим, что некоторые люди утверждают, что проблемы, вытекающие из неопределённого поведения (UB) в C и C++ в основном решены путём широкого распространения инструментов динамической проверки, таких, как ASan, UBSan, MSan и TSan. Мы здесь покажем очевидное: несмотря на то, что в последние годы произошло множество прекрасных улучшений в этих инструментах, проблемы UB далеки от разрешения, и рассмотрим ситуацию в деталях.


          Читать дальше →
        • AdBlock похитил этот баннер, но баннеры не зубы — отрастут

          Подробнее
          Реклама
        • Что каждый программист на C должен знать об Undefined Behavior. Часть 3/3

          • Перевод
          Часть 1
          Часть 2
          Часть 3

          В первой части цикла мы рассмотрели неопределённое поведение в С и показали некоторые случаи, которые позволяют сделать С более быстрым, чем «безопасные» языки. В части 2 мы рассмотрели некоторые неожиданные баги, которые могут противоречить представлениям многих программистов об языке С. В этой части, мы рассмотрим проблемы, которые компилятор Clang решает, чтобы достичь высокого быстродействия, и устранить некоторые сюрпризы.
          image
          Читать дальше →
          • +19
          • 5,3k
          • 5
        • Что каждый программист на C должен знать об Undefined Behavior. Часть 2/3

          • Перевод
          Часть 1
          Часть 2
          Часть 3

          В первой части нашего цикла мы обсудили, что такое неопределённое поведение, и как оно позволяет компиляторам C и C++ генерировать более высокопроизводительные приложения, чем «безопасные» языки. В этом посте мы обсудим, чем на самом деле является «небезопасный» C, объяснив некоторые совершенно неожиданные эффекты, вызываемые неопределённым поведением. В третьей части, мы обсудим, как «дружественные» компиляторы могут смягчить некоторые из таких эффектов, даже если они не обязаны это делать.

          Мне нравится называть это «Почему неопределённое поведение часто пугает и ужасает программистов на C».

          image
          Читать дальше →
        • Что каждый программист на C должен знать об Undefined Behavior. Часть 1/3

          • Перевод
          Часть 1
          Часть 2
          Часть 3

          Люди иногда спрашивают, почему код, скомпиливанный в LLVM иногда генерирует сигналы SIGTRAP, когда оптимизация была включена. Покопавшись, они обнаруживают, что Clang сгенерировал инструкцию «ud2» (подразумевается код X86) — то же, что генерируется __builtin_trap(). В этой статье рассматривается несколько вопросов, касающихся неопределённого поведения кода на C и того, как LLVM его обрабатывает.

          image

          В этой статье (первой из трёх) мы попытаемся объяснить некоторые из этих вопросов, чтобы вы могли лучше понять связанные с ними компромиссы и сложности, и возможно, изучить немного больше тёмные стороны С. Мы выясним, что C не является «высокоуровневым ассемблером», как многие опытные программисты на C (особенно те, кто сфокусирован на низком уровне) предпочитают думать, и что C++ и Objective-C напрямую унаследовали множество таких проблем.
          Читать дальше →
        • Broo — алгоритм сжатия без потерь. Улучшения

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


            Почему название "Broo"?


            image


            Читать дальше →
          Самое читаемое