CSC/ECE 517 Fall 2011/ch1 1g vn: Difference between revisions
Line 92: | Line 92: | ||
===Dynamic Typing=== | ===Dynamic Typing=== | ||
Scripting languages were originally designed to serve as tools for automating repetitive tasks such as rotating a system log. In order to permit easy interfacing between components, a script language must be as typeless as possible. In strongly typed languages, extra code may be required in order to allow to components to communicate. This dynamic typing provides a distinct advantage that eventually made its way into popular programming languages such as Python and Ruby. | Scripting languages were originally designed to serve as tools for automating repetitive tasks such as rotating a system log. In order to permit easy interfacing between components, a script language must be as typeless as possible. In strongly typed languages, extra code may be required in order to allow to components to communicate. This dynamic typing provides a distinct advantage that eventually made its way into popular programming languages such as Python and Ruby. [http://books.google.com/books/about/Scripting_with_objects.html?id=3lK3OAAACAAJ] | ||
===Glue code=== | ===Glue code=== |
Revision as of 23:35, 8 September 2011
Object-Oriented Languages and Scripting
Overview
In recent years, object-oriented programming has become especially popular in dynamic programming languages. Python, Ruby and Groovy are dynamic languages built on OOP principles, while Perl and PHP have been adding object oriented features since Perl 5 and PHP 4, and ColdFusion since version 6. Over time, the scripting landscape has changed dramatically. Perl has added support for object orientation, Python has extended its object-oriented support, and more recently Ruby has made a name for itself as a full-fledged dynamic object-oriented scripting language with significant productivity benefits when compared to Java and C++. Groovy follows the lead of Ruby by offering these dynamic object orientation features. Not only does it enhance Java by making it scriptable, but it also provides new OO features [1]
Object Oriented Languages
Object-oriented programming (OOP) is a programming paradigm using "objects" – data structures consisting of data fields and methods together with their interactions – to design applications and computer programs. Programming techniques may include features such as data abstraction, encapsulation, messaging, modularity, polymorphism, and inheritance. Many modern programming languages now support OOP, at least as an option.
List of object-oriented programming languages
Scripting Languages
A scripting language, script language or extension language is a programming language that allows control of one or more applications. "Scripts" are distinct from the core code of the application, as they are usually written in a different language and are often created or at least modified by the end-user. Scripts are often interpreted from source code or bytecode, whereas the application is typically first compiled to native machine code. Early script languages were often called batch languages or job control languages. Such early scripting languages were created to shorten the traditional edit-compile-link-run process.
Advantages that object orientation bring to a scripting language
As object-oriented concepts continue to evolve software development, many of the software needs that are driving the object-oriented movement are the same for scripting languages. Therefore, many of the fundamental concepts of Object-oriented languages are advantages for scripting languages. In some languages, object oriented concepts are present even if one does not directly use them. For example, all variables created in Ruby or Python are references to an object, regardless of whether or not they are treated as one. [2]
A few of the main concepts advantages to scripting are:
Objects
Objects are one of the key concepts in object-oriented design. When trying to understand software objects it is important to realize that they are very similar to real-world objects such as cats, desks, and cars. Real-world objects can be broken down into two fundamental characteristics: state and behavior. For example, a car object has state (color, make, model, year) and behavior (accelerate, brake, change gear).
Software objects, which conceptually are similar to real-world objects, also consist of state and behavior. An objects stores its state in variables and expose its behavior through methods. When combined with scripting languages, they provide the distinct advantage of allowing a programmer to more effectively model real-world objects. [3]
Image on right is a visual representation of a software object.
Inheritance
Another import an concept of object-oriented programming is inheritance. Inheritance allows a class to copy all the state and behavior of another class and then modify and extend these attributes to provide a more custom approach for the problem at hand.
Here is an inheritance example:
"Both a Graduate class and Undergraduate class have similar bahavior such as managing a name, an address, a major, and a GPA. Rather than put this behavior in both of these classes, the behavior is placed in a new class called Student. Both Graduate and Undergraduate become subclass of the Student class, and both inherit the Student behavior. Both Graduate and Undergraduate classes can then add additional behavior that is unique to them. For example, Graduate can be either Master's program or PhD program. On the other hand, the Undergraduate class might want to keep track of either the student is Freshman, Sophomore, Junior or Senior."
Any class that extends from another class is called a subclass. The class a subclass inherits from is called the superclass. Inheritance is also advantageous for scripting languages as it promotes code reuse and allows for specialized subclasses based on the needs of the script. [4]
Encapsulation
Encapsulation, which is most often achieved through information hiding, allows a programmer to hide the implementation details of an object. Only state and behavior of an object that are designated as public can be viewed from outside its scope. This provides an important advantage to scripting languages by preventing objects from accidentally modifying attributes in another object that may be vital to the scripts functionality.
In most programming languages, the common levels of access to an object are:
- Public : All objects can access it.
- Protected : Access is limited to members of the same class or subclass.
- Private : Access is limited to members of the same class. [5]
Interfaces
Objects define their interaction with the outside world through public attributes and methods. These public attributes form the object's interface with the outside word. For example, the buttons on your television remote are the interface between you and the electronics controlling the television. In its most common form, an interface is a set of methods without any code implementing them.
For example, this may be an interface for a bicycle in Java:
interface Bicycle { void changeCadence(int newValue); // wheel revolutions per minute void changeGear(int newValue); void speedUp(int increment); void applyBrakes(int decrement); }
To implement this interface, the name of your class would change (to a particular brand of bicycle, for example, such as ACMEBicycle), and you'd use the implements keyword in the class declaration:
class ACMEBicycle implements Bicycle { // remainder of this class implemented as before }
Interfaces are a way to formalize an object's behavior and form a contract between the class and the outside world. If your class implements an interface, then it must define and implement all of the methods that appear in the original interface. Interfaces can be very useful in scripting where implementations of an class may need to change frequently.[6]
Code Reuse
Object oriented design promotes code reuse by allowing programmers to take preexisting classes and integrating them into new scripts. This helps to improve readability of the code as well as promoting the "Don't Repeat Yourself" principle, which aims at reducing repetition of information. [7]
Advantages that scripting capability bring to an object-oriented language
Scripting provides a few advantages to object-oriented languages:
Dynamic Typing
Scripting languages were originally designed to serve as tools for automating repetitive tasks such as rotating a system log. In order to permit easy interfacing between components, a script language must be as typeless as possible. In strongly typed languages, extra code may be required in order to allow to components to communicate. This dynamic typing provides a distinct advantage that eventually made its way into popular programming languages such as Python and Ruby. [8]
Glue code
While not contributing any functionality to a program, glue code allows a programmer to bring together two different pieces of code that normally would be incompatible together.
Are there any advantages to a scripting language that is not object oriented?
The only advantage to a scripting language that is not object oriented is that it makes it a little easier if the language used for a particular project doesn’t require much complexity and OOP features don’t really make a difference. There are many non-object-oriented scripting languages in use, or scripting languages that have "object extensions" that often go unused like Perl, PHP, and various UNIX shells.
All these languages enable one to write small programs very quickly and efficiently without any complexity of OOP features. Perl was not originally designed or implemented as an object-oriented language. Its version of object orientation is simple and well integrated, but not fundamental to the language. In a larger system, an object-oriented implementation of a system in Perl will almost never be faster than the equivalent non-object-oriented implementation [9]
Tcl also did not originally support object oriented (OO) syntax before 8.6, so OO functionality was provided by extension packages, such as incr Tcl and XOTcl. Tcl is more suited at OO in the large than OO in the small. Fine-grained "an int is an object" OO would not fit well in Tcl. Everything is a string, after all [10]
Is scripting essentially synonymous with dynamic typing?
Dynamic typing is not so important for Scripting languages but usually they are dynamically typed. For e.g. scripting languages (e.g. Perl, Tcl, Python, Rexx, Visual Basic) are dynamically typed, usually interpreted, and very high-level. Because of dynamic typing and interpretation they are very flexible and encourage experimentation.
The figure on the right shows a comparison of various programming languages based on their level (higher level language execute more machine instructions for each language statement) and their degree of typing. System programming languages like C tend to be strongly typed and medium level (5-10 instructions/statement). Scripting language like Tcl tend to be weakly typed and vey high level (100-1000 instructions/statement) [11]
Objects in scripting languages tend to be typeless. To enable easy interfacing between the components that are combined together in a script. In a typeless environment, the output of one can be taken as a generic system of bytes and accepted by the receiving component just on that basis. Or, as is more commonly the case with scripting languages because string processing is main focus of such languages, the components can be assumed to produce characters at their outputs and to accept character streams at their inputs.
Perl is known as one of "the three Ps" (along with Python and PHP), the most popular dynamic languages for writing Web applications. Python is dynamically typed, so there is no need for variable declarations. This reduces the amount of code that students have to write and also eliminates common errors stemming from misunderstanding the subtle distinctions of declaration, definition and use
[12] Ruby also features dynamic typing. Part of the dynamic type system that lends Ruby its power is a feature called "open classes."
The following program shows power and simplicity of dynamic typing in Ruby
class Class def attr_reader2(*vars) vars.each do |symbol| define_method(symbol) { instance_variable_get "@#{symbol}" } end end def attr_writer2(*vars) vars.each do |symbol| define_method("#{symbol}=") { |value| instance_variable_set("@#{symbol}", value) } end end def attr_accessor2(*vars) attr_reader2(*vars) attr_writer2(*vars) end end
Object Oriented Scripting Languages
AppleScript
AppleScript is a scripting language created by Apple Inc., through which scriptable applications and parts of Mac OS can be controlled directly. AppleScript scripting language appears to be a simple language but it is a very rich, object-oriented language, capable of performing complex programming tasks. It has the concept of classes and objects. It is basically an inter-application processing system, intended to exchange data between different applications and control them to automate recurring tasks.
Example of a simple script with one property, one handler, one nested script object, and an implicit run handler with two statements
property defaultClientName : "Mary Smith" on greetClient(nameOfClient) display dialog ("Hello " & nameOfClient & "!") end greetClient script testGreet greetClient(defaultClientName) end script run testGreet --result: "Hello Mary Smith!" greetClient("Joe Jones") --result: "Hello Joe Jones!"
Curl
Curl is a reflective object-oriented programming language for interactive web applications whose goal is to provide a effortless transition between formatting and programming. Curl is a markup language like and also includes an object-oriented programming language that supports multiple inheritance.
A modern web document, which comprises of different building blocks mostly requires various kinds of methods of implementation: different languages, different tools, different frameworks and sometimes completely different teams. The biggest problem has been getting all of these blocks to communicate with each other in a consistent manner. Curl attempts to side step these problems by providing a consistent syntactic and semantic interface at all levels of web content creation: from simple HTML to complex object-oriented programming. Curl combines text markup (as in HTML), scripting (as in JavaScript), and heavy-duty computing (as in Java, C#, or C++) within one common framework. It is used in a range of internal enterprise, B2B, and B2C applications.
{Curl 5.0, 6.0, 7.0 applet} {text color = "blue", font-size = 16pt, Hello World}
Groovy
Groovy is an object-oriented programming scripting language for the Java platform. It is a dynamic language with features similar to those of Python, Ruby, Perl, and Smalltalk. It makes writing shell and build scripts easy with its powerful processing primitives, OO abilities and an Ant DSL. It makes testing simpler by supporting unit testing and mocking out-of-the-box. It seamlessly integrates with all existing Java classes and libraries. Groovy uses a Java-like bracket syntax. It is dynamically compiled to Java Virtual Machine (JVM) bytecode and interoperates with other Java code and libraries.
class Greet { def name Greet(who) { name = who[0].toUpperCase() + who[1..-1] } def salute() { println "Hello $name!" } } g = new Greet('world') // create object g.salute() // Output "Hello World!"
JavaScript
JavaScript, also known as Mocha, LiveScript, JScript, and ECMAScript, is one of the world's most popular programming languages. It is a class-free, object-oriented language, and uses prototypal inheritance instead of classical inheritance. It is a prototype-based scripting language, which is dynamic, weakly typed, and has first-class functions. It is a multi-paradigm language, which supports object-oriented, imperative, and functional programming styles. It supports OOP because it supports inheritance through prototyping as well as properties and methods. Many developers cast off JS as a suitable OOP language because they are so used to the class style of C# and Java. The primary use of JavaScript is to write functions that are embedded in or included from HTML pages and that interact with the Document Object Model (DOM) of the page. JavaScript is an excellent language to write object oriented web applications. It can support OOP because it supports Encapsulation, Polymorphism and inheritance through prototyping as well as properties and methods [13]
function A() { var x = 7; this.GetX = function() { return x;} this.SetX = function(xT) { x = xT; } } obj = new A; obj2 = new A; document.write(obj.GetX() + ' ' + obj2.GetX()); obj.SetX(14); document.write(' ' + obj.GetX() + ' ' + obj2.GetX());
Lua
Lua is a powerful, fast, lightweight, embeddable scripting language. Lua combines simple procedural syntax with powerful data description constructs based on associative arrays and extensible semantics. Lua is dynamically typed, runs by interpreting bytecode for a register-based virtual machine, and has automatic memory management with incremental garbage collection, making it ideal for configuration, scripting, and rapid prototyping.
String Class Example
> mt = {} -- metatable > > function String(s) >> return setmetatable({ value = s or '' }, mt) >> end > > function mt.__add(a, b) >> return String(a.value .. b.value) >> end > > function mt.__mul(a, b) >> return String(string.rep(a.value, b)) >> end > > s = String('hello ') > > print(s.value) hello > print( (s + String('Lua user')).value ) -- concat 2 String instances hello Lua user > print( (s*3).value ) hello hello hello > print( (((s + String('Lua user.')))*2).value ) -- use both metamethods hello Lua user.hello Lua user.
Object Rexx
Object REXX programming language is an object-oriented scripting language initially produced by IBM for OS/2. As an object-oriented language, Rexx provides data encapsulation, polymorphism, an object class hierarchy, class-based inheritance of methods, and concurrency[14] It includes a number of useful base classes and allows you create new object classes of your own.
factorialProgram.rex -- computes the factorial of a number
arg N . call factorial N say result exit 0 /* don't fall through to the PROCEDURE instruction */ factorial : PROCEDURE n = arg( 1 ) if n = 1 then return 1 return n * factorial( n - 1 )
Perl 5
Perl is a high-level, general-purpose, interpreted, dynamic programming language. Perl was originally developed by Larry Wall in 1987 as a general-purpose Unix scripting language to make report processing easier. There are three main terms, explained from the point of view of how Perl handles objects. The terms are object, class, and method.
- Within Perl, an object is merely a reference to a data type that knows what class it belongs to. The object is stored as a reference in a scalar variable.
- A class within Perl is a package that contains the corresponding methods required to create and manipulate objects.
- A method within Perl is a subroutine, defined with the package. The first argument to the method is an object reference or a package name, depending on whether the method affects the current object or the class.
Perl provides a bless() function which is used to return a reference and which becomes an object. Perl has a special variable, @ISA which governs (method) inheritance.
Inheritance in Perl 5
{ package Animal; sub speak { my $class = shift; print "a $class goes ", $class->sound, "!\n"; } sub name { my $self = shift; $$self; } sub named { my $class = shift; my $name = shift; bless \$name, $class; } } { package Horse; @ISA = qw(Animal); sub sound { "neigh" } }
PHP
PHP is a widely-used general-purpose scripting language that is especially suited for Web development and can be embedded into HTML. Basic object-oriented programming functionality was added in PHP 3 and improved in PHP 4. Object handling was completely rewritten for PHP 5, expanding the feature set and enhancing performance. PHP 5 introduced private and protected member variables and methods, along with abstract classes and final classes as well as abstract methods and final methods. It also introduced a standard way of declaring constructors and destructors, similar to that of other object-oriented languages such as C++, and a standard exception handling model. Furthermore, PHP 5 added interfaces and allowed for multiple interfaces to be implemented. There are special interfaces that allow objects to interact with the runtime system. Objects implementing ArrayAccess can be used with array syntax and objects implementing Iterator or IteratorAggregate can be used with the foreach language construct. There is no virtual table feature in the engine, so static variables are bound with a name instead of a reference at compile time.
class Person { public $firstName; public $lastName; public function __construct($firstName, $lastName = '') { //Optional parameter $this->firstName = $firstName; $this->lastName = $lastName; } public function greet() { return "Hello, my name is " . $this->firstName . " " . $this->lastName . "."; } } $he = new Person('John', 'Smith'); echo $he->greet(); // prints "Hello, my name is John Smith."
Python
Python is a remarkably powerful dynamic programming language that is used in a wide variety of application domains. Python is often compared to Tcl, Perl, Ruby, Scheme or Java. Python is a general-purpose, high-level programming language whose design philosophy emphasizes code readability. The class statement, which executes a block of code and attaches its local namespace to a class, for use in object-oriented programming. Python allows programmers to define their own types using classes, which are most often used for object-oriented programming.
Constructing a class
class Car: def brake(self): print("Brakes") def accelerate(self): print("Accelerating")
Ruby
Ruby is a dynamic, reflective, general-purpose object-oriented programming language that combines syntax inspired by Perl with Smalltalk-like features. Matsumoto has stated, "I wanted a scripting language that was more powerful than Perl, and more object-oriented than Python. That's why I decided to design my own language" Ruby is object-oriented: every data type is an object, including classes and types that many other languages designate as primitives (such as integers, booleans, and "nil"). Variables always hold references to objects. Every function is a method and methods are always called on an object. Methods defined at the top level scope become members of the Object class. Since this class is an ancestor of every other class, such methods can be called on any object. They are also visible in all scopes, effectively serving as "global" procedures. Ruby supports inheritance with dynamic dispatch, mixins and singleton methods (belonging to, and defined for, a single instance rather than being defined on the class). Though Ruby does not support multiple inheritance, classes can import modules as mixins.
class Person attr_reader :name, :age def initialize(name, age) @name, @age = name, age end def <=>(person) # Comparison operator for sorting @age <=> person.age end def to_s "#@name (#@age)" end end group = [ Person.new("Bob", 33), Person.new("Chris", 16), Person.new("Ash", 23) ] puts group.sort.reverse
Tcl-Tk
Tcl originally from "Tool Command Language" is a scripting language created by John Ousterhout. It is commonly used for rapid prototyping, scripted applications, GUIs and testing. Tcl is used on embedded systems platforms, both in its full form and in several other small-footprinted versions. Tcl 8.6 provides an OO system in Tcl core [15] The combination of Tcl and the Tk GUI toolkit is referred to as Tcl/Tk.
oo::class create fruit { method eat {} { puts "yummy!" } } oo::class create banana { superclass fruit constructor {} { my variable peeled set peeled 0 } method peel {} { my variable peeled set peeled 1 puts "skin now off" } method edible? {} { my variable peeled return $peeled } method eat {} { if {![my edible?]} { my peel } next } } set b [banana new] $b eat → prints "skin now off" and "yummy!" fruit destroy $b eat → error "unknown command"
References
1. Object-oriented_programming http://en.wikipedia.org/wiki/Object-oriented_programming
2. List of Object Oriented programming languages http://en.wikipedia.org/wiki/List_of_object-oriented_programming_languages
3.