• Генерация кода во время работы приложения: реальные примеры и техники

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


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


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


      Читать дальше →
    • Что нового в LLVM

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



      Инфраструктура компилятора LLVM прошла путь от технически любопытной вещи до живой части современного ландшафта программного обеспечения. Это то ядро, которое стоит за компилятором Clang, за компиляторами языков Rust и Swift, и предоставляет широкие возможности для разработки компиляторов для новых языков.
      Читать дальше →
      • +26
      • 6,8k
      • 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,5k
      • 9
    • 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,4k
            • 5
          • Ой, у вас баннер убежал!

            Ну, и что?
            Реклама
          • C++20 всё ближе. Встреча в Джексонвилле

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

              Хотите посмотреть на новости и узнать:

              • Почему это тут золотая медаль справа?
              • Как там поживает кросплатформенный SIMD?
              • Что будет если 4000 поделить на последнюю пятницу февраля?
              • Какие подводные камни нашлись у сопрограмм?
              • Какие крутые фишки для многопоточного программирования будут в скором времени доступны?
              Добро пожаловать под кат
            • Язык программирования, рассчитанный на минификацию


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


                В процессе общего обсуждения кто-то предложил нестандартную для мира демо идею: написать программу на каком-либо скриптовом языке. Дело в том, что все демо сжимаются упаковщиком для уменьшения размера (а при исполнении распаковываются). И текст сжимается намного лучше бинарного кода. Если интерпретатор будет иметь очень маленький размер, это может дать существенное преимущество.


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


                Но даже так большинство существующих языков не предназначены для данной оптимизации — очевидно, они имеют множество элементов, которые нужны для понимания человеку, а не машине. А что, если разработать язык, специально рассчитанный на минификацию?


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


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

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

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



                  Этот пост полностью соответсвует своему названию. Для начала в нем будет показано, что вопреки утверждению стандарта, а также классиков языка Си Кернигана и Ритчи, использование индексов массивов соверешенно не равнозначно использованию соответствующих указателей, а выбор эпиграфа будет понятен в самом конце. И да – середина поста тоже не пустая.
                  Читать дальше →
                • Хардкорные Java/JVM задачки

                    Перформансные задачи от Контура уже были, настала и наша очередь: представляем хардкорные задачи с Java-конференции JBreak 2018, aka «ад от Excelsior».


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


                    Задача 1


                    Ваш коллега начитался Java Language Specification и написал следующее:


                    void playWithRef() {
                        Object obj = new Object();
                        WeakReference<Object> ref = new WeakReference<>(obj);
                        System.out.println(ref.get() != null);
                        System.gc();
                        System.out.println(ref.get() != null);
                    }

                    А разгребать вам: какие результаты исполнения возможны?

                    Правильный ответ и еще больше хардкора!
                  Самое читаемое