А проблем тестирования самих акторов в случае с isolated mutability я не вижу, нужно тестировать реакцию на различные сообщения независимо от наличия очереди, точно так же как в однопоточном варианте.
Согласен, когда тестируется внешний API, тесты написать гораздо легче, чем для других методов. Но если юниттесты проверяют правильность общения между воркерами, то там можно напороться на эту особенность.
В остальных методах можно поставить дебажные мьютексы в ключевых местах и после успешного прохождения ассерта отпускать тестируемые потоки. С isolated mutability так сделать сложно, заблокированный worker все еще будет иметь необработанные сообщения в очереди.
Замечание из личного опыта: Isolated mutability гораздо сложнее покрыть тестами, нужно учитывать, что сообщения могут скапливаться в очередях и собранные с акторов мгновенные значения (например, количество обслуживаемых подключений) могут не совпадать с ожидаемыми (сумма активных и неактивных соединений может быть не равна общему числу соединений, как пример).
А существует серьезное ПО для моделирования таких космических программ? (На ум приходят только Celestia и Kerbal Space Program) Было бы интересно покрутить все эти марсианские программы в модели, поизучать, повысаживаться на Марс.
Некоторые решения оперировали с ascii отображением этого одномерного массива. Расширяя входные данные до двумерного массива, придется рисовать трехмерное отображение для такого алгоритма.
water :: Integral a => [a] -> a
water vec = inwater 0 0 0 vec
where inwater ml mr ac vec
| length vec <= 1 = ac
| leftMax >= rightMax = inwater leftMax rightMax (ac + rightMax - last vec) (take (length vec - 1) vec)
| otherwise = inwater leftMax rightMax (ac + leftMax - head vec) (drop 1 vec)
where
leftMax = if head vec > ml then head vec else ml
rightMax = if last vec > mr then last vec else mr
main = putStrLn $ show $ water [2,5,1,3,1,2,1,7,5,6]
в любой программном средстве написанном на компилируемых языках.
Что мешает сделать бинарный вирус для интерпретатора, который будет неявно добавлять закладку в текущую исполняемую программу? Тем более интерпретатор кто-то скомпилировал, даже если интерпретатор интерпретируется другим интерпретатором или мы имеем цепочку интерпретаторов, интерпретирующих следующий за ними интерпретатор, то проблема «начального» интерпретатора остается открытой. Нам нужен интерпретатор самоинтерпретируемый, который существует и существовал всегда…
Никогда не думал, что это может быть проблемой, но факт: пол-часа на сборку проекта. На весьма нехилом железе с кучей ядер и сверхбыстрой СХД снизу. Лично меня, после первых моментов гордости «ух ты, у нас наша программа аж пол-часа компилируется» это начало раздражать, потому что мелкий багфикс, и здравствуй, сцена:
GHC или Cabal умеют в инкрементальную сборку? Это могло бы намного ускорить компиляцию при мелких фиксах.
Наконец то нашел подробный материал по Rust, спасибо вам. После прочтения сложилось впечатление, что идеологии Rust и D очень схожи: Erlang-like многопоточность, строгий следящий за shared состояниями компилятор, разделение кода на unsafe и safe.
Без «trailing return type» ни gcc 4.8, ни vs2012 компилировать не хочет. Также хочу узнать, существует ли способ вывести вектор на экран лучше, чем лобовым циклом?
Просто для сравнения, аналогичная программка на D, просто для сравнения синтаксиса языков, по мне C++11 лямбды очень многословны:
Да, новые лямбды в C++11 можно назвать Voldemort типами. Однако в D они обычно являются структурами, с ними удобнее работать, чем с лямбдами, и структуры не выделяют память в куче.
в компайл-тайме — меткой «unspecified-type» в документации (например), чего вполне достаточно.
Так речь идет о внезапной возможности решить проблему более элегантным способом, итого из пространства имен целиком убираются вспомогательные вещи, которые в идеале должны быть доступны только реализации.
Такая фича сделала бы много пользы, например, я столкнулся с проблемой проверки наличия определенных методов у структур при реализации compile-time бекэндов для велосипедного сериализатора. Это можно сделать и специальным шаблоном, который в guarding выражениях проверит наличие методов, но через такой синтаксический сахар намного меньше monkey job.
Согласен, когда тестируется внешний API, тесты написать гораздо легче, чем для других методов. Но если юниттесты проверяют правильность общения между воркерами, то там можно напороться на эту особенность.
А существует серьезное ПО для моделирования таких космических программ? (На ум приходят только Celestia и Kerbal Space Program) Было бы интересно покрутить все эти марсианские программы в модели, поизучать, повысаживаться на Марс.
Прогноз не публикуется, иначе доказать содеянное затрудительно.
Важное добавление: чтобы исправить большинство багов, нужно копаться в исходниках компилятора, которые написаны на С++.
Версия для Data.Vector (все же эффективнее) с дебажным выводом массива.
Что мешает сделать бинарный вирус для интерпретатора, который будет неявно добавлять закладку в текущую исполняемую программу? Тем более интерпретатор кто-то скомпилировал, даже если интерпретатор интерпретируется другим интерпретатором или мы имеем цепочку интерпретаторов, интерпретирующих следующий за ними интерпретатор, то проблема «начального» интерпретатора остается открытой.
Нам нужен интерпретатор самоинтерпретируемый, который существует и существовал всегда…GHC или Cabal умеют в инкрементальную сборку? Это могло бы намного ускорить компиляцию при мелких фиксах.
Без «trailing return type» ни gcc 4.8, ни vs2012 компилировать не хочет. Также хочу узнать, существует ли способ вывести вектор на экран лучше, чем лобовым циклом?
Просто для сравнения, аналогичная программка на D, просто для сравнения синтаксиса языков, по мне C++11 лямбды очень многословны:
Да, новые лямбды в C++11 можно назвать Voldemort типами. Однако в D они обычно являются структурами, с ними удобнее работать, чем с лямбдами, и структуры не выделяют память в куче.
Так речь идет о внезапной возможности решить проблему более элегантным способом, итого из пространства имен целиком убираются вспомогательные вещи, которые в идеале должны быть доступны только реализации.