Другое

Умные компиляторы

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

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

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

В чем разница между многозадачностью и параллелизмом? Что такое закон Амдала? Как многозадачность влияет на работу программы? Как параллелизм влияет на работу программы?

Вы знаете, что такое атака по сторонним каналам? Как вы можете от нее защититься? Чем отличается атака по времени от атаки по энергопотреблению? Что такое скрытый канал?

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

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

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

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

Отношения программистов с компиляторами крайне неоднозначные. Одни программисты считают, что должны работать только те коды, которые они написали. Другим нравится, что компиляторы оптимизируют код безучастия человека. Я уже писал об этом в других статьях. Компиляторы предназначены для того, чтобы устранять проблемы и предоставить программисту свободу действий, а не увязнуть в деталях на уровне ассемблера.

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

Изначально LISP создавался как язык программирования, который будут использовать компьютеры, чтобы писать программы без участия человека.

И этот замысел провалился. Но возможное новое поколение компиляторов сможет реализовать мечту программистов?

 

Схожие статьи

Флориши для начинающих: что это такое и как быстро научиться?
Другое

Флориши для начинающих: что это такое и как быстро научиться?

Что такое язык программирования Dart и в чем его особенность
Другое

Что такое язык программирования Dart и в чем его особенность

Кто такой fullstack-дизайнер: обязанности и особенности данной профессии
Другое

Кто такой fullstack-дизайнер: обязанности и особенности данной профессии

Лучшие программы и инструменты для прототипирования интерфейсов
Другое

Лучшие программы и инструменты для прототипирования интерфейсов

×