Publicado por: lucasrthomaz | 6 06UTC Outubro 06UTC 2009

Regulamentação da Internet no Brasil

Recentemente em um trabalho da disciplina de Direito da Informática, o professor pediu para  resumir e dar uma opnião sobre um capítulo do livro de Ronaldo Lemos: “Direito, Tecnologia e Cultura”, no capítulo 4 de título “A Regulamentação da Internet no Brasil”.

Abaixo o trecho do meu resumo, no qual eu dou a minha opinião sobre o tema:

O avanço da internet bem como de todas as tecnologias computacionais ocorre a passos largos enquanto a regulamentação ainda engatinha.

É muito difícil de padronizar tecnologias que aparecem junto com a internet, é tudo muito rápido e dinâmico, criar regras para poder atrelar direitos e deveres a atos na rede mundial de computadores ainda está muito longe do ideal, muitas tecnologias “nascem” e “morrem” antes mesmo que se conheça um padrão para a sua existência.

O direito da informática tem caminhado mais firmemente na proteção de direitos intelectuais e de criação, a medida que esses se tornam mais comuns no cotidiano. Antigamente apenas com um conhecimento muito técnico podia se criar ou compartilhar algo relacionado à internet ou que pudesse ser exposto ali, hoje não, o conhecimento está ao alcance de todos e a criação do conteúdo na rede é inimaginável.

Essa alta criação de conteúdo é muito benéfica, pois leva a informação e o compartilhamento de conteúdos a tudo e a todos. Mas essa é apenas uma face da internet, a outra, que normalmente vem atrelada esse alto compartilhamento, é a ilegalidade. Pornografia infantil, distribuição de material protegido por direitos de cópia são ótimos exemplos de como a ilegalidade está presente e mesmo contando com o grande esforço que o Brasil está realizando para coibir esse tipo de ação ainda falta muito recurso, humano e tecnológico para que cheguemos perto do ideal.

O que se nota é a dificuldade de ponderar a facilidade da liberdade de compartilhar informações e conteúdos com a robustez e estruturação que um sistema necessita para que se garanta total apoio legal para todos os atos que acontecem na rede.

É visível que em pouco tempo teremos uma estrutura melhor a regulamentação da internet no Brasil, mas seria ingenuidade pensar que ela será perfeita ou estará atual a realidade da rede quando for implementada. Hoje estamos vivendo uma realidade, na qual se utilizam determinados meios para a comunicação, essa realidade pode ser totalmente diferente da que vivenciaremos daqui poucos anos.

É importante ter em mente que não se pode comparar a velocidade do avanço tecnológico dos últimos 50 anos com o desenvolvimento que tivemos nos últimos 15 anos. É um crescimento exponencial e inimaginável.

Talvez quando consigamos regularizar a internet, ela se torne obsoleta como meio de comunicação e seja necessário um recomeço como o que estamos passando no presente momento, mas uma certeza teremos, a base estará formada e adaptada para mudanças repentinas ou não poderemos afirmar que a internet está regularizada, pois em termos gerais essa é a sua essência.

Publicado por: lucasrthomaz | 1 01UTC Outubro 01UTC 2009

Portal NERA

Algum tempo atraz realizei um trabalho para o grupo de estudos da UNESP de Presidente Prudente. O grupo de estudos é intitulado NERA e trata de assuntos relacionados a reforma agrária.

Realizei um trabalho de redefinição do layout e adequação do portal aos padrões da WEB 2.0.

O trabalho incluiu muitas padronizações por CSS e tive uma atenção especial a facilidade de atualização e manutenção, pois ele é constantemente alterado e atualizado.

Confiram o site clicando aqui.

Publicado por: lucasrthomaz | 1 01UTC Outubro 01UTC 2009

Sistema Eletronico de Editoração de Revistas – SEER – OJS

Estou trabalhando na configuração de um sistema eletronico para editoração de revistas, SEER, para a divulgação das revistas produzidas pela pos graduação em educação da UNESP de Presidente Prudente.

