You are on page 1of 42

Paradigmas

de la Programacin

FaMAF 2017
captulo 4.1.
sintaxis vs. semn@ca
las diferencias en forma...
C, C++, Java:
int fact (int n) { return (n == 0) ? 1 : n * fact (n-1); }
Scheme:
(define fact
(lambda (n) (if (= n 0) 1 (* n (fact (- n 1))))))
ML:
fun fact n = if n=0 then 1 else n*fact(n-1);
Haskell:
fact :: Integer->Integer
fact 0 = 1
fact n = n*fact(n-1)
sintaxis vs. semn@ca
... no necesariamente implican diferencias en el
contenido (los efectos en la mquina)
catlogo de herramientas
teora de computabilidad: el poder y las
limitaciones de los programas
teora de @pos: sintaxis y semn@ca de los
lenguajes
... pero todava no tenemos una buena teora
matem@ca que d cuenta de funciones de alto
orden, transformaciones de estado y
concurrencia :(

qu es computable
video del hal@ng problem (o la prueba de que
las computadoras no pueden hacer todo)

programa: sintaxis y semn@ca
un programa es la descripcin de un proceso
dinmico
sintaxis: texto del programa
semn*ca: cosas que hace
la implementacin de un lenguaje de
programacin debe transformar la sintaxis de
un programa en instrucciones de mquina que
se pueden ejecutar para que suceda la
secuencia de acciones que se pretenda
transformacin de sintaxis a semn@ca
un lenguaje de programacin es un conjunto de
abstracciones y empaquetamientos quizs sin
correspondencia directa con la mquina
es necesario traducir lenguaje de
programacin a instrucciones de mquina
el compilador hace esa traduccin
un intrprete puede combinar traduccin y
ejecucin
sintaxis
compilador (o intrprete)
el compilador se encarga de procesar la
sintaxis de los lenguajes de programacin
un intrprete incluye un compilador y la
ejecucin
usaremos las lminas de Xin Yuan
hPp://www.cs.fsu.edu/~xyuan/cop4020/
compiler_phases.ppt
si quieren saber ms, pueden ver ms lminas
en la pgina de su curso
qu es un compilador?
un programa que lee un programa escrito
en un lenguaje origen y lo traduce a un
programa equivalente (con el mismo
significado) en un lenguaje destino
dos componentes
entender el programa (asegurarse de que es
correcto)
reescribir el programa
normalmente, el lenguaje origen es de
alto nivel y el destino es de bajo nivel
fases de un compilador
anlisis lxico
anlisis sintctico
anlisis semntico
generacin de cdigo intermedio
(independiente de mquina)
optimizacin de cdigo intermedio
generacin de cdigo destino (dependiente
de mquina)
optimizacin de cdigo destino
proceso de compilacin
programa origen, con macros

preprocesador

programa origen

compilador
programa en ensamblador destino

ensamblador

cdigo mquina reubicable

linker

cdigo mquina absoluto


Front-end y Back-end
programa origen (cadena de caracteres)
rbol sintctico abstracto

scanner
(anlisis lxico) op*mizacin de cdigo
independiente de
Tokens
mquina
Front end

Back end
anlisis

sntesis

parser forma intermedia modificada

(anlisis sintc*co)
generacin de cdigo
rbol sintctico
des*no
cdigo destino

anlisis semn*co y
generacin de cdigo
intermedio op*mizacin de cdigo
dependiente de mquina
rbol sintctico abstracto

cdigo destino modificado

Scanner: anlisis lxico
se divide un programa (secuencia de
caracteres) en palabras (tokens)
program gcd (input, output);
var i, j : integer;
begin
read (i, j);
while i <> j do
if i > j then i := i - j else j := j - i;
writeln (i)
end.

program gcd ( input , output ) ;


var i , j : integer ; begin
read ( i , j ) ; while
i <> j do if i > j
then i := i - j else j
:= i - i ; writeln ( i
) end .
Scanner: anlisis lxico
qu tipo de errores se puede reportar en
el anlisis lxico?

A = b + @3;
Parser: anlisis sintctico
comprueba si la secuencia de tokens
conforma a la especificacin gramatical
del lenguaje y genera el rbol sintctico
la especificacin gramatical suele
representarse con una gramtica
independiente de contexto (context free
grammar), que tambin le da forma al
rbol sintctico
gramticas independientes
de contexto
se definen categoras de construcciones del
lenguaje, por ejemplo:
Sentencias (Statements)
Expresiones (Expressions)
Declaraciones (Declarations)

<statement> ::= <for-statement> | <if-statement> | <assignment>


<for-statement> ::= for ( <expression> ; <expression> ; <expression> ) <statement>
<assignment> ::= <identifier> := <expression>
ejemplo: Micro Pascal
<Program> ::= program <id> ( <id> <More_ids> ) ; <Block> .
<Block> ::= <Variables> begin <Stmt> <More_Stmts> end
<More_ids> ::= , <id> <More_ids>
|
<Variables> ::= var <id> <More_ids> : <Type> ; <More_Variables>
|
<More_Variables> ::= <id> <More_ids> : <Type> ; <More_Variables>
|
<Stmt> ::= <id> := <Exp>
| if <Exp> then <Stmt> else <Stmt>
| while <Exp> do <Stmt>
| begin <Stmt> <More_Stmts> end
<Exp> ::= <num>
| <id>
| <Exp> + <Exp>
| <Exp> - <Exp>
ejemplo de anlisis
sintctico
id1: = id2 + id3 * 60!

:=

id1
+

id2
*

id3
60

anlisis semntico
el compilador trata de ver si un un programa tiene
sentido analizando su rbol sintctico
un programa sin errores gramaticales no siempre es
correcto, puede haber problemas de tipo
pos = init + rate * 60
qu pasa si pos es una clase y init y rate son
enteros?
el parser no puede encontrar este tipo de errores
el anlisis semntico encuentra este tipo de error
anlisis semntico
el compilador hace comprobaciones semnticas estticas
(static semantic checks)
comprobacin de tipos
declaracin de variables antes de su uso
se usan los identificadores en contextos adecuados
comprobar argumentos
si hay un fallo en compilacin, se genera un error
en tiempo de ejecucin (dynamic semantic checks) se
comprueba:
que los valores de los arreglos estn dentro de los lmites
errores aritmticos (divisn por 0)
no se desreferencian los punteros si no apuntan a un objeto vlido
se usan variables sin inicializacin
si hay un fallo en ejecucin, se levanta una excepcin
tipado fuerte
un lenguaje tiene tipado fuerte si siempre se detectan
los errores de tipo
en tiempo de compilacin o de ejecucin
tipado fuerte: Ada, Java, ML, Haskell
tipado dbil: Fortran, Pascal, C/C++, Lisp
duck typing: Python
el tipado fuerte hace que el lenguaje sea ms seguro
y fcil de usar sin errores, pero potencialmente ms
lento por las comprobaciones dinmicas
en algunos lenguajes algunos errores de tipo se
detectan tarde, lo que los hace poco fiables (Basic,
Lisp, Prolog, lenguajes de scripting)
Code Generation and
Intermediate Code Forms
A typical intermediate form of
code produced by the
semantic analyzer is an
abstract syntax tree (AST)
The AST is annotated with
useful information such as
pointers to the symbol table
entry of identifiers

Example AST for the


gcd program in Pascal
12/03/17 COP4020 Spring 2014 23
cdigo intermedio
el cdigo intermedio est cerca de la mquina
pero sigue siendo fcil de manipular, para
poder implementar optimizaciones. Por
ejemplo:
temp1 = 60!
temp2 = id3 + temp1!
temp3 = id2 + temp2!
id1 = temp3!
se puede optimizar (independientemente de
mquina):
temp1 = id3 * 60.0!
id1 = id2 + temp1!
cdigo destino
de la forma independiente de mquina se
genera ensamblador:
MOVF id3, R2
MULF #60.0, R2
MOVF id2, R1
ADDF R2, R1
MOVF R1, id1

este cdigo especfico de mquina se
optimiza para explotar caractersticas de
hardware especficas
ejemplo de compilacin de una
expresin

anlisis lxico (scanner)

expresin tokenizada:
conversin de tipos implcita
parser

slide 26
gram@cas
jerarqua de Chomsky
gram@cas independientes de
contexto
vamos a estar usando gram@cas
independientes de contexto (CFG, context-free
grammars), aunque algunas propiedades de los
lenguajes de programacin escapan a su
expresividad
gram@cas y rboles sintc@cos
una gram@ca...
es un mtodo para
denir conjuntos innitos de expresiones
procesar expresiones
consiste de
smbolo inicial
no terminales
terminales
producciones
gram@ca del
lenguaje de expresiones numricas
e ::= n | e + e | e e
n ::= d | nd
d ::= 0|1|2|3|4|5|6|7|8|9

expresiones:
0
1 + 3 5
2 - 28 + 347598
gram@cas como mtodo
no terminales
forma adecuada de describir la composicionalidad de
las expresiones
no pueden formar parte de una expresin, siempre se
@enen que subs@tuir por terminales
derivacin: secuencia de sus@tuciones que
termina en una cadena de terminales
ennddd2d25
ee-ee-e+e...n-n+n...10-15+12
CFG para decimales

::= stands for production rule; <> are non-terminals;


| represents alternatives for the right-hand side of a production rule

Sample parse tree:

slide 33
CFG para parntesis balanceados

ejemplo de derivacin: <balanced> ( <balanced> )


(( <balanced> ))
(( <empty> ))
(( ))

slide 34
CFG para cifras

recursiva a la derecha

ejemplo de <num> <digit> <num>


derivacin 7 <num>
top-down 7 <digit> <num>
izquierda - derecha
7 8 <num>
7 8 <digit>
789

slide 35
parsing recursivo descendiente

construccin del rbol


sintc@co top-down,
izquierda a derecha

slide 36
hPp://www.garshol.priv.no/download/text/
bnf.html

hPp://cui.unige.ch/isi/bnf/JAVA/
BNFindex.html
hPp://cui.unige.ch/db-research/
Enseignement/analyseinfo/BNFweb.html
ambigedad sintctica

esta gram@ca
Cmo parsear a+b*c usando esta gramtica? es ambigua

ambos rboles son


sintcticamente vlidos

slo este rbol es semnticamente correcto


(la precedencia de operadores y la asociatividad este rbol es
son semnticos, no sintcticos) sintc@camente correcto,
pero semn@camente
incorrecto slide 38
eliminar ambigedad
no siempre podemos eliminar
la ambigedad de esta forma
definir un smbolo distinto para cada nivel
de precedencia de cada operador
definir la parte derecha de las reglas de
forma que se fuerce la asociatividad
adecuada

slide 39
esta gramtica es inambigua

slide 40
recursin a izquierda y a derecha

Leftmost non-terminal on the RHS of Right-recursive grammar


production is the same as the LHS

Can you think of any


operators that are
right-associative?

slide 41
gramtica de expresiones Yacc

Yacc es un generador automtico de parsers


permite especificar explcitamente la
precedencia y asociatividad de los
operadores, sin modificar la gramtica

slide 42

You might also like