Лекция №12Языки программирования. Метапрограммирование
Одним из ключевых аспектов конструирования программного обеспечения является использование определенного языка (или языков) программирования, с помощью которых описывается цель программы и, при условии императивного подхода, способ ее достижения. В лекции рассматриваются языки программирования и функции, которые они выполняют в разработке. Также уделено внимание метапрограммированию (другое название: порождающее программирование) — парадигме, в которой языки программирования играют ключевую роль.
Языки программирования характеризуются тремя основными аспектами:
- синтаксисом (внешняя форма языка, его допустимые конструкции);
- семантика (смысл конструкций языка);
- реализацией.
Синтаксис ЯП изучается в других областях информатики; для программной инженерии главный интерес представляет семантика языка. Семантика не только определяет правила трансляции языка в машинный код, она может использоваться, например, для доказательства корректности программ с помощью логики Хоара.
Важной составляющей семантики языка программирования является его система типов. Тип определяет допустимые действия над переменной, позволяя избежать ошибок и сделать программу более понятной для человека. В языках со статической типизацией (Java, C/C++, C#) правила, касающиеся типов, проверяются на этапе компиляции; в случае динамической типизации (Python, PHP, JavaScript) эти правила проверяются непосредственно во время выполнения программы. Типизация также может быть строгой или слабой в зависимости от того, насколько ограничивающими являются правила согласования типов. Например, в Python запрещено складывать строки и числа, и в этом смысле этот ЯП строже, чем Java и C++.
Теория языков программирования используется в порождающем программировании для создания предметно-ориентированных языков (domain-specific language, DSL). Основная идея DSL: язык с семантикой, упрощенной по сравнению с языком программирования общего назначения, может быть более эффективным при использовании в конкретной предметной области. Примеры DSL:
- SQL для работы с реляционными базами данных;
- TeX/LaTeX для компьютерной верстки;
- HTML и CSS для отображения веб-страниц.
Предметно-ориентированные языки реализуют принцип разделения ответственностей (separation of concerns), лежащий в основе проектирования программных систем. DSL проектируются так, чтобы их можно было использовать профильным специалистам, достаточно далеким от программирования. Код на предметно-ориентированном языке сосредотачивает в себе логику приложения; программистам остается наладить взаимодействие между DSL и системой.