Para melhorar o conceito CAPES que um curso de pós-graduação está sujeito um dos quesitos importantes é a divulgação do trabalho realizado pelo departamento, uma boa maneira é a divulgação online e a melhor ferramenta que encontraram foi o SEER. O sistema está hospedado nesse endereço.

Estou tendo que aprender muita coisa mas felizmente material tem de sobra, alguns estão hospedados aqui e aqui.

O sistema é muito completo e atende todas as necessidades para uma edição básica e até complexa de uma revista, deixando altamente configurável as políticas para submissão e aprovação de um artigo.

Fico feliz com a oportunidade de utilizar esse recurso e espero em breve compartilhar mais informações aqui.

Publicado por: lucasrthomaz | 1 01UTC Outubro 01UTC 2009

Liferay – Gerenciador de Portal

Recentemente comecei a trabalhar com um sistema de gerencia de portal chamado Liferay.

Estou configurando um sistema para um portal interno de uma empresa que irá utilizar o liferay como ponto de encontro das informações internas da empresa. O projeto está em execução e minhas considerações até agora sobre o sistema Liferay são:

  • Fácil configuração de Portlets básicos para exibição de conteúdos, blogs, wikis, forums e qualquer outro tipo de exibição de conteúdo.
  • Alta configuração de papeis para usuários e uma ótima gerencia de escopos para visualização e permissões.
  • Processo de workflow para genrencia de layout bem definido, trabalhando com ’stages’.
  • Fraquissima, para não dizer inexistente gerencia de conteúdo, que não apresenta sequer um bom portlet ou solução para workflow de conteúdo.
  • Bem documentado.
  • Comunidade relativamente ativa.

Essas são minhas primeiras impressões sobre o sistema, quando estiver mais maduro, posto mais informações aqui.

ps: para conferir mais sobre o liferay, veja os artigos que criei no portal da empresa: http://www.weblibre.com.br/artigos/

Publicado por: lucasrthomaz | 23 23UTC Abril 23UTC 2009

Engenharia de Software 1 – Aula 1 e 2 -

Tecnicas de 4ª Geração

  • O ambiente de 4ª geração inclue:
    • Linguagens não procedimentais para consulta de banco de dados
    • Geração de Relatórios
    • Capacidade gráfica de alto nível
    • capacidade de planilhas eletronicas.
  • Para uso dessa tecnica, dividimos em 4 fases, trabalhando como o modelo em cascata:
    • Obtenção dos Requisitos:
      • Tradução dos requisitos exigidos pelo cliente para um protótipo operacional.
    • Estratégia do Projeto
      • Pode ser pulado em pequenas aplicações
      • Usado em grandes projetos para assegurar a qualidade do software
    • Implementação usando 4GL
      • Representação dos resultados para que haja uma automação no código
    • Testes
      • O desenvolvedor deve efetuar testes e desenvolver uma documentação significativa
      • Software deve ser construido de maneira que a manutenção possa er efetuada prontamente
  • Proponentes
    • Redução no tempo de desenvolvimento do software
    • Maior produtividade
  • Oponentes
    • As 4GL atuais não são mais fáceis de usar do que as linguagens de progrmação
    • o código fonte produzido é ineficiente
    • A manutenibilidade de sistemas usando tecnicas 4GL ainda é questionável.

Para a escolha de um modelo de Processo de Software, fique atendo a:

  • Natureza do projeto e da aplicação

  • Métodos e ferramentas a serem usados

  • Controles e produtos que precisam ser usados

Fases genéricas dos Modelos de Processo de Engenharia:

  • Independentemente da natureza do projeto e modelo de processo utilizado, todos passam por:
    • Fase de Definição
    • Fase de Desenvolvimento
    • Fase de Manutençao
    • Fase de Apoio

Fase de Definição

  • Focaliza “o que” será desenvolvido
  • Qual informação a ser processada
  • Quais as interfaces a serem estabelecidas
  • Restrições do projeto

Publicado por: lucasrthomaz | 21 21UTC Abril 21UTC 2009

Compiladores – Aula 3

Tabelas Sintáticas Preditivas

  • (arrumar os acentos — teclado dos infernos!!)
  • A construcao de tais tabelas pode ser realizada atraves do uso de algoritmos conhecidos.
  • Tal construcao e facilitada atraves de algums funcoes associadas a gramatica a ser analisada:
    • Primeiro
      • Se w eh uma cadeia de simbolos gramaticais quaisquer entao PRIMEIRO(w) eh o conjunto de terminais que comecam as cadeias derivadas de w.
      • Se w -> *vazio, entao vazio esta no conjunto de PRIMEIRO(w)
      • Para determinar PRIMEIRO(w)
        1. Se X é um terminal PRIM(X) = {X}
        2. Se X -> vazio é uma produção; vazio deve ser adicionado ao conjunto PRIM.
        3. Se X é um nao-terminal e X->Y1Y2…Yk; então adicionar em PRIM (X) todos os síbolos relativos a PRIM(Yi) onde Y1…Yi-1 -> vazio; onde i = 1,2,…,k.Se algum Yi não derivar em vazio, então nada mais é adicionado em PRIM(X)
    • Seguinte
      • A é um não terminal, SEGUINTE(A) é o conjunto de terminais que podem figurar imediatamente a direita de A em alguma forma sentencial.
      • Os simbolos pertencentes a SEGUINTE podem ser usados como tokens de sincronização durante a modalidade de desespero.
      • Para determinar o SEGUINTE:
        1. Colocar $ em SEG(S) se S for o simbolo de partida e $ o marcador de fim de entrada.
        2. Se existe uma produção A -> pBt então tudo em PRIM (t) exceto vazio deve ser adicionado em SEG(B)
        3. Se existe uma produção A -> pB ou A-> pBt onde PRIM (t) contem vazio (t -> vazio), então tudo que que está em SEG(A) está em SEG(B);
  • Construção de Tabelas Sintaticas Preditivas
    • Para cada produção A:
      • Se simbolo corrente da entrada é “a”, a expansão da gramatica seja dirigida para A -> p dado que PRIM(p) = {a}
      • Se a -> vazio  a expansão se da atravez de SEG (p)
    • Para cada produção A -> p da gramática repita os passos abaixo:
      • Para cada terminal “a” em PRIM (p), adicione A -> p a M[A,a]
      • Se vazio estiver em PRIM (p), adicione A -> p a M[A,b] para cada terminal b que estiver em SEG(A). Se vazio estiver em PRIM (p) e $ em SEG (A), adicione A-> p a M[A,$]
      • Para cada entrada indefinida de M corresponde a uma situação de erros.

Recuperação de Erros

  • Sabemos que ocorre um erro quando:
    • O simbolo corrente da entrada não corresponde ao terminal contidono topo da pilho OU
    • O simbolo corrente da entrada não possui produção correspondente a partir do não-terminal contido no topo da pilha.
  • Tais erros podem ser recuperados através da modalidade do desespero, i.e., através do descarte de símbolos da entrada até a localização de um token de sincronização.

Recuperação de Erros – Modalidade Desespero

  • Eficiencia depende da escolha adequada de tokens de sincronia
  • A recuperação de erros é provavel na maioria dos casos mas não pode ser assegurada.
  • Temos varias tecnicas, considerando ocorrencia do erro durante a expansão do não -terminal A:
    • Tecnica 1:
      • Usam-se todos os simbolos de SEG(A) como tokens de sincronia
      • Descartam-se os símbolos de entrada até encontrar-se um elemento de SEG(A), quando também descartamos A.
    • Tecnica 2:
      • Adiciona-se os simbolos de PRIM() das produções que se expandem de A.
    • Tecnica 3:
      • Se os simbolos em PRIM(A) s’ao adicionados ao conjuto de sincronizacao, podera ser possi
        <———— REVISAR————>
    • Tecnica 4:
Publicado por: lucasrthomaz | 17 17UTC Abril 17UTC 2009

