01 Intro
01 Intro
Programming Languages
Administrivia
• advances in hardware
2
Course Goal
Learn how programming languages work
int UMD(){
int umd_a;
All varialbe names
umd_a=10;
start with umd_
int umd_b;
umd_b=1;
while(umd_b<umd_a){
printf(umd_b);
umd_b =umd_b+1;
}
}
4
Course Subgoals
Learn some fundamental programming-
language concepts
• Regular expressions
• Automata theory
• Context free grammars
• Computer security
5
Syllabus
Dynamic/ Scripting languages (Ruby)
Functional programming (OCaml)
Scoping, type systems, parameter passing
Regular expressions & finite automata
Context-free grammars & parsing
Lambda Calculus
Logic programming (Prolog)
Secure programming
Comparing language styles; other topics
6
Calendar / Course Overview
Tests
• 5 quizzes (drop the lowest), 2 midterm exams, 1 final
exam
Clicker Quizzes
• In class, combined with lectures
Projects
• Project 1 – Ruby
• Project 2-4 – OCaml (and parsing, automata)
• Project 5 – Prolog
• Project 6 – Security
7
Clickers
Turning Technology clicker or Phone App is
required. Subscription is free.
• You can get any of LCD, NXT, or QT2 models
8
Discussion Sections
Lectures introduce the course content
Discussion sections will deepen understanding
• These are smaller, and thus can be more interactive
Oftentimes discussion section will consist of
programming exercises
• Bring your laptop to discussion
• Be prepared to program: install the language in
question on your laptop, or remote shell into Grace
There will also be be quizzes, and some lecture
material in discussion sections
9
Project Grading
You have accounts on the Grace cluster
Projects will be graded using the submit server
• Software versions on these machines are canonical
Develop programs on your own machine
• Generally results will be identical on Dept machines
• Your responsibility to ensure programs run correctly
on the grace cluster
See web page for Ruby, OCaml, SWI-Prolog
versions we use, if you want to install at home
• We will provide a VM soon
10
Rules and Reminders
Use lecture notes as your text
• Supplement with readings, Internet
• You will be responsible for everything in the notes,
even if it is not directly covered in class!
Keep ahead of your work
• Get help as soon as you need it
Ø Office hours, Piazza (email as a last resort)
Don’t disturb other students in class
• Keep cell phones quiet
• No laptops / tablets in class
Ø Except for taking notes (please sit in back of class)
11
Academic Integrity
All written work (including projects) must be
done on your own
• Do not copy code from other students
• Do not copy code from the web
• Do not post your code on the web
• We’re using Moss; cheaters will be caught
Work together on high-level project questions
• Do not look at/describe another student’s code
• If unsure, ask an instructor!
Work together on practice exam questions
12
CMSC 330: Organization of
Programming Languages
Overview
13
All Languages Are (Kind of) Equivalent
A language is Turing complete if it can compute
any function computable by a Turing Machine
14
Studying Programming Languages
Will make you a better programmer
• Programming is a human activity
Ø Features of a language make it easier or harder to program
for a specific application
• Ideas or features from one language translate to, or
are later incorporated by, another
Ø Many “design patterns” in Java are functional programming
techniques
• Using the right programming language or style for a
problem may make programming
Ø Easier, faster, less error-prone
15
Studying Programming Languages
Become better at learning new languages
• A language not only allows you to express an idea, it
also shapes how you think when conceiving it
Ø There are some fundamental computational paradigms
underlying language designs that take getting used to
• You may need to learn a new (or old) language
Ø Paradigms and fads change quickly in CS
Ø Also, may need to support or extend legacy systems
16
Changing Language Goals
1950s-60s – Compile programs to execute
efficiently
• Language features based on hardware concepts
Ø Integers, reals, goto statements
17
Changing Language Goals
Today
• Language features based on design concepts
Ø Encapsulation, records, inheritance, functionality, assertions
18
Language Attributes to Consider
Syntax
• What a program looks like
Semantics
• What a program means (mathematically)
Paradigm
• How programs tend to be expressed in the language
Implementation
• How a program executes (on a real machine)
19
Syntax
The keywords, formatting expectations, and
“grammar” for the language
• Differences between languages usually superficial
Ø C / Java if (x == 1) { … } else { … }
Ø Ruby if x == 1 … else … end
Ø OCaml if (x = 1) then … else …
21
Formal (Mathematical) Semantics
What do my programs mean?
let rec fact n = let fact n =
if n = 0 then 1 let rec aux i j =
else n * (fact n-1) if i = 0 then j
else aux (i-1) (j*i) in
aux n 1
22
Why Formal Semantics?
Textual language definitions are often
incomplete and ambiguous
• Leads to two different implementations running the
same program and getting a different result!
A formal semantics is basically a mathematical
definition of what programs do
• Benefits: concise, unambiguous, basis for proof
We will consider operational semantics
• Consists of rules that define program execution
• Basis for implementation, and proofs that programs
do what they are supposed to
23
Paradigm
There are many ways to compute something
• Some differences are superficial
Ø For loop vs. while loop
• Some are more fundamental
Ø Recursion vs. looping
Ø Mutation vs. functional update
Ø Manual vs. automatic memory management
Language’s paradigm favors some computing
methods over others. This class:
- Imperative - Logic
- Functional - Scripting/dynamic
24
Imperative Languages
Also called procedural or von Neumann
Building blocks are procedures and statements
• Programs that write to memory are the norm
int x = 0;
while (x < y) x = x + 1;
• FORTRAN (1954)
• Pascal (1970)
• C (1971)
25
Functional (Applicative) Languages
Favors immutability
• Variables are never re-defined
• New variables a function of old ones (exploits recursion)
Functions are higher-order
• Passed as arguments, returned as results
• LISP (1958)
• ML (1973)
• Scheme (1975)
• Haskell (1987)
• OCaml (1987)
26
OCaml
A mostly-functional language
• Has objects, but won’t discuss (much)
• Developed in 1987 at INRIA in France
• Dialect of ML (1973)
Natural support for pattern matching
• Generalizes switch/if-then-else – very elegant
Has full featured module system
• Much richer than interfaces in Java or headers in C
Includes type inference
• Ensures compile-time type safety, no annotations
27
A Small OCaml Example
intro.ml:
let greet s =
List.iter (fun x -> print_string x)
[“hello, ”; s; "!\n”]
$ ocaml
Objective Caml version 3.12.1
# #use "intro.ml";;
val greet : string -> unit = <fun>
# greet "world";;
Hello, world!
- : unit = ()
28
Logic-Programming Languages
Also called rule-based or constraint-based
Program rules constrain possible results
• Evaluation = constraint satisfaction = search
• “A :- B” – If B holds, then A holds (“B implies A”)
Ø append([], L2, L2).
Ø append([X|Xs],Ys,[X|Zs]) :- append(Xs,Ys,Zs).
• PROLOG (1970)
• Datalog (1977)
• Various expert systems
29
Prolog
A logic programming language
• 1972, University of Aix-Marseille
• Original goal: Natural language processing
Rule based
• Rules resemble pattern matching and recursive
functions in Ocaml, but more general
Execution = search
• Rules specify relationships among data
Ø Lists, records, “atoms”, integers, etc.
• Programs are queries over these relationships
Ø The query will “fill in the blanks”
30
A Small Prolog Example
/* A small Prolog program */ Lowercase logically
terminates
female(alice).
male(bob). Program consists
male(charlie). of facts and rules
father(bob, charlie).
mother(alice, charlie). Uppercase denotes
variables
% “X is a son of Y”
son(X, Y) :- father(Y, X), male(X).
son(X, Y) :- mother(Y, X), male(X). User types ; to request
?- son(X,Y). additional answer
X = charlie,
Multiple answers
Query Y = bob;
X = charlie, User types return to
Y = alice. complete request
31
Object-Oriented Languages
Programs are built from objects
• Objects combine functions and data
ØOften into “classes” which can inherit
class C { int x; int getX() {return x;} … }
class D extends C { … }
#!/usr/bin/ruby
• sh (1971) while line = gets do
• perl (1987) csvs = line.split /,/
if(csvs[0] == “330”) then
• Python (1991) ...
• Ruby (1993)
33
Ruby
An imperative, object-oriented scripting
language
• Created in 1993 by Yukihiro Matsumoto (Matz)
• “Ruby is designed to make programmers happy”
• Core of Ruby on Rails web programming framework
(a key to its popularity)
• Similar in flavor to many other scripting languages
• Much cleaner than perl
• Full object-orientation (even primitives are objects!)
34
A Small Ruby Example
intro.rb: def greet(s)
3.times { print “Hello, ” }
print “#{s}!\n”
end
35
Concurrent / Parallel Languages
Traditional languages had one thread of control
• Processor executes one instruction at a time
Newer languages support many threads
• Thread execution conceptually independent
• Means to create and communicate among threads
Concurrency may help/harm
• Readability, performance, expressiveness
Won’t cover in this class
• Threads covered in 132 and 216; more in 412, 433
36
Theme: Software Security
Security is a big issue today
Features of the language can help (or hurt)
• C/C++ lack of memory safety leaves them open for
many vulnerabilities: buffer overruns, use-after-free
errors, data races, etc.
• Type safety is a big help, but so are abstraction and
isolation, to help enforce security policies, and limit
the damage of possible attacks
Secure development requires vigilance
• Do not trust inputs – unanticipated inputs can effect
surprising results! Therefore: verify and sanitize
37
Other Languages
There are lots of other languages w/ various features
• COBOL (1959) – Business applications
Ø Imperative, rich file structure
• BASIC (1964) – MS Visual Basic
Ø Originally designed for simplicity (as the name implies)
Ø Now it is object-oriented and event-driven, widely used for UIs
• Logo (1968) – Introduction to programming
• Forth (1969) – Mac Open Firmware
Ø Extremely simple stack-based language for PDP-8
• Ada (1979) – The DoD language
Ø Real-time
• Postscript (1982) – Printers- Based on Forth
38
Beyond Paradigm
Important features Declarations
• Regular expression handling • Explicit
• Objects • Implicit
Ø Inheritance
• Closures/code blocks
Type system
• Immutability
• Static
• Tail recursion
• Polymorphism
• Pattern matching
Ø Unification
• Dynamic
• Abstract types • Type safety
• Garbage collection
39
Implementation
How do we implement a programming
language?
• Put another way: How do we get program P in
some language L to run?
40
Compilation
def greet(s)
11230452
print("Hello, ”)
23230456
print(s)
01200312
print("!\n”)
…
end
“world”
42
Architecture of Compilers, Interpreters
Parser Static
Analyzer
Source
Intermediate
Representation
Compiler / Interpreter
43
Front Ends and Back Ends
Front ends handle syntax
• Parser converts source code into intermediate format
(“parse tree”) reflecting program structure
• Static analyzer checks parse tree for errors (e.g.,
erroneous use of types), may also modify it
Ø What goes into static analyzer is language-dependent!
Back ends handle semantics
• Compiler: back end (“code generator”) translates
intermediate representation into “object language”
• Interpreter: back end executes intermediate
representation directly
44
Compiler or Intepreter?
gcc
• Compiler – C code translated to object code, executed
directly on hardware (as a separate step)
javac
• Compiler – Java source code translated to Java byte
code
java
• Interpreter – Java byte code executed by virtual machine
sh/csh/tcsh/bash
• Interpreter – commands executed by shell program
45
Compilers vs. Interpreters
Compilers
• Generated code more efficient
• “Heavy”
Interpreters
• Great for debugging
• Fast start time (no compilation), slow execution time
In practice
• “General-purpose” programming languages (e.g. C,
Java) are often compiled, although debuggers
provide interpreter support
• Scripting languages and other special-purpose
languages are interpreted, even if general purpose
46
Attributes of a Good Language
• Cost of use
• Program execution (run time), program translation,
program creation, and program maintenance
• Portability of programs
• Develop on one computer system, run on another
Programming environment
• External support for the language
• Libraries, documentation, community, IDEs, …
47
Attributes of a Good Language
• Clarity, simplicity, and unity
• Provides both a framework for thinking about algorithms
and a means of expressing those algorithms
• Orthogonality
• Every combination of features is meaningful
• Features work independently
51