Title: Programming Languages
1Programming Languages
- "A computer program does what you tell it to do,
not what you want it to do." - Greer's Third Law.
2Programming Language Toolset
C
If all you have is a hammer, then everything
looks like a nail.
3More than just a tool
- Current view from carpentry
-
- A hammer is more than just a hammer. It's a
personal tool that you get used to and you form a
loyalty with. It becomes an extension of
yourself." - http//www.hammernet.com/romance.htm
4Objectives
- Explore Programming Language history and design
- Review Programming Paradigms
- Learn about the Traditional Programming concepts
- Review Procedural Units
- Understand the basics of Program Translation
- Reading Brookshear Ch. 5
5Language Generations
Five Generations Procedural Languages 1GL
Machine language 2GL Assembly language 3GL
High-level language Nonprocedural Languages 4GL
Very high-level language 5GL Natural language
- Low levels closer to binary format
- High levels - closer to human language
6Machine Language
- Written in strings of 0 and 1
- Only language the computer understands
- All other programming languages are translated to
machine language - Computer dependent
- Recall that CISC instructions wont work for a
RISC architecture
7Machine Language
- Why is programming in machine language difficult?
- Must remember the binary encoding for
instructions or constantly look them up from some
reference sheet - Difficult to read code.
- Error prone, difficult to locate errors.
- Recall Brookshear Machine Instructions
- 156C
- 166D
- 5056
- 306E
- C000
8Machine Language
- Early programmers used machine language to
program - plan and lay out data and code in memory
- In BSML, recall starting program at 00 and
storing data at say 20 - use explicit addresses for jump instructions
- In BSML, recall we had to specify the address to
jump to - use explicit addresses for data storage
- What happens if you add another instruction in
the middle of your code? - It might move the rest of the instructions in
memory which - changes the address of other instructions which
- might require changes to the addresses in jump
instructions. - Similar problems occur if you change the
arrangement of data.
9Assembly Language
- Uses Mnemonic codes
- Assigns Names for memory locations
- Depends on the Computer
- Needs an Assembler to translates from Assembly to
machine language so the machine can execute the
program
10Assembly Language
- Humans work better with mnemonics, which are
words that are designed to aid in remembering
information. - Programmers invented assembly language which uses
mnemonic symbols rather than binary to represent
machine instructions and registers
11Assembly Language
- Mnemonic names
- Example,
- assign the name Price to location 6C,
- assign the name ShippingCharge to 6D
- Assign the name TotalCost to 6E
- Then, the following two columns are equivalent
- 156C Load R5, Price
- 166D Load R6, ShippingCharge
- 5056 Add1 R0, R5, R6
- 306E Store R0, TotalCost
- C000 Halt
12Assembly Language
- Mnemonics still dont solve the problem of
relocating addresses when code or data is shifted - Also, data is still referred to by its address in
memory, we just use a name for the memory cell
instead of a number - Symbolic addresses were developed to refer to
memory locations - Example, Use of Labels to mark JUMP statements
13The Assembler
- Programmers used text files containing assembly
language to describe programs (known as Source
code). - Assembly language used mnemonics and symbolic
addresses - Assemblers are software tools that translate
source code (text) into machine language (binary)
14Assemblers
- Assemblers translate the mnemonic codes to
binary codes - Machine instruction is different for different
machine architecture - Recall RISC and CISC Instruction sets?
- So, Assemblers must be written for every
different type of machine - Programmers need to think in terms of machine
instructions - Programs are not portable
15High Level Languages 3GL
- Identify a collection of high-level primitives
- e.g. loops and selection constructs
- Think and express concepts at a higher level of
abstraction than machine language - Implement translation of such high-level
primitives into machine language using an
intermediary (Compilers)
163GL Third Generation Languages
- 1960s
- Languages designed for specific types of problems
and used syntax familiar to the people in that
field - FORTRAN math
- COBOL business
- Compiler translates from high-level language to
machine language
173GL Third Generation Languages
- FORTRAN
- 1954
- Represent complex mathematical formulas
- C/C has replaced FORTRAN
- COBOL
- 1959
- Business
- Large complex data files
- Formatted business reports
18Third Generation Languages FORTRAN
FORTRAN
19Language Translation Interpreters Compilers
- High level languages were invented to
- break away from machine-dependence
- allow the expression of abstract concepts
- Compilers and interpreters are software tools
that translate high-level source code (text) into
machine language (binary)
20Language Translation
- Interpreters
- read each line of text
- translates the text into machine language
- executes the line before reading the next line
- Compilers
- read all text
- translate everything
- create executable files that represent the source
code
21Programming Paradigms
- Procedural (Imperative)
- Cobol, Fortran, C, Pascal
- Focused at expressing an algorithm
- Declarative
- Prolog, SQL
- Focused at expressing the solution to a problem
- Functional
- Scheme, Lisp, ML
- Focused at identifying functional components
- Object-Oriented
- Smalltalk, C, Java
- Programs are sets of cooperating components that
contain both data and operations
22Programming Paradigms Procedural
- Procedural the development of a sequence of
commands that, when followed, manipulate the data
to produce the desired result - Our Algorithms discussion is based on this
paradigm - Find an algorithm to solve the problem and
express that algorithm as a sequence of simple
and unambiguous commands - C, FORTRAN are examples of procedural paradigm
23Programming Paradigms Declarative (Logic)
- Declarative design and state the problem
precisely, rather than design a solution - The trick is to discover and implement a general
problem-solving algorithm so that - all you have to do is state the problem in the
correct format and it already has a solution - Useful in simulating systems (economic,
geographical, political) in order to test
hypothesis - The general solution is to recompute the value of
certain key parameters (like GDP, temperature
etc) over passage of time - Then design the problem at hand precisely by
defining the correct parameters - Prolog is an example of declarative paradigm
24Programming Paradigms Functional
- Functional View the process of program
development as connecting predefined black
boxes - each of which accepts input and produces output
- in such a way as to produce the required
input-to-output relationship. - Mathematicians refer to such boxes as
functions and hence the name. - LISP, ML (MetaLanguage), Hope and Scheme are
examples of Functional paradigm - Primitives in this paradigm are elementary
functions which can be used to create more
complex functions as needed to solve the problem - Example Compute the average of a given set of
numbers
25Programming Paradigms Functional
- Example Compute the average of a given set of
numbers - The three boxes or functions are
- Sum, Count, Divide
- Both Sum and Count functions accept the same
input whereas Sum box computes the sum, the
Count box keeps track of the count - The output from these two boxes are the input
for the third box Divide, which produces the
desired output. - In LISP, the above program is written as
- (Divide (Sum Numbers) (Count Numbers))
-
26Evolution of programming paradigms
- AI The functional and logical paradigms were
very popular a decade or so ago as a result of
the Japanese 5th Generation initiative, - which adopted a logic programming language as its
focus in an attempt to use parallel architectures
to solve AI problems. - At that time, groups in the UK and the USA
emphasized the functional paradigm as an easier
way to program parallel architectures
27Evolution of programming paradigms
- OOP The object oriented paradigm is now much
more fashionable - and is more widely used in
industry today - One reason for this is because nearly all object
oriented languages are quite close to the
imperative paradigm - though this need not be the
case - and the change from imperative programming
to object oriented (hereafter OOP) programming is
less of a shock for programmers brought up on
imperative programming languages.
28OOP Languages
- It may appear that, having learnt C, C is the
obvious choice of the OO languages. - The problem with C is that it incorporates some
OO ideas, but not necessarily in a particularly
clean way - As a result it is not an elegant language, and
nor is it a good example of the different
paradigm. C also derives a lot from C, but is
just too new. - Fortunately Java borrows quite a lot from C as
well and seems to be easier to learn for
beginners in OOP.
29Programming paradigms at a glance
30Traditional Programming Concepts (TPC)
- Variables and Data Types
- Describe data and data format
- Data Structures
- Complex data types
- Constants and Literals
- Using a value directly
- Assignment Statements
- Assign values to variables
- Assign result of an evaluation to a variable
- Control Statements
- Selection
- Loop
31TPC Variables and Data Types
- Variable is a location in main memory referenced
by a name rather than a numeric address - Variable holds a value value associated with
that name can change during the program execution - Variables need to be declared before they can
be used in the program - Variable declaration includes specifying what
type of quantity it can hold numeric,
character, Boolean and so on known as the data
type - Variable declaration in C
- float price
- int age
- char x
32TPC Data Structures
- Data Structure refers to the conceptual
arrangement of data for easier manipulation,
depending on the computation - Arrays homogenous block structure of cells, with
each cell in the array holding a value of the
same data type can be 1D or 2D - Linked Lists a list of boxes linked by pointers
to the next box can be doubly linked, circular
linked - Trees conceptual arrangement with a single root,
with parent-child relationship between nodes - In JS, a one-dimensional array (1D array) is
written as arrayNameindex. Remember? - In C, a 2D array holding integers can be declared
as - int Scores 2 9
- To be interpreted as a 2 rows and 9 column table
- More on these special data structures when we do
chapter 7
33TPC Constants and Literals
- Literal is a fixed quantity that is used over and
over literally in a computation. - In calculations of air traffic in the vicinity of
an airport, if the altitude above sea level is
645 feet and is a quantity that is used over and
over in calculations, it is used explicitly as
is. - For example,
- EffectiveAltitude AltimeterReading 645
- Where EffectiveAltitude and AltimeterReading are
variables
34TPC Constants and Literals
- Constant is a fixed quantity that is referenced
by a descriptive name rather than the literal
value - In calculations of air traffic in the vicinity of
an airport, if the altitude above sea level is
645 feet and is a quantity that is used over and
over in calculations, we can declare it as a
constant - Constant AirportAltitude 645
- If EffectiveAltitude and AltimeterReading are the
same variables as before, then, the same formula
now can be written as - Effective Altitude Altimeter Reading
AirportAltitude
35TPC Constants and Literals
- Why is constant a better way to program than
literal? - Consider the case where a program uses the
airport altitude 25 times in its calculations. - Literal method would have the literal value 645
appearing 25 times in that program - Constant method would have the value 645
appearing only once at the initial declaration - Constant AirportAltitude 645
- Any subsequent use of this value would be done
using the variable AirportAltitude, not the
literal value 645. - So far so good.
- What if we want to use this program with another
airport with airport altitude 1000 feet? - Literal method would involve making 25 changes,
whereas Constant method would involve making only
one change.
36TPC Assignment statements
- Assign a right-hand-side (rhs) quantity to a
left-hand-side (lhs) quantity. - Z X Y
- rhs quantity X Y is evaluated first and the
result is assigned to the lhs variable Z - Name Ann
- The value Ann is assigned to the variable Name
- Many High level languages allow arithmetic
assignment of the form - variable operator value
37TPC Control statements
- Imperative statement that alters the execution
sequence of a program - Selection
- If Else, or multi-way switch
- True/false condition to select the set of
instructions that need to be executed - Repetition
- While () and for( ) loop structures
- Initialize, modify, terminate the condition to
control the repetition of a set of instructions
as needed
38Procedural Units
- Procedure is an abstract modular tool that can be
used by several different program units. - A Procedure needs to be defined first, and then
invoked via procedure call wherever needed - Control transfers from current statement in the
program unit to the procedure unit by means of a
JUMP control at the time of procedure call - Control is returned to the original program unit
once the procedure unit has finished executing - Procedures have their own set of local variables
- Values from one program unit to another procedure
unit can be passed via parameters declared for
that procedure unit - Reading Chapter 5 Section 5.3
39Procedural Units Control transfer
40Procedural Units Procedure Call
41Procedural Units Separate copies maintained
42Procedural Units Preserve calling environment
43Procedures vs. Functions
- Function is similar to Procedure except that a
value is transferred back to the calling program
as the value of the function - Procedures do not pass back a return value and
preserve the calling environment - Functions pass back a return value that can be
used by the calling program whenever needed
44Grammar
- Every language has a distinct grammar, which is a
set of rules for creating expressions in the
language - (define (sum n m) ( n m)) in Scheme
- x n m in C
- The syntax of a language consists of the grammar
combined with an alphabet - Most languages use the normal alphabet, e.g.
Scheme - Some languages use special symbols, e.g. APL
45Syntax Diagram
- Pictorial representation of programs grammatical
structure - Example ifthenelse structure
- Terms in rectangles require further description
and are called non-terminals - Terms in ovals are called terminals (a.k.a Key
words or Reserved words)
46Language Syntax
- Syntax is usually represented in a formal way
using what is known as Context Free Grammar (CFG) - One of the widely used formalism is called BNF
Backus-Naur form named after the originators of
this formalism
47Syntax BNF
- The valid and legal syntax of a language can be
described using a special notation known as
Backus-Naur form (BNF) - John Backus and Peter Naur
- Originally developed to describe ALGOL language
(1950s and 1960s)
48BNF
- The meta-symbols of BNF are
- meaning "is defined as"
- meaning "or"
- lt gt angle brackets used to surround category
names. - The angle brackets distinguish syntax rule names
(also called non-terminal symbols) from terminal
symbols which are written exactly as they are to
be represented.
49BNF
- Consider a small child that can only form the
sounds from its limited vocabulary just using M,
B, D, A, O - In BNF form, this can be defined as
- ltconsonantgt M B D
- ltvowelgt A O
- ltbaby-talkgt ltconsonantgt ltvowelgt
- In English, the above three BNF statements read
- Consonant is (defined as) M or B or D
- Vowel is (defined as) A or O
- Baby-talk is (defined as) a consonant followed by
a vowel
50BNF
- From this specification you can assume the child
can make the following set of baby-talk - MA MO BA BO DA DO
- baby-talk ltconsonantgt X ltvowelgt
- Suppose the child is capable of a brief pause
between sounds PAUSE, we can define - ltbabblegt ltbaby-talkgt PAUSE ltbabblegt
ltbaby-talkgt
51Date Syntax in BNF
- Purpose Write BNF
- Who Groups of 2-3
- Task Write a BNF specification for date syntax
dd-mmm-yyyy in the form 04-Nov-2002 - Allow illegal but syntactically correct dates
(e.g. 93-Feb-2999) - Date is always expressed with two digits and year
with four digits, while month uses 3-letter
abbreviation - Product Alphabet and BNF specification of the
syntax - Time 5 minutes
52Date Syntax BNF
- Possible Solution
- ltmonthgt JanFebMarAprDec
- ltdigitgt 0123456789
- ltddgt ltdigitgtltdigitgt
- ltyyyygt ltdigitgtltdigitgtltdigitgtltdigitgt
- ltdategt ltddgt - ltmonthgt - ltyyyygt
53OOP vs. Functional JS vs. Scheme?
- Students interested in learning more about
functional paradigm using Scheme programming
language can use the information posted on the
class web page for a self-paced study. - We will learn a little more about OOP and
introduce you to JavaScript (JS) to help you do
your group project.
54Scheme Syntax
- ltlettergt ltagtltZgt
- ltdigitgt 1230
- ltintegergt ltdigitgtltintegergtltdigitgt
- ltrationalgt ltintegergt / ltintegergt
- ltinexactgt i ltintegergt . ltintegergt
- ltbooleangt true false
- ltvargt ltlettergt ltvargt ltlettergt
- ltcongt ltintegergt ltrationalgt ltinexactgt
ltbooleangt - ltprmgt - .
55Scheme Syntax
- ltexpgt ltvargt
- ltcongt
- (ltprmgt ltexpgt ltexpgt)
- (ltvargt ltexpgt ltexpgt)
- (cond (ltexpgt ltexpgt) (ltexpgt ltexpgt))
- ltdefgt (define (ltvargt ltvargt ltvargt) ltexpgt)
- More on this later
56Compiler Parse Tree
- The compiler will build a parse tree to represent
the program based on the grammar - A parse tree is a graphical representation of the
syntactical structure of a statement
57Example Syntax Diagram and Parse Tree for
Expression x y z
58Compiling a Program
- The steps completed by a compiler are
- Lexical Analysis identify the individual tokens
in the language statements reading symbol by
symbol - Syntax and Semantics Analysis Build a parse
tree by reading the tokens analyzed by Lexical
analyzer and Identify the intent of the program
statements - Code Generation Produce machine language
instructions
59Program Translation Process
60Program Translation Parsing
- Early parsers required fixed-format for source
code - Modern 3GL are free-format languages
- Example
- if cost lt cashOnHand pay cash else use
credit card - is understood by the modern parsers correctly,
but, makes it harder to read for humans, so, we
write it as - if (cost lt cashOnHand)
- pay cash
- else
- use credit card
- Semi-colons are typically used to indicate end of
each statement - Key words are defined which cannot be used in
programs to represent anything other than what
they are defined for
61Choosing a Language
- Choose based on
- What is available
- Required interface
- What do you know best?
- More importantly Which language lends itself
best to the problem at hand?
62Some of the widely used 3GL
- Visual Basic
- 1987
- Create complex user interfaces
- Uses standard Windows features
- Event-driven user controls the program
- C
- 1972
- Efficient code
- Portability
- C
- Enhancement of C with OOP concepts
63What about Java?
- The Hype about Java
- Java is a simple but powerful language for
creating safe, portable, robust object-oriented,
multithreaded programs. - So, what does it all mean?
- Simple and Powerful
- It should be easy to learn, but you can achieve a
lot. There should be no surprising features, and
no fiendishly complicated ones either. - Safe and Robust
- Java is intimately connected with the Internet.
- you can use Java to write programs which run on
other peoples computers when they read your Web
page. - In such circumstances, programmers and users
want assurance that bugs in the code cannot
accidentally do damage to the remote computers on
which it is run, and that a malicious programmer
cannot deliberately do damage. - So a lot of thought has gone into making the
behavior of programs predictable, and being able
to run them securely.
64Java
- Portable
- i.e. it must be architecture neutral.
- It is very easy to write C programs which can
discover the word-length of your machine, the
precision of your floating-point representation,
etc. These are not architecturally neutral! - Another issue related to portability is character
sets. Java wants to be able to represent
information in any language - and therefore does
not want to be tied to a character set associated
mainly with English. A character in Java is
encoded using Unicode, which uses 16 bits per
character! - Aside
- Java is Multithreaded
- Not many languages have threads built-in, but
such concurrency is very useful if you are trying
to provide a graphical user interface (GUI) to an
application or if you are communicating with
another computer. It is possible to add library
features to C for this sort of thing, but then
the responsibility for handling the interactions
between threads is usually just an added burden
on the programmer. In Java threads have been
there from the start - and are therefore easier
to manage.
654GLVery High-Level Languages
- Programmer specifies the desired results the
language develops the solution - Many times more productive with a 4GL than a
procedural language - Query Languages
- Retrieve information from databases
- Easy to learn and use
665GL Natural Languages
- Resemble natural or spoken English
- Translates human instructions into code the
computer can execute
67OOP Object-Oriented Programming
- Object
- Self-contained unit of data and instructions
- Includes
- Related facts (data)
- Related functions (instructions to act on that
data) - Example
- Object cat
- Data feet, nose, fur, tail
- Functions eat, purr, scratch, walk
- Cat Kitty, Susan
- More on OOP in another lecture presentation
68Summary
- All programs must be translated into machine
language in order to run - There are at least three identifiable programming
paradigms, each with its own special features - High level languages provide machine independence
and better productivity for developers and need
some intermediary like compliers to translate to
machine language - Languages are specified using grammars. This
allows compilers to translate the programs
unambiguously by creating appropriate parse trees - Traditional programming concepts include
- Variables, Data Types, Data Structures
- Assignment Statements
- Control Statements like Selection and Repetition