Compiladores – Analisador Léxico – Aula 3

Análise Sintática

  • Segunda fase de um compilador
  • É responsavel pela leitura do fluxo de tokens produzido pelo analisador lexico
  • Checa se o fluxo gerado pertence a gramatica da linguagem fonte
  • Chamada de análise gramatical ou parsing
  • Pode produzir a árvore gramatical que sera usada na geração do código
  • Permite determinar se a tradução de um programa-fonte em códigos-objeto é possivel localizando erros gramaticais
  • Objetivos:
    • Obter uma cadeia de tokens do analisador lexico determinando se pode ser gerada pela gramática da linguagem-fonte
    • Relatar o maior número possível de erros de forma clara facilitando sua corrção
    • Criar uma árvore que possa ser efetivamente utilizada pelas demais fases da compilação.
  • Tipos:
    • Metodos Universais:
      • Podem tratar qualquer tipo de gramática
      • Usualmente ineficientes
    • Métodos Top-Down:
      • Constroem uma arvore gramatical do topo para o fundo
    • Metodos Botton-Up:
      • Constroem uma arvore das folhas para as raizes.
  • Os metodos Top-Down e Botton-Up são aplicaveis a praticamente todos os casos, mas com efiencia apenas a certas sub=classes gramaticais.
  • A maioria das linguagens pdem ser descritas por gramaticas:
    • LL: Left to Left – Leftmost derivation : Derivação mais a esquerda
      • Conveniente para a implementação manual
    • LR: Left to Right – Rightmost derivation]
      • Adequada para a implementação automática.
  • Compiladores devem processar programas considerando a possivel existencia de erros
  • O tratamento de erros é usualmente incorporado a análise e não a LP

Tratamento de Erros

  • Maior parte dos erros encontrados na analise sintática
  • A rotina de tratamento de erros deve:
    • Relatar a ocorrencia de erros de forma clara e precisa
    • Recuperar cada erro de forma suficiente para prosseguir erros subsequentes
  • Maior parte dos erros é simples, embora tenha erros que sejam dificeis de recuperação.
  • Erros muito proximos podem ser desconsiderados
  • Estratégias para recuperação de erros:

    • Modalidade Desespero
      • Após a detecção do erro, descartam-se os tokens e continua reconhecendo os subsequentes até encontrar um token de sincronisação, um “;” por exemplo.
      • Não detecta erros multiplos num mesmo enunciado, mas é simples e não entra em laço infinito
    • Nível de Fase:
      • Correção da entrada por meio de inserções, alterações ou remoçoes baseadas em distancia mínima.
      • Desde que cuidadosamente planejada, permite a detecção de multiplos erros
      • Pode levar a laços infinitos
    • Produções de Erro
      • Erros considerados frequentes tem suas produções incluídas na gramatica permitindo a exibição de diagnosticos apropriados.
      • É complexa e torna a análise lenta
    • Correção Global
      • Aplicação de algoritimos especiais que escolhem uma sequencia mínima de correções para o programa fonte.
      • Possuem custo computacional elevado e mesmo assim não garantem que a correção seja a desejada.

Gramática Livre de Contexto

  • Expressões regulares podem representar a estrutura lexica de totkens mas não podem expressar enunciados condicionais.
  • Gramáticas livres de contexto são mais adequadas pra tal fim.

Derivações

  • A contrução de derivações é um meio conveniente de realizar-se a análise sintática na forma Top-Down.
  • O Objetivo de uma análise sint´tica é verificar se uma dada entrada atenda tal gramática.
  • As derivações são obtidas utilizando as regras de produção de uma gramática como regras de reescrita, onde símbolos não-terminais são substituidos por suas cadeias equivalentes.
    • Se é possível realizar uma série de substituições a partir de S que se construa uma dada cadeia de simbolos “w” então tal cadeia pertence a linguagem L(G)
  • Uma derivação mostra um caminho gramaticalmente corrento de equivalências.
  • Constituida de 2 passos:
    • 1º escolher o não terminal a ser substituido.
    • 2º escolha da alternativa de substituição.
  • Derivações construidas através da substituição do não-teminal mais a esquerda são ditas derivações mais ‘a esquerda.
  • Derivações construidas somente por substituição do não-terminal mais a direita, são ditas derivações canonicas.
  • As árvores sintáticas são representações gráficas das derivações possíveis numa certa ordem
  • Na árvore de derivação, cada nó interior é rotulado por um não teminal e cada folha é rotulada por um terminal. ou vazio.

