LINUX.ORG.RU

Парни из Ричмонда разработали язык Fan на замену C# и Java

 , , , ,


0

0

Устав переписывать программы с Java на C# и обратно, группа лиц разработала новый практичный язык программирования, который предназначен для написания программ в легкой и непринужденной, веселой (fun) манере.

Программы на языке Fan можно запускать как скрипты в браузере (аналогично JavaScript), так и как обычные скрипты (аналогично bash/perl) или десктопные приложения (.exe, elm)

Программы компилируются в промежуточный код fcode, который затем в рантайме транслируется либо в байткод JVM, либо в IL, в зависимости от того, в какой виртуальной машине запустили программу. Также fcode позволит в будущем написать транслятор в Parrot, Object-C либо LLVM.

>>> Подробности

★★★★★

Проверено: Shaman007 ()

Ответ на: комментарий от thevery

> это вы ещё java -server не пробовали ;)

на том ноутбуке java итак серверная [см. в конце] :)

dave ★★★★★
()
Ответ на: комментарий от anonymous

>Вы что, все тупые? тест бажный, сделайте как я писал выше, и сравните результаты

Он не бажный, он сферический. Если начать его исправлять как будто нам действительно нужно число Фибоначи - то ничего не останется.

legolegs ★★★★★
()

Уф.. устал читать вашу переписку , много букв . Вижу вы тут все тестируете яву на выделение памяти. А помните ли вы что в некоторых случаях java-программа жрет на порядок больше памяти, если ее писать в лоб как кальку с c++. Когда-то давно я делал тесты , получалось, что обычны класс: class Empty { } Emty e = new Emplt();

занимает 8 байтов памяти . Чтобы это проверить создайте много таких объектов (массив ) и замерьте общую память до создании и после ,поделите на количество.

а : class Empty { byte b = 0; }

занимает 8 + 1= 16 байтов(выравнивание ) памяти. Т.е в java иногда выделяется в 16 раз больше памяти чем в c++.

Особенно хорошо это видно , например на библотеки poi. Она читает excel -файлы . Что есть excel файл - это огромный массив ячеек разного типа , причем данных для каждой ячейки бывает по несколько байт всего . poi пытается создать объект для каждой ячейки и загрузив файл в 40 мб размером в памяти занимает 800 мб . C++ совские(и сишные тоже) приложения этим не страдают , так в к структуре не прибавляется 8 байт да и выравнивания нет .. Поэтому поле загрузки в excell или в OF он занимает в памяти примерно столько же . Отсюда вывод - в ява нельзя создавать объекты для маленьких структур если их очень много , нужно использовать менее удобные структуру данных - например просто масив байтов(тогда будет прогрышь по скорости доступа кним). Т.е если даный пример - загрузка excell файла запрограммировать в лоб на c++ и на java, то с++ однозначно выиграет . Нужно для java будет писать другой код, а вообще java не очень удобен для подобных задач - отсутствие структур иногда не есть гуд .

P.S. Я ява-разработчик ..

anonymous
()
Ответ на: комментарий от anonymous

насчет -server я не понял .

# java

Usage: java [-options] class [args...] (to execute a class) or java [-options] -jar jarfile [args...] (to execute a jar file) where options include: -d32 use a 32-bit data model if available -d64 use a 64-bit data model if available -server to select the "server" VM The default VM is server.

-cp <class search path of directories and zip/jar files> -classpath <class search path of directories and zip/jar files> A : separated list of directories, JAR archives, and ZIP archives to search for class files. -D<name>=<value> ....

Получается что по дефолту он итак включен . и на сановской и на яве из репозитория

anonymous
()
Ответ на: комментарий от dave

> У твоего диспетчера есть огромный недостаток. Он жрет и не отдает память, пока явно не будет вызван cleanUp(). В "реальной жизни" это иногда неприемлемо.

Спасибо, Кэп!

Я тебе даже больше скажу. У моего диспечера ещё и проблемы с многопоточностью. Только все они устранимы если нужно. У явы всего один нетерпимый недостаток - тормоза безбожные. Но он, к сожалению, никак не устраним.

AndreyKl ★★★★★
()
Ответ на: комментарий от AndreyKl

Положил примерно миллион объектов в память.

Результаты для двух циклов для сорок второго числа:

java, лучший результат 14 мин 56 сек (896 сек) с++, лучший результат 2 мин 46 сек (164 сек)

