Características Essenciais no Projeto de Linguagens de Programação

Linguagens de programação são ferramentas para a produção de sistemas (programas). Existe um conjunto de critérios para a avaliação dessas linguagens e esses critérios são baseados nos conceitos de tipos de dados, estruturas de controle, correção de programas e programação de grandes sistemas. Abaixo segue uma lista das principais características desejadas no projeto de uma linguagem.

Critérios de Projeto
As linguagens de programação devem auxiliar o programador no projeto, documentação e validação de programas. Os critérios para o projeto das linguagens são: redigibilidade, legibilidade e confiabilidade.

Dois objetivos adicionais no projeto são tradução eficiente e execução eficiente, devido aos programas serem executados por computadores. Algumas características do tradutor tem influenciado no projeto de linguagens, como por exemplo, a necessidade da declaração de cada nome antes de seu uso (como em Pascal), permitindo a tradução de programas em um único passo.

Em alguns casos uma execução eficiente é um objetivo tão importante do projeto da linguagem que ela reflete características da arquitetura da máquina. Isso devido a ser difícil especificar um execução eficiente sem que seja feita uma referência a arquitetura da máquina em particular. Discutiremos apenas os critérios para o projeto de linguagens independentes de máquina, isto é, linguagens que podem ser implementadas em qualquer computador.

Um objetivo de projeto cuja realização requer atenção especial é a independência de máquina. Já que muitas linguagens supostamente independentes contêm, na realidade, características dependentes de máquina.

Redigibilidade
Linguagens de programação auxiliam no projeto de programas fornecendo mecanismos que facilitam a expressão da metodologia adotada. Fazendo com que o programador possa se concentrar no entendimento e na solução do problema. As propriedades básicas que contribuem para a regibilidade de programas são classificados como: simplicidade, expressividade, ortogonalidade e rigor na definição.

Simplicidade
A Linguagem deve ser fácil de dominar, suas características devem ser facilmente aprendidas e lembradas e o resultado de qualquer combinação dessas características deve ser previsível e facilmente entendido. Uma linguagem que não satisfaz este requisito é a PL/I, devido ao grande número de características, sendo assim difícil de dominar. A simplicidade é prejudicada se a linguagem oferecer várias maneiras diferentes para a especificação de um mesmo conceito, aumentando o tamanho da linguagem e favorecendo o desenvolvimento de “dialetos”.Outro aspecto que também prejudica a simplicidade é se a linguagem permite que diferentes conceitos sejam expressos com a mesma notação. Um exemplo disso seria a sobrecarga de operadores. Por fim em alguns casos as características das linguagens, aparentemente simples interagem de uma maneira crítica, ou acabam por gerar programas cujo comportamento é difícil de prever.

Expressividade
A expressividade de uma linguagem seria uma medida de naturalidade com que uma estratégia de resolução do problema pode ser transformada em uma estrutura de programa. Um exemplo de uma linguagem com um alto poder de expressão é o Pascal, mesmo que ela falhe no fornecimento de mecanismos adequados de modularização. Boa parte de seu sucesso se deve ao rico conjunto de estruturas de controle e dados.

Ortogonalidade
A ortogonalidade significa que a linguagem deve permitir que qualquer composição de primitivos básicos deveria ser permitido. Um exemplo de falta de ortogonalidade é a linguagem de programação Pascal, dado pelos procedimentos (funções) e por chamadas de procedimentos, que devem seguir algumas restrições(arquivos não podem ser passados por valor,componentes de uma estrutura compacta não podem ser passados por referência, funções só podem devolver valores de um conjunto restrito de tipos,…). A ortogonalidade não deve ser considerada como um substituto para a simplicidade, mas sim deve-se buscar o equilíbrio entres os dois, porém é difícil de se quantificar esses dois objetivos.
De acordo com Wirth (Wirth 1975a) ” Se nós tentamos conseguir simplicidade através de generalidade da linguagem, podemos obter programas que, por sua própria concisão e falta de redundância, escapam da nossa capacidade intelectual … A chave então se encontra não tanto na minimização do número de características básicas da linguagem, mas na inclusão de mecanismos fáceis de entender ”. Assim o equilíbrio que precisamos atingir entre ortogonalidade e simplicidade talvez possa ser chamado de preditividade.

