25 июня 2008

Java vs D (проблемы практической педагогики)

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

Последним вариантом на сегодняшний день был язык D. К его богатым методическим возможностям можно отнести, в частности:

  • полноценную поддержку модулей с блоками инициализации и финализации;
  • функциональные приемы, такие как чистые функции и ленивые вычисления, не говоря уже о, ставших банальными, замыканиях;
  • параметрический полиморфизм с поддержкой вычислений во время компиляции;
  • надежное программирование на основе контрактов; поддержка модульного тестирования на уровне синтаксиса.
Кроме того, язык позиционируется как идейный наследник c++, что предполагает полноценную реализацию объектно-ориентированного подхода, перегруженных функций и операторов, шаблонов и т.д. с соответствующей производительностью, но в более однозначном и читабельном синтаксисе. Все это позволяет излагать технологии с качественными практическими примерами, и, при этом, не сталкиваться в конце семестра с отговорками вроде «не смог скомпилировать библиотеку». Кроме того, известен положительный опыт использования этого языка в высшем образовании.

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

Попытка привлечения нескольких языков для демонстрации всех важных подходов приводит к необходимости изучения нескольких стандартных библиотек, нескольких интегрированных сред и т.д., что в рамках одного курса трудновыполнимо.
В процессе поиска решения данных проблем, я вернулся к первоначальной идее изложения курса на основе Java. Собственно решение состоит в использовании трех языков, работающих в среде JVM, а именно Java, Groovy и Scala.

Язык Java является сильнотипизированным, поддерживает шаблоны и перегрузку функций, а главное, предлагает наиболее чистую реализацию объектно-ориентированного подхода в духе C++. Язык Groovy позволяет продемонстрировать утиную типизацию вместе с рядом функциональных возможностей, таких как анонимные функции и карринг.
Наконец, Scala реализует механизм сопоставления с образцом и ленивые вычисления.

Результаты компиляции всех трех языков совместимы на уровне байт-кода и работают в рамках одной библиотеки классов. Кроме того, напрашивается использование среды разработки Eclipse, которая является промышленным стандартом для многих разработчиков.

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

Комментариев нет: