No REST (Representational State Transfer) utilizado nas aplicações web atuais, uma url representa um recurso (uma informação), e os métodos HTTP como GET, POST, PUT e DELETE representam as operações possíveis de serem realizadas nesses recursos, normalmente mapeadas para operações CRUD (Create, Read, Update e Delete). Essa técnica tem sido utilizada amplamente em APIs que integram sites entre si.

Justin R. Erenkrantz, Michael M. Gorlick, Richard N. Taylor publicaram um trabalho (http://bit.ly/hlfOi) onde eles generalizam o REST. Além de troca de informação, eles definiram uma forma de trocar programas entre as aplicações.

No CREST, uma url representa um recurso computacional. A aplicação cliente envia um programa (expressão) para o servidor origem que o avalia e retorna seu resultado que pode ser um primitivo (inteiro, string, etc) ou outro programa, uma closure, uma continuation, ou pares nomes/valores que podem conter os mesmos tipos de resultados acima.

Há duas formas de operação: remote e spawn. Na forma remote, o código é avaliado e o resultado retorna para o cliente. Na forma spawn, o cliente envia o código que fica armazenado no servidor origem que retorna uma url desse novo serviço para o cliente utilizar.

Continuations e Closures estão na base do CREST. Como closures mantém o estado entre invocações, CREST permite que as aplicações possam ser facilmente escaláveis pois qualquer servidor origem pode processar os recursos computacionais.

No paper publicado eles fornecem mais detalhes, inclusive com os axiomas que orientam o desenvolvimento de aplicações utilizando essa técnica. Vale uma leitura atenta.