итого с++ в 5.46 раз быстрее.

ниже исходники для тестирования

ява (запускать примерно так time /usr/lib/jvm/java-6-sun/bin/java -Xmx1073741824 FibObj3)


class FibObj3
{
    private int _value;
    private FibObj3 _prev1;
    private FibObj3 _prev2;
    private int[] _foo = new int[20];
    static private FibObj3[] _list = new FibObj3[1000000];
    static private int _ind = 0;
    
    private final void addObj(FibObj3 obj) {
	FibObj3._list[FibObj3._ind] = obj;
	FibObj3._ind++;
	if(FibObj3._ind >= 1000000) {
	    FibObj3._ind = 0;
	}
    }

    private final void _init(int n)
    {
        _prev1 = new FibObj3(n-1);
        addObj(_prev1);
        _prev2 = new FibObj3(n-2);
        addObj(_prev2);
    }

    private final void _free()
    {
        _prev1 = null;
        _prev2 = null;
    }

    FibObj3(int n)
    {
        _value = n;

        for(int i=0; i<20; i++)
            _foo[i] = 0;
    }

    public int value()
    {
        if(_value <= 2)
            return 1;

        _init(_value);
        int res = _prev1.value() + _prev2.value() + _prev1.foo() + _prev2.foo();
        _free();
        return res;
    }

    public int foo()
    {
        int sum = 0;
        for(int i=0; i<20; i++)
            sum += _foo[i];

        return sum;
    }
       
    public static void main(String[] argv)
    {
        for(int i=0; i<2; i++)
        {
            FibObj3 x = new FibObj3(42);
            System.out.println(x.value());
        }
    }
}

c++ (компилять так: g++ -O3 -march=native -o 5 5.cpp)


#include <stdio.h>

#define SIZE 20

#include <stdio.h>
#include <sys/types.h>
#include <iostream>
#include <string.h>

#define POOLSIZE 1000100
#define LIST_SIZE 1000000

class FibObj2
{
  private:
     int _value, _foo[SIZE];
     FibObj2 *_prev1, *_prev2;

    void _init(int n)
    {
        _prev1 = new FibObj2(n-1);
        _prev2 = new FibObj2(n-2);
    }

    void _free()
    {
        delete(_prev1);
        delete(_prev2);
    }

  public:
    FibObj2(int n)
    {
        _value = n;
        for(int i=0; i<SIZE; i++)
            _foo[i] = 0;
    }

    int value()
    {
	if(_value < 3)
	    return 1;
        _init(_value);
        int res = _prev1->value() + _prev2->value() + _prev1->foo() + _prev2->foo();
        _free();
        return res;
    }

    int foo()
    {
        int sum = 0;
        for(int i=0; i<SIZE; i++)
            sum += _foo[i];
        return sum;
    }
    
    inline void* operator new (size_t size);
    inline void operator delete (void* pointerToDelete);
};


class MemoryManager {
  unsigned int totalInMemory;
  
  FibObj2 *list[LIST_SIZE];
  unsigned int ind;

  struct FreeStore {
     FreeStore *next;
  };
  FreeStore* freeStoreHead;
  
  void addObject(FibObj2 * fo) {
    if(list[ind] != 0) 
	free_(((void*)(list[ind])));
    list[ind] = fo;
    ind++;
    if(ind >= LIST_SIZE) ind = 0;
  }

  public:
    unsigned int totalInMemoryMax; 
    MemoryManager () {
      freeStoreHead = 0;
      totalInMemory = 0;
      totalInMemoryMax = 0;
      ind = 0;
      for(unsigned i = 0; i < LIST_SIZE; i++) list[i] = 0;
      expandPoolSize ();

    }
    virtual ~MemoryManager () {
    	for(unsigned i = 0; i < LIST_SIZE; i++) {
	    if(list[i] != 0) 
		free_((void*)list[i]);
	    list[i] = 0;
	}
      cleanUp ();
      
    }

    inline void* allocate(size_t size) {
      if (0 == freeStoreHead)
        expandPoolSize ();

      FreeStore* head = freeStoreHead;
      freeStoreHead = head->next;
      
      totalInMemory++;
      if(totalInMemoryMax < totalInMemory) totalInMemoryMax = totalInMemory;
      

      return head;
    }
    

    inline void free(void* deleted) {
      addObject((FibObj2*)deleted);
    }
    
