Guy Steele's "Growing a Language" advocates for designing programming languages with extensibility in mind, enabling them to evolve gracefully over time. He argues against striving for a "perfect" initial design, instead favoring a core language with powerful mechanisms for growth, akin to biological evolution. These mechanisms include higher-order functions, allowing users to effectively extend the language themselves, and a flexible syntax capable of accommodating new constructs. Steele emphasizes the importance of "bottom-up" growth, where new features emerge from practical usage and are integrated into the language organically, rather than being imposed top-down by designers. This allows the language to adapt to unforeseen needs and remain relevant as the programming landscape changes.
Guy Steele's 1998 paper, "Growing a Language," delivered as the OOPSLA keynote address, presents a comprehensive philosophy on language design centered around the concept of evolutionary growth rather than revolutionary overhaul. Steele argues against the pursuit of the "perfect" programming language, recognizing that such an ideal is subjective, unattainable, and ultimately stifling to innovation. Instead, he advocates for a more organic approach, where languages evolve incrementally, adapting to the changing needs of programmers and the ever-evolving landscape of computer science.
He introduces the concept of "Worse is Better," not as an endorsement of poor design, but as an acknowledgment that simplicity and deployability are often more crucial in the early stages of a language's lifespan than absolute correctness or completeness. A language that is easy to implement and distribute will gain traction, providing a platform for future improvements and extensions. This contrasts with the "MIT approach," which prioritizes elegance and completeness from the outset, potentially delaying deployment and limiting adoption.
Steele further elaborates on this by distinguishing between the "New Jersey approach" and the "MIT approach." The New Jersey approach, exemplified by languages like C and Unix, prioritizes simplicity and practicality, even at the expense of theoretical elegance. This allows for rapid iteration and widespread adoption, enabling the language to evolve based on real-world usage. Conversely, the MIT approach, exemplified by Lisp, prioritizes conceptual purity and completeness, sometimes at the cost of accessibility and ease of implementation. While the MIT approach can lead to powerful and expressive languages, it can also hinder adoption if the initial implementation is complex or resource-intensive.
The paper delves into specific mechanisms for language growth, including libraries, frameworks, and syntactic extensions. Libraries offer modular functionality that can be added without altering the core language. Frameworks provide more structured extensions, influencing the overall design of programs built with them. Syntactic extensions allow for the introduction of new language constructs, offering more powerful abstractions.
Steele emphasizes the importance of "orthogonality" in language design, where features can be combined in meaningful ways without unexpected side effects. He advocates for carefully considering the interactions between new features and existing ones, striving for a coherent and predictable overall system. He uses examples like Common Lisp's CLOS (Common Lisp Object System) to illustrate the power and flexibility that can be achieved through carefully designed orthogonal extensions.
Furthermore, Steele underscores the role of community in language evolution. A thriving community of users and developers provides crucial feedback, identifying areas for improvement and contributing to the growth of the language. This collective effort is essential for refining the language, adapting it to new domains, and ensuring its long-term viability.
The paper concludes by reiterating the importance of embracing the evolutionary process in language design. By prioritizing simplicity, practicality, and community involvement, we can cultivate languages that are not only powerful and expressive but also adaptable and resilient in the face of changing technological landscapes. This evolutionary approach, according to Steele, is the key to fostering continuous growth and ensuring the long-term vitality of programming languages.
Summary of Comments ( 2 )
https://news.ycombinator.com/item?id=43683130
Hacker News users discuss Guy Steele's "Growing a Language" lecture, focusing on its relevance even decades later. Several commenters praise Steele's insights into language design, particularly his emphasis on evolving languages organically rather than rigidly adhering to initial specifications. The concept of "worse is better" is highlighted, along with a discussion of how seemingly inferior initial designs can sometimes win out due to their adaptability and ease of implementation. The challenge of backward compatibility in evolving languages is also a key theme, with commenters noting the tension between maintaining existing code and incorporating new features. Steele's humor and engaging presentation style are also appreciated. One commenter links to a video of the lecture, while others lament that more modern programming languages haven't fully embraced the principles Steele advocates.
The Hacker News post titled "Growing a Language [pdf] (1998)" linking to Guy Steele's paper has generated a moderate number of comments, primarily focusing on Steele's approach to language design, its practical implications, and reflections on language evolution in general.
Several commenters praise Steele's emphasis on gradual, organic growth of programming languages, drawing parallels to biological evolution and contrasting it with more revolutionary approaches. One commenter appreciates Steele's recognition of the importance of "compromise and accretion" in language design, suggesting this perspective offers valuable insights into the messy reality of language development. Another highlights the idea of languages developing "immune systems" to resist unwanted changes, reflecting on the difficulty of introducing breaking changes in established languages.
The concept of "worse is better" is brought up in connection to Steele's ideas, with one commenter suggesting that Steele's approach might provide a framework for understanding why this phenomenon occurs. They see Steele's growth-oriented perspective as a potential explanation for the prevalence of suboptimal language features that nevertheless become entrenched due to their early adoption.
Another discussion thread revolves around the practicalities of language design and implementation. Commenters discuss the trade-offs between pursuing elegant, theoretically sound language features versus prioritizing practical considerations like performance and ease of use. The challenge of achieving both elegance and practicality is acknowledged, with some suggesting that the tension between these two goals is inherent in the process of language design.
A few comments delve into specific technical aspects touched upon in Steele's paper, including discussions about the role of macros and the benefits of reflective capabilities in programming languages. One user specifically highlights the importance of macros for extensibility and mentions the challenges of designing macro systems effectively.
Finally, some commenters offer personal anecdotes and reflections on their experiences with different programming languages, connecting their observations to the themes discussed in Steele's paper. One commenter mentions their preference for languages that allow for incremental learning and growth, echoing Steele's emphasis on gradual evolution.
While not a flood of comments, the discussion on Hacker News offers a thoughtful engagement with Steele's ideas, exploring the implications of his growth-oriented approach to language design for both theoretical understanding and practical development. The comments provide a range of perspectives, from high-level philosophical reflections to more concrete technical considerations, illustrating the enduring relevance of Steele's work in the field of programming language design.