Download presentation
Presentation is loading. Please wait.
Published bySimon Hamlen Modified over 9 years ago
1
Young & Interpreted: Python, Ruby, JavaScript Susan Haynes 18 February 2008 Susan Haynes 18 February 2008
2
These three languages have a lot in common: Dynamic typing -- variables have type, but the type can change during the course of execution Implicit typing -- if it walks like a duck, quacks like a duck, and swims like a duck ---> it’s a duck. Interpreted -- Source code is not compiled then executed. Instead, the source is executed by the interpreter Released ‘92 - ‘95 Dynamic typing -- variables have type, but the type can change during the course of execution Implicit typing -- if it walks like a duck, quacks like a duck, and swims like a duck ---> it’s a duck. Interpreted -- Source code is not compiled then executed. Instead, the source is executed by the interpreter Released ‘92 - ‘95
3
They’re Really Different Extent of Object Orientation JavaScript is just barely OO Ruby is practically pure OO Python has extensive set of primitive sequential structures. JavaScript has String and Array JavaScript is intended to run in web pages and is integrated with the DOM Python and Ruby have lots of support for Web apps beyond displaying pages. Extent of Object Orientation JavaScript is just barely OO Ruby is practically pure OO Python has extensive set of primitive sequential structures. JavaScript has String and Array JavaScript is intended to run in web pages and is integrated with the DOM Python and Ruby have lots of support for Web apps beyond displaying pages.
4
Origins ruby released '95, author Yukihiro Matsumoto, open source python released '91, author Guido van Rossum, open source javascript released with Netscape ‘95. Originally developed by Brendan Eich (netscape) under the name ‘mocha’ ruby released '95, author Yukihiro Matsumoto, open source python released '91, author Guido van Rossum, open source javascript released with Netscape ‘95. Originally developed by Brendan Eich (netscape) under the name ‘mocha’
5
Questions Suitable for CS education? What are they good for? Coolness factor? Suitable for CS education? What are they good for? Coolness factor?
6
What do I know? Not much. I haven’t done serious development in any of these languages -- only toy stuff. Plenty of experience learning a little bit about a lot of languages: PL/1, Algol, Pascal, Fortran, basic, Lisp, C, C++, Java, Ada, Prolog, APL, Javascript, various assemblers, scheme (squeak). Not much. I haven’t done serious development in any of these languages -- only toy stuff. Plenty of experience learning a little bit about a lot of languages: PL/1, Algol, Pascal, Fortran, basic, Lisp, C, C++, Java, Ada, Prolog, APL, Javascript, various assemblers, scheme (squeak).
7
Demos JavaScript using browser :-( Python using IDLE or shell ( python file ) Ruby using irb or shell ( ruby file.rb ) JavaScript using browser :-( Python using IDLE or shell ( python file ) Ruby using irb or shell ( ruby file.rb )
8
White Space Javascript does not care about whitespace. EXCEPT! Multiple statements on a single line must be separated by ‘;’ Python uses white space to indicate nesting level. Ruby allows you to delete certain keywords depending on whitespace. Javascript does not care about whitespace. EXCEPT! Multiple statements on a single line must be separated by ‘;’ Python uses white space to indicate nesting level. Ruby allows you to delete certain keywords depending on whitespace.
9
Line termination Javascript ‘;’ is optional except when multiple statement per line (but everyone uses it) Python ‘;’ is optional. No one uses it Ruby ‘;’ is optional. No one uses it. Javascript ‘;’ is optional except when multiple statement per line (but everyone uses it) Python ‘;’ is optional. No one uses it Ruby ‘;’ is optional. No one uses it.
10
Numbers Javascript number is a fundamental type (along with String, boolean and Object) Python number is a fundamental type, along with boolean, and various list types Ruby number is an object: 3.zero? ==> returns false 3.kind_of? Integer==> returns true 3.class ==> return Fixnum 3.to_f ==> returns 3.0 Javascript number is a fundamental type (along with String, boolean and Object) Python number is a fundamental type, along with boolean, and various list types Ruby number is an object: 3.zero? ==> returns false 3.kind_of? Integer==> returns true 3.class ==> return Fixnum 3.to_f ==> returns 3.0
11
Variable Names JavaScript -- the usual Python -- the usual Ruby -- Local variables start with lower case or _ Instance variables start with @ Class variables start with @@ Globals start with $ JavaScript -- the usual Python -- the usual Ruby -- Local variables start with lower case or _ Instance variables start with @ Class variables start with @@ Globals start with $
12
Simple Python Program First program: first.py s1 = raw_input(“enter integer: “) s2 = raw_input(“enter float: “) s3 = s1 + s2 print “s1+s2 “ + s3 + “\n” n1 = int(s1) n2 = float(s2) n3 = n1+n2 print “n1+n2: “ + n3 Output enter integer: 3 enter float: -14.34 s1+s2 3-14.34 n1+n2 -11.34 Run this with Python and Idle import first then reload(first) on subsequent changes
13
Another simple Python program Second program: second.py x = 10 y = ‘3’ print “type(x): “, type(x) print “type(y): “, type(y) y = int(y) print “type(y): “, type(y) dir() Output >>> import second type(x): type(y): [__builtins__’, ‘__doc__’, ‘__name’__’ ‘first’, ‘n1’, ‘n2’, ‘sys’, ‘x’, ‘y’ ] Notice use of type(), str() and dir() type(varX): returns type of varX str(varY): any varY has a “nice” string representation dir(): lists all known names
14
Parallel Assignment Python, Ruby and JavaScript 1.7 have parallel assignments. Here is a python example (idle) Python, Ruby and JavaScript 1.7 have parallel assignments. Here is a python example (idle) >>> t = (‘a’, ‘b’, ‘c’) >>> type(t) >>> t[0] ‘a’ >>> t[1] ‘b’ >>> type ( (x, y, z) ) >>> (x, y, z) = t >>> x ‘a’ >>> y ‘b’
15
Method Names JavaScript -- the usual Python -- the usual Ruby -- has a convention that’s pretty neat (you’ll see an example later) Ending in ?, returns true or false Ending in !, “in place” modifier of the object itself Ending in =, a ‘setter’ of an instance variable JavaScript -- the usual Python -- the usual Ruby -- has a convention that’s pretty neat (you’ll see an example later) Ending in ?, returns true or false Ending in !, “in place” modifier of the object itself Ending in =, a ‘setter’ of an instance variable
16
Arrays Arrays can change size dynamically. Elements can be of different types Can do the standard indexing and slicing operations. Javascript example (next slide) All three let you use negative indexes to offset from the end Arrays can change size dynamically. Elements can be of different types Can do the standard indexing and slicing operations. Javascript example (next slide) All three let you use negative indexes to offset from the end
17
Javascript - simple array // see array.html var arr1 = [2, 4, 6, 8, "who", "do", 'we', "appreciate", "?" ]; document.write(" Outputting initialized arr1 “ + “ "); document.write(arr1); document.write(" I'm slicing the arr1 “ + “from index 2 to 3nd from end "); arr2 = arr1.slice(2, -2); document.write(arr2); document.write(" I'm adding elements to arr1 “ + at index 20, 21 "); arr1[20] = [1, 2, 3]; arr1[21] = "ta"; document.write(arr1); // see array.html var arr1 = [2, 4, 6, 8, "who", "do", 'we', "appreciate", "?" ]; document.write(" Outputting initialized arr1 “ + “ "); document.write(arr1); document.write(" I'm slicing the arr1 “ + “from index 2 to 3nd from end "); arr2 = arr1.slice(2, -2); document.write(arr2); document.write(" I'm adding elements to arr1 “ + at index 20, 21 "); arr1[20] = [1, 2, 3]; arr1[21] = "ta"; document.write(arr1);
18
Dictionary JavaScript Arrays can be Associate Arrays (like property lists) - see assoc- array.html arr1["dog"] = "mammal"; arr1["parrot"] = "bird"; arr1["tarantula"] = "arachnid"; for (var i in arr1) document.write(arr1[i] + " "); Python and Ruby use a different data structure Python: next slide JavaScript Arrays can be Associate Arrays (like property lists) - see assoc- array.html arr1["dog"] = "mammal"; arr1["parrot"] = "bird"; arr1["tarantula"] = "arachnid"; for (var i in arr1) document.write(arr1[i] + " "); Python and Ruby use a different data structure Python: next slide
19
Dictionary Python example (from idle) >>> dict = {"dog": "mammal", "cat": "mammal", (10, 'a'): 42} >>> dict {(10, 'a'): 42, 'dog': 'mammal', 'cat': 'mammal'} >>> str(dict) "{(10, 'a'): 42, 'dog': 'mammal', 'cat': 'mammal'}" >>> dict.keys() [(10, 'a'), 'dog', 'cat'] >>> dict.values() [42, 'mammal', 'mammal'] >>> dict[(10, "a")] 42 Python example (from idle) >>> dict = {"dog": "mammal", "cat": "mammal", (10, 'a'): 42} >>> dict {(10, 'a'): 42, 'dog': 'mammal', 'cat': 'mammal'} >>> str(dict) "{(10, 'a'): 42, 'dog': 'mammal', 'cat': 'mammal'}" >>> dict.keys() [(10, 'a'), 'dog', 'cat'] >>> dict.values() [42, 'mammal', 'mammal'] >>> dict[(10, "a")] 42
20
Composite types Summary for Python String, immutable, a sequence of character: “this is a string” String delimiters are: ‘ ‘, “ “, “”” “”” List, mutable, a sequence of anything: ( 3, 4, “abc”) Array, similar to Java’s ArrayList: [‘this’, 1, -4.2, [4, “abc”] ] Can insert and delete to a list. Many methods available: y = [].append(“twenty”) #y has value [‘twenty’] Tuple, an immutable set of items (“smith”, “jane”, 24000, “123-45-6789”) Dictionary, a property list or hash table. The key is immutable {(“smith”, “jane”, 24000, “123-45-6789”): 4, “vehicle”: “truck”, age: 19 } String, immutable, a sequence of character: “this is a string” String delimiters are: ‘ ‘, “ “, “”” “”” List, mutable, a sequence of anything: ( 3, 4, “abc”) Array, similar to Java’s ArrayList: [‘this’, 1, -4.2, [4, “abc”] ] Can insert and delete to a list. Many methods available: y = [].append(“twenty”) #y has value [‘twenty’] Tuple, an immutable set of items (“smith”, “jane”, 24000, “123-45-6789”) Dictionary, a property list or hash table. The key is immutable {(“smith”, “jane”, 24000, “123-45-6789”): 4, “vehicle”: “truck”, age: 19 } Each type has many useful methods; indexing and slicing are essentially the same for all types
21
Defining Methods Javascript and Python have an explicit return statement, that may be ignored by the caller Ruby always returns the last value computed (may be ignored by caller) All allow for variable argument lists Python allows for naming parameters Javascript and Python have an explicit return statement, that may be ignored by the caller Ruby always returns the last value computed (may be ignored by caller) All allow for variable argument lists Python allows for naming parameters
22
Closures All three allow for some kind of closure (an unnamed function) Ruby example coming up later in looping All three allow for some kind of closure (an unnamed function) Ruby example coming up later in looping
23
Control Structures The usual suspects with differences in syntax: IF, Looping (while, for, etc), Switch, break, continue. Ruby is a little richer with unless (opposite of if) and until (opposite of while). The usual suspects with differences in syntax: IF, Looping (while, for, etc), Switch, break, continue. Ruby is a little richer with unless (opposite of if) and until (opposite of while).
24
Event handling All offer event handling with variations in syntax
25
Ruby expressiveness: looping examples (1) # fitz56.rb #initialize array values = [1, 2, "buckle", "my", "shoe"] puts "\n-->print array using while" i = 0 while i < values.size do # 'do' is optional here print values[i], " " i += 1 end puts "\n\n--> using 'do-while'" i=0 begin print values[i], " " i += 1 end while i < values.size
26
Ruby expressiveness: looping examples (2) puts "\n\n-->print array using nameless function" values.each do |e| print e, " " end puts "\n\n-->print array using nameless function with {}" values.each { |e| print e, " " } puts "\n\n-->print array using for" for i in 0..values.size-1 do print values[i], " " end puts "\n\n-->using Integer's upto method" 0.upto(values.size-1) { |i| print values[i], " " }
27
Creating classes - Many similarities Class definitions are open, so instance variables and members can be added later, methods can be overridden by adding the new definition. Single inheritance. Object is the base class. Class definitions are open, so instance variables and members can be added later, methods can be overridden by adding the new definition. Single inheritance. Object is the base class.
28
JavaScript class example: defining // see objects.html function Horse (name) { this.name = name; this.getName = getHorseName; this.setName = setHorseName; } function getHorseName () { return this.name; } function setHorseName(name) { this.name = name } // see objects.html function Horse (name) { this.name = name; this.getName = getHorseName; this.setName = setHorseName; } function getHorseName () { return this.name; } function setHorseName(name) { this.name = name }
29
JavaScript class example: modifying Horse.prototype.gait = "walk"; function getHorseGait () { return this.gait; } function setHorseGait (gait) { this.gait = gait; } Horse.prototype.setGait = setHorseGait; Horse.prototype.getGait = getHorseGait; Horse.prototype.gait = "walk"; function getHorseGait () { return this.gait; } function setHorseGait (gait) { this.gait = gait; } Horse.prototype.setGait = setHorseGait; Horse.prototype.getGait = getHorseGait;
30
Ruby class example: Defining # fitz128.rb class Horse def initialize (name)# execute AFTER instantiation @name = name# instance variable end def name# getter @name end# last value is returned def name= (name)# setter @name = name end end # fitz128.rb class Horse def initialize (name)# execute AFTER instantiation @name = name# instance variable end def name# getter @name end# last value is returned def name= (name)# setter @name = name end end
31
Ruby class example: modifying #fitz128b.rb # repeated code deleted class Horse def initialize ( name = 'pokey', age = 10) @name = name @age = age end def say_whoa puts "Whoa there " + @name end #fitz128b.rb # repeated code deleted class Horse def initialize ( name = 'pokey', age = 10) @name = name @age = age end def say_whoa puts "Whoa there " + @name end
32
Python class example: defining Class Doggie: size = 25 friendly = True def sayArf(self): print(“arf”) fifi = Doggie() fifi.size fifi.sayArf() Class Doggie: size = 25 friendly = True def sayArf(self): print(“arf”) fifi = Doggie() fifi.size fifi.sayArf() Run in IDLE
33
Ruby: metaprogramming to make class definition easier To irb class Horse attr :gait, true attr :name, true def say_whoa puts “Whoa there “ + @name end Horse.instance_methods - Object.instance_methods h1 = Horse.new h1.name= “pokey” h1.gait = “trot” p h1
34
Python code Example 1: defining a function >>> def fib(n): “”” Calculate fibonacci Number of parameter “”” if n < 1: return 1 else: return n * fib(n-1) >>> fib >>> type(fib) >>> help(fib) help on function fib in module __main__: fib(n) calculate fibonacci number of parameter >>> fib(5) 120
35
Python code Example 2: A couple stacks >>> p = [] >>> type(p) >>> p.append(1) >>> p.append(2) >>> p.append(“buckle”) >>> p.append(“my”) >>> p.append(5) >>> p {1, 2, ‘buckle’, ‘my’, 5] >>> q = [] >>> while p: q.append(p.pop()) >>> p [] >>> q [5, ‘my’, ‘buckle’, 2, 1]
36
Python list mapping >>> li = range(10) >>> li [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> li2 = [i*2 for i in li] >>> li2 [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] >>> li [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
37
Documentation JavaScript ? Python help(...) returns the docstring of the object Ruby ri, shell command JavaScript ? Python help(...) returns the docstring of the object Ruby ri, shell command
38
At the end of the day Everyone should make a language Many similarities between JavaScript, Python and Ruby: dynamic typing OO Single inheritance Flexible list lengths Interesting (useful) data types: list, hash, tuple,… Lambdas, closures Modifiable class definitions Everyone should make a language Many similarities between JavaScript, Python and Ruby: dynamic typing OO Single inheritance Flexible list lengths Interesting (useful) data types: list, hash, tuple,… Lambdas, closures Modifiable class definitions
39
Which is better? Javascript? Javascript feels kind of klugey -- especially in its OO support, but also in some other things (e.g. the same variable can hold an indexed array and a dictionary) Javascript is quite accessible, especially to ‘old- school’ computer profs who learned to program in a procedural language. The close connection with client-side programming has affected the typical development environment in unpleasant ways (because, mostly, of non-standard compliant browsers). Debugging support is not good. Still the go-to language for dynamic web pages There are lots of Javascript libraries out there. You have to find what you want and include it with Javascript feels kind of klugey -- especially in its OO support, but also in some other things (e.g. the same variable can hold an indexed array and a dictionary) Javascript is quite accessible, especially to ‘old- school’ computer profs who learned to program in a procedural language. The close connection with client-side programming has affected the typical development environment in unpleasant ways (because, mostly, of non-standard compliant browsers). Debugging support is not good. Still the go-to language for dynamic web pages There are lots of Javascript libraries out there. You have to find what you want and include it with
40
Which is better? Python? Easy learning curve for the initial bit. Great for quick development Very readable code, thanks to the indent rule and other syntax rules OO is pretty good -- cleaner than JavaScript’s Lovely set of data types My opinion: I found the syntax very natural Code is not too terse: good for noobs to read & write. Import is easy Very easy to get information from interpreter Really nice debugging support, both in terms of debugger and in terms of online help I had an easier time moving between the IDE and the shell with Python than with Ruby Terrific community and support. Easy learning curve for the initial bit. Great for quick development Very readable code, thanks to the indent rule and other syntax rules OO is pretty good -- cleaner than JavaScript’s Lovely set of data types My opinion: I found the syntax very natural Code is not too terse: good for noobs to read & write. Import is easy Very easy to get information from interpreter Really nice debugging support, both in terms of debugger and in terms of online help I had an easier time moving between the IDE and the shell with Python than with Ruby Terrific community and support.
41
http://imgs.xkcd.com/comics/python.png
42
Which is better? Ruby? OMG! If I were a CS senior, this is the language I would code in. It is a programmer’s language. Like perl (with a scheme-feel for OO, and some lisp thrown in) but with a lot more stuff and slightly more disciplined. Very pristine OO framework. Very easy to get information from interpreter -- most powerful support for reflection. As a teacher, no way! Other people’s code is already hard enough to read. Development environment is not as strong as Python’s. An enthusiastic and growing fan-base. POLS, principle of least surprise (the language should minimize confusion for experienced users). Ruby-on-Rails is reputed to be a “killer app” OMG! If I were a CS senior, this is the language I would code in. It is a programmer’s language. Like perl (with a scheme-feel for OO, and some lisp thrown in) but with a lot more stuff and slightly more disciplined. Very pristine OO framework. Very easy to get information from interpreter -- most powerful support for reflection. As a teacher, no way! Other people’s code is already hard enough to read. Development environment is not as strong as Python’s. An enthusiastic and growing fan-base. POLS, principle of least surprise (the language should minimize confusion for experienced users). Ruby-on-Rails is reputed to be a “killer app”
43
Downloads? Javascript is typically available with a browser. Develop in a plain text editor and execute in the browser. Python and Ruby both “come with” Linux/Unix distributions -- so hurrah for OSX. Python and Ruby interpreters have been implemented for assorted platforms, including Windows. Javascript is typically available with a browser. Develop in a plain text editor and execute in the browser. Python and Ruby both “come with” Linux/Unix distributions -- so hurrah for OSX. Python and Ruby interpreters have been implemented for assorted platforms, including Windows.
44
Resources Javascript About a gazillion Web tutorials JavaScript Standard (O’Reilly book) Many, many, many crappy textbooks and how-to books. Run away! Python www.python.orgwww.python.org Guido’s tutorial is very good. The online book, Dive into Python is good for programmers Python for Dummies. 2 stars. Ruby www.ruby-lang.orgwww.ruby-lang.org There are some tutorials there. Not bad. I can recommend Fitzgerald’s Learning Ruby (O’Reilly). Very simple and readable. Javascript About a gazillion Web tutorials JavaScript Standard (O’Reilly book) Many, many, many crappy textbooks and how-to books. Run away! Python www.python.orgwww.python.org Guido’s tutorial is very good. The online book, Dive into Python is good for programmers Python for Dummies. 2 stars. Ruby www.ruby-lang.orgwww.ruby-lang.org There are some tutorials there. Not bad. I can recommend Fitzgerald’s Learning Ruby (O’Reilly). Very simple and readable.
45
EOT Questions?
Similar presentations
© 2024 SlidePlayer.com Inc.
All rights reserved.