. Я должен был написать пару слов о Scala, для чего задал пять вопросов Мартину Одерски. Но, поскольку в Компьютерру материалы о Scala не попыли, то я решил задать Мартину еще несколько вопросов. Результат можно увидеть на моей страничке:
eao197,
MO> ... Some areas of interest are concurrency and distribution, pluggable types, staging, virtual classes, and new forms of packagings. Some of this might make it into a future Scala release, but it is far too early to tell.
Много непонятных терминов. Мой поиск, начавшийся где-то 4 месяца назад дал непустые результаты только для staging и virtual types.
Staging это концепция метапрограммирования, впервые реализованная в MetaML. Пример того, как это работает там:
# val triple = (3 + 4, <3 + 4>, lift 3 + 4);
val triple = (7, <3 %+ 4>, <7>) : (int * <int> * <int>)
# fun f (x, y, z) = <8 - ~y>;
val f = fn : ('a * <int> * 'b) -> <int>
# val code = f triple;
val code = <8 %- (3 %+ 4)> : <int>
# run code;
val it = 1 : int
Выражение <e> строит кусок кода, который является представлением e (quotation). Выражение ~e сплайсит код, полученный вычислением e в тело выражения, заключённого в угловые скобки (то есть ~e легально только внутри выражения в угловых скобках). lift e вычисляет e и строит представление результата вычисления. run e вычисляет e чтобы получить кусок кода, а потом вычисляет этот кусок.
Virtual classes — это обобщение виртуальных функций. Представьте себе, что в базовом классе определён внутренний виртуальный класс, который может быть переопределён в потомках подобно тому, как виртуальный метод может быть переопределён в потомках. Примером может служить следующий код
class Graph {
class Node {
Edge connect(Node other) { return new Edge(this, other); }
}
class Edge {
Node from, to;
Edge(Node f, Node t) { from = f; to = t; }
}
}
Теперь класс ColouredGraph наследует от также мемберов Node и Edge, и может расширять их:
class ColouredGraph extends Graph {
class Node {
Colour nodeColour;
}
}
Теперь новое поле nodeColour добавлено к классу Node, унаследованного от Graph. Клёво, не правда ли?
Эта штуковина не имеет аналогов ни в одном из мэйнстримовых языков, более того, в экспериментальных языках таких как Beta, gBeta, Concord, .FJ, Jx, Caesar и других реализация не является полностью типобезопасной и создать такую систему типов, в рамках которой можно было бы создать виртуальные классы, является нехилой проблемой в теории типов.
Пример возникающих сложностей: предположим, что в раскрашенном графе мы хотим иметь возможность соединять только раскрашенные вершины, но наивная реализация виртуальных классов легко позволяет нам сделать такое.
Graph.Node n = new Graph.Node();
Graph.Node cn = new ColouredGraph.Node();
n.connect(cn); // ???
Следовательно надо иметь возможность различать классы g1.Node и g2.Node для различных графов g1 и g2. И сделать это статически весьма непросто.
В системе типов (надмножество системы типов vObj) Скалы есть projection types, являющихся некоторым приближением к идеалу. Создать же true virtual classes в Скале мешают как теоретические проблемы, так и JVM, так как для успеха Скалы необходимо сохранить двустороннюю совместимость с Java.
Для интересующихся вот статьи: Tribe: more types on virtual classes — система типов Tribe — некоторое приближение к VC Scalable component abstractions — система типов vObj и реализация в Scala On the (un)reality of virtual types — какие проблемы, и как они решаются в (сюрприз!) Ocaml
Здравствуйте, EvilChild, Вы писали:
E>>Disclaimer. Я уже не являюсь приверженцем Scala и довольно сильно подзабыл этот язык. EC>А можешь рассказать почему?
Последние пару лет я искал язык в качестве замены C++. Таковым мог бы стать Eiffel, если бы не маркетинг его создателя. Или Scala, поскольку программирование на Scala чем-то напоминает программирование на Ruby.
Но я искал более простой язык, чем C++. Который был бы хорошо понятен мне и которому я мог бы учить своих коллег. Пока Scala для меня таковым не является. Некоторые подробности см. http://www.rsdn.ru/Forum/Message.aspx?mid=2422251&only=1
Кроме того, мои задачи более близки к низкоуровневому программированию. Например, насколько востребованны будут функции высшего порядка, лямбды и паттерн-матчинг в задачах эффективной обработки ввода/вывода или реализации таймерных событий -- очень большой вопрос.
Ну и еще один важный фактор -- для того, чтобы безболезнено продолжать свои текущие проекты мне нужны новые версии ObjESSty и SObjectizer-а. Как сделать эти версии, скажем, на D я себе представляю, а вот как на Scala -- нет.
Так что я пока не вижу таких достоинств Scala, которые бы оправдали ее сложность в моих условиях и на моих проектах.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
MO>> ... Some areas of interest are concurrency and distribution, pluggable types, staging, virtual classes, and new forms of packagings. Some of this might make it into a future Scala release, but it is far too early to tell.
LCR>Много непонятных терминов. Мой поиск, начавшийся где-то 4 месяца назад дал непустые результаты только для staging и virtual types.
Здравствуйте, EvilChild, Вы писали:
E>>Кроме того, мои задачи более близки к низкоуровневому программированию. Например, насколько востребованны будут функции высшего порядка, лямбды и паттерн-матчинг в задачах эффективной обработки ввода/вывода или реализации таймерных событий -- очень большой вопрос. EC>А что смущает? Виртуальным функциям и шаблонам применение нашлось, чем перечисленные тобой возможности хуже?
Они не хуже, они другие. С одной стороны, они требуют другого подхода к проектированию. Причем в тех областях, где раньше обычного C с классами хватало с лихвой. Так что уже не факт, что подобное перепроектирование будет оправдано. Кроме того, все это работает в управляемых средах, а в низкоуровневых вещах часто приходится опускаться на уровень ОС. Мне как-то довелось делать реализацию генератора таймерных событий для Linux-а и для Windows. Реализация под Windows работала на уровне чистого WinAPI, в linux-е использовался select, но и реализация там была менее точная. Вот и есть опасение, что будут лишне приключения по подключению к JVM кусков C-шного кода через JNI, а все эти высокоуровневые функциональные фишки не будут восстребованы. Кроме того, еще большой вопрос, насколько эффективны будут реализации на Scala и JVM вещей типа SObjectizer, если посмотреть на тесты Language Shootout, то Scala изрядно проигрывает D и C++.
Я делал как-то построение отчетов по РСУБД на Ruby -- там основные расчеты как раз на блоках кода строились. Вот здесь Scala-вские лямбды бы были в тему. Но это отнюдь не низкоуровневые задачи.
E>>Так что я пока не вижу таких достоинств Scala, которые бы оправдали ее сложность в моих условиях и на моих проектах. EC>Так замена C++ была найдена? Это D?
Пока да, D. Но до реального начала использования D в критически-важных проектах пройдет еще изрядное количество времени. Так что время может все переиграть, и не один раз.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
>MO: Scala является основной частью работы почти 10 человек: меня, 2-х кандидатов наук и 7-х аспирантов.
ахринеть! Немерлу бы такие ресурсы!
Вообще, 10 full time vs. 2 по остаточном приципу, а результат в лучшем случае паритетный. У F#-щиков 2 разработчика full time. А результат тоже похожий. Неясно почему Скала с такими ресурсами не выбилась в лидеры в желтой майке.
ЗЫ
Лучше бы прям суда запостил. Ведь народ поиском пользуется и может пропустить это сообщение.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, eao197, Вы писали:
>>MO: Scala является основной частью работы почти 10 человек: меня, 2-х кандидатов наук и 7-х аспирантов.
VD> ахринеть! Немерлу бы такие ресурсы!
Да, и желающих приглашают участвовать (за нормальную зарплату!)
VD>Вообще, 10 full time vs. 2 по остаточном приципу, а результат в лучшем случае паритетный. У F#-щиков 2 разработчика full time. А результат тоже похожий. Неясно почему Скала с такими ресурсами не выбилась в лидеры в желтой майке.
Ну тебе кажется что похожий. А так Scala уже в версии 2.4, в отличие от Nemerle (0.9.3.x) и F# (1.1.x).
Хм, вон оно как! Ведь была статья на эту тему: "Static typing where possible, dynamic typing when needed", просто термин был optional types, а не pluggable types.
Здравствуйте, eao197, Вы писали:
E>Кроме того, мои задачи более близки к низкоуровневому программированию. Например, насколько востребованны будут функции высшего порядка, лямбды и паттерн-матчинг в задачах эффективной обработки ввода/вывода или реализации таймерных событий -- очень большой вопрос.
А что смущает? Виртуальным функциям и шаблонам применение нашлось, чем перечисленные тобой возможности хуже?
Я не собираюсь ни в чём переубеждать, просто интересно.
E>Так что я пока не вижу таких достоинств Scala, которые бы оправдали ее сложность в моих условиях и на моих проектах.
Так замена C++ была найдена? Это D?
now playing: Vicious Circle & Universal Pro — Workout