Pull to refresh
35
0
Антон Гуща @NCrashed

User

Send message
Пример взят отсюда, тестирование read-write mutex (сорри, что код на D, но в данном случае от джавы почти не отличается):
    //...
    void readerFn()
    {
        synchronized (mutex.reader)
        {
            atomicOp!"+="(numReaders, 1);
            rdSemA.notify();
            rdSemB.wait();
            atomicOp!"-="(numReaders, 1);
        }
    }

    void writerFn()
    {
        synchronized (mutex.writer)
        {
            atomicOp!"+="(numWriters, 1);
            wrSemA.notify();
            wrSemB.wait();
            atomicOp!"-="(numWriters, 1);
        }
    }

    // ...

    scope group = new ThreadGroup;

    // 2 simultaneous readers
    group.create(&readerFn); group.create(&readerFn);
    rdSemA.wait(); rdSemA.wait();
    assert(numReaders == 2);
    rdSemB.notify(); rdSemB.notify();
    group.joinAll();
    assert(numReaders == 0);
    foreach (t; group) group.remove(t);


А проблем тестирования самих акторов в случае с isolated mutability я не вижу, нужно тестировать реакцию на различные сообщения независимо от наличия очереди, точно так же как в однопоточном варианте.


Согласен, когда тестируется внешний API, тесты написать гораздо легче, чем для других методов. Но если юниттесты проверяют правильность общения между воркерами, то там можно напороться на эту особенность.
В остальных методах можно поставить дебажные мьютексы в ключевых местах и после успешного прохождения ассерта отпускать тестируемые потоки. С isolated mutability так сделать сложно, заблокированный worker все еще будет иметь необработанные сообщения в очереди.
Замечание из личного опыта: Isolated mutability гораздо сложнее покрыть тестами, нужно учитывать, что сообщения могут скапливаться в очередях и собранные с акторов мгновенные значения (например, количество обслуживаемых подключений) могут не совпадать с ожидаемыми (сумма активных и неактивных соединений может быть не равна общему числу соединений, как пример).
Тем не менее, Facebook экспериментирует не только с PHP. Совсем недавно они начали использовать D как бекэнд.
Скорей всего, для ушей скриптово записано каждые N секунд проигрывать анимацию.
Из реалистичных космосимов есть Orbiter, жалко, что только под Win.
Каждый ваш пост греет душу.

А существует серьезное ПО для моделирования таких космических программ? (На ум приходят только Celestia и Kerbal Space Program) Было бы интересно покрутить все эти марсианские программы в модели, поизучать, повысаживаться на Марс.
… but the content of the prediction stays hidden until after the fact

Прогноз не публикуется, иначе доказать содеянное затрудительно.
То, что эта реализация пока работает только под win32, написано в этом issue.
Давно пора было подобное устроить. Многие баги могли висеть в трекере месяцами, правились самые критичные и те, за которые проголосовало много людей.

Важное добавление: чтобы исправить большинство багов, нужно копаться в исходниках компилятора, которые написаны на С++.
Некоторые решения оперировали с ascii отображением этого одномерного массива. Расширяя входные данные до двумерного массива, придется рисовать трехмерное отображение для такого алгоритма.
Реализация на Haskell:
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]


Версия для Data.Vector (все же эффективнее) с дебажным выводом массива.
Нужен аппаратный аудит, специальный чип на плате, который будет непрерывно анализировать оперативку на наличие в бинарниках закладок.
в любой программном средстве написанном на компилируемых языках.


Что мешает сделать бинарный вирус для интерпретатора, который будет неявно добавлять закладку в текущую исполняемую программу? Тем более интерпретатор кто-то скомпилировал, даже если интерпретатор интерпретируется другим интерпретатором или мы имеем цепочку интерпретаторов, интерпретирующих следующий за ними интерпретатор, то проблема «начального» интерпретатора остается открытой. Нам нужен интерпретатор самоинтерпретируемый, который существует и существовал всегда…
Никогда не думал, что это может быть проблемой, но факт: пол-часа на сборку проекта. На весьма нехилом железе с кучей ядер и сверхбыстрой СХД снизу. Лично меня, после первых моментов гордости «ух ты, у нас наша программа аж пол-часа компилируется» это начало раздражать, потому что мелкий багфикс, и здравствуй, сцена:


GHC или Cabal умеют в инкрементальную сборку? Это могло бы намного ускорить компиляцию при мелких фиксах.
Наконец то нашел подробный материал по Rust, спасибо вам. После прочтения сложилось впечатление, что идеологии Rust и D очень схожи: Erlang-like многопоточность, строгий следящий за shared состояниями компилятор, разделение кода на unsafe и safe.
Давно не работал с C++, но скомпилировать получилось вот такой вариант:
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

auto rand_generator(unsigned seed) -> function<unsigned (void)>
{
  return [=]() mutable
  {
    seed = seed * 1103414245 + 12345;
    return ((seed /0x10000) * seed) >> 16;
  };
}

int main()
{
  vector<unsigned> numbers;
  generate_n(back_inserter(numbers), 10, rand_generator(1337));

  for( vector<unsigned>::const_iterator i = numbers.begin(); i != numbers.end(); ++i)
    cout << *i << ' ';

  return 0;
}


Без «trailing return type» ни gcc 4.8, ни vs2012 компилировать не хочет. Также хочу узнать, существует ли способ вывести вектор на экран лучше, чем лобовым циклом?

Просто для сравнения, аналогичная программка на D, просто для сравнения синтаксиса языков, по мне C++11 лямбды очень многословны:
import std.range;
import std.stdio;
import std.algorithm;

auto rand_generator(uint seed)
{
	return ()
	{
		seed = seed * 1103414245 + 12345;
		return ((seed / 0x10000) * seed) >> 16;
	};
}

int main()
{
	writeln( repeat(rand_generator(1337), 10).map!(x => x()) );
	return 0;
}


Да, новые лямбды в C++11 можно назвать Voldemort типами. Однако в D они обычно являются структурами, с ними удобнее работать, чем с лямбдами, и структуры не выделяют память в куче.
в компайл-тайме — меткой «unspecified-type» в документации (например), чего вполне достаточно.


Так речь идет о внезапной возможности решить проблему более элегантным способом, итого из пространства имен целиком убираются вспомогательные вещи, которые в идеале должны быть доступны только реализации.
Первый случай не пройдет со структурами, а Implements я нигде не могу найти в Phobos, а вроде очень полезная вещь.
Такая фича сделала бы много пользы, например, я столкнулся с проблемой проверки наличия определенных методов у структур при реализации compile-time бекэндов для велосипедного сериализатора. Это можно сделать и специальным шаблоном, который в guarding выражениях проверит наличие методов, но через такой синтаксический сахар намного меньше monkey job.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Registered
Activity