Ambiguidade

  • Uma gramática é dita ambigua quando houver uma ou mais derivações distintas para uma mesma sentença;
  • Se for possível para cada derivação uma arvore de derivação diferente, essa gramática é dota ambigua;
  • A maioria dos analisadores utilizam métodos que requerem gramáticas não ambiguas.
  • Uma forma conveniente de eliminar a ambiguidade de uma gramática, é reescrevendo tal gramática.

Gramática Livre x Expressões Regulares

  • Gramáticas podem representar grande parte das linguagens de programação, mas não todas.
  • As gramáticas em si, não são apropriadas para fazer o reconhecimento de tipos de tokens.
  • Construções descritas por expressões regulares podem ser descritas por uma gramática.
  • Da mesma forma uma expressão regular pode ser convertida em um AFNque pode ser mecanicamente convertido a uma gramática.
  • Regras  lexicas são geralmente simples e podem ser descritas mais simplismente através das expressoes regulares.
  • Expressoes regulares podem ser convertidas automaticamente em analisadores lexicos eficientes.
  • Expressoes regulares são mais adequadas para descrever a estrutura das construções lexicas
  • Gramáticas são mais adequadas para descrever estruturas aninhadas. (parenteses ou if/else)

Eliminação da recursão a Esquerda

  • Gramáticas são recursivas a esquerda se possuem um não terminal A para o qual existam derivações A-> +Ap para uma cadeia p
  • Metodos Top-Down não podem processar tais gramáticas.
  • Torna-se necessária uma transformação na gramática para que a recursão seja eliminada.
  • Para o par de produções:
    • A-> Ap | B ====> p e B são terminais
    • Representa uma gramática com recursão a esquerda.
    • Para eliminar, essa substituição resolve:
      • A -> BA’
      • A’-> pA | Vazio
    • nenhuma modificação é requerida e a gramática fica sem recursão a esquerda.
  • Algoritimo para eliminação da recursão a esquerda
    Colocar não terminais em qualquer ordem A1,...,An
    Para i = 1 até n faça
        Para j = 1 ate i-1 faça
            substituir produções Ai -> Ajy
            por Ai -> b1y|b2y|...|bny
            onde Aj -> b1|...|bn são as produções Aj correntes

Fatoração a Esquerda

  • Transformação gramatical apropriada para a criação de analisadores sintáticos preditivos.
  • Adia a escolha de uma produção até que ela seja a possivel escolha certa.
  • Desta forma o analisador pode atuar sem a necessidade de retrocesso.
  • <——- INSERIR EXEMPLOS ————–>

Analise Sintática Top-Down

  • Encontrar uma derivação mais a esquerda para a cadeia de entrada procurando construir uma árvore em gramatical a partir da raiz criando nós em pre-ordem.
  • Pode envolver retrocesso.
  • Denominada: Analise sintática descendente recursiva.
  • Quando não há retrocesso, é denominada Analise Sintática Preditiva – Muito conveniente para a programação.
  • Para se montar a arvore de derivações:
    • Encontra o simbolo inicial da gramática – Será a raiz da arvore
    • A medida que se encontra um não terminal, ele é expandido.
    • Da mesma forma são consumidos os terminais, um a um, gerando as folhas.
  • Usualmente é implementada como um conjunto de funções cooperativas.
  • Cada construção da linguagem (uma regra BNF) é reconhecida pelo código de uma função.
  • Tal estratégia é consistente com os principios de abstração e refinamento passo a passo propostos pela engenharia de software.
  • Se a gramática for cuidadosamente escrita de forma que:
    • não haja recursão a esquerda e
    • suas produções estejam adequadamente fatoradas
  • Pode-se construir um analisador sintático preditivo, ou seja, que não necessite operações de retrocesso.