Precisão na Definição
Esse aspecto é importante nas linguagens de programação na definição de sua sintaxe e semântica. Pois as definições obscuras são inimigas de programadores em dois aspectos:
1 – o programador não pode confiar inteiramente na linguagem, e qualquer tentativa de encontrar uma resposta na definição da linguagem resulta em frustração.
2 – implementadores diferentes podem decidir implementar características definidas de maneira imprecisa e de formas diferentes, com conseqüências infelizes para a portabilidade do programa.
A questão de como fornecer descrições formais claras e simples para as linguagens de programação é ainda assunto para investigações.

Legibilidade
A legibilidade é o que mais influencia a modificação e manutenção de programas, tendo também um impacto considerável no custo de produção. A facilidade em escrever programas favorecem tanto na escrita de programas como também na sua leitura. A simplicidade, abstração de dados e modularização trazem um estilo claro de escrever programas.
A documentação é importante no aspecto de legibilidade, pois é uma forma de explicar ao leitor o funcionamento do programa, para que o entendimento e manutenção do programa seja feito com sucesso e deve ser feita desde o início do projeto. Os comentários também são uma maneira de documentação onde uma explicação é inserida diretamente no código, o que pode ser interessante, desde que seja tomado o cuidado de não confundir o comentário com o código em si.
As convenções léxicas tem influência na legibilidade, na medida em que fazem algumas restrições, como por exemplo limitar o comprimento de identificadores, obrigando o programador a usar nomes crípticos, ou proibindo o uso de símbolos como o separador (“_”) ou espaço, o que obriga a juntar-se as várias palavras de cada nome.
Outro fator influenciador é a sintaxe da linguagem. Delimita explícitos que indicam o início e fim para cada tipo de bloco (if,for,case) são melhores do que o begin e end do Pascal, pois indicam claramente o propósito do grupo de comandos. Em linguagens onde os blocos são especificados por espaçamentos horizontais, o programa pode facilmente adquirir uma estrutura descuidada e confusa, sendo seu reespaçamento custa caro e é sujeito a erros. A semântica pode ajudar na legibilidade impondo restrições, mas tendo uma generalidade reduzida.

Confiabilidade
A confiabilidade está estritamente ligada com a facilidade de escrita e com a legibilidade, pois há mais facilidade na correção de um programa. Se a linguagem faz uma distinção rigorosa entre verificações estáticas e dinâmicas, os programadores ficam cientes do grau de validação de cada passo do processamento. Linguagens não deveriam fornecer características que são impossíveis ou difíceis de verificar devido a falta de confiabilidade intrínseca.
É importante fazer com que os programas sejam os mais verificáveis quanto possível, pois verificações em tempo de execução pode reduzir a velocidade de execução e não certificar a correção de programas.
Linguagens que permitem o desenvolvimento de módulos que possam ser certificados em separado ajudam na confiabilidade. A facilidade de modificar programas também contribui para a confiabilidade, porque durante a manutenção devemos ser capazes de modificar o programa mantendo sua confiabilidade. Ocorre forte relacionamento entre a confiabilidade de programas e uma definição rigorosa da semântica de linguagens. Um semântica formal é a base na verificação de programas, o que torna isso um componente importante na programação. É necessária uma confiabilidade da implementação da linguagem, e quanto maior a linguagem mais difícil é a produção de implementações confiáveis.

A implementação de linguagens
Requer mais esforço implementar um linguagem de programação do que projetar um processador para a linguagem. O implementador também deveria ter “os recursos para escrever manuais de usuários, textos introdutórios e avançados; ele deveria construir ferramentas auxiliares de programação e procedimentos de bibliotecas; e, finalmente, deveria ter a vontade e os recursos, de natureza política, para vender a linguagem aos fregueses a que ela se destina” (Hoare 1973).
O projeto de processadores de linguagens baseados em tradução é uma ampla área de estudos, que pode ser usada na prática para a construção de tradutores confiáveis. Um processador de linguagens pode ser visto como uma caixa preta, onde a entrada é um texto escrito em uma linguagem fonte LF e a saída é a tradução da entrada, em uma linguagem objeto LO. O tradutor é escrito em uma linguagem de implementação LI e só pode ser executado em máquinas que tenham processadores para LI, assim como programas objeto só podem ser executados em máquinas que tenham um processador para LO.
A portabilidade de um tradutor é um objeto de projeto desejável, pois somente um tradutor altamente confiável precisa ser desenvolvido, do qual várias versões podem ser obtidas a um custo muito menor.

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>