• Как передать полиморфный объект в алгоритм STL

    • Перевод
    Как мы можем прочесть в первой главе книги Effective C++, язык С++ является по сути своей объединением 4 разных частей:

    • Процедурная часть, доставшаяся в наследство от языка С
    • Объектно-ориентировання часть
    • STL, пытающийся следовать функциональной парадигме
    • Шаблоны

    Эти четыре, по сути, подъязыка составляют то, что мы называем единым языком С++. Поскольку все они объединены в одном языке, то это даёт им возможность взаимодействовать. Это взаимодействие порой порождает интересные ситуации. Сегодня мы рассмотрим одну из них — взаимодействие объектно-ориентированной модели и STL. Оно может принимать разнообразные формы и в данной статье мы рассмотрим передачу полиморфных функциональных объектов в алгоритмы STL. Эти два мира не всегда хорошо контачат, но мы можем построить между ними достаточно неплохой мостик.

    image
    Читать дальше →
    • +32
    • 7,1k
    • 6
  • Комитет по стандартизации С++ срывает с себя оковы

    • Перевод
    Радикальная перемена в подходе к обновлениям и дополнениям в Стандарте C++ случилась на недавней встрече WG21, — или, скорее, это было изменение, которое «висело в воздухе» вот уже в течении нескольких последних встреч, и теперь наконец было обсуждено комитетом и задокументировано. Внимание читателей должны привлечь два ключевых пункта в самом начале документа «С++: планы на стабильность, скорость и реализацию языка» (C++ Stability, Velocity, and Deployment Plans [R2])":

    • Является C++ языком, в котором есть новые потрясающие возможности?
    • Известен ли C++ как язык, славящийся своей отличной стабильностью в течение долгого периода времени?

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

    Позади нас — 30 лет совместимости C++/C (ну хорошо, в последние 15 лет были по мелочи небольшие случаи, когда мы упирались в края и «заигрывали» с нею). Это замечательное достижение, за которое мы в течение вот уже более 30 лет благодарим Бьярна Страуструпа и 64 встречи, проведенные комитетом по стандартизации (Том Плум и Билл Плагер занимали их место в этом нелегком деле в промежуток между WG14 и WG21).
    Читать дальше →
  • Генерация кода во время работы приложения: реальные примеры и техники

      Генерация кода в рантайме — очень мощная и хорошо изученная техника, но многие разработчики все еще неохотно её используют. Обычно изучение Expression Trees начинают с какого-нибудь простого примера типа создания предиката (фильтра) или математического выражения. Но не Expression Trees единым жив .NET-разработчик. Совсем недавно появилась возможность генерировать код, используя сам компилятор — это делается с помощью API библиотек Roslyn/CodeAnalisys, предоставляющих, кроме всего прочего, еще и парсинг, обход и генерацию исходников.


      Эта статья основана на докладе Raffaele Rialdi (Twitter: @raffaeler) на конференции DotNext 2017 Moscow. Вместе с Рафаэлем мы проанализируем реальные способы использования кодогенерации. В отдельных случаях они позволяют очень сильно улучшить производительность приложения, что в свою очередь приводит нас к дилемме — если сгенерированный код так полезен и мы собираемся его часто использовать, то как же отлаживать этот код? Это один из фундаментальных вопросов, возникающих в реальных проектах.


      Рафаэль — практикующий архитектор, консультант и спикер, имеющий MVP в категории Developer Security начиная с 2003 года, который прямо сейчас занимается бэкендами enterprise-проектов, специализируясь на генерации кода и кроссплатформенной разработки для C# и C++.


      Читать дальше →
    • Компилятор на JavaScript с использованием ANTLR




        В начале этого года я присоединилась к команде, работающей над MongoDB Compass — графическим интерфейсом для MongoDB. Пользователи Compass через Intercom запросили инструмент, позволяющий писать запросы к базе данных, используя любой удобный им язык программирования, поддерживаемый драйвером MongoDB. То есть нам нужна была возможность трансформировать (компилировать) язык Mongo Shell в другие языки и обратно.

        Данная статья может стать как практическим руководством, помогающим при написании компилятора на JavaScript, так и теоретическим ресурсом, включающим основные понятия и принципы создания компиляторов. В конце приведен не только полный список всех используемых при написании материалов, а также ссылки на дополнительную литературу, направленную на более глубокое изучение вопроса. Информация в статье подается последовательно, начиная с исследования предметной области и далее постепенно усложняя функционал разрабатываемого в качестве примера приложения. Если во время прочтения вам кажется, что вы не улавливаете переход от одного шага к другому, вы можете обратиться к полной версии данной программы и возможно это поможет устранить возникший пробел.
        Читать дальше →
        • +14
        • 3,7k
        • 3
      • Что нового в LLVM

        • Перевод
        LLVM 6 уменьшает опасность Spectre, имеет улучшенную поддержку Windows и CPU компании Intel, а также включает WebAssembly в число поддерживаемых целевых платформ.



        Инфраструктура компилятора LLVM прошла путь от технически любопытной вещи до живой части современного ландшафта программного обеспечения. Это то ядро, которое стоит за компилятором Clang, за компиляторами языков Rust и Swift, и предоставляет широкие возможности для разработки компиляторов для новых языков.
        Читать дальше →
        • +26
        • 7,2k
        • 1
      • Выпуск Rust 1.25

        • Перевод

        Команда Rust рада сообщить о новой версии Rust: 1.25.0. Rust — это системный язык программирования, нацеленный на безопасность, скорость и параллельное выполнение кода.


        Если у вас установлена предыдущая версия Rust, для обновления достаточно выполнить:


        $ rustup update stable

        Если же у вас еще не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта. С подробными примечаниями к выпуску Rust 1.25.0 можно ознакомиться на GitHub.


        Что вошло в стабильную версию 1.25.0


        Несколько последних выпусков были незначительными, но Rust 1.25 содержит много
        нововведений! Во-первых: мы обновили LLVM с 4-ой версии до 6-ой. Обновление
        влечёт ряд изменений, наиболее важное из которых — поддержка AVR.

        Читать дальше →
        • +36
        • 6,9k
        • 9
      • Ой, у вас баннер убежал!

        Ну. И что?
        Реклама
      • SASS: Оптимизируем media screen

          Приветствую!

          Примерно месяц назад я написал статью, в которой выдвинул идею об оптимизации @media screen. Идея заключается в том, чтобы иметь возможность писать значения для всех экранов в одну строку. Более подробно можете почитать по ссылке. Большинство комментариев — это критика относительно реализации, к сожалению идей никто не подкинул. Но если посмотреть с другой стороны, из каждой критики можно вытащить идею, поэтому опираясь на мнение читателей, я поставил себе цель написать миксин, который:

          • легко читается (максимально повторяющий синтаксис sass/scss/css);
          • легко поддерживать (чтобы через год ты понимал, что там написано);
          • гибкий (поддержка максимального количества описаний @media);

          Давайте посмотрим, что у меня вышло (репозиторий Github)!
          Читать дальше →
        • C++ велосипедостроение для профессионалов

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

            • Некоторые делают это для самообучения: берут класс стандартной библиотеки, пишут его сами с нуля, сравнивают то, что получилось, с тем, что есть в стандартной библиотеке — в процессе узнают для себя что-то новое.
            • Некоторые проекты имеют особое требования к коду. В embedded-разработке принято работать без RTTI и без exception, поэтому части стандартной библиотеки, которые используют RTTI и exception, необходимо переписать без них.
            • Редко, но бывает, когда велосипед пишут, потому что могут написать лучше, чем в стандартной библиотеке. Как правило, такие нововведения рано или поздно попадают в стандартную библиотеку.
            • Другим только кажется, что они могут написать лучше, и таких людей больше. Но в процессе они обучаются, выясняют для себя что-то новое и что-то интересное открывают.
            • Могут быть другие причины.

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

            • бездумно переносить устаревшие технологии 20-30-летней давности в современные проекты;
            • пользоваться «вредными» бенчмарками и оптимизациями.

            А также затронем «вредные» советы, обсудим новейшие практики программирования (C++ 11 и позднее), подумаем, что делать с «идеальным» велосипедом.

            Читать дальше →
          • Разбор перформансных задач с JBreak (часть 4)

              Разбор последней четвёртой задачи:

                  public double octaPow(double a) {
                      return Math.pow(a, 8);
                  }
              
                  public double octaPow(double a) {
                      return a * a * a * a * a * a * a * a;
                  }
              
                  public double octaPow(double a) {
                      return Math.pow(Math.pow(Math.pow(a, 2), 2), 2);
                  }
              
                  public double octaPow(double a) {
                      a *= a; a *= a; return a * a;
                  }

              Условие (упрощённо):
              Определить, какие методы быстрые, а какие — медленные (JRE 1.8.0_161).
              Под катом бенчмарки, куски ассемблера и разбор оптимизаций со стороны JVM.

              Другие публикации серии: Часть 1, Часть 2 и Часть 3.
              Читать дальше →
            • Полный перечень intrinsic-функций в HotSpot в JDK 7, 8, 9 и 10

                Интринсик или intrinsic-функция — функция, которую JIT-компилятор может встроить вместо вызова Java- и JNI-кода с целью оптимизации. Важный вывод из этого — intrinsic-функции не доступны в режиме интерпретатора. По умолчанию в HotSpot используется два JIT-компилятора C1 и C2, таким образом, может быть доступна реализация intrinsic-функции для каждого из JIT-компиляторов. Различия в реализации intrinsic-функций для разных JIT-компиляторов обуславливаются различным внутренним представлением кода (intermediate representation — IR).

                В HotSpot реализовано несколько сотен интринсиков (их количество растёт от релиза к релизу). Описание всех intrinsic-функций можно найти в исходниках OpenJDK в файле vmSymbols.hpp. Ниже приведены полные списки интринсиков для JDK 7 (vmSymbols.hpp), JDK 8 (vmSymbols.hpp), JDK 9 (vmSymbols.hpp) и JDK 10 (vmSymbols.hpp).
                Читать дальше →
                • +31
                • 3,6k
                • 5
              Самое читаемое