This research focuses on how to integrate software transactions into the definition and implementation of modern programming languages. With small-scale parallel computers (also known as multicore architectures) becoming the norm, there is an urgent need for programming languages to provide programmers convenient mechanisms for exploiting parallelism. Software transactions are one such mechanism because they make it easier to synchronize computations executing in parallel. While they hold great promise, important questions of semantics and interaction with language-implementation technology have not been considered with sufficient precision. This research investigates the semantic questions via formal operational semantics, attacking questions regarding weak atomicity, open nesting, and interaction with code written in other languages. For implementation questions, a variety of static and dynamic optimizations are considered for identifying data that is not used within a software transaction or that is used by only one thread of computation at a time.