Diagrama de Transição

  • Uteis na construção de analisadores Lexicos
  • Pode ser util para a implementação de um analisador sintatico preditivo
  • A gramatica a ser utilizada tem que ter a recurção a esquerda e ambiguidade eliminada. Bem como a fatoração.
  • Para cada não-terminal A existe um diagrama para o qual:
    • criamos um estado inicial e um estado final;
    • Para cada A-> X1X2…X3 criamos um percurso do estado inicial para o final com n-1 estados.
  • A implementação da analise sintática preditiva é possivel atraves de um conjuto de funções acionada recursivamente.

Análise Sintática Preditiva Não-Recursiva

  • Uma tabela sintática mantem todas as produções da gramatica sendo usada pelo analisador não-recursivo.
  • A implementação de um analisador sintático
    preditivo não-recursivo é um pouco mais complexa
    que seu equivalente recursivo, como pode ser visto
    a seguir.
  • Por outro lado seu código é mais eficiente (menor e
    mais rápido), podendo ser mais facilmente
    adaptável a outras diferentes gramáticas.
Publicado por: lucasrthomaz | 17 17UTC Abril 17UTC 2009

Compiladores – Analisador Léxico – Aula 2 – Parte 3

Reconhecimento de Tokens

  • Geralmente inicializa-se uma tabela de simbolos com o registro das palavras reservadas da linguagem.
  • Os identificadores são registrados na tabela de simbolos apenas uma vez, mas seus atributos são modificados ao longo da execução.

Projeto de Analisador Léxico

Passos:

  • Definir o Alfabeto
  • Listar os tokens necessários
  • Especificar os tokens por meio de definições
  • Montar os automatos para reconhecer os tokens
  • Implementar o analisador lexico
Publicado por: lucasrthomaz | 16 16UTC Abril 16UTC 2009

Compiladores – Analisador Léxico – Aula 2 – Parte 2

Scanner

  • Le o programa fonte caracter a caracter, juntando-os em unidades atômicas chamadas itens lexicos
  • Opera sob o controle do parser que pede ao scanner o proximo item sempre que precisar de um
  • Retorna ao parser 2 ou mais parametros: Tipo e valor do item lido; sendo que valor pode ser tambem um ponteiro para a sua posição na tabela de simbolos.

Modalidade de Pânico

  • Usada para recuperar erros lexicos.
  • Acionada quando o analisador lexico parar ou entrar em um laço infinito.
  • Ignora caracteres invalidos a partir da posição com erro até o proximo caracter que pertença ao alfabeto ou fim do arquivo.

Bufferização

  • Tecnica para percorrer arquivos de entrada quando estes forem muito grandes
  • Quando a não houber memoria para carregar todo o arquivo.=
  • São utilizados em pares
  • Em algumas situações o analisador lexico precisa examinar alguns caracteres a frente para que possa reconhecer o token
  • Isso faz a leitura do arquivo ficar voltando e avançando, o que pode levar um certo tempo.
  • Para aumentar a eficiencia , pode ser utilizados buffers em memoria principal
  • Normalmente é dividido em duas metades, cada uma ocupando o tamanho de um bloco de disco -: 1024 ou 4096
  • O analisador le um bloco do arquivo e armazena na primeira metade, usando um ou mais apontadores para percorrer o buffer em memoria a procura de um token.
  • Se restarem menos caracteres do que o tamanho do buffer, um caracter especial é inserido (eof)
  • Dois apontadores indicam o início e o fim do token corrente no buffer. Quando um lexema for reconhecido ambos apontam para o primeiro caracter depois do token.
  • o par de buffer pode não funcionar em situações onde o apontador adiante precisa percorrer uma distancia maior que o comprimento do buffer.
  • Sempre que movemos os apontadores em um buffer, temos que verificar se não ultrapassamos os limites do buffer.
  • Se ultrapassarmos o primeiro buffer, temos que carregar o segundo, se ultrapassarmos o segundo, temos que carregar o primeiro e retornar os apontadores.
  • Um caracter especial que não fazs parte do alfabeto do arquivfo fonte pode ser inserido no final do buffer, para servir de sentinela.
    se adiante estiver no fim da 1ª metade, entao
    carrega a 2ª metade
    adiante ++
    senão
    se adiante no final da segunda metade, então
    recarrega a 1ª metade
    desloca adiante para o inicio da 1ª metade
    senão
    adiante ++
    fim_se
    fim_se

