Faculty of Engineering
Making Imagination into Reality through Programming
In this edition of “Tell Us Teacher,” we spoke with Dr. Ian Piumarta, a professor in the Department of Mechanical and Electrical Systems Engineering at the Faculty of Engineering at KUAS. Dr. Piumarta is from the United Kingdom and specializes in computer science.
Q:What kind of a boy were you?
I was interested in maps, astronomy, and electronics from five or six years old. My father bought me a soldering iron and I was building small electronic deviceswhen I was in primary school. I inherited many books from my grandmother on science that I loved to read, and my parents bought me more books about physics and electricity and I loved knowing how all of it worked. My father put up a very long wire running from my bedroom window to the end of our garden that I used to pick up radio signals.
I began learning programming when I was about 12 years old, using a Texas Instruments Ti-59 programmable calculator. I discovered that I loved the process of programming and became fascinated with the languages that we use to write programs and communicate our intentions to the machine. When I was 13 I learned to program computers using machine code, and started to implement my own high-level programming languages when I was 15 years old.
Q: When did you start to work on your current research?
At Manchester University I was introduced to two particularly elegant and influential languages called Lisp and Smalltalk. Through them I discovered the power of simplicity and generality in programming. Ever since then my mission has been to bring as much simplicity, generality, and flexibility as possible to the way we program computers. (Because of that mission I was even able to work with the inventor of Smalltalk for ten years in California and to meet the inventor of Lisp in person.) A large piece of the solution to this puzzle has been metaprogramming, which means programs that can understand and modify themselves or other programs. Much of my published work in the past 15 years has concentrated on finding the smallest possible set of principles on which complex programming languages and programming systems can be built, and on which metaprogramming techniques can help with that. Virtual Machines (VMs) and flexible parsers (part of a programming language implementation that tries to understand what the programmer wrote) have also featured prominently in that work.
My current research investigates whether my past results can be applied to ‘mainstream’ general-purpose languages such as the C language which is especially important in engineering. We are building a flexible parsing system and metalanguage for the C compiler, with the aim of letting programmers develop their own new and ‘optimal’ ways of expressing their intentions in their C programs. Among other things we expect this will encourage programmers to build better ‘firewalls’ around different components of their systems, or to rigorously prove certain properties of their programs, helping them to manage complexity and improve the reliability of critical systems.
Q:In your research described above, please specify the areas that you would like to emphasize?
Metaprogramming is a particularly powerful tool. In many programming languages the range of ideas that can be expressed is limited by the decisions that were made, and built into the language, by the original language designer(s). Metaprogramming allows a way out of that prison. An application programmer can write a metaprogram, embedded in their larger application’s program source code, that can automatically generate large parts of their application code from a more human-friendly representation that might be similar to the notation that an expert in the problem domain would use. Sophisticated metaprogramming lets the programmer inspect aspects of very large application programs and analyse them, or even extend the range of representations (syntax) and meanings (semantics) that they can use to express their intentions in their programs.
My current research is designed to be an add-on facility for C programmers that they can introduce into their normal workflow without disrupting any other part of it. I hope this approach will make it available as an optional tool to the widest possible community of C programmers. I am also deeply committed to open source systems in Computer Science research, and all of our results will be made available with a very liberal license that allows anyone to copy and use them, or even modify them, for their own purposes.
Q: What makes programming appealing?
To me the attraction of programming is the challenge and pleasure of solving a problem elegantly within a system that imposes very rigid constraints and in which the user has only certain freedoms of expression and behaviour.
As an example of another such a system, when I lived in California I studied flying and obtained my pilot’s license. Aviation is a very large, well-organised constraint system in which its users have certain freedoms and limitations. Flying an airplane from point A to point B involves solving very many problems within that system simultaneously in order to make progress towards the desired end result. In fact my interest in actively participating in aviation was first ignited by a book that I picked up in a second-hand book shop about the history and operation of the Air Traffic Control system. I was fascinated by this complex parallel universe that surrounds all of us and yet remains invisible to almost everyone, and I wanted to be part of it. Navigation systems, radio communication systems and procedures, negotiating a route through different airspaces with their particular rules and regulations, understanding and planning for different weather systems, understanding and operating the mechanical and avionics systems of the aircraft, together form a complex interconnected set of systems with hundreds of constraints in which finding an effective solution to moving the airplane from point A to point B is both challenging and incredibly rewarding.
I see programs and algorithms as architectures, which of course subsume communication. Programming is creating the rules that transform a model of a problem from one state to another state that is more interesting, more understandable, more efficient, or which represents a solution to some initial question. Even ‘general-purpose’ programming systems tend not to allow you to solve every problem elegantly, or to build and manipulate the models you want in efficient and elegant ways. You always have to choose which compromises, by choosing a particular programming language, that you want to deal with. Learning to deal with these different compromises, which limit what kind of freedoms you have to express yourself, is a hugely fascinating part of programming for me. At the ‘bottom’ of any programming system you have the machine and its machine code; at the ‘top’ you can have any abstractions and representations that the human mind can dream up. The relationships between the ‘top’ and the ‘bottom’, and how those relationships are expressed and implemented, is maybe the most fascinating part of Computer Science for me.
Q: What contributions to society do you hope to make through your research?
I think there are maybe four ways that my research can contribute to society.
First is contributing a concrete, useful artefact and I am therefore designing my prototypes so that they can be used very easily by anybody. They can be inserted into a normal programming workflow, as one additional step that performs powerful transformations on programs using metaprogramming. I’m making a tool that I hope is accessible to anybody who wants to try to use it.
The second way of contributing is based on the idea that the products of research belong to the everyone. Everything I produce is open and freely available to anyone who wants it, so they can take all the components that went into the design and development of the final ‘product’ and not just the ‘product’ itself. They can look at the components, understand them, see and understand the philosophy behind how everything works, and modify the entire system for their own purposes, to work in a slightly different way or to extend it or to even to simplify it. They get not only the results of the research, they get the research work as well to reuse in their own systems or their own research.
Thirdly I contribute by providing a platform on which language researchers can experiment with new ways of describing solutions to programming problems. The success of the World Wide Web led to new approaches to publishing and communicating, with end user and research communities arising to use and evolve those approaches. If our work is extremely successful then maybe we will see user groups, research communities, and even commercial entities arise to evolve, design, develop, and release different toolkits that embody different programming philosophies, built on our style of metaprogramming framework, to provide new, powerful tools and paradigms for programmers to use.
I think the fourth contribution might be to broaden the philosophical horizons of programmers. A very old, very rigid programming language that has not evolved much at all in the last 40 years is still used to program 70% of the world’s most critical infrastructure. For ‘end user’ programmers, a philosophical contribution would be to show them a new way to organise and manage their programs through powerful metatprogramming techniques. For the ‘curators’ of languages, another philosophical contribution might be to demonstrate that evolution of programming languages can happen in the metalanguage space and not exclusively in the languages themselves. For example, a recent desire to ‘modernise’ the C programming language has caused it to begin evolving in a direction that greatly worries me. Many people have many opinions about what is ‘missing’ from the C language and are pushing to add new features to the base language itself. Support for complex numbers is one example. However, the more you add to the base language the more complicated it becomes, the less reliable its implementation becomes, and for both reasons the less reliable will be the systems created in that language. (We saw this situation turn critical with the C++ language, which added hundreds of new and complicated features to the C language.) Instead of expanding the base C language ‘downwards’ I believe we should expand ‘upwards’ by making our programming tools more intelligent, more flexible, and more general through metaprogramming. The programmer can have access to, and influence over, how they choose to write their programs. If we get this right then there is no need at all to add anything to the base language, since features can be meta-programmed into the language in exactly the form needed and in only the specific places and situations where they are appropriate. I agree wholeheartedly with Saint-Exupéry who wrote about design philosophy in aviation saying, “it seems that perfection is attained not when there is nothing more to add but when there is nothing more to take away.” [Terre des Hommes, 1939]

