Our ability to understand and effectively use parallel computers lags far behind our ability to build them. The inherent complexity of parallelism causes some of the difficulty. However, programming languages must also take some blame since they have not provided adequate support for understanding, expressing, or managing parallelism. This research addresses the problem of expressing, programming, and debugging complex, symbolic applications on parallel computers. Based on past experience with compiling Lisp programs for parallel computers and recent simulations of C programs, this research attempts to establish that existing languages are inappropriate for parallel symbolic computation. It pursues two new approaches to language design--large- grain data parallelism and parallel abstract data types--that will produce languages better suited to expressing and compiling parallel programs.