    inline void free_(void* deleted) {
      FreeStore* head = static_cast <FreeStore*> (deleted);
      head->next = freeStoreHead;
      freeStoreHead = head;
      totalInMemory--;
    }


    void expandPoolSize () {
      std::cout<<"expanding\n";
      size_t size = (sizeof(FibObj2) > sizeof(FreeStore*)) ? sizeof(FibObj2) : sizeof(FreeStore*);
      FreeStore* head = reinterpret_cast <FreeStore*> (new char[size]);
      freeStoreHead = head;

      for (unsigned int i = 0; i < POOLSIZE; i++) {
        head->next = reinterpret_cast <FreeStore*> (new char [size]);
        head = head->next;
      }

      head->next = 0;
      std::cout<<"expanded\n";
    }

    void cleanUp() {
      FreeStore* nextPtr = freeStoreHead;
      for (; nextPtr; nextPtr = freeStoreHead) {
        freeStoreHead = freeStoreHead->next;
        delete [] nextPtr; // запомните, это был числовой массив
      }
    }
    
};

MemoryManager gMM;

void* FibObj2::operator new (size_t size) {
  return gMM.allocate(size);
}

void FibObj2::operator delete (void* pointerToDelete) {
  gMM.free(pointerToDelete);
}


int main()
{   
    for(int i=0; i<2; i++)
    {
        FibObj2 *x = new FibObj2(42);
        printf("n=%d\n", x->value());
        delete(x);
    }
    
    std::cout<<"total was "<<gMM.totalInMemoryMax<<" objects in memory\n";
    return 0;
}


AndreyKl ★★★★★
()
Ответ на: комментарий от AndreyKl

не смухлюешь - не потестишь, ё-моё.

java, лучший результат 14 мин 56 сек (896 сек) с++, лучший результат 2 мин 46 сек (>166< сек)

итого с++ в >5.40< раз быстрее.

AndreyKl ★★★★★
()
Ответ на: комментарий от legolegs

>Отчего-же?

Не-а, это у тебя другая задача решается :) Где функции инициализации и освобождения?

>Нужно другое тестовое задание, такое чтоб нельзя было ничего выкинуть без изменения результата.

Ага, уже придумал, как.

KRoN73 ★★★★★
()
Ответ на: комментарий от AndreyKl

Однако, несмотря на гораздо большую близость к реальности, тест всё-таки искусственный, потому что в памяти одновременно находится (для 42го числа) не более 81 объекта, что, согласитесь, несколько далеко от реальности.

Я сперва делал вариант, где _prev инициировались в конструкторе. Но тогда памяти нифига не хватает :)

...

Чёрт, сейчас сишный тест умудрился запустить на удалённой машине без ulimits :D Сожрало полтора гига памяти и еле-еле убилось :)

...

А, ну да, я э деструктор не добавил... Хм. А с деструктором сегфолтится на третьем(!) цикле...

Где что не так (foo пока для простоты выкинуты)?

class FibObj2
{
  private:
     int _value, _foo[SIZE];
     FibObj2 *_prev1, *_prev2;

  public:
    FibObj2(int n)
    {
        _value = n;

        if(n < 3)
            return;

        _prev1 = new FibObj2(n-1);
        _prev2 = new FibObj2(n-2);
    }

    ~FibObj2()
    {
        delete(_prev1);
        delete(_prev2);
    }

    int value()
    {
        if(_value < 3)
            return 1;

        return _prev1->value() + _prev2->value();
    }
};

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

затрудняюсь ответить что не так, но в любом случае по поему мой тест выше - лучше. Там можно прямо задавать сколько объектов держать в памяти.

AndreyKl ★★★★★
()
Ответ на: комментарий от KRoN73

дык а почему нельзя использовать локальные переменные FibObj2 внутри value()??

int value()
{

if(_value < 3) return 1;

FibObj2 _prev1(_value-1), _prev2(_value-2);

return _prev1.value() + _prev2.value();

}


/waveM

anonymous
()
Ответ на: комментарий от Sikon

Модно. А еще модно петь заупокойную жабе, сейчас трендово иметь свой бложек, в котором можно грабить корованы и отпевать умершую жабу. Типа http://codemonkeyism.com/java-dead/

Karapuz ★★★★★
() автор топика
Ответ на: комментарий от Sikon

Results 1 – 10 of about 8,620,000 for java is dead.

Karapuz ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

