Intuition behind straight-line programs
A straight-line program is one with no branches, no loops, no conditional statements, no comparisons -- just a sequence of basic operations.

A straight-line program for a finite group $G$ is a straight-line program in a very simple language with an unlimited number of registers $r_1,r_2,r_3,\dots$ and with only two legal operations:


$r_i := \text{inverse}(r_j)$ 
$r_i := \text{multiply}(r_j,r_k)$


You specify $i,j,k$ for each line of the program; those are constants.  Each register holds a group element.  



For instance, the following is a straight-line program that computes the cube of the element in $r_1$ and stores the result in $r_3$:


$r_2 := \text{multiply}(r_1, r_1)$
$r_3 := \text{multiply}(r_1, r_2)$


Here is another program that computes the same thing, but in a different way:


$r_2 := \text{multiply}(r_1, r_1)$
$r_4 := \text{multiply}(r_2, r_2)$
$r_5 := \text{inverse}(r_1)$
$r_3 := \text{multiply}(r_4, r_5)$