• Особенности применения языков программирования С и С++ при разработке ПО, связанного с функциональной безопасностью

    image

    Крис Хоббс (Chris Hobbs) в своей фундаментальной работе «Embedded Software Development for Safety-Critical Systems» [1] приводит распространенное среди программистов мнение о том, что накладывать ограничения на языки программирования, это как заказывать Пикассо создание картины, при этом запрещать ему использовать желтый цвет. Тем не менее, сложно представить себе предприятие, которое серьезно занимается разработкой программного обеспечения для систем ответственного назначения, у которого в писанных или неписанных стандартах не было бы указаний о том, какой язык программирования применять и, мало того, как его применять.

    Данная статья посвящена подходу, который определен в стандарте IEC 61508 и который состоит в применении для разработки ответственного программного обеспечения безопасных подмножеств языков программирования С и С++.

    Читать дальше →
    • +14
    • 5,5k
    • 4
  • Использование GitHub Actions с C++ и CMake

    Привет, Хабр! Предлагаю вашему вниманию перевод статьи "Using GitHub Actions with C++ and CMake" о сборке проекта на C++ с использованием GitHub Actions и CMake автора Кристиана Адама.


    Использование GitHub Actions с C++ и CMake


    В этом посте я хочу показать файл конфигурации GitHub Actions для проекта C++, использующего CMake.


    GitHub Actions это предоставляемая GitHub инфраструктура CI/CD. Сейчас GitHub Actions предлагает следующие виртуальные машины (runners):


    Виртуальное окружение Имя рабочего процесса YAML
    Windows Server 2019 windows-latest
    Ubuntu 18.04 ubuntu-latest or ubuntu-18.04
    Ubuntu 16.04 ubuntu-16.04
    macOS Catalina 10.15 macos-latest

    Каждая виртуальная машина имеет одинаковые доступные аппаратные ресурсы:


    • 2х ядерное CPU
    • 7 Гб оперативной памяти
    • 14 Гб на диске SSD

    Каждое задание рабочего процесса может выполняться до 6 часов.

    Читать дальше →
    • +20
    • 2,6k
    • 7
  • PDB — это не только ценный мех


      Представьте себе, вам необходимо доработать некую очень полезную программу без SDK, но по счастливому стечению обстоятельств рядом завалялся PDB файл.

      (Беременным и детям не читать!)
      Как же теперь жить?
    • Управление шаговыми двигателями с помощью Simatic S7-1200 с ограниченным количеством импульсных выходов

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

        Раннее было принято решение построить систему автоматизации на базе одноплатного микрокомпьютера Orange pi plus 2e и микроконтроллера Arduino Nano. Для этих плат нашлось применения для другого подобного проекта, но это уже другая история. Но в последствии, после обсуждений всех преимуществ и недостатков остановились на PLC CPU 1214C DC/DC/DC с каталожным номером 6ES7 214-1AG40-0XB0 у которого на борту можно сконфигурировать до четырех импульсных выводов управления и модуль дискретных выходов SM 1222 DQ16 x 24VDC с каталожным номером 6ES7 222-1BH32-0XB0. Шаговые двигатели были выбраны из серии KRS56, управляемые драйверами TB6560 V2.


        Читать дальше →
      • Высокопроизводительная сборка мусора для C++

        • Перевод
        Мы уже писали о сборке мусора для JavaScript, о DOM, и о том, как всё это реализовано и оптимизировано в JS-движке V8. Правда, Chromium — это не только JavaScript. Большая часть браузера и движок рендеринга Blink, куда встроен V8, написаны на C++. JavaScript можно использовать для работы с DOM, а на экран изменения выводятся с использованием конвейера рендеринга.

        Так как граф C++-объектов, имеющих отношение к DOM, тесно связан с JavaScript-объектами, команда разработчиков Chromium пару лет назад начала использовать для управления памятью, в которой хранятся эти объекты, сборщик мусора, названный Oilpan. Oilpan — это сборщик мусора, написанный на C++ и предназначенный для управления C++-памятью, которая может быть подключена к V8. Управление памятью осуществляется с использованием технологии кросс-компонентной сборки мусора. В рамках этой технологии граф связанных C++/JavaScript-объектов рассматривается как единая куча.



        Этот материал является первой публикацией, посвящённой Oilpan. Здесь будет сделан обзор основных принципов, лежащих в основе данного сборщика мусора, а также — C++-API Oilpan. Мы рассмотрим некоторые возможности, поддерживаемые Oilpan, расскажем о том, как устроена работа различных подсистемам сборщика мусора. Тут же мы разберём процесс конкурентного освобождения памяти, занятой объектами.

        Самое интересное здесь то, что система Oilpan является частью Blink, но сейчас осуществляется её перевод в V8, где она будет представлена в форме библиотеки для сборки мусора. Цель этого всего заключается в том, чтобы облегчить доступ к C++-механизмам сборки мусора всем тем, кто встраивает в свои платформы движок V8. Кроме того, то, что Oilpan станет библиотекой, позволит пользоваться этой системой абсолютно всем заинтересованным в ней C++-программистам.
        Читать дальше →
        • +31
        • 8,7k
        • 6
      • Сколько инструкций процессора использует компилятор?

          Месяц назад я попытался сосчитать, сколько разных инструкций поддерживается современными процессорами, и насчитал 945 в Ice Lake. Комментаторы затронули интересный вопрос: какая часть всего этого разнообразия реально используется компиляторами? Например, некто Pepijn de Vos в 2016 подсчитал, сколько разных инструкций задействовано в бинарниках у него в /usr/bin, и насчитал 411 — т.е. примерно треть всех инструкций x86_64, существовавших на тот момент, не использовались ни в одной из стандартных программ в его ОС. Другая любопытная его находка — что код для x86_64 на треть состоит из инструкций mov. (В общем-то известно, что одних инструкций mov достаточно, чтобы написать любую программу.)

          Я решил развить исследование de Vos, взяв в качестве «эталонного кода» компилятор LLVM/Clang. У него сразу несколько преимуществ перед содержимым /usr/bin неназванной версии неназванной ОС:

          1. С ним удобно работать: это один огромный бинарник, по размеру сопоставимый со всем содержимым /usr/bin среднестатистического линукса;
          2. Он позволяет сравнить разные ISA: на releases.llvm.org/download.html доступны официальные бинарники для x86, ARM, SPARC, MIPS и PowerPC;
          3. Он позволяет отследить исторические тренды: официальные бинарники доступны для всех релизов начиная с 2003;
          4. Наконец, в исследовании компиляторов логично использовать компилятор и в качестве подопытного объекта :-)

          Начну со статистики по мартовскому релизу LLVM 10.0:
          ISA Размер бинарника Размер секции .text Общее число инструкций Число разных инструкций
          AArch64   97 МБ 74 МБ 13,814,975 195
          ARMv7A 101 МБ 80 МБ 15,621,010 308
          i386 106 МБ 88 МБ 20,138,657 122
          PowerPC64LE 108 МБ 89 МБ 17,208,502 288
          SPARCv9 129 МБ 105 МБ 19,993,362 122
          x86_64 107 МБ 87 МБ 15,281,299 203
          В прошлом топике комментаторы упомянули, что самый компактный код у них получается для SPARC. Здесь же видим, что бинарник для AArch64 оказывается на треть меньше что по размеру, что по общему числу инструкций.

          А вот распределение по числу инструкций:
          Читать дальше →
        • Парсер данных по произвольной грамматике в 400 строк

            Есть много существующих инструментов для парсинга файлов по заданной грамматике. Например, ANTLR или Yacc. Они используют конечные автоматы и генерируют большие файлы с исходным кодом для парсинга. Действительно ли это так сложно? Попробуем сделать сами.


            В этой статье я покажу, как можно сделать такой парсер методом рекурсивного спуска. Для сравнения я буду говорить об ANTLR, другие парсеры не рассматриваются. Под катом много примеров кода, без этого сложно объяснить, почему сделано так, а не иначе.


            Будем делать парсер для грамматик в ANTLR-like виде. Вот в таком:


            C:
                | A1? A2* A3
                | B1? B2+ B3
            ;

            Делать будем на языке PHP. А если получится нормально, перепишем на C++.

            Читать дальше →
          • Вышла вторая бета-версия операционной системы Haiku R1

              Опубликован второй бета-выпуск операционной системы Haiku R1. Изначально проект был создан как реакция на закрытие ОС BeOS и развивался под именем OpenBeOS, но был переименован в 2004 году из-за претензий, связанных с использованием в названии торговой марки BeOS. Для оценки работы нового выпуска подготовлено несколько загрузочных Live-образов (x86, x86-64). Исходные тексты большей части ОС Haiku распространяются под свободной лицензией MIT, исключение составляют некоторые библиотеки, медиа-кодеки и компоненты, заимствованные из других проектов.

              ОС Haiku ориентирована на персональные компьютеры, использует собственное ядро, построенное на основе модульной архитектуры, оптимизированное для высокой отзывчивости на действия пользователя и эффективного выполнения многопоточных приложений. Для разработчиков представлен объектно-ориентированный API. Система напрямую базируется на технологиях BeOS 5 и нацелена на бинарную совместимость с приложениями для данной ОС. Минимальное требование к оборудованию: CPU Pentium II и 256 МБ ОЗУ (рекомендовано Intel Core i3 и 2 ГБ ОЗУ).


              Читать дальше →
            • Юнит-тесты в uVision Keil (и не только)

                КПДВ


                Не утихают споры о том, нужны ли юнит-тесты вообще, а если нужны — то как именно их писать. Сначала писать код или сначала писать тесты? Допустимо ли нарушать инкапсуляцию при тестировании или же можно трогать только публичное API? Сколько процентов кода должно быть покрыто тестами?


                Тестирование во встраиваемых системах тоже порождает немало споров. Точки зрения разнятся от "покрытие должно быть 100% + нужны испытательные стенды" до "какие еще тесты, я программу написал — значит все работает".


                Я не хочу начинать холивар и вооще стараюсь придерживаться некоего разумного баланса. Поэтому для начала предлагаю рассмотреть самые "низко висящие" плоды, которые позволяет сорвать юнит-тестирование применительно к embedded-разработке.

                Читать дальше →
              • Как мы решаем проблему неинициализированной стековой памяти в Windows

                • Перевод
                В этой заметке я расскажу в общих чертах о том, как в Microsoft устраняют уязвимости, связанные с неинициализированной стековой памятью, и почему мы вообще этим занимаемся.
                Читать дальше →
              • Топ-10 причин для перехода в Oracle Cloud. Как бизнесу ускорить инновации?

                  Привет, Хабр!

                  Сегодня хотим поделиться со всеми, кому интересна облачная тема, переводом whitepaper от Oracle на тему перехода на облачную инфраструктуру. За перевод благодарим нашего коллегу и постоянного хаброавтора obieesupport.

                  РДТЕХ — один из старейших партнеров Oracle в России (первое партнерское соглашение между компаниями было подписано в 1993 году). Сегодня наша компания имеет высший партнерский статус Oracle Platinum Partner, а Учебный центр РДТЕХ — один из главных центров авторизованного обучения Oracle в России (думаем, кто-то из числа наших читателей посещал курсы в нашем Учебном центре или даже учится в нем сейчас дистанционно).

                  Еще наши коллеги создали легендарный глоссарий терминов Oracle, которым пользуются многие представители «базоданческого сообщества» (спойлер: в одном из последующих постов мы расскажем подробнее о глоссарии).

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



                  Читать дальше →
                • Что делает Rust универсальным языком программирования

                    Владей и заимствуй


                    Долгое время Rust позиционировался исключительно как язык для системного программирования. Попытки использовать Rust для высокоуровневых прикладных задач зачастую вызывали усмешку у значительной части сообщества: зачем использовать инструмент в том качестве, на которое он не рассчитан? Какая польза от возни с типами и анализатором заимствований (borrow checker), если есть Python и Java со сборкой мусора? Но другая часть сообщества всегда видела потенциал Rust именно как языка прикладного, и даже находила его удобным в использовании для быстрого прототипирования — во многом благодаря его особенностям, а не вопреки им.

                    Читать дальше →
                  • Текстовая игра на Blazor с нуля (+сорсы +демо)

                    • Tutorial
                    Идея о том, что можно писать веб приложение без JavaScript интересна многим, а особенно тем кто начинал свой путь в программирование с серверного языка. Внедрение Web Assembly может (наконец-то) позволить это полноценно реализовать. Писать всю логику приложения на одном языке — звучит довольно заманчиво. Тем более, если этот код компилируется в бинарник, а не в промежуточный язык.

                    Эту технологию хотелось бы увидеть в не типичных веб-приложениях. Например, как это — писать что-то более интерактивное на Web Assembly (Blazor). Предлагаю попробовать создать простую текстовую интерактивную игру. В игре есть возможность создать свой вопрос и отвечать на вопросы других игроков, набирая очки за правильные ответы. Всё на одной странице и с помощью Blazor.



                    Результат:

                    Github
                    Demo
                    Читать дальше →
                  • Веб-разработка с .NET: Представляем Blazor WebAssembly 3.2.0

                    • Перевод
                    Привет, Хабр! Я рад сообщить, что Blazor WebAssembly теперь официально выпущена и доступна для всех. Это полнофункциональный и поддерживаемый выпуск Blazor WebAssembly, готовый к использованию в продакшене. Фулл-стак веб-разработка с .NET! Подробности под катом.

                    Читать дальше →
                  • Разработка встроенного ПО: введение

                    Привет, Хабр! Представляю вашему вниманию перевод статей Chris Svec, оригинал здесь. Публикуется с разрешения автора по лицензии CC-A-NC-ND.

                    Embedded software engineering 101: введение


                    Я запускаю цикл статей по обучению разработке встроенного программного обеспечения. Мы начнем с описания простого микроконтроллера, и после того, как Вы поймете, как он работает, разовьем это до понимания работы относительно сложных систем, таких как Fitbit или Nest.
                    Я назвал эту серию Embedded Software Engineering 101, и она начинается с этой недели прямо здесь в этом блоге.

                    Продолжайте читать для дальнейших объяснений и подробностей.


                    Одни строительные блоки на других строительных блоках.
                    Читать дальше →
                  • Веб-сервисы в Oracle



                      Веб-сервисы широко применяются для интеграции между компонентами одной системы или между различными системами. Популярность веб-сервисов как способа интеграции обусловлена их универсальностью, а также простотой реализации и отладки. Универсальность связана с передачей данных с помощью интернета и протокола HTTP. Веб-сервисы дают возможность относительно легко построить интеграции между компонентами, написанными на разных языках, запускаемыми на разных операционных системах и платформах. Простота реализации веб-сервисов достигается за счет встроенных во многие IDE средств и компонентов, позволяющих быстро разработать как сам веб-сервис (provider side), так и необходимый код для вызова сервиса на стороне клиента (client side). Отладку сервисов упрощает использование понятных человеку форматов обмена данными — XML и JSON. Кроме того, существует множество утилит для отладки и тестирования сервисов, в том числе нагрузочного.

                      В этой статье рассмотрим несколько способов создания веб-сервисов непосредственно из СУБД Oracle, то есть без использования сторонних средств.
                      Читать дальше →
                    • Документооборот в Google Drive?

                      • Tutorial
                      Казалось бы, вот оно общее информационное пространство, в котором можно распределять права доступа, систематизировать файлы и добавлять к ним дополнительные поля. Чего не хватает для электронного документооборота? Уже на нескольких крупных строительных объектах мы испробовали Google Drive в деле документооборота, нашли популярные грабли и удачные решения. В майские праздники я (наконец-то!) упаковал этот опыт в 7-минутный ролик, отобрав самые полезные приемы.

                      image
                      Читать дальше →
                    • Лучшие практики повышения производительности в C#

                      • Перевод
                      Всем привет. Мы подготовили перевод еще одного полезного материала в преддверии старта курса «Разработчик С#». Приятного прочтения.




                      Поскольку недавно мне довелось составлять список лучших практик в C# для Criteo, я подумал, что было бы неплохо поделиться им публично. Цель этой статьи — предоставить неполный список шаблонов кода, которых следует избегать, либо потому что они сомнительны, либо потому что просто плохо работают. Список может показаться немного рандомным, потому что он слегка выдернут из контекста, но все его элементы в какой-то момент были обнаружены в нашем коде и вызывали проблемы в продакшене. Надеюсь, это послужит хорошей профилактикой и предотвратит ваши ошибки в будущем.

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

                      И последнее, но не менее важное: некоторые пункты (например, ConfigureAwait) уже обсуждались во многих статьях, поэтому я не буду подробно останавливаться на них. Цель заключается в том, чтобы сформировать компактный список моментов, на которые нужно обращать внимание, а не давать подробную техническую выкладку по каждому из них.
                      Читать дальше →
                    • C++/Qt: пора валить?.

                      image


                      Если бы раньше я запускал новый долгоживущий проект, в котором основные функции связаны с большим объёмом вычислений при каком-то взаимодействии с пользователем через графический интерфейс, я бы не задумываясь использовал С++/Qt. Это позволяло использовать один фреймворк/язык везде, независимо от структуры проекта и его компонентов, без дополнительных сложностей с зоопарком технологий и зависимостей.

                      Сейчас, в свете присходящего с Qt, придётся менять подход...


                      Читать дальше →
                    • Большое тестирование процессоров различных архитектур

                      Предисловие


                      Попытка сравнить производительность процессоров на разнородных архитектурах x86-64, e2k (Эльбрус), mips и arm.


                      Все тесты написаны на языке C (взяты из исходных кодов, которые я не модифицировал и не оптимизировал) и компилируются под конкретную архитектуру с использованием конкретного компилятора для данной архитектуры и тесты производятся на различных дистрибутивах операционных систем на ядре Linux. На результаты может влиять как тип так и версия компилятора, а также режим оптимизаций. Хотя даже таким способом можно примерно сравнить производительность процессоров на разных архитектурах.


                      P.S.: Знаю, что большинство тестов для очень старых компьютеров, но они работают везде. Что даже очень неплохо.

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