у меня сиё не падает, кстати.


#include <iostream>

#define SIZE 20

using namespace std;

class FibObj2
{
  private:
     int _value, _foo[SIZE];
     FibObj2 *_prev1, *_prev2;

  public:
    FibObj2(int n)
    {
        _value = n;

        if(n < 3)
            return;

        _prev1 = new FibObj2(n-1);
        _prev2 = new FibObj2(n-2);
    }

    ~FibObj2()
    {
        delete(_prev1);
        delete(_prev2);
    }

    int value()
    {
        if(_value < 3)
            return 1;

        return _prev1->value() + _prev2->value();
    }
};

int main() {
	int n = 10;
	FibObj2 *f = new FibObj2(n);
	cout<<"fib("<<n<<") = "<<f->value()<<"\n";
	delete f;
	return 0;
}


AndreyKl ★★★★★
()
Ответ на: комментарий от anonymous

>ижу вы тут все тестируете яву на выделение памяти. А помните ли вы что в некоторых случаях java-программа жрет на порядок больше памяти, если ее писать в лоб как кальку с c++

У нас тут наоборот: c++ тормозит сильнее, чем жаба, если в лоб переписать 1 в 1 с неё.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

>Если начать его исправлять как будто нам действительно нужно число Фибоначи - то ничего не останется.

Естественно. Ибо останется только по тому же Бине посчитать:

int fib(int n) { return (int)(pow((1+sqrt(5))/2, n)/sqrt(5)+0.5); }

KRoN73 ★★★★★
()
Ответ на: комментарий от AndreyKl

>у меня сиё не падает, кстати.

А, понятно. Видимо, утыкается в ulimits. Сколько оно у тебя памяти отжирает?

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Где что не так (foo пока для простоты выкинуты)?

*** glibc detected *** /home/legolegs/programing/KRoN73/optimized/./src/kron73: double free or corruption (fasttop): 0x0000000030d221c0 ***

Правильнее так:

  FibObj2 ( int n )
  {
    if ( n < 3 )
    {
      _prev1 = 0;
      _prev2 = 0;
      return;
    }
    _value = n;

    _prev1 = new FibObj2 ( n - 1 );
    _prev2 = new FibObj2 ( n - 2 );
  }
legolegs ★★★★★
()
Ответ на: комментарий от AndreyKl

вот так не фолтится


    FibObj2(int n)
    {
        _value = n;
	_prev1 = _prev2 = 0;

        if(n < 3)
            return;

        _prev1 = new FibObj2(n-1);
        _prev2 = new FibObj2(n-2);
    }

    ~FibObj2()
    {
	if(_prev1) {
		delete(_prev1);
		delete(_prev2);
	}
    }

AndreyKl ★★★★★
()
Ответ на: комментарий от AndreyKl

>Положил примерно миллион объектов в память.

ИМХО - слишком много для практических задач. У нас едва сотня тысяч активных объектов на lineage2-сервере с парой сотен человек и 40 тыс. активных мобов было :) А на десктопе обычно и того меньше. Даже если, скажем, в медиаплейере _каждую_ песню моей коллекции загрузить в виде объекта (что уже маразм) - будет всего 12 тыс. объектов :)

KRoN73 ★★★★★
()
Ответ на: комментарий от AndreyKl

>_prev1 = _prev2 = 0;

Чёрт! Всё не привыкну, что Си++ с некоторых пор перестал обнулять переменные при инициализаци...

...

Ну, оно и память жрать! :D Уже на 4-м цикле >600Мб, так что убил от греха, не дожидаясь ухода в своп.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> _каждую_ песню моей коллекции загрузить в виде объекта (что уже маразм) - будет всего 12 тыс. объектов :)

Думаю, там как минимум будет несколько строковых объектов (титл, дескрипшн, теги) и время - то есть это уже 48 тыс. :)

AndreyKl ★★★★★
()
Ответ на: комментарий от KRoN73

а я для 42го числа запустил и даже не успел понять, что происходит. Пока пытался попасть в консоль, ядро убило мой браузер, а затем и виновника торжества :).

AndreyKl ★★★★★
()
Ответ на: комментарий от AndreyKl

>Думаю, там как минимум будет несколько строковых объектов (титл, дескрипшн, теги) и время - то есть это уже 48 тыс. :)

Ну, да. Но, согласись, что маразм :D

...

