1.1 - Razões para se estudar os conceitos de linguagem de programação
● Aumento da capacidade para expressar ideias: O pensamento da pessoa é
influenciado pelo poder da linguagem, ou seja, se uma pessoa pessoa possui pouco conhecimento sobre o funcionamento de uma linguagem, mais limitada ela estará. As construções de uma linguagem pode ser simuladas em outras linguagens que não possuem suporte para tal, porém o recomendado é usar o que está feito na linguagem, ao invés de simular. ● Melhora a capacidade para escolher uma linguagem apropriada: Um programador tende a escolher a linguagem que ele está mais familiarizada para um determinado projeto, mesmo que ela não seja adequada para tal, porém, caso ele saiba outras linguagens, isso pode influenciar em uma escolha acertada de uma linguagem para um projeto específico, visto que ele irá saber os detalhes de cada uma e com isso ele poderá tomar uma decisão melhor. ● Melhora a capacidade para aprender novas linguagens: O processo de aprendizado de uma nova linguagem de programação pode ser difícil, caso o programador esteja nunca tenha estudado os conceitos gerais das linguagens, porém, uma vez que ele possui esse conhecimento, fica mais fácil aprender uma linguagem, pois basta ele ver como que uma determinada linguagem implementa o conceito. ● Melhor compreensão do significado da implementação: O entendimento da implementação pode levar ao entendimento de como uma determinada linguagem foi projetada daquela maneira, levando a utilização dela de maneira inteligente. A implementação pode ajudar a compreender como que o computador executa as construções de uma linguagem. ● Melhor utilização das linguagens já conhecidas: Através do estudo dos conceitos das linguagens de programação, um programador pode entender mais acerca de construções que antes ele não conhecia e utilizava em uma linguagem. ● Avanço geral da computação: Através dos conceitos das linguagens de programação, é possível entender o porquê de algumas linguagens serem menos utilizadas ou terem caído em desuso e outras linguagens serem tão populares.
1.2 - Domínios da Programação
● Domínio científico: Onde são utilizadas estrutura de dados simples e um uso massivo de números de ponto flutuante. A primeira linguagem e a mais utilizada foi o Fortran, porém existe o ALGOL 60 para competir com ela. ● Domínio comercial/negócios: A linguagem que foi mais utilizada para esse tipo de domínio foi o COBOL, sendo usado para elaborar relatórios. ● Inteligência Artificial: Utiliza computação simbólica usando listas encadeadas e símbolos (nomes) e é caracterizado pela flexibilidade. A primeira linguagem criada para esse propósito foi o LISP, porém mais tarde foi criado o conceito de programação lógica, com Prolog. ● Programação de sistemas: Se destaca por possuir características de baixo nível que permitem o software se comunicar com periféricos, exemplo de um sistema operacional. A linguagem mais conhecida para este domínio é o C, facilitando a portabilidade, aumentando a eficiência e o fato de ela possuir características de baixo nível. ● Software para a Web: Utiliza linguagens como Java, PHP ou javascript em conjunto com linguagens de marcação como HTML e XHTML para construir softwares dinâmicos para a internet.
1.3 - Critérios de avaliação de uma linguagem
1. Legibilidade: Capacidade de leitura e entendimento de uma determinada linguagem. Colocou a importância na manutenção e tirou o foco da máquina(eficiência), colocando no usuário(entendimento e manutenção de código). a. Simplicidade: Uma linguagem com um número maior de construções básicas é uma linguagem mais difícil de se aprender, fazendo que um programador aprenda apenas um pequeno subconjunto da linguagem. Existe o problema da multiplicidade de características (várias maneiras de se fazer a mesma coisa). Existe o sobrecarga de operadores onde um operador possui mais de um significado. b. Ortogonalidade: É a capacidade de uma linguagem poder combinar um pequeno conjunto de construções primitivas para construir estruturas de dados e de controle. Quanto mais ortogonal for uma linguagem, menor será a quantidade de exceções das regras da linguagem. Um exemplo de ortogonalidade seria o retorno de structs em função (permitido) e o retorno de um array em função (não permitido) em C. A linguagem mais ortogonal seria o ALGOL 68. c. Tipo de dados: A presença de uma declaração fácil de um tipo de dado facilita a legibilidade, exemplo de C. d. Design da sintaxe: Possui um efeito significativo na legibilidade, como a utilização de palavras especiais, keywords, a forma e o significado de um operador. 2. Escrita: Mede o quão fácil uma linguagem pode ser utilizada para escrever um programa. Está relacionado com a legibilidade. a. Simplicidade e Ortogonalidade: Se uma linguagem possui um número muito grande de diferentes construções, alguns programadores podem não estar familiarizados com todas elas, podendo causar o uso de algumas características e o desuso de outras. Um conjunto pequeno de construções primitivas e um conjunto consistente de regras de combinação são melhores do que um conjunto grande de construções primitivas. Caso uma linguagem possua bastante ortogonalidade, será difícil detectar a origem de um possível erro. b. Suporte à Abstração: É um princípio básico no design de uma linguagem, pois permite que vários detalhes de uma construção sejam ignorados, facilitando a escrita de um programa e a legibilidade dele. c. Expressividade: Capacidade de usar pouco código para efetuar grandes quantidades de computação, aumentado a capacidade de escrita de uma linguagem. 3. Confiabilidade: Um programa é confiável se ele executa as suas especificações em todas as condições possíveis. a. Verificação de tipos: É um teste para verificar se uma variável pertence ao tipo que foi declarada, tornando um programa confiável, podendo ser verificada em tempo de compilação e em tempo de execução. b. Tratamento de exceções: É a capacidade de um programa interceptar erros em tempo de execução e assim possibilitando a tomada de medidas corretivas. c. Criação de alias: É a capacidade de uma linguagem poder possuir 2 nomes distintos apontando para o mesmo endereço de memória. d. Escrita e Legibilidade: Afetam diretamente a confiabilidade de uma linguagem, pois um programa mais fácil de se escrever é maior a probabilidade de ele estar correto. 4. Custo: Existe o custo de se treinar um programador em uma determinada linguagem, o custo de se escrever um programa, em que ambos pode ser reduzidos através da utilização de um bom ambiente de desenvolvimento e também existe o custo de compilação e o custo de execução, podendo usar técnicas de otimização para diminuir esses custos.
1.4 - Influências no design de uma linguagem
1. Arquitetura do computador: As linguagens imperativas foram projetadas baseadas na arquitetura de Von Neumann. 2. Metodologias no design de uma linguagem de programação: Imperativa, Orientação a Objetos, Funcional e Lógica. 3. Trade-offs: Confiabilidade x Custo de execução, Eficiência x Confiabilidade, Expressividade x Legibilidade e Escrita x Legibilidade. 4. Métodos de implementação: Interpretação pura (interpretação do código fonte por um interpretador, sem parte de tradução), Compilação (tradução de código fonte para código de máquina), implementação híbrida (interpretação com compilação, mais rápido que a interpretação pura, pois a decodificação das instruções só ocorrem uma vez, ocorre primeiro a etapa de compilação e depois a etapa de interpretação da linguagem intermediária, bytecode) e o pré processamento (Ocorre o processamento do programa antes de ele ser compilado e realiza a expansão de macros). 5. Ambientes de desenvolvimento: Ferramentas utilizadas para auxiliar o desenvolvimento de programas, que inclui um conjunto de ferramentas internas que auxilia o programador a desenvolver um programa de maneira mais eficiente.