Baixe o app para aproveitar ainda mais
Prévia do material em texto
PARADIGMAS DE LINGUAGEM PARADIGMAS DE LINGUAGEM DE PROGRAMAÇÃODE PROGRAMAÇÃO PARADIGMAS:PARADIGMAS: CONCORRENTE,CONCORRENTE, PARALELO EPARALELO E IMPERATIVOIMPERATIVO Autor: Esp. Douglas Salvador Revisor : Rafae l Rehm IN IC IAR introduçãoIntrodução Na sociedade moderna, podemos contar com inúmeras tecnologias da informação. Nesse contexto em que a tecnologia tem papel de destaque, a programação tem se revelado como algo de extrema importância no processo educacional. É claro que a escolha da primeira linguagem de programação e do paradigma de programação correspondente é essencial para o desenvolvimento acadêmico e pro�ssional. Nos últimos cinquenta anos, surgiram milhares de linguagens de programação pertencentes a vários paradigmas de programação. No entanto, apesar do grande número de linguagens de programação, existem apenas alguns conceitos de programação verdadeiramente importantes e não há muitas linguagens que sobreviveram por mais de dez anos. É essencial detectar quais são os recursos adequados de uma linguagem de programação. Para tanto, vamos abordar os conceitos, as aplicações e comparações entre os paradigmas de linguagem de programação funcional, lógico, concorrente, paralelo e imperativo. O paradigma de programação imperativa é baseado na arquitetura de computadores Von Neumann, introduzida na década de 1940. A arquitetura de Von Neumann é a de hardware dominante nos computadores e consiste em uma única CPU sequencial separada da memória e com dados canalizados entre CPU e memória. Isso se re�ete no desenho das linguagens imperativas, com: Estados: representando células de memória com valores variáveis Pedidos sequenciais: re�etindo a CPU sequencial única; e Declarações de atribuição: re�etindo a tubulação. EstudoEstudo Comparativo:Comparativo: ParadigmaParadigma Funcional xFuncional x ParadigmaParadigma ImperativoImperativo Programas imperativos são sequências de instruções (ou ordens) para executar uma ação. Como a ordem das ligações afeta o valor de expressões, uma questão importante é o sequenciamento adequado das ligações. Portanto, a programação imperativa é caracterizada pela programação com estados e comandos que modi�cam esses estados. Linguagens de programação imperativas fornecem uma variedade de comandos para estruturar o código e manipular os estados. De acordo com o Gurbani et al.: Programação imperativa é um paradigma de programação que usa declarações que alteram um estado do programa. Da mesma maneira que o humor imperativo nas línguas naturais expressa comandos, um programa imperativo consiste em comandos para o computador executar. A programação imperativa se concentra em descrever como um programa opera. Toda linguagem de máquina ou procedural se utiliza dos conceitos de programação estruturada como Fortran, BASIC, Pascal, Linguagem COBOL, ALGOL e para algoritmos matemáticos e linguagem C, bem como nos paradigmas orientados a objetos como C++, JAVA, Perl, Ruby, C++ e Python. Linguagens básicas também tem suporte a eventos imperativos como Visual Basic e PHP que são linguagens de design da Web, também linguagens funcionais possuem compatibilidade com o paradigma imperativo, como: VB.Net e C#, J# e F# (GURBANI et al., 2017, p. 180, tradução nossa). Geralmente, em linguagens de programação imperativas, uma sequência de comandos pode ser nomeada, e o nome pode ser usado para chamar a sequência de comandos. A sequência de comandos nomeada é chamada de subprograma, procedimento ou função. Quando a programação imperativa é combinada com subprogramas é chamada de programação procedural. O paradigma imperativo é suportado por linguagens como Fortran (introduzido em 1954), Cobol (1959), Pascal (1970), C (1971) e Ada (1979), entre outras. Já o paradigma de programação funcional é baseado na teoria das funções matemáticas, mais precisamente no cálculo lambda. Ele permite que o programador pense sobre o problema em um nível mais alto de abstração, incentivando o pensamento sobre a natureza do problema e não sobre a natureza sequencial do mecanismo de computação subjacente. Conforme Bird e Wadler, Uma característica da programação funcional é que, se uma expressão possui um valor bem de�nido, então a ordem em que um computador pode transportar a aplicação não afeta o resultado. Em outras palavras, o signi�cado de uma expressão é o seu valor e a tarefa do computador é simplesmente obter tal expressão e valor. As expressões em uma linguagem funcional podem ser construídas manipulando e fundamentando funções, como qualquer outro tipo de expressão matemática, usando leis algébricas mais ou menos familiares. O resultado, é uma estrutura conceitual para a programação que é ao mesmo tempo simples, concisa, �exível e muito poderosa (BIRD; WADLER, 1988, p. 59, tradução nossa). As linguagens funcionais são motivadas e desenvolvidas pelas seguintes perguntas: qual é a unidade apropriada de decomposição do programa e como pode a linguagem melhorar e suportar a composição do programa a partir de componentes independentes? Uma linguagem de programação funcional geralmente possui três conjuntos principais de componentes: Objetos de dados: como uma lista ou uma matriz; Funções internas: para manipular os objetos de dados básicos; e Formas funcionais: também chamadas de funções de alta ordem, para a construção de novas funções (como composição e redução). A execução de programas funcionais é baseada em dois mecanismos fundamentais: ligação e aplicação. A ligação é usada para associar valores aos nomes. Dados e funções podem ser usados como valores. A aplicação de função é usada para calcular novos valores. A programação funcional é caracterizada pela programação com valores, funções e formas funcionais. Uma característica importante da funcionalidade dos programas é a de reduzir ou mesmo eliminar o impacto dos efeitos colaterais. Linguagens de programação funcional são chamadas de aplicativas, pois as funções são aplicadas a seus argumentos e não são processuais ou declarativas, pois as de�nições especi�cam o que é calculado e não como é calculado. O paradigma funcional é suportado por linguagens como LISP (1958), ML(1973), Scheme (1975), Miranda (1982) e Haskell (1987). praticarVamos Praticar O paradigma funcional se difere em alguns pontos do paradigma imperativo. Por exemplo: o paradigma funcional orienta que o código seja expresso por meio de funções e evita a mutação de estado. Já o paradigma imperativo expressa o código de uma forma diferente. Qual seria? Assinale a alternativa correta com relação à forma de expressão do paradigma imperativo. a) O paradigma imperativo expressa o código por meio da linguagem estruturada, sem manipular os estados. b) O paradigma imperativo é baseado e expressa o código por meio da teoria das funções matemáticas. c) O paradigma imperativo expressa o código somente com a linguagem Fortran. d) O paradigma imperativo expressa o código por meio de funções indiretas ao computador. e) O paradigma imperativo expressa o código por meio de comando diretos ao computador. O paradigma da programação lógica tem suas raízes no teorema automatizado, do qual se originou a vertente de dedução. No processo de dedução, alguns valores são computados. A criação desse paradigma de programação é o resultado de uma longa história, que, na maior parte de seu curso, decorreu dentro da lógica e, somente mais tarde, dentro da ciência da computação. O Prolog pode ser visto como uma realização prática da ideia de programas lógicos. Começou como uma linguagem de programação para aplicativos de processamento de idioma natural, mas, logo após, foi possível constatar que ele podia ser usado como uma linguagem de programação de uso geral. Originalmente, o Prolog foi implementado por Philippe Roussel, na forma de um interpretador escrito em Algol-W. Um passo importante depois foi alcançado por David H. Warren, que lançou, em 1983, uma máquina abstrata, agora chamada WAM (WarrenAbstract Machine). Consiste em uma arquitetura de máquina com um conjunto de instruções que serve como um alvo para Paradigma Lógico:Paradigma Lógico: Conceito eConceito e AplicaçõesAplicações máquinas independentes para compiladores de Prolog. O WAM tornou-se uma base padrão para implementar o Prolog e outras programações lógicas. O paradigma da programação lógica in�uenciou vários desenvolvimentos na ciência da computação. Criou a noção de bancos de dados dedutivos que estendem os bancos de dados relacionais, fornecendo recursos de dedução. Um impulso adicional ao assunto veio inesperadamente dos japoneses, com o Projeto de Quinta Geração para Sistemas de Computação Inteligentes (1982- 1991), em que o paradigma lógico de programação foi escolhido como base. Mais recentemente, esse paradigma levou à programação lógica de restrições, que realiza uma abordagem geral para computação em que o processo de programação é limitado a uma geração de restrições (requisitos), de forma a implementar uma programação lógica indutiva, que se torna uma abordagem lógica para aprendizado de máquina. O paradigma de programação lógica se difere substancialmente de outros paradigmas de programação. Ele pode ser resumido pelos três recursos a seguir: A computação ocorre sobre o domínio de todos os termos de�nidos em um alfabeto "universal". Os valores são atribuídos às variáveis por meio de substituições geradas automaticamente, denominadas uni�cadores gerais. Esses valores podem conter variáveis, chamadas variáveis lógicas. O controle é fornecido por um único mecanismo: retorno automático. A principal vantagem do paradigma de programação lógica reside em uma enorme simplicidade e concisão; sua desvantagem tem a ver com as restrições a um mecanismo de controle e o uso de um único tipo de dados. Portanto, se uma estrutura tem a necessidade de ser modi�cada e enriquecida para acomodá-la às necessidades habituais de programação, devem-se fornecer várias construções de controle e introduzir outros tipos de dados com as operações aritméticas habituais. praticarVamos Praticar O paradigma lógico de programação se difere bastante dos demais, ele possui vantagens e desvantagens de uso, bem como é caracterizado por três recursos essenciais. Com relação aos recursos e às vantagens e desvantagens do paradigma lógico de programação, assinale a alternativa correta. Figura 3.1 - Linguagens de programação agrupadas Fonte: deniskot / 123RF. a) Os três recursos essenciais do paradigma lógico são: domínio de dados tipados, uni�cadores gerais e retorno automático. A principal vantagem é a simplicidade e concisão. Sua desvantagem é o uso de um único tipo de dados. b) Os três recursos essenciais do paradigma lógico são: domínio de todos os termos de�nidos, uni�cadores únicos e retorno automático. A principal vantagem é a simplicidade e concisão. Sua desvantagem é o uso de um único tipo de dados. c) Os três recursos essenciais do paradigma lógico são: domínio de todos os termos de�nidos, uni�cadores únicos e retorno sequencial. A principal vantagem é a simplicidade e concisão. Sua desvantagem é o uso de um único tipo de dados. d) Os três recursos essenciais do paradigma lógico são: domínio de todos os termos de�nidos, uni�cadores gerais e retorno automático. A principal vantagem é a simplicidade e concisão. Sua desvantagem é o uso de um único tipo de dados. e) Os três recursos essenciais do paradigma lógico são: domínio de todos os termos de�nidos, uni�cadores gerais e retorno automático. A principal vantagem é a lógica e a concisão. Sua desvantagem é o uso de um único tipo de dados. Um programa concorrente é uma ação de�nidora que pode ser executada simultaneamente. Um programa sequencial especi�ca a execução de uma lista de declarações; sua execução é chamada de processo. O programa que se utiliza desse paradigma especi�ca dois ou mais programas sequenciais que podem ser executados simultaneamente como processo paralelo. O programa concorrente pode ser executado permitindo-se que os processos compartilhem um ou mais processadores ou executando-se cada processo em seu próprio processo. A taxa na qual os processos são executados depende de qual abordagem é utilizada. Quando cada processo é executado em seu próprio processador, cada um é executado em uma taxa �xa, mas de forma desconhecida. Quando processos compartilham um processador, é como se cada um fosse executado em um processador de velocidade variável. A abordagem axiomática tem uma notável e�ciência em uma análise de caso muito extensa. É, talvez, a técnica mais promissora para entender programas ParadigmaParadigma Concorrente:Concorrente: Conceito eConceito e AplicaçõesAplicações concorrentes. Ela possui familiaridade com a lógica formal que é necessária para o seu uso. No entanto, isso diminuiu a sua aceitação. Para resumir, há três questões principais subjacentes ao design de uma notação, para expressar um programa por meio da computação simultânea: Como indicar execução simultânea? Qual modo de comunicação entre processos usar? Qual mecanismo de sincronização será utilizado? Além disso, mecanismos de sincronização podem ser vistos como formas de restringir a ordem de eventos ou como controle de interferência. A di�culdade e ine�ciência de projetar programas concorrentes que usam a espera ocupada levou à de�nição de semáforos. Os semáforos foram então estendidos de duas maneiras: (1) De�nidos como construtores que direcionam seu uso para um modo estruturado, resultando em regiões críticas, monitores e expressões de caminho; (2) "Dados" que, quando adicionados à sincronização associada aos semáforos, resultam da passagem de mensagens primitivas. Finalmente, a interface processual dos monitores foi combinada com a passagem de mensagens, resultando em uma chamada de procedimento remoto. Os conceitos primordiais de programação sob a ótica do paradigma concorrente nasceram a cerca de dez anos atrás. Toda essa experiência prática aumentou o entendimento sobre como projetar tais programas, e o desenvolvimento de técnicas formais aumentou a compreensão dos conceitos básicos. Apesar de existir uma variedade de linguagens de programação, existem apenas três tipos essencialmente diferentes: orientada a procedimentos, orientada a mensagens e orientada a operações. Um dos principais problemas da programação concorrente é o não determinismo. Uma execução de um programa não é determinística se, em algum momento, houver uma escolha do que fazer em seguida. O não determinismo aparece naturalmente quando há simultaneidade: duas atividades simultâneas são independentes, a especi�cação do programa não pode dizer qual executa primeiro. Se houver vários encadeamentos prontos para execução, em cada estado de execução, o sistema precisará escolher qual thread executar a seguir. Essa escolha pode ser feita de diferentes maneiras. Normalmente, há uma parte do sistema, chamada scheduler, que faz a escolha. O não determinismo é muito difícil de lidar se puder ser observado somente pelo usuário do programa. O não determinismo observável, às vezes, é chamado de race condition. praticarVamos Praticar A di�culdade e ine�ciência de projetar programas concorrentes que usam a espera ocupada levou à de�nição de semáforos. Assinale a alternativa que indica uma das maneiras pela qual os semáforos foram então estendidos. a) Como construtores que direcionam seu uso para um modo estruturado, resultando em regiões críticas, monitores e expressões de caminho. b) Como funções que direcionam seu uso para um modo estruturado, resultando em regiões críticas, monitores e expressões de caminho. c) "Dados" que, quando adicionados à sincronização associada aos semáforos, resultam da passagem de noti�cações primitivas. d) Como funções que direcionam seu uso para um modo paralelo, resultando em regiões críticas, monitores e expressões de caminho. e) Como funções que direcionam seu uso para um modo paralelo, resultandoem regiões críticas, dados e expressões de caminho. O paradigma concorrente refere-se a um aplicativo que está executando em mais de uma tarefa ao mesmo tempo. A simultaneidade é uma abordagem usada para diminuir o tempo de resposta do sistema, utilizando uma única unidade de processamento. A simultaneidade é a ilusão de paralelismo. No entanto, na verdade, os blocos de uma tarefa não são processados paralelamente. Dentro do aplicativo, há mais de uma tarefa sendo processada por vez. Ele não encerra completamente uma tarefa antes de começar outra. A simultaneidade é obtida por meio da operação de intercalação de processos na unidade central de processamento (CPU) ou, em outras palavras, pela alternância de contexto. Essa lógica é como o processamento paralelo: aumenta a quantidade de trabalho concluído de cada vez. EstudoEstudo Comparativo:Comparativo: ParadigmaParadigma Concorrente xConcorrente x Paradigma ParaleloParadigma Paralelo Um conceito-chave para o estudo do paradigma concorrente e paralelo é a independência: construir um programa com partes independentes. Isso é algo complexo. Por exemplo: considere um programa que consiste em instruções que são executadas uma após a outra. As instruções não são independentes, pois são ordenadas por tempo. Para implementar a independência, precisamos de um novo conceito de programação chamado simultaneidade. Quando duas partes não interagem, dizemos que são simultâneas (quando a ordem de execução de duas partes é dada, dizemos que são sequenciais). Partes simultâneas podem ser estendidas para ter uma interação bem de�nida. A concorrência não deve ser confundida com o paralelismo. A concorrência é um conceito de linguagem de programação, e paralelismo é um conceito de hardware. Duas partes são paralelas se executarem simultaneamente em saibamaisSaiba mais O vídeo detalhando o conceito de computação paralela traz alguns exemplos de como são criados os clusters de computadores para a realização do processamento e múltiplos computadores, de modo a aumentar a velocidade de resposta. Para saber mais, assista ao vídeo a seguir. ACESSAR https://youtu.be/wf0NCVrHFCk vários processadores. Concorrência e paralelismo são ortogonais: é possível executar programas simultâneos em um único processador (usando agendamento preventivo e intervalos de tempo) e para executar programas sequenciais em vários processadores (paralelizando os cálculos). O mundo real é simultâneo: consiste em atividades que evoluem de forma independente. O mundo da computação também é concorrente e possui três níveis de simultaneidade: O de computadores conectados por meio de uma rede. Essa é a estrutura básica da Internet. O sistema operacional, em que o software que gerencia um computador. Uma atividade simultânea é chamada de processo. Os processos têm memórias independentes. O sistema operacional lida com a tarefa de mapear a execução dos processos e a alocação de memória para o computador. Por exemplo: cada aplicativo em execução normalmente é executado em um processo. Atividades dentro de um processo, em que uma atividade simultânea é chamada de encadeamento. São executados de forma independente, mas compartilham o mesmo espaço de memória. Por exemplo: as diferentes janelas em um navegador da Web geralmente são executadas em threads separadas. A diferença fundamental entre processos e threads é como a alocação de recursos é feita. A simultaneidade no nível do processo, às vezes, é chamada de simultaneidade competitiva: cada processo tenta adquirir todos os recursos do sistema para si. A simultaneidade no nível do encadeamento, às vezes, é chamada de simultaneidade cooperativa: threads em um processo compartilham recursos e colaboram para alcançar o resultado do processo. Os threads são executados no mesmo aplicativo e, portanto, são guiados pelo mesmo programa. Quadro 3.1 - Diferenças entre paradigma concorrente e paradigma paralelo Fonte: Elaborado pelo autor. Concorrente Paralelo Concorrente é a tarefa de executar e gerenciar os vários cálculos ao mesmo tempo. Paralelismo é a tarefa de executar vários cálculos simultaneamente. O concorrente é obtido por meio da operação de intercalação de processos na unidade central de processamento (CPU) ou, em outras palavras, pela alternância de contexto. Alcançado por meio de várias unidades de processamento central (CPUs). A concorrência pode ser feita usando uma única unidade de processamento. Necessita de várias unidades de processamento. A concorrência aumenta a quantidade de trabalho concluído por vez. Melhora a taxa de transferência e a velocidade computacional do sistema. A concorrência lida com muitas coisas simultaneamente. Executa muitas coisas simultaneamente. A concorrência é a abordagem não determinística do �uxo de controle. É uma abordagem determinística do �uxo de controle. Na concorrência, a depuração é muito difícil. A depuração também é difícil, mas é mais simples do que na simultaneidade. O paradigma de programação paralelo está relacionado a um aplicativo no qual as tarefas são divididas em subtarefas menores, que são processadas simultaneamente ou paralelamente. É usado para aumentar a taxa de transferência e a velocidade computacional do sistema usando os múltiplos processadores. É a técnica que faz muitas coisas simultaneamente. O paralelismo leva à sobreposição da unidade central de processamento e das tarefas de entrada e saída em um processo com a unidade central de processamento e as tarefas de entrada e saída de outro processo. Já no paradigma concorrente, a velocidade é aumentada pela sobreposição das atividades de entrada e saída de um processo com o processo da CPU de outro processo. praticarVamos Praticar Um dos recursos do paradigma de programação paralela é a Interface de transmissão de mensagens, mais conhecida como MPI - Memory passing interface, que possui atualmente cerca de 125 funções para a programação. A MPI está implementada nas seguintes linguagens: C, C++ e Fortran. Utilizando as diretivas básicas da MPI, crie dois comandos: um que inicializa um processo MPI e estabelece o ambiente necessário para sua execução, de forma a sincronizar os processos para o início da aplicação paralela; e outro que �naliza um processo MPI, sincronizando os processos para o término da aplicação paralela. Vamos praticar? indicações Material Complementar FILME O jogo da imitação Ano: 2014 Comentário: o �lme explora o papel que os criptologistas e matemáticos desempenharam na Segunda Guerra Mundial. Liderando a equipe de cientistas que tentam quebrar as mensagens criptografadas pelo exército nazista está Alan Turing, considerado o pai da computação. Ele desenvolve uma máquina a �m de acelerar o processo de decodi�cação das mensagens. Esse processo de decodi�cação é considerado o primeiro ato de uso dos paradigmas computacionais. Para conhecer mais sobre o �lme, acesse o trailer disponível no link a seguir. TRA ILER LIVRO Programando para processadores paralelos Editora: Elsevier Autores: David Kirk e Wen-Mei Hwu ISBN: 8535241884 Comentário: esse livro aborda os conceitos sobre a programação para processadores paralelos e complementa com estratégias para criar arquiteturas de programação para sistemas que utilizam as GPUs. A obra proverá insumos para quem deseja trabalhar com os recursos dos de processadores multicore. conclusão Conclusão Como vimos, o paralelismo apresenta novos desa�os ao escrever um código correto e e�ciente. Como a tendência de aumentar o paralelismo no nível do hardware continuará no futuro próximo, o cálculo paralelo se tornará cada vez mais importante na programação de aplicativos. Existem sistemas que exploram uma única forma de paralelismo e concorrência, e sua e�ciência está atingindo um nível satisfatório, embora ainda haja espaço considerável para melhorias. Os sistemas que lidam com formas mais gerais de paralelismo ainda estão na fase de testes. Existemrespostas para os principais problemas que precisam ser enfrentados nesses dois paradigmas, mas ainda não foram encontradas maneiras de projetá-los em uma implementação real de uso. Existe um corpo muito ativo de pesquisas sobre como tornar o paralelismo mais fácil e menos propenso a erros para os programadores. referências Referências Bibliográ�cas BIRD, R.; WADLER, P. Introduction to functional programming. New York: Prentice Hall, 1988. 310 p. GURBANI, K. et al. Imperative programming. Mumbai: Himalaya Publishing House, 2017.
Compartilhar