A tradução que o STeP faz entre os programas SPL e os FTSs segue essencialmente as regras definidas em [6], exceptuando alguns promenores de sintaxe relativos à forma como são escritos os FTSs e o mecanismo de representar a localização do controlo de execução.
A principal diferença entre o mecanismo usado pelo STeP para gerar os FTSs e o método apresentado em [6] consiste na forma como são tratadas as marcas existentes num programa. Enquanto que no método usado nas aulas teóricas o conjunto de marcas do programa é incorporado literalmente no conjunto V das variáveis do FTS, no STeP são geradas variáveis independentes para controlo do estado da execução dos programas. Para cada processo presente numa instrução de cooperação é gerada uma variável chamada pin, onde ndesigna a posição do processo nessa instrução. Por exemplo, para o programa da figura 1.9 seriam geradas as variáveis pi0 para indicar o estado de execução do processo P1 e pi1 para indicar o estado de execução do processo P2. Cada variável pin começa com o valor 0, sendo o seu valor incrementado de uma unidade sempre que o estado da execução avança sequencialmente através do processo. No caso do programa da figura 1.9 a correspondência entre as marcas colocadas pelo programador e o valor das variáveis pin gerado automaticamente pelo STeP é:
m0
pi1=0
m1
pi1=1
A principal razão pela qual o STeP faz esta geração automática de marcas deve-se ao facto de o programador por vezes não colocar marcas num programa ou então colocar marcas redundantes. Atente-se, por exemplo, no seguinte programa:
Se o programa não estiver etiquetado (ou faltarem etiquetas relevantes) aparecem, na secção Control correspondence, algumas marcas geradas automaticamente que o programador pode usar na especificação de propriedades temporais. Por exemplo, se o programa consistir apenas na instrução skip, a correspondência gerada é:
A sintaxe utilizada no STeP para descrever um FTS é muito simples:
Transition J0J1 Just: modrel l0 /\ x /\ !l0' /\ l1' modvar l0, l1 ; modrel l0 /\ !x /\ !l0' /\ l2' modvar l0, l2
Transition J0J1 Just: enable l0 /\ x assign l0:=false, l1:=true ; enable l0 /\ !x assign l0:=false, l2:=true
Como exemplo, apresenta-se na figura 3.1 o FTS gerado pelo STeP para o programa da figura 1.9. Note-se que STeP declara uma série de marcas que não são depois usadas na descrição do FTS, pois são utilizadas as equivalentes variáveis pin geradas automaticamente. Para se obter o FTS de um programa usa-se a opção Save transitions do menu File, sendo o FTS gravado num ficheiro à escolha. Também poderia ser usada a opção View transitions, mas esta usa uma sintaxe um pouco mais elaborada pois baseia-se na especificação modular de FTSs.
Transition System out y : int local x : bool location $4 : bool location $3 : bool location m1 : bool location m0 : bool location $2 : bool location l2 : bool location l1 : bool location l0 : bool location $1 : bool control pi0 : [0..2] control pi1 : [0..1] Initially (x = true /\ y = 0) /\ pi0 = 0 /\ pi1 = 0 Transition m0 Just: enable pi1 = 0 assign pi1 := 1,x := false Transition l0 Just: enable pi0 = 0 /\ x assign pi0 := 1 ; enable pi0 = 0 /\ ~x assign pi0 := 2 Transition l1 Just: enable pi0 = 1 assign pi0 := 0,y := y + 1 |
Note-se que, em vez de um programa escrito em SPL, é possível fornecer ao STeP o mesmo programa descrito como um FTS. Para tal, escreve-se num ficheiro de texto o FTS na notação acima apresentada, e depois usa-se a opção Load transitions do menu File para o "carregar" para o STeP.