Bubble Sort in Forth (for strings)
To address your immediate concerns,

Using the return stack for storing your temporaries is a perfectly valid technique.

pick is always frown upon (as well as tuck, roll, and friends). It seems that the len parameter to bubblesort does not participate in computation - except the very beginning - and mostly just stays in the way. Consider
 : bubblesort
     dup &gt;r 1-
     ....



and use over instead of 2 pick (don't forget to r&gt; the length at the end).

I prefer a slightly different formatting of conditional. Consider
2dup &gt; if     
    r@ c! r&gt; 1 + c!  else   
    r&gt; drop 2drop then ;

Same for the loops. Consider
: bubblesort ( string len -- string len )
    dup 1 - begin 
    dup 0&gt; while
        dup 0 do                                      
            2 pick i compare-and-swap-next               
        loop
        1 -                                     
    repeat
drop ;

Keeping control words together with their respective conditions/actions looks more Forthy for me.

r&gt; drop is also known as rdrop.
rot rot is also known as -rot.