Блин, нужен тест, чтобы и простой(! - а то наши уже сильно усложнились - я не настолько всякие F# или Nemerle знаю, чтобы без ошибок легко переносить такие тесты) был, и память грузил, и объекты другие использовал. Пойду поломаю голову :)

KRoN73 ★★★★★
()
Ответ на: комментарий от AndreyKl

>а я для 42го числа запустил и даже не успел понять, что происходит

Там некоторые анонимусы (пора выключать их показ, или с ЛОРа опять валить) матерятся про небольшую глубину просмотра, но забывают про то, что это глубина дерева :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>Чёрт! Всё не привыкну, что Си++ с некоторых пор перестал обнулять переменные при инициализаци...

Он и не начинал.

legolegs ★★★★★
()
Ответ на: комментарий от KRoN73

Не знаю-не знаю. Вот этот вот явовский вполне прост и понятен.


class FibObj3
{
    private int _value;
    private FibObj3 _prev1;
    private FibObj3 _prev2;
    private int[] _foo = new int[20];
    static private FibObj3[] _list = new FibObj3[1000000];
    static private int _ind = 0;
   
    private final void addObj(FibObj3 obj) {
   FibObj3._list[FibObj3._ind] = obj;
   FibObj3._ind++;
   if(FibObj3._ind >= 1000000) {
       FibObj3._ind = 0;
   }
    }

    private final void _init(int n)
    {
        _prev1 = new FibObj3(n-1);
        addObj(_prev1);
        _prev2 = new FibObj3(n-2);
        addObj(_prev2);
    }

    private final void _free()
    {
        _prev1 = null;
        _prev2 = null;
    }

    FibObj3(int n)
    {
        _value = n;

        for(int i=0; i<20; i++)
            _foo[i] = 0;
    }

    public int value()
    {
        if(_value <= 2)
            return 1;

        _init(_value);
        int res = _prev1.value() + _prev2.value() + _prev1.foo() + _prev2.foo();
        _free();
        return res;
    }

    public int foo()
    {
        int sum = 0;
        for(int i=0; i<20; i++)
            sum += _foo[i];

        return sum;
    }
       
    public static void main(String[] argv)
    {
        for(int i=0; i<2; i++)
        {
            FibObj3 x = new FibObj3(42);
            System.out.println(x.value());
        }
    }
}

Нужно только менять 1000000 на то, что больше нравится по вкусу и будет счастье, по моему. Сча навояю с него для си++ копию.

AndreyKl ★★★★★
()
Ответ на: комментарий от legolegs

>М.б. с графами что-нибудь?

Так у нас граф почти и есть. Дерево же :)

...

Хочется что-то, что практически бы оправдало заведения массива в пару десятков элементов. А налепить объектов в память, в конце концов можно простым циклом. Типа, пересчитать все числа Фибоначчи до 33-го, не очищая память :) Кстати, мысль... Сейчас...

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Простой тест всегда можно оптимизировать на конкретном языке. В том-то и беда. Надо брать как тест реальные приложения, например сервер приложений на 100000 клиентов.

farafonoff ★★
()
Ответ на: комментарий от KRoN73

> В серии тестов для «hello world» результат воспроизводим

У меня (со второго раза и далее)

$ time java Hello
Hello World!

real 0m0.227s
user 0m0.168s
sys 0m0.040s

$ time mono hello.exe
Hello, World!

real 0m0.083s
user 0m0.076s
sys 0m0.008s

sv75 ★★★★★
()
Ответ на: комментарий от farafonoff

>Надо брать как тест реальные приложения

И тогда чтобы его повторить на каком-нибудь неизвестном тебе языке с непривычным синтаксисом придётся месяц только с ним разбираться :)

Увы, не катит. Если я не смогу на неизвестном мне до того языке написать тест за полчаса - тест для меня излишне сложен :)

KRoN73 ★★★★★
()
Ответ на: комментарий от AndreyKl

не, это просто так на си++ не переносится. тут ведь блин ссылки надо определять. Без мемори манагера не обойтись никак, если тупо переносить влоб.

AndreyKl ★★★★★
()
Ответ на: комментарий от Bohtvaroh

>Предлагаешь KRoN73 переписать серв линейки на всех возможных языках? :D

Это был бы тест - всем тестам тест :D

...

Можно даже проще - написать, например, высокопроизводительный web-сервер на всех языках. Хотя бы для одной статики :D

