SPARD: новый взгляд

Apr 13, 2013 20:37

Продолжу вас мучать своим языком :)

До сегодняшнего дня программа на SPARD, который является чистым функциональным языком, реализовывала некоторую функцию y = f(x). Чистота языка заключается в том, что для одного и того же x результатом работы программы всегда будет y. В большинстве языков программирования это не так. Может производиться чтение из файла, из базы данных, использоваться random, наконец.

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

Зачем вообще нужна чистота? Хотя бы для того, чтобы вычислить результат функции для входных данных один раз и запомнить его. А при следующем обращении ничего не вычислять и сразу вернуть. Также расширяются возможности по преобразованию таких программ. Можно доказывать корректность решения задачи и производить оптимизации. В целом, куча плюсов.

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

В некоторых задачах нужна работа с внешней средой. Например, для поиска введённого текста в базе данных. Получается, что SPARD в такой задаче вообще неприменим. Единственный способ его использования - занести всё содержимое базы данных в исходный код. Он скомпилируется, и затем можно будет осуществлять поиск.

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

Это часто бывает неудобно. А поэтому мне сегодня и пришла идея: ведь функцию, реализуемую программой на SPARD, можно описать и так: у = f(x, p), где p - параметры преобразования. И в это p можно вложить всё влияние внешней среды. При этом чистота языка сохраняется: для фиксированных x и p результат также будет фиксированным. Однако для фиксированного x и разных p могут получаться различные результаты. Цель достигнута.

Конечно, этот способ хуже полного копирования внешних данных в текст программы тем, что мы не можем произвести оптимизацию этих внешних данных (в момент компиляции они неизвестны). Увы, да, но зато у него свои плюсы.

Просто? Весьма. Но вот додуматься удалось только сейчас. Преобразователи с несколькими входами уже используется в качестве реализации внутренних функций языка; осталось придумать, как правильно раскрыть эту функциональность для внешних вызовов.

Технологии, Творчество

Previous post Next post
Up