Передача кода по сети
От: Abyx Россия  
Дата: 09.08.10 11:55
Оценка:
Надо передать код по сети, и выполнить его на удаленной машине.

Решение должно быть оформлено в виде двух библиотек — одна для передающей стороны, другая для принимающей.
Принимающая сторона получает некоторый код, сжимает его, сериализует и возвращает массив byte[].
Пользовательский код по некоторому протоколу передает его на принимающую сторону.
Принимающая сторона получает массив byte[], преобразует его в вид пригодный для исполнения и выполняет.

Требования:

Способы решения:
1. Передавать сборку (.dll).
Передаваемый код можно писать на любом языке. Простая реализация на принимающей и передающей стороне.
Однако, даже если передавать только секцию кода, то все равно она будет раз в 5 больше чем исходник.
Очевидно что одна строчка кода ЯВУ
Console.WriteLine("q")
компилируется в несколько инструкций MSIL и кучу метаданных.

2. Передавать исходник.
На принимающей стороне есть компилятор C#, встроенный в .NET, с его помощью можно скомпилировать исходник и потом запустить из памяти.
Однако исходник содержит большое количество избыточной информации — пробелы, длинные имена переменных. Отчасти с этим справится сжатие, но лучше написать обфускатор, который убирал бы пробелы и переименовывал переменные, имена методов и типов.

3. Передавать CodeDom.
Если язык С# — то нужен парсер, т.к. у CSharpCodeProvider не реализован метод Parse.
Лучше парсить исходник, выкидывать из него лишнюю информацию, передавать свой AST, и на принимающей стороне преобразовывать его в CodeDom
Если язык не С# — то надо включить в зависимости принимающей стороны компилятор и рантайм. Например для Boo это будет ~1Мб, что многовато.

4. Передавать IL методов.
Это несколько ограничивает удобство написания кода, надо дизассемблировать и обрабатывать IL-код методов. Слишком сложно.
In Zen We Trust
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.