Есть много языков, которые имеют модульные системы.Три, которые сразу приходят на ум, - это модульная система Standard ML, единичная система Racket и модульная система Newspeak.
Некоторые из них считаются либо более мощными, либо лучше разработанными (или и тем, и другим)чем OSGi или подобные системы.
Мне особенно нравится модульная система Newspeak из-за ее невероятной простоты.На самом деле, у Newspeak даже нет системы модулей, просто получается, что если вы серьезно относитесь к объектной ориентации , классы автоматически становятся определениями модулей, а объекты автоматически становятся модулями.
Это освежающий контраст с другими модульными системами, такими как Standard ML, Racket или OSGi, которые обычно безумно сложны.Вот приятная и забавная цитата Джонатана Шапиро, дизайнера языка программирования BitC о разработке модульной системы:
Модульная система ML полностью понятна только Дэвиду МакКуину и только через несколько недель,Для достижения модульной системы Схема потребовалось объединенное великолепие Мэтта Флатта и Матиаса Феллайзена (и шесть пересмотров языкового стандарта).
И когда спросили Саймона Пейтона Джонса, одного из дизайнеров Haskell,почему у Haskell есть только такая базовая модульная система, он сказал, что они не считают себя достаточно умными, чтобы создать настоящую.Пусть это утонет в ... конструкторах Haskell . Не умный .
Дизайн Newspeak совершенно блестящий: в объектной ориентации все - отправка сообщения (на Java-языке это вызов (не статичный) метода, на C ++ - речь)это вызов виртуальной функции).В большинстве объектно-ориентированных языков это, к сожалению, не так.У вас есть переменные, поля, константы, не виртуальные функции, статические методы, словарь классов, словарь пакетов и так далее.Доступ к любому из них осуществляется не с помощью отправки сообщения, а с помощью других средств.
Не так на Newspeak: в Newspeak все является отправкой сообщения.Даже суперкласс класса - это отправка сообщения.(То есть: если я пишу class Foo extends Bar
в Newspeak, то Bar
- это , а не - ссылка на сам класс, он просто вызывает метод с именем Bar
, который затем возвращает класс.КСТАТИ означает, что вы можете переопределить суперклассы в подклассах, что очень ошеломляет.)
Это означает, что классы верхнего уровня не могут иметь суперкласс: поскольку суперкласс - это отправка сообщения, куда вы его отправите?В классе верхнего уровня вы можете вызывать только те методы, которые определены в самом классе: вы не можете вызывать методы из охватывающей области, поскольку в классе верхнего уровня нет охватывающей области.И вы не можете вызывать методы, унаследованные от суперкласса, потому что для объявления суперкласса вам потребуется вызвать метод, но вы можете вызывать только методы, определенные внутри класса.
Теперь это не очень полезно, поэтому классы имеют инициализаторы классов, которые позволяют вам вводить объекты (а классы являются объектами) в класс.И это only способ внедрения зависимостей в класс, поэтому функции инициализатора класса являются спецификацией зависимостей модуля.
С другой стороны, если единственный способ сделать что-то - это черезпосле отправки сообщения внутренняя часть класса автоматически становится закрытой, ее функциональность может быть достигнута только путем вызова открытых методов.Ergo, общедоступные методы функционируют как спецификация интерфейса модуля.
Несколько других интересных функций также естественным образом вытекают из этого.Функции, которых нет во многих других модульных системах: поскольку модуль на самом деле является просто классом, вы можете иметь несколько экземпляров модуля, просто вызывайте конструктор несколько раз, как и в любом другом классе.Во многих других модульных системах модули являются одиночными.
Кроме того, вы можете передавать аргументы конструктору, тем самым предоставляя вам параметризованные модули, которые обычно поддерживаются только очень продвинутыми модульными системами, если вообще используются.