Niklaus Wirth on Creating Programming Languages
Niklaus Wirth, a Swiss computer scientist and pioneer in software design, passed away on New Year's Day 2024.
“My idea was that programming languages allow programming on a higher level of abstraction compared to machine coding. You can abstract specific properties and facilities of a specific You can abstract to a higher level and create programs that will then be available and runnable on all computers. That's called abstraction. And the term higher level language comes exactly from that. Now, to create a general purpose language which relies only on higher level concepts is not easy. I mean, think of it. You cannot make any reference to any machine anymore. You have an abstract thing. You may have created a model for an abstract machine, but that's all. You cannot go to a lab and say, well, let's try it. Let's see whether it works. That's out. But unless you strive for that concept of machine independence, portability is the same thing, you'll never really make great progress in the art of programming. Look at today's situation. People programming C++, the worst disease ever created, or C Sharp or Java, which are a bit better, but they all suffer from their mightiness. I'm always expecting they're going to collapse under their own weight.
Q: Well, it is interesting that some languages win, no matter what other theoretical merits, and some languages lose, even theoretically. And even as a user for a programmer that would present a really good tool of abstraction, how you can explain it? And apparently it is not only because industry picks up the wrong languages. For some reason it picks up those languages. But how you can explain this situation?
A:It's not easy to explain it in full. But, I mean, look at the current situation where Java and C Sharp are predominant. It's simply because of that feedback. Industries create these languages, the compiler propagates them, there are users who flock to them, there are schools which start teaching it, and this way they spread. And then soon when software projects are announced, it is requested that you know one of these popular languages. And for other languages you couldn't get anyone. So it's a lot of feedback processes which go to that. It was broken only once with Pascal. That was kind of a miracle. And I kind of knew that it would never happen again. But Oberon would really deserve it, at least in the domain of teaching. Because that's where it excels, in my opinion.”
Asked GPT4 about the lessons from this for teaching programming skills;
The discussion about programming languages and their evolution provides several key lessons for teaching programming:
Focus on Fundamental Concepts: The success of languages like Pascal in educational settings underscores the importance of teaching fundamental programming concepts rather than focusing solely on the syntax of popular languages. Understanding the basics of algorithms, data structures, and programming logic is more valuable in the long term than mastering the nuances of a specific language.
Abstraction and Machine Independence: Emphasizing the concept of abstraction in programming is crucial. Teaching students how to think in abstract terms and to write code that is portable and not overly dependent on the specifics of any one system can foster a deeper understanding of how programming works across different platforms.
Simplicity and Clarity: Languages that are simple and clear can be more effective in teaching. They allow students to focus on learning programming principles without getting bogged down in complex syntax or language-specific features.
Diversity in Language Exposure: While it's important to teach languages that are relevant in the industry, exposing students to a variety of languages, including those like Oberon which emphasize certain principles or paradigms, can provide a broader understanding of programming. This exposure can help students adapt to new languages and paradigms more easily in their future careers.
Practical and Theoretical Balance: A balance between practical programming skills and theoretical understanding is important. Practical skills are necessary for job readiness, but a strong theoretical foundation enables students to grasp new concepts and technologies as they emerge.
Encourage Critical Thinking: Encouraging students to critically evaluate the strengths and weaknesses of different programming languages fosters a deeper understanding. This critical approach prepares them to make informed decisions about the right tools for a given task in their future work.
Industry Trends and Real-world Relevance: Keeping an eye on industry trends and the languages in demand can guide the curriculum to make it relevant and job-market oriented. However, this should be balanced with the teaching of timeless programming principles.
Problem-Solving Skills: Emphasize problem-solving and logical thinking skills, which are universally applicable across different programming languages and paradigms.
Adaptability and Lifelong Learning: Prepare students for lifelong learning in the fast-evolving field of technology. Teaching them to be adaptable and to continuously update their skills is crucial for their long-term success.
In summary, teaching programming effectively requires a blend of focusing on fundamental principles, exposing students to a variety of languages and paradigms, and balancing theoretical knowledge with practical skills, while also fostering critical thinking and adaptability.
For Discussion:
1. **Role of Abstraction in Programming**: How does the concept of abstraction in programming languages influence the way we solve problems and design systems? Can you provide examples where high-level abstraction was beneficial or, conversely, where it led to complications?
2. **Language Popularity vs. Pedagogical Value**: Why do certain programming languages become popular in the industry despite potential drawbacks, and how does this popularity impact their adoption in educational settings? Should teaching be more aligned with industry demands or focus on languages that are pedagogically sound?
3. **Balancing Theory and Practice**: How should programming education balance theoretical concepts with practical skills? What are the risks of focusing too much on one at the expense of the other, and how can educators mitigate these risks?
4. **Evolution of Programming Paradigms**: How have different programming paradigms (such as procedural, object-oriented, functional) influenced the way we teach programming? Should newer paradigms be introduced early in the education process or only after mastering the basics?
5. **Preparing for Future Changes in Technology**: Given the rapid pace of change in technology and programming languages, what strategies should be employed in education to prepare students for future shifts? How can educators encourage adaptability and continuous learning in their students?