Internal DSLs allow defining domain-specific languages embedded in general-purpose host languages. They use method chaining and nested functions to provide a more concise and expressive syntax compared to traditional object-oriented APIs. However, internal DSLs are limited by the syntax rules of the host language and IDEs may not be aware of their constraints. Different styles like command-query, fluent APIs, and method chaining each have advantages and disadvantages for implementing internal DSLs.