terça-feira, 13 de maio de 2014

FORMAS DE EXECUÇÃO DE PROGRAMAS



O que é : Tradução, Compilação  e  Interpretação.


Execução de programas 

Um programa de computador não é escrito em uma linguagem que a máquina entende, por isso é necessário haver uma tradução do programa para a linguagem binária. 


1) Montagem (Assembler = Montador)

Tradução de um programa em linguagem de montagem (código fonte) para linguagem binária (código objeto).

O programa que faz a tradução é o montador (ou Assembler)


Funções básicas: 

  • Examinar a correção de cada instrução
  • Substituir códigos de operações simbólicos por valores numéricos
  • Substituir nomes simbólicos de endereços por valores numéricos
  • Converter valores de constantes para binários
  • Reservar espaço de memória para armazenamento de instruções e dados


2 ) Compilação

Traduz o programa-fonte escrito em linguagem de alto nível (linguagem fonte) para o programa-objeto escrito, por exemplo, em linguagem de máquina (binária). Pode-se gerar um programa intermediário no meio do processo escrito em Assemply, por exemplo.

O tempo para realizar esta tarefa é chamado tempo de compilação. Em seguida executa o programa-objeto. O tempo para realizar esta tarefa é chamado tempo de execução.

O programa que faz a tradução é o compilador.

Compilador executa duas funções básicas: análise e síntese


Análise:

  • Análise léxica: decompõe o programa fonte em seus elementos individuais distintos e verifica se estão de acordo com as regras da linguagem
    (ex: associa strings de caracteres a comandos, operadores, variáveis,....)
    Resultado: conjunto de tokens

  • Análise sintática: cria as estruturas para os comandos e verifica a correção das estruturas (ex: tem int antes de main, tem abre e fecha parênteses)
    Resultado: árvore sintática representando a estrutura do programa

  • Análise semântica: verifica as regras semânticas estáticas da linguagem (ex: estar atribuindo valores do tipo correto para uma variável: Parcela1=1.5, poderia dar erro pois variável Parcela1é do tipo int)
Síntese: gera o programa-objeto 

  • Geração de código: gera o programa-objeto

  • Otimização de código: tenta tornar o programa-objeto mais eficiente

Exemplo de linguagem compilada: C, Pascal


Montagem x Compilação:

Diferença está na complexidade. Na montagem existe uma relação 1:1 entre o código na linguagem de montagem e o código na linguagem de máquina. Já na compilação a relação é múltipla, cada instrução do código fonte gera múltiplas instruções no código de máquina.


3) Ligação ou link-edição

Algumas rotinas já existem codificadas no sistema, por exemplo, rotinas para entrada e saída de dados, de modo que o programador não precisa codificá-las.
 
Exemplo: printf(), readln(), rotinas matemáticas como seno e coseno.
 
Estas rotinas são armazenadas em bibliotecas que são incluídas no código objeto gerado pelo compilador.
 
Para que o código da subrotina externa seja anexado ao código objeto utiliza-se o processo de ligação. Este processo examina todo o código objeto e procura por referências externas não resolvidas assinaladas pelo compilador.
 
Ele procura pela rotina no sistema e se a encontra, inclui seu código no código objeto, caso contrário, gera uma mensagem de erro.


4) Interpretação

A partir do código fonte realiza as três fases (compilação, ligação e execução) comando a comando. Lê uma instrução, compila, liga e executa. Depois lê a próxima instrução e faz os mesmos 3 passos.

O programa executa estas três fazes é o interpretador.

Exemplo de linguagem interpretada: Java


Compilação X Interpretação


Tempo de execução:

É maior no na interpretação pois cada vez que o programa é executado, o interpretador executa as três fases. Já o compilador é só executar o programa-objeto já gerado na primeira vez.



Consumo de memória:

O interpretador precisa permanecer na memória durante todo o tempo de execução. Já o compilador fica na memória somente durante o tempo de compilação. Quando o programa é executado, somente o programa-objeto fica na memória.

Repetição da interpretação:
Sempre que um programa for utilizado, terá que ser interpretado novamente. Isso é um problema para os programas que são muito utilizados.

No caso de loops, cada instrução do loop é interpretada em todos os passos do loop. No caso da compilação, a tradução para código-objeto ocorre só uma vez pois o loop não e executado enquanto a tradução é feita.

Por tanto, o método de interpretação torna-se mais lento que o de compilação.

Detecção de erros:

No método de compilação, a identificação de erros durante a fase de execução fica sempre difícil, pois não há mais relação entre comandos do código fonte e instruções do executável.
 
No método de interpretação, cada comando é interpretado e executado individualmente, a relação entre código fonte e executável é mais direta e o efeito da execução (certa ou errada) é direta e imediatamente sentido.

Por tanto, erros são detectados de forma mais fáci

domingo, 6 de abril de 2014

EQUAÇÃO DO 3º GRAU : DICAS PARA SOLUÇÃO




Como Resolver Equações do

Terceiro Grau através da Fatoração

 

Equações do terceiro grau possuem a forma de

                 "f(x) = Ax³ + Bx² + Cx + D"

onde A é diferente de zero. Encontrar variáveis através da fatoração é um dos modos mais eficientes de simplificar seu problema. Além disso, determinar variáveis do terceiro grau é algo difícil de se fazer. Entretanto, com esta abordagem para resolver problemas de fatoração do terceiro grau, você não terá dificuldade em resolver outros no futuro.

 

Instruções


1.       Analise o polinômio cúbico claramente. Por exemplo, a equação é:

                "f(y) = 12y³- 30y - 5 + 2y²".


2.      Rearranje os termos do expoente mais alto até o mais baixo. A equação ficará:

                "f(y) = 12y³+ 2y² - 30y - 5".


3.      Divida a equação em dois grupos. No exemplo,

       "12y³ + 2y² - 30y - 5" = "(12y³+ 2y²) - (30y + 5)".



4.      Simplifique encontrando o fator em comum. Nesta equação, não existe um fator comum absoluto, embora o primeiro parênteses tenha o fator comum de "(2y^2)", e o segundo parênteses tenha o fator comum de "5". Isto resulta em uma equação da forma:

                   "2y²(6y + 1) - 5(6y + 1)".



5.       Deixe em evidência os termos em comum, que são    "(6y + 1)".

   A nova equação é

                      "(6y + 1)(2y² - 5)".

Estes termos são as raízes cúbicas da função

                 "f(y) = 12y³ + 2y²- 30y - 5".

 

 



quinta-feira, 27 de março de 2014

MEMÓRIA PRINCIPAL



Cálculos -  Capacidade da Memória Principal ( MP )

01.  Definições Importantes

a.   A memória principal é organizada em um conjunto de N
      células, cada uma podendo armazenar um quantidade M
      de bits;
b.   N = a capacidade da memória, dada pela quantidade  de
       células ou de endereços que a memória possui;

c.   M quantidade de bits que podem ser armazenados  em uma
      célula.
      Obs.:   Esses bits representam a informação em si, seja uma
           Instrução ( ou parte dela ) ou um dado ( ou parte dele );

d.   E = quantidade de bits ( ou tamanho ) de cada endereço;

e.   T = total de bits que podem ser armazenados na memória.
                                                                                               M
f.    Pode-se armazenar em cada célula um valor entre 0 e 2    - 1.
                M
      São  2       combinações possíveis;
                                            8
g.   Se  M = 8 bits, tem-se 2    = 256. Logo é possível armazenar
      valores de:

   00000000 ( 0     ou  0  )  até   11111111 (  255     ou  FF    ).
                         10        16                                   10           16

h.   A capacidade da memória principal é dada  por:
                                     E
                           N = 2           .

i.    O total de bits que podem ser armazenados na MP é dado por:


                                        T = N x M    ,

onde  por  ( I )  pode-se escrever:

                           E
                  T = 2     x   M


Exercícios :

1.   Uma memória principal possui espaço de 512 células, com  8 bits de tamanho.  Quantos bits essa memória é capaz de armazenar.  Em  seguida, verifique quantos bits são necessários para representar cada um dos endereços da memória.

      Solução:

 N  = total de células = 512
 M  =  tamanho da célula = 8 bits
 T   =  total de bits da memória = ?
 E   =  quantidade de bits para representar um endereço = ?

    Temos  que :

 T   =   N  x  M ,    logo vem:

  T = 512 x 8  = 4096 bits =  4 x 1024 bits =  4 K bits.

    Sabemso que :

                 E                                   9
        N = 2       e       N = 512 =  2      ,    logo :

                 9        E
               2   =   2   ,

     Onde podemos concluir que :  E =  9 bits.


sábado, 1 de março de 2014

OPERAÇÕES QUE OCORREM NUM PC



