ICFPC2006,VM на C# имеет право на жизнь?
UPD. Есть предложение обсуждать всё связанное с ICFPC в одном треде. Тогда будет понятно, кто, возможно, будет учавствовать.
первое уже сделал.
что надо добавить хибернацию согласен.
также нужна возможность в любой момент временно перенаправить вывод/ввод в другой файл/программу.
это позволит ту же самую задачу с hack-ом решать на любом внешнем языке, а не на встроенном basic-е.
Ускорять, думаю, смысла нет.в целом - да, если не брать операцию decrypt - работает довольно шустро.
За сколько проходит sandmark?
одна итерация - 4 секунды
Я подозреваю, что для вольного перенаправления в любой момент всё-таки нужен GUI.
само собой, но это не сложно.
к этой же программе добавить в начале
new Thread(delegate{Application.Run(new MainForm;}).Start;
Кажися, классическая оптимизация таких машин - переход от case к массиву укателей на функции.
так такую оптимизацию и компилятор делает.
trying to Allocate array of size 0..
trying to Abandon size 0 allocation..
trying to Allocate size 11..
trying Array Index on allocated array..
trying Amendment of allocated array..
checking Amendment of allocated array..
trying Alloc(a,a) and amending it..
comparing multiple allocations..
pointer arithmetic..
check old allocation..
simple tests ok!
about to load program from some allocated array..
Index in 0-array fail
JIC, видимо оно на операторе 12 (Load Program) наепывается.
Index in 0-array failтекущую позицию работы после LoadProgram правильно меняешь?
да
в том числе, даже если происходит загрузка из 0-array-а (уже исполняемого массива)?
Я всегда меняю ip. И еще. Я вижу, что ты в случае загрузки из 0-массива не копируешь массив (такая маленькая оптимизация). Так вот у меня из за этого sandmark падал еще раньше, чем падает сейчас, с предупреждением, что я не выделяю новый массив. Пришлось случай с загрузкой из 0-массива обрабатывать так же как загрузку из любого другого массива, тупо копируя. Чудеса.
Я вижу, что ты в случае загрузки из 0-массива не копируешь массив (такая маленькая оптимизация).я вообще при загрузке никогда не копирую массивы, при загрузке только помечается, что массив используется в двух местах, соответственно если в 0 массив грузится нулевой же массив, то никакого размножения не происходит, что в коде и отражено.
код покажи
case 12:
long[] temp = arrays.get( (int) registers[b] );
final long[] newProgram = new long[temp.length];
System.arraycopy( temp, 0, newProgram, 0, temp.length );
arrays.set( 0, newProgram );
finger = (int)registers[c];
break;
проблема скорее всего где-то рядом, а не в самом LoadProgram, поэтому приведи лучше весь код
[телепатия] скорее всего ты ip плюсуешь в конце цикла, даже когда инструкцию LoadProgram обратываешь, а в этом случае ip менять не надо.
да, скорее всего так и есть спасибо
Например, если надо перейти куда-то по условию A<B?
А как в этой VM делаются условные переходы? Все через LoadProgram?да, через LoadProgram
Или через самомодифицирующийся код!
и как ты представляешь себе переход через самомодифицирующийся код?
через самомодифицирующий код можно делать какие-то хитрые переходы на основе LoadProgram, но все равно все будет завязано именно на LoadProgram.
А это уже можно сделать.
> А это уже можно сделать.
сделать можно, но зачем?... для того, чтобы выполнить разный код, это разный код надо где-то взять, т.е. откуда-то взять и поместить как следующие команду.
внимание вопрос, зачем заниматься таким перекопированием информации, если можно сразу перейти и выполнить этот код без перекопирования?
самомодификация удобна только в нескольких случаях:
1. самораспаковка кода
2. при отсуствии в оп-ах косвенной адресации
3. JIT-оптимизация
Просто так можно. Но, разумеется, не нужно.
Оставить комментарий
Dasar
есть вот такая VM, какие еще есть очевидные способы ее ускорить (под профайлером пока не смотрел)