Modern computing environments present new software development challenges. The problems of concurrency, distribution, security, and extensibility must be addressed for today's software applications to be successful. These features are notoriously difficult to program, to test, and to debug. Programming languages can address these problems by allowing developers to express invariants that can be used by compilers and other tools to rule out errors in programs before they are run and to generate more efficient code. A key challenge is providing language features that permit programmers to express application-specific invariants and permit construction of tools to use these invariants. In this talk, I will describe my work on compilers and programming language features that enable construction of domain-specific extensions to X10, an object-oriented programming language for high-performance computing. It extends a sequential core language with constructs for concurrent and distributed programming. X10 provides powerful mechanisms that enable users to extend the syntax and semantics of the core language. Annotations and compiler plugins allow programmers to refine the type information in the program and to perform static analyses on these types. X10's dependent type system allows programmers to specify invariants that are enforced by the compiler to rule out run-time errors and that are used to optimize code. Joint work with Andrew Myers, Michael Clarkson, Stephen Chong, Xin Qi, Vijay Saraswat, Jens Palsberg, and Christian Grothoff.