Especificação de Tokens

  • São padrões que podem ser especificados atraves de expressões regulares
  • Um alfabeto determina o conjunto de caracteres válidos para a formação de cadeias, sentenças ou palavras
  • Cadeias são sequencias finitas de caracteres.
  • Expressoes regulares pode receber um nome, formando o token de um analisador lexico
  • Algumas convenções:

  • Uma ou mais ocorrencia: +
  • Zero ou mais ocorrencias: *
  • Zero ou uma ocorrencia: ?
  • Classe de caracteres: [a-z] = a|b|…|z
  • Tokens podem ser reconhecidos por meio de automatos finitos, sendo que o estado final dispara o reconhecimento de um token específico e/ou um procedimento específico (inserir na tabela de simbolos por exemplo)
  • Normalmente constroi-se um diagrama de transição para representar o reconhecimento de tokens.

Diagramas de Transição

  • Delineiam as ações tomadas pelo analisador léxico quando chamado pelo parser.
  • Assumindo que os Dt sejam deterministicos (O mesmo simbolo não pode figurar como rótulo em dois lados diferentes que deixem um estado)
  • Os estados (representados por circulos) são conectados por setas cujos rotulos indicam as possiveis sequencias de caracteres.
  • O rotulo outro indica qualquer caracter que não apareça como esperado em um dado estado.
  • Estados podem ter ações associadas, que são executadas quando atingidos pelo fluxo de controle.
  • Circulos duplos indicam a ceitação de uma cadeia
  • Asterisco indica o retrocesso do ponteiro.
Publicado por: lucasrthomaz | 13 13UTC Abril 13UTC 2009

Linguagens de Programação – Aula 4 – Parte 1

