Программирование сигнальных процессоров (DSP) --- сложная задача, плохо поддающаяся автоматизации. Это связано со спецификой архитектуры таких процессоров, при программировании которых требуется сложное планирование активностей параллельно работающих блоков. Несмотря на то, что DSP уже используются достаточно давно, трансляторы для них с традиционных языков (таких, как С/С++) недостаточно эффективны и сильно уступают по эффективности генерируемого кода ручному программированию на языке ассемблера.
В компании "СофтКом" ведется исследовательский проект по разработке специального языка, ориентированного на эффективную компиляцию алгоритмов в коды различных DSP-процессоров. Научным руководителем этого направления является Д.Ю.Булычев. В рамках данного направления предлагается несколько тем курсовых работ.
Все темы предполагают работу над "векторным" языком ("array language") --- языком, в котором основным типом данных являются массивы и основные операции предназначены для обработки массивов. Особенностью данного конкретного языка является то, что в нем все данные имеют статический размер и статическое распределение.
Основным требованием к соискателям является готовность изучать современные подходы в области разработки и реализации языков программирования, компиляции, оптимизирующих преобразований и статического анализа. Желательно также владение основами функционального программирования и дискретной математики; в области практического программирования --- make, bash, git, командная строка unix-систем.
5.1. Дефорестация
Дефорестация (deforestation) --- это преобразование, при котором устраняются промежуточные результаты вычислений (например, можно сначала возвести каждый элемент вектора в квадрат, а потом их сложить, а можно сразу складывать и одновременно возводить в квадрат, экономя одновременно и время, и память). Предлагается разработать и реализовать дефорестацию для векторного языка. Предполагается, что это будет сделать довольно просто.
5.2. Статическая и динамическая семантика
В настоящий момент для векторного языка существует эталонный интерпретатор и кое-как написанный эвристический вывод типов. Существует ряд гипотез, которые пока никак не подтверждены (и не опровергнуты) (например, что возможен полностью автоматический вывод типов).
Предлагается аккуратно заполнить существующие пробелы --- описать формальную семантику языка и правила типизации, и доказать (или опровергнуть) гипотезу о выводе типов. В случае, если гипотеза окажется верна, разработать алгоритм вывода типов и доказать его корректность,если нет --- дополнить язык минимальным набором типовых аннотаций.
5.3. Оптимизирующие преобразования
Предлагается реализовать ряд оптимизирующих преобразований как для исходного, так и для промежуточного представления --- константные вычисления, экономию общих подвыражений, устранение кортежей и т.д.