290 likes | 421 Views
This document explores the systematic development of programming languages, emphasizing the abstraction layers from imperative and functional to object-oriented paradigms. It discusses the evolution of languages like FORTRAN, COBOL, and ALGOL, illustrating their goals, features, and problem domains. Key concepts include the von Neumann architecture, levels of abstraction, and the importance of strong typing and encapsulation. The document also outlines various programming paradigms and their appropriateness for different tasks, addressing considerations for scripting versus systems programming languages.
E N D
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 L1Intro
Ij 1. Customized Digital Computer Task j Oj Task k Ik Ok Rig different circuit for each task L1Intro
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 Oj L1Intro
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 L1Intro
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. L1Intro
Pros and Cons of Assembly Language • Avoids Absolute Addressing • relocatable, reusable/shareable • Uses Symbolic Names • readable • Low-level programming wastes effort in coding a solution rather than solving a problem. • Difficult to build and maintain large programs. L1Intro
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. L1Intro
Problem Domain (stacks, tables) Java/C#/Scala/Python/Scheme/Clojure (Class Hierarchies) Levels of Abstraction Ada (ADTs) (arrays) Pascal C++ C Assembly Language Machine (char, int) L1Intro
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 L1Intro
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 L1Intro
Problems • Not rugged wrt typographical errors Do 10 I = 1.20 I5 = I5 + 1 vs vs Do 10 I = 1,20 I5 = IK + 1 • Remedy: Use spaces to delimit tokens, Declare before use • Unintended Coercion I > J and false • Remedy: Type checking L1Intro
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 L1Intro
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. L1Intro
Other Languages • Functional • Common LISP, Scheme, Clojure • ML, Haskell • Logic • Prolog • Object-oriented • Smalltalk, SIMULA, Modula-3, Oberon • C++, Eiffel, Ada-95, Java, C# • Hybrid • Python, Ruby, Scala • Application specific languages and tools L1Intro
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, etc. 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. Scripting vs Systems Programming Languages L1Intro
(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. L1Intro
Jython (for convenient access to Java APIs) I:\tkprasad\cs7100>jython … >>> import javax.swing as swing >>> win = swing.JFrame("Welcome to Jython") >>> win.size = (200, 200) >>> win.show() >>> ^Z L1Intro
map = new HashMap(); map.put("one",new Integer(1)); map.put("two",new Integer(2)); map.put("three",new Integer(3)); System.out.println(map.get("one")); list = new LinkedList(); list.add(new Integer(1)); list.add(new Integer(2)); list.add(new Integer(3)); map = {"one":1,"two":2,"three":3} print map ["one"] list = [1, 2, 3] Java vs Jython L1Intro
for i in list: (* iterator *) newList = [function(i) for i in oldList] (* list comprehension *) for (Iterator i; i.hasNext();) { i.next(); } List newList = ArrayList() for (Iterator i; i.hasNext();) { Object obj = i.next(); newList.add(function(obj)) } (cont’d) L1Intro
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] L1Intro
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) L1Intro
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) L1Intro
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( ) L1Intro
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, robustness and code evolution • Example languages • Older: Python, Ruby • Recent: Scala, F# L1Intro
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. L1Intro
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 L1Intro
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() } L1Intro
Java vs Scala //Scala def buildEpochKey(keys: String*): String = { ("elem" +: keys) . mkString(".") . toLowerCase } println(buildEpochKey("aBcDeF")) L1Intro