пятница, 31 августа 2007 г.

Компиляция кода из своей программы

В данный момент я пытаюсь написать более гибкий движок для скриптов. Основная идея - скрипты должны писаться не на каком-то там "псевдо-языке", а на обычном C#.
В принципе, первая попытка написать такой движок уже была. Каждый скрипт хранился в отдельном файле. При старте менеджера скриптов, он их компилировал и в дальнейшем они использовались в работе переводчика.
Ну а то, что в зависимости от количества этих самых скриптов скорость загрузки программы падала экспоненциально думаю и так понятно :)
Поэтому сейчас я делаю редактор скриптов, который бы в итоге генерировал сборку, понятную менеджеру модулей переводчика и, соответственно, которая и использовалась бы для анализа предложений в процессе перевода. Это позволит избежать компиляции при загрузке.
Ну а теперь перейдем к теме поста.
Итак, что нужно для того чтобы скомпилировать произвольный код написанный, например, на языке C# и получить в итоге .exe или .dll файл?
Оказывается все очень и очень просто:

public static void Compile(string code, out string errors)
{
CompilerParameters cp = new CompilerParameters(); 

//указываем список используемых сборок
cp.ReferencedAssemblies.Add("System.dll"); 

//генерируем .exe файл
cp.GenerateExecutable = true; 

//в файл с именем
cp.OutputAssembly = "c:\\tmp.exe"; 

//Здесь можно поставить true, если нет необходимости сохранять
//скомпилированный файл и вы умеете пользоваться сборками, 
//которые загружены в память :)
cp.GenerateInMemory = false;

CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerResults cr = provider.CompileAssemblyFromSource(cp, new string[] {code} );

if (cr.Errors.Count != 0) {
//если были ошибки при компиляции, выводим в errors их список StringBuilder sb = new StringBuilder(); foreach (CompilerError ce in cr.Errors) { sb.Append(ce.ToString()); sb.Append(System.Environment.NewLine); } errors = sb.ToString(); } else errors = "Compiled!";
}
Ну а пока что можно полюбоваться на новый редактор :) Вот оно:

суббота, 26 мая 2007 г.

Link Grammar в моем переводчике!

Наконец-то переделал порт Link Grammar чтобы он принимал для обработки не только строку, а еще и массив слов. Результат можно скачать тут. Пока что результаты работы модуля сохраняются только в output.txt и нигде не используются, но все равно - уже какой-то прогресс есть :) Осталось сделать так, чтобы генерируемые данным модулем связи между словами понимались остальными модулями. Судя по всему - придется преобразовать класс TLink в интерфейс с тем, чтобы можно было переделывать его реализацию по мере необходимости. Правда в этом случае возникает одна проблема... Нескольким модулям может потребоваться разные реализации класса связей. Как в этом случае поступать - я пока что не имею ни малейшего представления. P.S.: К сожалению, в текущей реализации Link Grammar наблюдается странный глюк - если предложение начинается с предлога, то ссвязи в таком предложении не находятся. Если предлог убрать - находятся.

пятница, 25 мая 2007 г.

Visual Studio Code Name 'Orcas' Express Editions

Если вдруг кого заинтересует: оказывается, несмотря на то, что до выхода самой VS Orcas еще далеко, Express-версии среды уже есть здесь в виде VB, C#, Web Developer, и C++ версий.

четверг, 17 мая 2007 г.

Гугл

Весь день натыкался на новости о том, что гугл объединили (собираются объединить) все виды поиска в один. Зашел на Google Labs посмотреть что же такое там придумали-то :) Во-первых, на что стоит обратить внимание, это timeline-поиск, например вот такой, что подтверждается и обычным поиском, действительно больше всего документов по Link Grammar было в 2000-м году. Такой поиск несомненно удобен, если хочется оценить тенденции чего-либо... (Примечание: с русским текстом не работает) Во-вторых, однозначно стоит пользоваться Google Scholar. По тому же самому запросу была сразу найдена книга "Parsing English with a Link Grammar" (опубликованная не только на оригинальном сайте http://www.link.cs.cmu.edu/link/ftp-site/link-grammar/LG-tech-report.pdf, но и на других). В принципе, она находится и обычным поиском, однако для этого надо уже знать ее название и вот такого поискового запроса уже недостаточно. (Примечание: а вот на русском по запросу "грамматика связей" ничего полезного найдено не было...)

четверг, 10 мая 2007 г.

Все еще перевожу Link Grammar на C#... Уже научился загружать грамматику из файла и парсить данные. Осталось теперь научиться применять загруженную информацию. Не совсем понятна разница между тремя видами скобок. Мало информации... Пока что известно, что:
  • квадратные скобки прибавляют 1 к весу связи
  • круглые скобки - похоже просто ограничивают группу операндов в выражении
  • что делают фигурные скобки - пока что загадка
25392226.a5e351c855901a7acefacc6448e97458.1178813598.2cae6782503463cac1f3838e7e2e1f07