KRoN73 ★★★★★
()
Ответ на: комментарий от AndreyKl

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

AndreyKl ★★★★★
()
Ответ на: комментарий от Valeg

Я виноват, что у них на сайте так и сказано: Fan is designed as a practical programming language to make it easy and fun to get real work done

EASY and FUN

По русски это всегда переводилось как "легко и просто" или языком телеведущих "в легкой и непринужденной манере"

Karapuz ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Твоя ошибка как раз в этом. Чтобы хорошо программировать на языке надо иметь практику. Насмотрелся я на людей которые пишут на C++ как на паскале.

farafonoff ★★
()

Как вам такой вариант?

class FibObj3
{
    private int _value;
    private static FibObj3[] _fibs;
    private FibObj3 _prev1, _prev2;

    public final FibObj3 f1() { if(_prev1 != null) return _prev1; else return _prev1 = _load(_value-1); }
    public final FibObj3 f2() { if(_prev2 != null) return _prev2; else return _prev2 = _load(_value-2); }

    private final FibObj3 _load(int n) { if(_fibs[n] != null) return _fibs[n]; else return _fibs[n] = new FibObj3(n); }

    public final void reset() { _fibs = new FibObj3[_value]; }
    public final void resize()
    {
        FibObj3[] newFibs = new FibObj3[_value];
        System.arraycopy(_fibs, 0, newFibs, 0, _fibs.length);
        _fibs = newFibs;
    }

    FibObj3(int n)
    {
        _value = n;

        if(_fibs == null)
            reset();

        if(_fibs.length <= n)
            resize();
    }

    public int value()
    {
        if(_value <= 2)
            return 1;

        return f1().value() + f2().value();
    }

    public static void main(String[] argv)
    {
        for(int pass=0; pass<10; pass++)
        {
            for(int n=1; n<=40; n++)
            {
                FibObj3 x = new FibObj3(n);
                System.out.println(x.value());
            }
        }
    }
}

(pass - 10 проходов для большей точности).

Вычисляем 40 первых чисел подряд, опираясь на предыдущие значения. (Тут же ратовали некоторые за кеширование вычислений :)). И всяких foo нету (правда, массив данных статический, ну да фиг с ним) и со статикой дело, вроде, реальнее обстоит - если кто-то слепит статику в таком варианте - значит она в таких задачах вполне жизнеспособна :)

И повторить на других языках не особо сложно... Хотя - копирование массива при росте, чтобы не на тупом цикле... В ряде языков, боюсь, придётся много экспериментировать...

Хотя, опять же, блин - объектов одновременно мало :-/

...

Не... плохой тест :)

KRoN73 ★★★★★
()
Ответ на: комментарий от farafonoff

>Твоя ошибка как раз в этом. Чтобы хорошо программировать на языке надо иметь практику.

Это чтобы запрограммировать веб-сервер :) Потому тест и должен быть простым, чтобы поверхностно оценить базовые фишки языка.

А потом, если решение неудачно, то владеющие этим языком пришлют вариант получше. Или даже код компилятора подправят, как это (вроде бы) было в случае теста на D :)

KRoN73 ★★★★★
()
Ответ на: комментарий от AndreyKl

>Так что там, Крон, с новой твоей идеей? Выходит чего?

Вариантов 7 уже перепробовал. Надо что-то кардинальнее менять :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>Обсуждаемый вами фильм не видел, но типичный американский фильм говорит, что _все_ русские - плохие

А разве не так? Отсель опять грозить мы будем шведам, немцам, кокосам. http://nnm.ru/blogs/russouth/luchshiy_vid_na_etot_gorod_esli_sest_v_bombardir...

Karapuz ★★★★★
() автор топика

Нужен не тест. Нужна задача :) В которой по условию зафиксировать несколько базовых объектов средней сложности. Долгоживущих и с разумным количеством активных объектов в памяти. И при этом - несложная, чтобы воспроизводилась на незнакомых языках.

...

Задачка, блин :)

В голову лезут задачи коммивояжёра, поиска путей в лабиринте, расстановки ферзей... Всё не то, блин...

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> Вариантов 7 уже перепробовал. Надо что-то кардинальнее менять :)

Ясно, пора писать сервер :)

AndreyKl ★★★★★
()
Ответ на: комментарий от anonymous

>эекстелр тыой яебанейу коту11..?

И тебе чочо! 42fm.ru

Karapuz ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.