1. A method of compiling a program, the program including software transactional memory blocks and the method comprising: by a computer, optimizing the program to create an optimized program containing software transactional memory instructions; wherein optimizing the program comprises: (a) inserting one or more word-based direct-access software transactional memory instructions at the software transactional memory blocks; (b) replacing the one or more word-based direct-access software transactional memory instructions with decomposed software transactional memory instructions in the program at the software transactional memory blocks; and (c) performing optimizations on the program to create the optimized program, such that at least some of the optimizations are configured to operate specifically on the decomposed software transactional memory instructions; wherein performing optimizations comprises performing a common subexpression elimination procedure which is modified to operate on decomposed software transactional memory instructions such that a decomposed software transactional memory instruction to open an object for read, that comprises a parameter that references the object, is eliminated which takes place after a decomposed software transactional memory instruction to open the object for update within a same transaction; wherein the optimizations are performed within software transactional memory constraints, the software transactional memory constraints comprising data dependencies which are introduced into the decomposed software transactional memory instructions; wherein the data dependencies enforce a call order based on output variables for at least some of the decomposed software transactional memory instructions being input variables for subsequent decomposed software transactional memory instructions; and compiling the optimized program.