Escreva a seqüência de microoperações que devem ser realizadas pelo ciclo de execução das seguintes instruções:

a) SUB Op. ACC ACC – (Op.)

Resposta:
t1: REM (RI(Endereço))
t2: RDM Memória
t3: ACC (ACC) - (RDM)

b) JMP Op. CI Op

Resposta:
t1: CI (RI(Endereço))

c) INC Op. (Op.) (Op.) + 1

Resposta:
t1: REM (RI(Endereço))
t2: RDM Memória
t3: ACC (RDM) + 1
t4: RDM ACC
t5: Memória RDM


Considere uma máquina que possa endereçar 512 Mbytes de memória física, utilizando endereço referenciando byte, e que tenha a sua memória organizada em blocos de 32 bytes. Ela possui uma memória cache que pode armazenar 8K blocos, sendo um bloco por linha. Mostre o formato da memória cache, indicando os campos necessários (tag, bloco) e o número de bits para cada campo, e o formato de um endereço da memória principal, indicando os bits que referenciam os campos da cache, para os seguintes mapeamentos:

a) Mapeamento direto.

Resposta:
Como há 16 M blocos na memória principal e 8 K blocos na cache, então cada linha deverá acomodar 2K blocos, um de cada vez, é claro.

Formato da memória cache:
A memória cache terá 8K linhas (ou quadros) em cada linha teremos tag de 11 bits e bloco de 32 bytes.
O endereço da memória principal terá o seguinte formato:
Campo de número do bloco: de 11 bits (para endereçar um dos 2 K blocos)
Campo de número da linha: de 13 bits (já que temos 8 K blocos)
Campo de endereço da palavra: 5 bits (já que temos 32 bytes por bloco)

b) Mapeamento totalmente associativo.

Resposta:

Como há 16 M blocos na MP e eles podem ficar em quaisquer dos 8 K blocos da Cache, temos:

Formato da memória cache:
A memória cache terá 8K linhas (ou quadros), em cada linha teremos tag de 24 bits e bloco de 32 bytes.
O endereço da memória principal terá o seguinte formato:
Campo de número do bloco: de 24 bits (para endereçar um dos 16 M blocos)
Campo de endereço da palavra: 5 bits (já que temos 32 bytes por bloco)

c) Mapeamento associativo por conjunto, onde cada conjunto possui quatro linhas, cada uma de um bloco.

Resposta:

A memória cache neste caso terá um número de conjuntos igual a 8K linhas/ 4 = 2 K. Onde, cada um
dos 16M blocos pode ficar em um dos 2K conjuntos, ou seja, cada conjunto poderá alocar 8K blocos.
Assim, o formato da memória cache será: 2k conjuntos de 4 linhas e cada linha com bloco de 32 K.
O tag da memória cache terá 13 bits e bloco de 32 bytes.
O endereço da MP terá os seguintes campos:
Tag: 13 bits (já que cada conjunto poderá alocar 8K blocos)
Número de conjuntos: 11 bits (já que existem 2K conjuntos)
Endereço da palavra: 5 bits (já que temos 32 bytes por blocos)


sexta-feira, 31 de janeiro de 2014

FÓRMULAS DE INDETERMINAÇÃO



Formas Indeterminadas

                                              
Aqui estão as sete indeterminações matemáticas:

01.   0/0,
            
02.   ∞/∞,

03.   0 x ∞,
          ∞
04.   1         ,

05.   0° ,

06.   ∞        ,

07.   ∞ − ∞ .


OBSERVAÇÃO:

 Temos dois tipos de divisão por zero: 

- a divisão de um número não nulo por zero;
- a divisão de zero por zero. 

Os representantes protótipos desses tipos são: 
- a divisão 1/0;
- a divisão 0/0.

Essas duas divisões tem natureza bastante distinta:

  • a divisão 1/0 é indefinida ou impossível entre os número.
  • e a divisão 0/0 é indeterminada. 



Resumo e conclusões:

  • a divisão 1/0 é indefinida entre os números, mas pode ser definida como 1/0 = infinito. Se adotarmos essa solução, devemos estar bem cientes que a operação com o infinito provocará resultados absurdos a menos que façamos uma drástica modificação nas regras usuais de cálculo.
     
  • a divisão é/0 indeterminada entre os números não nulos, e em especial com a escolha 0/0 = 1; o caminho alternativo 0/0 = 0 leva a resultados não naturais e inconvenientes.