Systematic Development of Programming Languages cs784(Prasad) L1Intro 1 Orthogonal Parameters Conceptual view (Model of Computation) » imperative, functional, relational,... Level of abstraction (Model of Implementation) » problem domain » ... » machine – Computational Task : I/O relation to be implemented cs784(Prasad) L1Intro 2 1. Customized Digital Computer Task j Ij Oj Task k Ik Ok Rig different circuit for each task cs784(Prasad) L1Intro 3 2. Stored Program Computing von Neumann showed the existence of a Universal Machine (hardware) that can be customized using control inputs to carry out different tasks. Software is the encoding of the task to control this machine. encoding(Tj) Ij cs784(Prasad) Oj L1Intro 4 Imperative Languages Model of Computation » ALU + Memory + Input + Output (von Neumann architecture) Levels of Abstraction (“Human Interface”) – Machine Language » Binary Representation of the task – Assembly Language » Symbolic Representation of the task cs784(Prasad) L1Intro 5 Assembly Language ADDI R4,R2,21 ADDI R4 R2 21 10101100100000100000000000010101 Use symbols instead of binary digits to describe fields of instructions. Every aspect of machine visible in program: – One statement per machine instruction. – Register allocation, call stack, etc. must be managed explicitly. No structure: everything looks the same. Pros and Cons of Assembly Language Avoids Absolute Addressing » relocatable, reusable/shareable Uses Symbolic » readable Names Low-level programming wastes effort in coding a solution rather than solving a problem. Difficult cs784(Prasad) to build and maintain large programs. L1Intro 7 High-level Language Provides notation to describe problem solving strategies rather than organize data and instructions at machine-level. Improves programmer productivity by supporting features to abstract/reuse code, and to improve reliability/robustness of programs. Requires a compiler. cs784(Prasad) L1Intro 8 Levels of Abstraction Problem Domain (stacks, tables) (Class Hierarchies) Java/C#/Scala/Python/Scheme C++ Ada (ADTs) C Pascal (arrays) Assembly Language Machine (char, int) cs784(Prasad) L1Intro 9 Evolution of Programming Languages • FORTRAN ( FORmula TRANslator) Goals : Scientific Computations Efficiency of execution Compile-time storage determination Features : Symbolic Expressions Subprograms Absence of Recursion • COBOL Goal: Business Application Features : Record/Structure; File Handling cs784(Prasad) L1Intro 10 Evolution of Programming Languages • ALGOL - 60 (ALGOrithmic Language) Goals : Communicating Algorithms Features : Block Structure (Top-down design) Recursion (Problem-solving strategy) BNF - Specification • LISP (LISt Processing) Goals : Manipulating symbolic information Features : List Primitives Interpreters / Environment cs784(Prasad) L1Intro 11 Problems Not rugged wrt typographical errors Do 10 I = 1.20 vs Do 10 I = 1,20 I5 = I5 + 1 vs I5 = IK + 1 – Remedy: Declare before use Unintended Coercion I > J and false – Remedy: Type checking cs784(Prasad) L1Intro 12 Evolution of Programming Languages • Pascal Goal : Structured Programming, Type checking, Compiler writing. Features : • Rich set of data types for efficient algorithm design • E.g., Records, sets, ... • Variety of “readable” single-entry single-exit control structures • E.g., for-loop, while-loop,... • Efficient Implementation • Recursive descent parsing cs784(Prasad) L1Intro 13 Programming in the Large Programs no longer monolithic. Developed by a team of programmers. Code sharing and reuse very important. Correctness, reliability, and robustness essential. – Data Abstraction / Encapsulation / Strong Typing » Ada, CLU, Modula etc. cs784(Prasad) L1Intro 14 Other Languages Functional » Common LISP, Scheme » ML, Haskell Logic » Prolog Object-oriented » Smalltalk, SIMULA, Modula-3, Oberon » C++, Java, C#, Eiffel, Ada-95 Hybrid » Python, Ruby, Scala Application cs784(Prasad) specific languages and tools L1Intro 15 Scripting vs Systems Programming Languages Designed for gluing applications : flexibility Interpreted Dynamic typing and variable creation Data and code integrated : meta-programming supported Examples: PERL, Tcl, Python, Ruby, PHP, Scheme, Visual Basic, Scala, etc. cs784(Prasad) L1Intro Designed for building applications : efficiency Compiled Static typing and variable declaration Data and code separated : cannot create/run code on the fly Examples: PL/1, Ada, Java, C, C++, C#, Scala, etc. 16 (cont’d) Does application implement complex algorithms and data structures? Does application process large data sets (>10,000 items)? Are application functions well-defined, fixed? If yes, consider a system programming language. Is the main task to connect components, legacy apps? Does the application manipulate a variety of things? Does the application have a GUI? Are the application's functions evolving rapidly? Must the application be extensible? Does the application do a lot of string manipulation? If yes, consider a scripting language. cs784(Prasad) L1Intro 17 Jython (for convenient access to Java APIs) I:\tkprasad\cs784>jython Jython 2.1 on java1.4.1_02 (JIT: null) Type "copyright", "credits" or "license" for more information. >>> import javax.swing as swing >>> win = swing.JFrame("Welcome to Jython") >>> win.size = (200, 200) >>> win.show() >>> ^Z cs784(Prasad) L1Intro 18 Java vs Jython map = new HashMap(); map.put("one",new Integer(1)); map.put("two",new Integer(2)); map.put("three",new Integer(3)); map = {"one":1,"two":2,"three":3} System.out.println(map.get("one")); print map ["one"] list = new LinkedList(); list.add(new Integer(1)); list.add(new Integer(2)); list.add(new Integer(3)); cs784(Prasad) list = [1, 2, 3] L1Intro 19 (cont’d) for (Iterator i; i.hasNext();) { i.next(); } for i in list: (* iterator *) List newList = ArrayList() for (Iterator i; i.hasNext();) { Object obj = i.next(); newList.add(function(obj)) } cs784(Prasad) L1Intro newList = [function(i) for i in oldList] (* list comprehension *) 20 Functional Programming in Jython apply(lambda x,y : x*y, (10, 20)) # 200 map(lambda x,y: x + y, [[1,2],[“a”]], [[“3”],[“b”]]) # [[1, 2, ‘3’], [‘a’, ‘b’]] reduce(lambda x,y: x + y, [1,2,3], 100) # 106 filter(lambda x: x > 0, range(10,-5,-3)) # [10, 7 , 4, 1] cs784(Prasad) L1Intro 21 Meta-programming in Jython Dynamic code evaluation print eval (“[1,3] + range(6,10,3)”) # [1, ,3, 6, 9] x = 2 + 3j exec “x = 5, x + x” #(5, (4+6j) cs784(Prasad) L1Intro 22 Java functionality through Jython import java.lang as lang import javax.swing as swing import java.awt as awt names = ["Groucho", "Chico", "Harpo"] quotes = {"Groucho": "Say the secret word", "Chico": "Viaduct?", "Harpo": "HONK!"} def buttonPressed(event): field.text = quotes[event.source.text] def exit(event): lang.System.exit(0) def createButton(name): return swing.JButton(name, preferredSize=(100,20), actionPerformed=buttonPressed) cs784(Prasad) L1Intro 23 win = swing.JFrame("Welcome to Jython", size=(200, 200),windowClosing=exit) win.contentPane.layout = awt.FlowLayout( ) field = swing.JTextField(preferredSize=(200,20)) win.contentPane.add(field) buttons = [createButton(each) for each in names] for eachButton in buttons: win.contentPane.add(eachButton) win.pack( ) win.show( ) cs784(Prasad) L1Intro 24 Current Trend Multiparadigm languages – Functional constructs for programming in the small » Focus on conciseness and correctness – Object-Oriented constructs for programming in the large » Focus on programmer productivity and code evolution Example languages – Older: Python, Ruby, – Recent: Scala, F#, etc cs784(Prasad) L1Intro 25 Scheme (dialect of LISP) Recursive definitions Symbolic computation : List Processing Higher-order functions Dynamic type checking Functional + Imperative features Automatic storage management – Provides a uniform executable platform for studying, specifying, and comparing languages. cs784(Prasad) L1Intro 26 Standard ML and Scala Strongly typed language – static type inference – SML supports polymorphic types Supports Abstract Data Types and Modules Higher-order functions Pattern matching – cf. Prolog, list-processing in Scheme cs784(Prasad) L1Intro 27 Java vs Scala //Java - what we're used to seeing public String buildEpochKey(String... keys) { StringBuilder s = new StringBuilder("elem") for(String key:keys) { if(key != null) { s.append(".") s.append(key) } } return s.toString(). toLowerCase() } cs784(Prasad) L1Intro 28 Java vs Scala //Scala def buildEpochKey(keys: String*): String = { ("elem" +: keys) filter(_ != null) mkString(".") toLowerCase } cs784(Prasad) L1Intro 29