Ch. 1: Overview and History
This covers material from Chapter 1, with various additions.
  1. Principles
    1. Syntax: What is a legal program?
      1. What symbols are used?
      2. How must they be arranged?
    2. Names and types.
      1. What names can we use?
      2. What type of data can we store?
      3. How do we decide all that?
    3. Semantics: What does a program mean?
  2. Paradigms
    1. Imperative.
    2. Object-Oriented
    3. Functional (Applicative)
    4. Logic (Rule-based; Declarative)
  3. Programming Language History.
    1. Fig. 1.2.
    2. The Patriarchs.
      1. FORTRAN
        1. FORmula TRANslator: Expressions.
        2. Rest of language reflects hardware.
        3. No block control constructs: Conditional GOTOs.
        4. Early-Style Fortran Program'
        5. Fixed format: Designed for punched cards.
      2. COBOL
        1. Record data structure.
        2. Verbose assembly language.
        3. Also fixed format for punched cards.
        4. Simple Example (off-site, U. of Limerick).
        5. Record Example (off-site, U. of Limerick).
      3. Algol
        1. Fluid format.
        2. Block structure.
        3. An Algol Program
        4. More popular to swipe ideas from than actually use.
    3. Algol's Children
      1. PL/I. Everything but the kitchen sink.
        1. Pointers.
        2. Something like exceptions.
        3. Example (off-site, IBM).
      2. Pascal - Less is more.
        1. Data structures to fit problem.
        2. Day of the week, Schedule Program
      3. Ada - No, its not. Another kitchen sink language.
        1. Modular programming.
        2. Generics
        3. Rational Mod, Rational Impl, Driver.
    4. The Black Sheep
      1. C — For OS.
      2. C++ Kitchen sink again.
        1. Classes.
        2. Generics.
      3. Java — C++ minus the crud.
    5. And many more.
  4. Design Constraints.
    1. Hardware archtecture.
      1. Programming languages need to run on a computer.
      2. Took a while for languages to escape being ruled by architecture.
      3. Then they took over.
        1. CISC machines to represent high-level constructs in hardware.
        2. Stack machines to model Algol-style scope.
        3. Lisp machines to run Lisp.
      4. RISC machines considered best.
    2. Technical setting.
      1. Operating system environment.
      2. Purpose
        1. General
        2. Special
      3. Standards.
        1. When?
          1. Too early: Not based on experience.
          2. Too late: Too much divergence.
        2. Who?
          1. Corporation (e.g., Java).
          2. Voluntary Committee (e.g., C++). Herding cats
          3. Government as buyer (Ada).
    3. Legacy.
      1. Re-writing a working program is very expensive.
      2. Old languages tend to live forever.
  5. Attributes of a Good Language. (Some listed beyond what's in your book.)
    1. Simplicity and Readability.
      1. Can tell what a construct means.
      2. Easy to tell what a data are effected.
      3. Similar-looking things have similar operations.
    2. Reliability.
    3. Learnability.
      1. Access to compilers.
      2. Access to tutorial information.
    4. Abstraction Support. Collect code to perform a specific task which can be used as a single object.
      1. Compound data structures.
      2. Functions and procedures.
      3. Modules.
      4. Objects.
    5. Orthogonality — Every combination of features is meaningful.
    6. Efficiency
      1. Translation.
      2. Execution (most important).
    7. Avoid arbitrary limits.
      MacLennan: The only reasonable numbers are zero, one and infinity.
    8. Portability.
  6. Binding.
    1. Binding: The fixing of some property for some feature of the language.
    2. Binding time: When binding is done.
      1. Execution time (run time).
        1. At start of execution.
        2. At function entry.
        3. At any point during execution.
      2. Translation time (compile time).
        1. Chosen by the programmer (“Program writing time.”)
        2. Chosen by the translation system.
      3. Implementation time: Chosen by the compiler writer.
      4. Language definition time: Chosen by the language designer.
    3. Binding Time Examples
  7. Machines
    1. Real hardware.
    2. Virtual machine (e.g., JVM).
    3. Language system must get the source program to execute on the machine.
  8. Translation and Interpretation.
    1. Translate from source to machine language.
    2. Interpret the program: Read it and do likewise.
    3. Practical systems are a mix.
      ↓ C ↓ Java Python ↓
      ↑ C++ Shell Scripts/BAT files ↑
    4. Interpreted programs typically have later binding.
  9. Equivalence of Program and Data.
    1. Your program is data to the machine that runs it, or the compiler that translates it.
    2. Any program that takes input is an interpreter for its input language.
    3. In some languages, you can build a program as a data structure, then run it.
      1. Notably Lisp.
      2. Many interpreted languages allow you to construct code in a string and execute it.