CSC/ECE 517 Spring 2013/ch1b 1i lh
- Write-up of This Topic.
- Expertiza Wiki Entry on Meta-programming in Statically Typed Languages 1
- Expertiza Wiki Entry on Meta-programming in Statically Typed Languages 2
- Expertiza Wiki Entry on What is Meta-programming
"I rather write a x86 program in binary using a butterfly than writing this article" - Hao Liu
This page is a discuss about meta-programming and its implementation and uses in dynamically typed languages.
Meta-programming in Dynamically Typed Languages
Introduction to Meta-Programming
In essence meta-programs are computer programs that can write or manipulate other programs or themselves as their data. Meta-programming is the general term for techniques use to write such program. The language in which the meta-program is written is called the metalanguage. The language of the programs that are manipulated is called the object language.[1]
This simplistic definition of meta-program and meta-programming tend to give reader a very intimidating first impression and render a image of a sentient self modifying program that ultimately take over the world. In reality meta-program and meta-programming techniques can very in complexity from the extreme of sentient self modifying program to simple and everyday thing such as a pre-processor macro. In most cases meta-programming are use to improve the quality of life of the programmer by improving the readability and re-usability of the code and by providing a higher level of abstraction.
Any programming language, even the simple shell script, can be use for meta-programming, so long as they have the ability to reading and modifying the source code of another program or it's own source code as a text file.
For example:
#!/usr/bin/env bash echo -e "#include <stdio.h>" >> program.c echo -e "int main() {" >> program.c for ((I=1; I<=5; I++)) do echo -e " printf(\042 meta \042);" >> program.c done echo -e "return 0}" >> program.c g++ program.c a.out
This simple bash script generates a program that prints out
meta meta meta meta meta
by generating a c source code as a text file, than compile to source code into a executable binary file using a compiler.
In this article we will be focusing more on the implementation and use of reflection to facilitate meta-programming in dynamically typed languages.
Reflection is the ability of a computer program to examine and modify the structure and behavior of an object at runtime.[2]
Introduction to Dynamically Typed Programming Languages
In general programming languages can be split into two categories base on their type system, statically typed and dynamically typed. A programming language is said to be statically typed if type checking is performed during compile-time. In comparison, a programming language is said to be dynamically typed deferring type checking until run-time as opposes to compile-time. [3]
In dynamically typed languages, the variables and parameters do not have a designated type and may take different type of values at different times. In all the operations, the operands must be type checked at run-time just before performing the operation. Dynamically typed languages don’t need to make a distinction between classes created at compile time and classes provided. It is possible to define classes at run time and in fact, classes are always defined at run time. These eliminate many developer constraints by avoiding the need of book keeping, declarations etc. Due to this flexibility these languages make an ideal candidate for prototyping and are widely used in agile development environments. However, dynamic languages are known to have performance issues. Static languages have code optimization features at compile time, but dynamic languages allow run-time code optimizations only. [4] In dynamically typed languages, the interpreter deduces type and type conversions, this makes development time faster, but it also can provoke run-time failures. These run-time failures are caught early on during compile time for statically typed languages.
Examples of Dynamically Typed Programming Languages
Perl
Perl is a high-level, general-purpose, interpreted, dynamic programming language originally developed as a general-purpose Unix scripting language to make report processing easier. Perl borrows features from other programming languages including C, shell scripting (sh), AWK, and sed. The language provides powerful text processing facilities without the arbitrary data-length limits of many contemporary Unix tools, facilitating easy manipulation of text files. Perl is used for CGI scripting, graphics programming, system administration, network programming, finance, bioinformatics, and other applications.
Python
Python is a general-purpose, high-level programming language whose design philosophy emphasizes code readability. It supports multiple programming paradigms, including object-oriented, imperative and functional programming styles. It features a fully dynamic type system and automatic memory management, similar to that of Scheme, Ruby, Perl and Tcl. Like other dynamic languages, Python is often used as a scripting language, but is also used in a wide range of non-scripting contexts. Using third-party tools, Python code can be packaged into standalone executable programs.
Ruby
Ruby is a dynamic, reflective, general-purpose object-oriented programming language that combines syntax inspired by Perl with Smalltalk-like features. It was also influenced by Eiffel and Lisp. Ruby supports multiple programming paradigms, including functional, object oriented, imperative and reflective. It also has a dynamic type system and automatic memory management; it is therefore similar in varying respects to Smalltalk, Python, Perl, Lisp, Dylan, Pike, and CLU.
Example of Meta-Programming in Dynamically Typed Languages
Ruby
Implementation of Meta-Programming in Dynamically Typed Languages
-macro
-self
-metaclass A metaclass is a class whose instances are classes. Just as an ordinary class defines the behavior of certain objects, a metaclass defines the behavior of certain classes and their instances.
In ruby each object metaclass, a class that can have methods, but is only attached to the object itself.
-eval