Обобщённый преобразователь

Sep 03, 2009 20:58

Очень часто в процессе нашей деятельности возникает задача обработки данных. И как правило, требуется преобразовывать одни структуры данных в другие. Вашему покорному слуге это понадобилось сразу для нескольких проектов. А поэтому необходимо разработать универсальный подход для описания таких преобразований.

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

Другим следствием решения данной задачи станет первый шаг к построению действительно разумной системы, но до этого ещё далеко.

На первом этапе будет разработан лишь универсальный лексический преобразователь.

Во вторую очередь, требуется переписать ядро ковертера вопросов СИ, которое в настоящий момент несоверешенно и неоптимизировано. Задача в данном русле - по входному файлу уметь строить шаблон, которого придерживался автор-составитель вопросов в файле, а уже на основании этого шаблона уметь считывать вопросы из файла. Сейчас эта задача уже решена, и она даже работает для частично ошибочных данных. Однако имеется возможность оптимизировать работу анализатора и использовать более качественные алгоритмы, которые позволят прямо указывать на встречаемые в тексте ошибки форматирования.

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

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

Несмотря на это, нам чаще всего придётся работать со строками и последовательностями, поэтому требуется, чтобы описание преобразований было дружественно к этим структурам данных и позволяло представлять их максимально просто.

Для описания преобразований необходимо разработать специальный язык. Нельзя использовать существующие языки, во-первых, в силу их ограниченности в отношении преобразуемых данных, во-вторых, в силу невозможности их органичного встраивания в код на C#. Разработка собственного языка позволит обойти эти ограничения и использовать его конструкции максимально удобным образом.

Осуществлять преобразования будет некий универсальный преобразователь. Он получает описание преобразования (функцию) и входные данные. На выходе он должен предоставить корректную выходную конструкцию. Такой преобразователь может быть использован для решения совершенно разнообразных задач.

Для того чтобы оптимизировать работу преобразователя под конкретную функцию, будет иметься возможность скомпилировать его и применять его лишь для выполнения одной задачи. Однако эту задачу он будет выполнять весьма качественно.

Таким образом, если обобщённый преобразователь работает по схеме A := f, x => y, то конкретная его реализация будет иметь более простой вид f := x => y.

Продолжение следует.

Игры будущего

Previous post Next post
Up