Tipos de Dados Primitivos

  • Inteiro:
    • com/sem sinal, inteiro base decimal, inteiro base binaria, precisao simples
  • Ponto Flutuante:
    • Aproximação ao conjunto dos números reais
    • Linguagens cientificas:
      • Precisao Simples:
        • [bit sinal | Expoente : 8bits | Fração 23 bits]
      • Precisao Extendida
        • [bit sinal | Expoente : 11bits | Fração 52 bits]
    • Relação proxima com hardware
  • Decimal:
    • Aplicações comerciais
    • Armazena um numero determinado de digitos decimais
    • Codificado em base binaria
    • Alta precisão
    • Amplitude limitada
    • Grande gasto de memoria
  • Lógico (Boolean)
    • Permite apenas Valso e Verdadeiro
    • Aumenta a legibilidade do código
  • String
    • Valores são sequencia de caracteres
    • Dimensão pode ser estática ou dinamica
    • Análise:
      • Facilita a criação do código
      • É eficiente como tipo primitivo estático
      • Dinamicamente é caro e custoso.
  • Ordinal
    • Indicam uma ordem de valores
    • Tipo Enumerado:
      • Enumera todos os possiveis valores atraves de constantes simbolicas
      • Ex: [C]
        enum tipocor {vermelho, azul, branco,preto}
    • Tipo Subfaixa:
      • Introduzido pelo Pascal.
      • Subfaixa se comporta como o tipo pai.
      • Podem ser usados em array, comparação, …
      • Ex.: type positivo = 0 … MAXINT;
      • Avaliação:
        • Melhor legibilidade
        • Melhor confiabilidade
        • Maior facilidade de detecção de erros
      • Implementação:
        • São geralmente implementados associando números inteiros a cada constante.
  • Arrays
    • Sequencia homogenia de dados.
    • Cada elemento é uma variável e pode ser acessado por sua posição relativa, a apartir da primeira posição
    • É uma estrutura de daos fundamental e existente em TODAS as linguagens
    • Indexação:
      • Associação entre indices e elementos do array
      • Tipos de indices:
        • Pascal : ordinal escalar, boolean chae e enum
        • Java: Numeros inteiros
      • Limite inferior dos indices:
        • C e Java = 0
        • Basic = 1
    • Array Estático:
      • Armazenamento estático
      • Tamanho do array é estático
      • Indices e armazenamento são vinculados em tempo de compilação.
      • Eficiente na execução
        • Não ha reserva nem liberação de memoria.
    • Array Dinamico de Tamanho Fixo
      • Indices com vinculação estática
      • Armazenamento é vinculado em tempo de execução na pilha dinamica
      • Dimensão é estática
      • Tempo de vida = tempo do bloco ou função
      • Eficiencia de espaço de memoria
    • Array Dinamico de Pilha
      • Dimensão e armazenamento são dinamicos porem assim que dorem definidos são fixos durante o tempo de vida do array
      • Flexivel
      • Tamanho não precisa ser conhecido a priori
    • Array de Heap
      • Dimensão e armazenamento dinamicos – Podem mudar qualquer numero de vezes DURANTE seu tempo de vida
      • Tempo de vida controlado pelo programador ou pelo Garbage Collection
      • Flexivel : tamanho pode crescer ou diminuir conforme a necessidade
      • C: malloc, free
    • Numero de indices de um array
      • FORTRAN : 1 A 3 dimensões
      • C/C++/Java: Uma dimensão, mas cada posição do arrau pode conter um outro array
  • Registro
    • Conjunto de elementos (possivelente heterogenios)
    • Cada elemento é designado por campo e identificado por nome e seus atributos
    • Operações:
      • Atribuição: Se foram identicos (C,Pascal) ou “move corresponding” (Cobol)
      • Inicialização: Através de constantes agregadas
  • União
    • Variáveis podem armazenar tipos de dados difetenres em tempos diferentes de execução.
    • Tipos de União:
      • Livre: Linguagens que não oferecem qualquer suporte para dos tipos de dados (responsabilidade do programador)
      • Discriminada: inclui um identificador de tipos de dados.
    • Potencialmente não seguro na maior parte das linguagens, exceto Ada.
  • Conjunto
    • Tipo de dados cujas variáves podem armazenar uma coleção não ordenada de valores distintos de algum tipo ordinal, designado de tipo BASICO
    • Avaliação
      • Aumenta Legibilidadea
      • Pode ser simulado caso a linguagem não suporte esse tipo
      • Arrays são mais fexiveis que conjuntos, pois tem mais operações.
    • Implementação:
      • Armazenados como string de bits e usando operações lógicas de conjunto.
  • Ponteiro:
    • Apontador é um tipo cujos valores consistem em endereçoes de memória e um valor especial Null
    • Utilidades:
      • Flexibilidade de endereçamento
      • Reserva dinamica de memoória
    • Operações:
      • Atribuição de um endereço a um apontador
      • Rerefencia
    • Problemas:
      • Referencia oscilante:
        • Quando um ponteiro pode conter um endereçõ de uma variável heap-dinamica que já foi liberada.
        • Geração de lixo
          • Perda de Endereço
          • Quando uma variavel heap-dinamica não é mais referenciada por um ponteiro e deixa de ser acessivel
    • Avaliações:
      • Referencias são perigosas e lixos são problemas
      • Apontadores são como “goto” para posições de uma memoria
        • Geram varios modos de acesso a uma celula da memoria
      • São necessários
        • Não é possivel projetar uma linguagem sem eles.

Mensagens Antigas »

Categorias