Q: What advice would you like to give to your students at KUAS?
The best way to learn is to do something. You cannot learn to ride a bicycle by reading books. You cannot learn to cook by reading books. We all learned to talk and to tell our parents that we were tired or hungry without studying a single book on vocabulary or grammar. If you want to learn to talk, you just do it until you stop making mistakes. I would say we learn most things best by learning how not to fail at them. A child can make 600 sounds of which maybe a few tens are actually relevant to their particular native spoken language. By trying lots of these sounds at random, and gradually learning which ones work (to communicate with parents), the child learns how to speak by figuring out from first-hand experience how not to fail at speaking. You cannot learn to cook without first making some inedible things. You cannot learn to ride a bike except by learning, through practical experience, how not to fall off it.
I think the best way to learn engineering is also to experience it practically and at first-hand. Build things. Experiment with them. When you have a practical problem in front of you, solve it using your own hands along with mechanical and electrical components, and use that situation as motivation to pursue the theory that you need to solve those problems. That kind of practical context is very important in properly learning and retaining the underlying theory. Do not be afraid to break things and have to rebuild them. Do not be afraid to build things that do not work at all; just make sure you figure out why they don’t work and hence gradually, through accumulated experience, learn how to avoid all the things that don’t work. At KUAS this applies to English language too, which many of our students are learning in parallel with learning engineering. We teach engineering, mathematics, physics, and programming in English. I sincerely do not care if your spelling and grammar are completely wrong! All I care about is that we can communicate engineering ideas effectively and precisely between ourselves. Start by learning how to do that and then, as you gain experience using English to communicate, you will gradually learn how not to make spelling and grammatical mistakes through practical experience. Leaning to make perfect English before learning to communicate effectively verbally really is ‘putting the cart before the horse’, as we say.
Q: What sort of hobbies do you have?
I love to cook, both Japanese and international food; at home I grow my own fresh herbs, and make my own miso and (as a by-product) tamari.
I also love music, both playing and listening to it. I studied classical guitar in college and also played semi-professionally in a band at university, and I still play my guitars or bass for a few minutes every day. Listening to music is an excuse for me to collect (far too many!) headphones. I also love to design and build my own audio hardware, such as amplifiers and digital-to-analogue converters, which fuels my love of electronics.
I find many kinds of complex systems or activities to be fascinating and enjoy trying to master them in my spare time. For example, before moving to Japan I studied for and obtained both a pilot’s license (with additional ratings for aerobatic and seaplane flying) in the USA, and a boating license in Australia (with no limitation on the size of vessel). The pilot’s license in particular involved a lot of study and practice of mechanical and electrical systems, different methods of navigation, understanding and predicting weather patterns, radio systems and communication procedures, and so on. I also enjoy programming computers just for the fun of mastering complex algorithms and I am especially fortunate that programming features so largely in both my research and teaching work, making them all the more enjoyable for me. I recently became interested in the implementation of computer hardware too and have started designing and implementing my own computer architectures using ‘Field-Programmable Gate Arrays’ which are a form of end-user configurable hardware that can perform almost any function.
When it is time to do nothing but relax, one of my favorite things to do is spend several days at some small, remote onsen ryokan enjoying the baths, the scenery, the hospitality, and the great local food.
Learn more about Dr. Ian Piumarta
Q:What kind of a boy were you?
I was interested in maps, astronomy, and electronics from five or six years old. My father bought me a soldering iron and I was building small electronic deviceswhen I was in primary school. I inherited many books from my grandmother on science that I loved to read, and my parents bought me more books about physics and electricity and I loved knowing how all of it worked. My father put up a very long wire running from my bedroom window to the end of our garden that I used to pick up radio signals.
I began learning programming when I was about 12 years old, using a Texas Instruments Ti-59 programmable calculator. I discovered that I loved the process of programming and became fascinated with the languages that we use to write programs and communicate our intentions to the machine. When I was 13 I learned to program computers using machine code, and started to implement my own high-level programming languages when I was 15 years old.
Q: When did you start to work on your current research?
At Manchester University I was introduced to two particularly elegant and influential languages called Lisp and Smalltalk. Through them I discovered the power of simplicity and generality in programming. Ever since then my mission has been to bring as much simplicity, generality, and flexibility as possible to the way we program computers. (Because of that mission I was even able to work with the inventor of Smalltalk for ten years in California and to meet the inventor of Lisp in person.) A large piece of the solution to this puzzle has been metaprogramming, which means programs that can understand and modify themselves or other programs. Much of my published work in the past 15 years has concentrated on finding the smallest possible set of principles on which complex programming languages and programming systems can be built, and on which metaprogramming techniques can help with that. Virtual Machines (VMs) and flexible parsers (part of a programming language implementation that tries to understand what the programmer wrote) have also featured prominently in that work.
My current research investigates whether my past results can be applied to ‘mainstream’ general-purpose languages such as the C language which is especially important in engineering. We are building a flexible parsing system and metalanguage for the C compiler, with the aim of letting programmers develop their own new and ‘optimal’ ways of expressing their intentions in their C programs. Among other things we expect this will encourage programmers to build better ‘firewalls’ around different components of their systems, or to rigorously prove certain properties of their programs, helping them to manage complexity and improve the reliability of critical systems.
Q:In your research described above, please specify the areas that you would like to emphasize?
Metaprogramming is a particularly powerful tool. In many programming languages the range of ideas that can be expressed is limited by the decisions that were made, and built into the language, by the original language designer(s). Metaprogramming allows a way out of that prison. An application programmer can write a metaprogram, embedded in their larger application’s program source code, that can automatically generate large parts of their application code from a more human-friendly representation that might be similar to the notation that an expert in the problem domain would use. Sophisticated metaprogramming lets the programmer inspect aspects of very large application programs and analyse them, or even extend the range of representations (syntax) and meanings (semantics) that they can use to express their intentions in their programs.
My current research is designed to be an add-on facility for C programmers that they can introduce into their normal workflow without disrupting any other part of it. I hope this approach will make it available as an optional tool to the widest possible community of C programmers. I am also deeply committed to open source systems in Computer Science research, and all of our results will be made available with a very liberal license that allows anyone to copy and use them, or even modify them, for their own purposes.
Q: What makes programming appealing?
To me the attraction of programming is the challenge and pleasure of solving a problem elegantly within a system that imposes very rigid constraints and in which the user has only certain freedoms of expression and behaviour.
As an example of another such a system, when I lived in California I studied flying and obtained my pilot’s license. Aviation is a very large, well-organised constraint system in which its users have certain freedoms and limitations. Flying an airplane from point A to point B involves solving very many problems within that system simultaneously in order to make progress towards the desired end result. In fact my interest in actively participating in aviation was first ignited by a book that I picked up in a second-hand book shop about the history and operation of the Air Traffic Control system. I was fascinated by this complex parallel universe that surrounds all of us and yet remains invisible to almost everyone, and I wanted to be part of it. Navigation systems, radio communication systems and procedures, negotiating a route through different airspaces with their particular rules and regulations, understanding and planning for different weather systems, understanding and operating the mechanical and avionics systems of the aircraft, together form a complex interconnected set of systems with hundreds of constraints in which finding an effective solution to moving the airplane from point A to point B is both challenging and incredibly rewarding.
I see programs and algorithms as architectures, which of course subsume communication. Programming is creating the rules that transform a model of a problem from one state to another state that is more interesting, more understandable, more efficient, or which represents a solution to some initial question. Even ‘general-purpose’ programming systems tend not to allow you to solve every problem elegantly, or to build and manipulate the models you want in efficient and elegant ways. You always have to choose which compromises, by choosing a particular programming language, that you want to deal with. Learning to deal with these different compromises, which limit what kind of freedoms you have to express yourself, is a hugely fascinating part of programming for me. At the ‘bottom’ of any programming system you have the machine and its machine code; at the ‘top’ you can have any abstractions and representations that the human mind can dream up. The relationships between the ‘top’ and the ‘bottom’, and how those relationships are expressed and implemented, is maybe the most fascinating part of Computer Science for me.
Q: What contributions to society do you hope to make through your research?
I think there are maybe four ways that my research can contribute to society.
First is contributing a concrete, useful artefact and I am therefore designing my prototypes so that they can be used very easily by anybody. They can be inserted into a normal programming workflow, as one additional step that performs powerful transformations on programs using metaprogramming. I’m making a tool that I hope is accessible to anybody who wants to try to use it.
The second way of contributing is based on the idea that the products of research belong to the everyone. Everything I produce is open and freely available to anyone who wants it, so they can take all the components that went into the design and development of the final ‘product’ and not just the ‘product’ itself. They can look at the components, understand them, see and understand the philosophy behind how everything works, and modify the entire system for their own purposes, to work in a slightly different way or to extend it or to even to simplify it. They get not only the results of the research, they get the research work as well to reuse in their own systems or their own research.
Thirdly I contribute by providing a platform on which language researchers can experiment with new ways of describing solutions to programming problems. The success of the World Wide Web led to new approaches to publishing and communicating, with end user and research communities arising to use and evolve those approaches. If our work is extremely successful then maybe we will see user groups, research communities, and even commercial entities arise to evolve, design, develop, and release different toolkits that embody different programming philosophies, built on our style of metaprogramming framework, to provide new, powerful tools and paradigms for programmers to use.
I think the fourth contribution might be to broaden the philosophical horizons of programmers. A very old, very rigid programming language that has not evolved much at all in the last 40 years is still used to program 70% of the world’s most critical infrastructure. For ‘end user’ programmers, a philosophical contribution would be to show them a new way to organise and manage their programs through powerful metatprogramming techniques. For the ‘curators’ of languages, another philosophical contribution might be to demonstrate that evolution of programming languages can happen in the metalanguage space and not exclusively in the languages themselves. For example, a recent desire to ‘modernise’ the C programming language has caused it to begin evolving in a direction that greatly worries me. Many people have many opinions about what is ‘missing’ from the C language and are pushing to add new features to the base language itself. Support for complex numbers is one example. However, the more you add to the base language the more complicated it becomes, the less reliable its implementation becomes, and for both reasons the less reliable will be the systems created in that language. (We saw this situation turn critical with the C++ language, which added hundreds of new and complicated features to the C language.) Instead of expanding the base C language ‘downwards’ I believe we should expand ‘upwards’ by making our programming tools more intelligent, more flexible, and more general through metaprogramming. The programmer can have access to, and influence over, how they choose to write their programs. If we get this right then there is no need at all to add anything to the base language, since features can be meta-programmed into the language in exactly the form needed and in only the specific places and situations where they are appropriate. I agree wholeheartedly with Saint-Exupéry who wrote about design philosophy in aviation saying, “it seems that perfection is attained not when there is nothing more to add but when there is nothing more to take away.” [Terre des Hommes, 1939]
Q: What advice would you like to give to your students at KUAS?
The best way to learn is to do something. You cannot learn to ride a bicycle by reading books. You cannot learn to cook by reading books. We all learned to talk and to tell our parents that we were tired or hungry without studying a single book on vocabulary or grammar. If you want to learn to talk, you just do it until you stop making mistakes. I would say we learn most things best by learning how not to fail at them. A child can make 600 sounds of which maybe a few tens are actually relevant to their particular native spoken language. By trying lots of these sounds at random, and gradually learning which ones work (to communicate with parents), the child learns how to speak by figuring out from first-hand experience how not to fail at speaking. You cannot learn to cook without first making some inedible things. You cannot learn to ride a bike except by learning, through practical experience, how not to fall off it.
I think the best way to learn engineering is also to experience it practically and at first-hand. Build things. Experiment with them. When you have a practical problem in front of you, solve it using your own hands along with mechanical and electrical components, and use that situation as motivation to pursue the theory that you need to solve those problems. That kind of practical context is very important in properly learning and retaining the underlying theory. Do not be afraid to break things and have to rebuild them. Do not be afraid to build things that do not work at all; just make sure you figure out why they don’t work and hence gradually, through accumulated experience, learn how to avoid all the things that don’t work. At KUAS this applies to English language too, which many of our students are learning in parallel with learning engineering. We teach engineering, mathematics, physics, and programming in English. I sincerely do not care if your spelling and grammar are completely wrong! All I care about is that we can communicate engineering ideas effectively and precisely between ourselves. Start by learning how to do that and then, as you gain experience using English to communicate, you will gradually learn how not to make spelling and grammatical mistakes through practical experience. Leaning to make perfect English before learning to communicate effectively verbally really is ‘putting the cart before the horse’, as we say.
Q: What sort of hobbies do you have?
I love to cook, both Japanese and international food; at home I grow my own fresh herbs, and make my own miso and (as a by-product) tamari.
I also love music, both playing and listening to it. I studied classical guitar in college and also played semi-professionally in a band at university, and I still play my guitars or bass for a few minutes every day. Listening to music is an excuse for me to collect (far too many!) headphones. I also love to design and build my own audio hardware, such as amplifiers and digital-to-analogue converters, which fuels my love of electronics.
I find many kinds of complex systems or activities to be fascinating and enjoy trying to master them in my spare time. For example, before moving to Japan I studied for and obtained both a pilot’s license (with additional ratings for aerobatic and seaplane flying) in the USA, and a boating license in Australia (with no limitation on the size of vessel). The pilot’s license in particular involved a lot of study and practice of mechanical and electrical systems, different methods of navigation, understanding and predicting weather patterns, radio systems and communication procedures, and so on. I also enjoy programming computers just for the fun of mastering complex algorithms and I am especially fortunate that programming features so largely in both my research and teaching work, making them all the more enjoyable for me. I recently became interested in the implementation of computer hardware too and have started designing and implementing my own computer architectures using ‘Field-Programmable Gate Arrays’ which are a form of end-user configurable hardware that can perform almost any function.
When it is time to do nothing but relax, one of my favorite things to do is spend several days at some small, remote onsen ryokan enjoying the baths, the scenery, the hospitality, and the great local food.
Learn more about Dr. Ian Piumarta