310 likes | 324 Views
Dive into imperative, functional, and declarative languages, software development processes, and the role of programming languages in computing. Understand the Waterfall and Spiral models, the importance of PLs in software environments, and the impact of software design methodologies. Discover how abstraction, control, data abstraction, and non-sequential execution shape programming languages. Explore the influence of computer architecture on PL design, from Von Neumann's sequential execution to modern concurrent computing. Gain insights into the evolution of PL concepts and their role in advancing software development practices.
E N D
CSCE 330Programming Language Structures Fall 2004 Marco Valtorta mgv@cse.sc.edu
Textbooks • Ghezzi and Jazayeri • The main textbook • History and general concepts • Syntax and semantics • Imperative languages • Functional languages • Declarative languages • Ullman • In-depth coverage of the functional language ML-97
Disclaimer • The slides are based on the textbooks and other sources, including several other fine textbooks for the Programming Language (PL) Concepts course • The PL Concepts course covers topics PL1 through PL11 in Computing Curricula 2001 • One or more PL Concepts course is almost universally a part of a Computer Science curriculum
Why Study PL Concepts? • Increased capacity to express ideas • Improved background for choosing appropriate languages • Increased ability to learn new languages • Better understanding of the significance of implementation • Increased ability to design new languages • Background for compiler writing • Overall advancement of computing
Software Development Process • Three models of the Software Development process: • Waterfall Model • Spiral Model • RUDE • Run, Understand, Debug, and Edit • Different languages provide different degrees of support for the three models
The Waterfall Model • Requirements analysis and specification • Software design and specification • Implementation (coding) • Certification: • Verification: “Are we building the product right?” • Validation: “Are we building the right product?” • Module testing • Integration testing • Quality assurance • Maintenance and refinement
PLs as Components of a Software Development Environment • Goal: software productivity • Need: support for all phases of SD • Computer-aided tools (“Software Tools”) • Text and program editors, compilers, linkers, libraries, formatters, pre-processors • E.g., Unix (shell, pipe, redirection) • Software development environments • E.g., Interlisp, JBuilder • Intermediate approach: • Emacs (customizable editor to lightweight SDE)
Influences on PL Design • Software design methodology (“People”) • Need to reduce the cost of software development • Computer architecture (“Machines”) • Efficiency in execution • A continuing tension • The machines are winning
Software Design Methodology and PLs • Example of convergence of software design methodology and PLs: • Separation of concerns (a cognitive principle) • Divide and conquer (an algorithm design technique) • Information hiding (a software development method) • Data abstraction facilities, embodied in PL constructs such as: • SIMULA 67 class, Modula 2 module, Ada package, Smalltalk class, CLU cluster, C++ class, Java class
Abstraction • Abstraction is the process of identifying the important qualities or properties of a phenomenon being modeled • Programming languages are abstractions from the underlying physical processor: they implement “virtual machines” • Programming languages are also the tools with which the programmer can implement the abstract models • Symbolic naming per se is a powerful abstracting mechanism: the programmer is freed from concerns of a bookkeeping nature
Data Abstraction • In early languages, fixed sets of data abstractions, application-type specific (FORTRAN, COBOL, ALGOL 60), or generic (PL/1) • In ALGOL 68, Pascal, and SIMULA 67 Programmer can define new abstractions • Procedures (concrete operations) related to data types: the SIMULA 67 class • In Abstract Data Types (ADTs), • representation is associated to concrete operations • the representation of the new type is hidden from the units that use the new type • Protecting the representation from attempt to manipulating it directly allows for ease of modification.
Control Abstraction • Control refers to the order in which statements or groups of statements (program units) are executed • From sequencing and branching (jump, jumpt) to structured control statements (if…then…else, while) • Subprograms and unnamed blocks • methods are subprograms with an implicit argument (this) • unnamed blocks cannot be called • Exception handling
Non-sequential Execution • Coroutines • allow interleaved (not parallel!) execution • can resume each other • local data for each coroutine is not lost • Concurrent units are executed in parallel • allow truly parallel execution • motivated by Operating Systems concerns, but becoming more common in other applications • require specialized synchronization statements • Coroutines impose a total order on actions when a partial order would suffice
Computer Architecture and PLs • Von Neumann architecture • a memory with data and instructions, a control unit, and a CPU • fetch-decode-execute cycle • the Von Neumann bottleneck • Von Neumann architecture influenced early programming languages • sequential step-by-step execution • the assignment statement • variables as named memory locations • iteration as the mode of repetition
Other Computer Architectures • Harvard • separate data and program memories • Functional architectures • Symbolics, Lambda machine, Mago’s reduction machine • Logic architectures • Fifth generation computer project (1982-1992) and the PIM • Overall, alternate computer architectures have failed commercially • von Neumann machines get faster too quickly!
Language Design Goals • Reliability • writability • readability • simplicity • safety • robustness • Maintainability • factoring • locality • Efficiency • execution efficiency • referential transparency and optimization • optimizability: “the preoccupation with optimization should be removed from the early stages of programming… a series of [correctness-preserving and] efficiency-improving transformations should be supported by the language” [Ghezzi and Jazayeri] • software development process efficiency • effectiveness in the production of software
Language Translation • A source program in some source language is translated into an object program in some target language • An assembler translates from assembly language to machine language • A compiler translates from a high-level language into a low-level language • the compiler is written in its implementation language • An interpreter is a program accepts a source program and runs it immediately • An interpretive compiler translates a source program into an intermediate language, and the resulting object program is then executed by an interpreter
Example of Language Translators • Compilers for Fortran, COBOL, C • Interpretive compilers for Pascal (P-Code) and Java (Java Virtual Machine) • Interpreters for APL and (early) LISP
Plankalkül (Konrad Zuse, 1943-1945) FORTRAN (John Backus, 1956) LISP (John McCarthy, 1960) ALGOL 60 (Transatlantic Committee, 1960) COBOL (US DoD Committee, 1960) APL (Iverson, 1962) BASIC (Kemeny and Kurz, 1964) PL/I (IBM, 1964) SIMULA 67 (Nygaard and Dahl, 1967) ALGOL 68 (Committee, 1968) Pascal (Niklaus Wirth, 1971) C (Dennis Ritchie, 1972) Prolog (Alain Colmerauer, 1972) Smalltalk (Alan Kay, 1972) FP (Backus, 1978) Ada (UD DoD and Jean Ichbiah, 1983) C++ (Stroustrup, 1983) Modula-2 (Wirth, 1985) Delphi (Borland, 1988?) Modula-3 (Cardelli, 1989) ML (Robin Milner, 1985?) Eiffel (Bertrand Meyer, 1992) Java (Sun and James Gosling, 1993?) C# (Microsoft, 2001?) Scripting languages such as Perl, etc. Etc. Some Historical Perspective
Syntax and Semantics • Syntax is the set of rules that specify the composition of programs from letters, digits and other characters. • Semantics is the set of rules that specify what the result/outcome of a program is. • Problems with English language description of Syntax and Semantics: • verbosity • ambiguity
Syntax • What is syntax? • syntax vs. lexical rules • Regular languages and context-free languages • Backus Normal Form (a.k.a. Backus-Naur Form)BNF • A syntax metalanguage • Derivation vs. recognition • Syntax Diagram • Extended BNF (EBNF)
BNF History In Java: <IfThenStat> ::= if (<Expr>) <Stat> <IfThenElseStat> ::= if (<Expr>) <StatNoShortIf> else <Stat>
Recursive Descent Parsing • Parsing is the process of constructing a parse tree • A recursive descent parser is a kind of leftmost parser with very limited lookahead • Recursive descent parsers are built directly from (E)BNF rules • Recursive descent parsers do not work with left-recursive grammars • We provide a simple example for parsing terms made of factors
The Concept of Binding • entities (e.g., variables, statements, subprograms, declarations...) have attributes (e.g., for variable: name, type, storage area) • Binding is the specification of the exact nature of an attribute. • When does binding occur? Binding time. • language definition time • language implementation time • compile time • run time • Example: the Fortran type INTEGER is bound partly at language definition time, partly at language implementation time. • static (established before run-time, cannot be changed) and dynamic binding
Variables • Name • Scope • Lifetime • Value • l-value (memory location) and r-value (contents of a memory location) • Type
Variable Scope • Variables have scope: the range of program instructions over which the variable is known, and therefore manipulable • scope binding can be static or dynamic • dynamic scoping is easy to implement, but more confusing for most programmers • most modern languages use static scoping
Variable Type • type is the range of values a variable can take, together with operations to create, access, and modify values • variable type declarations • implicit in FORTRAN, explicit almost in any other language • dynamic binding between variables and types is unusual • APL and SNOBOL4 have it
Variable Value • binding of variable and value is dynamic, except for symbolic constants • Algol v. Pascal: manifest constants • reference (pointer) • access path (chain of pointers) • primary means of accessing anonymous variables • shared objects
Semantics • (So-called) Static Semantics • Context-Sensitive Grammars • Scope and Type • Attribute Grammars • Operational Semantics • Denotational Semantics • Axiomatic Semantics
Previewing Postscript In this course, most notes from the instructor are in Postscript format • Postscript previewers are installed on the departmental Unix machines • “gv is available on all solaris machines” (P. O’Keefe) • and on the College Windows machines • “GSView is located in all of the prototype machines. I copied the shortcuts in cse apps folder” (H. Naik) • a link to obtaining PostScript previewers is provided on the course web site. It points (indirectly) to http://www.cs.wisc.edu/~ghost/
Static Semantics • Static semantics are used to check type and scope rules • Semantics is a misnomer in this context • We provide only an example • for checking the type rules of the variable and expression in the assignment statement of a simple language • using attribute grammars (which are a formalization of contextual grammars)