Estúdio      23/11/2023

Paradigma de programação estrutural. Paradigmas de programação "esquecidos". Linguagens que apoiam este paradigma

COMPUTAÇÃO RECURSIVA EM DIVERSOS PARADIGMAS DE PROGRAMAÇÃO.

G. V. Vanykina, A.V. Yakushin

Universidade Pedagógica do Estado de Tula em homenagem. L. N. Tolstoi

[e-mail protegido]

1. Paradigmas da programação moderna.

Historicamente, as primeiras técnicas tecnológicas na área de programação incluem a decomposição da estrutura geral do problema a ser resolvido em tais componentes, que neste contexto são elementares. Posteriormente, foram desenvolvidas uma base teórica séria e uma série de técnicas tecnológicas recomendadas para esta abordagem, que juntas constituem a programação moderna. Dependendo da escolha do “elemento base”, é possível obter diversos conjuntos de técnicas metodológicas, regras, relacionamentos, dependências, etc. para resolver um determinado problema, que juntos formam um paradigma de programação.

Deve-se notar que a palavra “paradigma” entrou na programação a partir do influente livro “A Estrutura das Revoluções Científicas”, escrito pelo historiador da ciência Thomas Kuhn em 1970. Kuhn usou o termo para descrever um conjunto de teorias, padrões e métodos que, juntos, constituem uma forma de organizar o conhecimento científico – em outras palavras, uma forma de ver o mundo. O ponto principal de Kuhn é que as revoluções na ciência ocorrem quando um antigo paradigma é revisto, rejeitado e substituído por um novo.

Num sentido semelhante, como modelo ou exemplo, e geralmente como abordagem organizadora, a palavra é usada na palestra “Paradigmas de Programação” de Robert Floyd, vencedor do Prêmio Turing de 1979.

O paradigma de programação é um conceito fundamental de alto nível na teoria da programação e, portanto, não pode ser estritamente definido. Por paradigma em programação entendemos um conjunto internamente consistente de elementos de programa que possuem características fundamentais comuns, tanto lógicas quanto algorítmicas, e os conceitos básicos associados a esses elementos. Da mesma forma, pode-se dizer que um paradigma em programação é uma forma de conceituar como realizar cálculos e como o trabalho realizado por um computador deve ser estruturado e organizado.

Os paradigmas de programação ocupam um lugar importante na tecnologia de desenvolvimento de software. É em torno deles que os conceitos metodológicos começam a ser construídos e desenvolvidos. Este papel é determinado pelo fato de que novas ideias emergentes para a criação de programas são inicialmente implementadas em ferramentas simples que apoiam a pesquisa e a verificação experimental do estilo proposto, que na maioria das vezes são linguagens de programação. Após a generalização da experiência inicial, chega-se à compreensão das vantagens e desvantagens, o que nos permite passar à formação de metodologias que garantam a utilização do paradigma no desenvolvimento de grandes sistemas de software. Se o paradigma desenvolvido não for capaz de servir de base a uma metodologia industrial, é rejeitado ou aplicado em escala limitada. Podemos dizer que o paradigma de programação é implementado através de metodologias de programação, que se concretizam num conjunto de acordos e acordos sobre ferramentas linguísticas básicas e suas combinações aceitáveis ​​​​e não aceitáveis ​​​​para um determinado paradigma.

Dependendo do método de decomposição, podem ser distinguidos os seguintes paradigmas de programação principais, apresentados na Tabela 1.

Tabela 1. Paradigmas básicos de programação

Nome do paradigma

Método de decomposição

Exemplos de linguagens de programação

Imperativo

(sinônimos: diretivo, processual)

Subrotinas, tipos de dados abstratos

Fortran, C, Pascal, Básico

Declarativo

(componentes: lógicos e funcionais)

Metas expressas em termos de cálculo de predicados. Regras "se-então"

Lisp, Esquema, Prolog, ML, Haskell

Orientado a Objeto

Classes e objetos

Java, C++, Ruby

Programação com restrições

Relações invariantes, sistema de restrições

idiomas CLP(X), SETL, Prolog III

Cenário

Cenário de processamento ou controle elementar

Perl, PHP, Python, ASP

Deve-se notar que seguir um determinado paradigma influencia significativamente a abordagem tecnológica para a resolução de problemas e o uso de vários tipos de estruturas heurísticas características na prática de programação. Em geral, podemos dizer que a escolha e utilização de um paradigma por muito tempo deixa uma certa marca no pensamento de um programador (principalmente um iniciante) e pode ser muito difícil quebrar o círculo vicioso de “clichês” estabelecidos quando é necessário resolver problemas fora do padrão. Para um utilizador de qualquer nível, uma vez feita, a escolha de um determinado paradigma determina essencialmente tanto a sua atitude perante as tecnologias informáticas como a eficácia da sua utilização.

Atualmente, o conhecimento profissional da tecnologia informática e um elevado nível de cultura da informação são impossíveis sem uma compreensão clara não só dos princípios de funcionamento do computador, mas, ainda em maior medida, das suas capacidades potenciais. Esta tendência não pode deixar de influenciar a estrutura do estudo da informática tanto na universidade como, sobretudo, na escola, uma vez que é a educação escolar que estabelece as bases fundamentais que determinam e apoiam o desenvolvimento futuro de um futuro especialista.

O problema do desenvolvimento da cultura algorítmica dos alunos como componente fundamental da cultura da informação é resolvido do ponto de vista de vários paradigmas de programação dependendo de uma série de fatores: o currículo para o ensino dos cursos de informática, hardware e software, bem como o qualidades pessoais e profissionais do professor. A secção “Programação” no âmbito do nível de ensino geral dos alunos envolve o estudo dos fundamentos do imperativo ( Básico, Pascal, C , linguagem algorítmica escolar) ou orientada a objetos ( Delphi, C++, Java ) paradigmas. A formação especializada dos alunos do ensino secundário em ciências naturais é, em regra, também implementada no quadro dos paradigmas anteriores. Ressalta-se, porém, que ensinar programação em uma linguagem específica não é a tarefa principal na implementação do treinamento algorítmico para escolares. Uma prioridade muito maior é o treinamento na abordagem algorítmica para a resolução de problemas, a capacidade de avaliar a eficácia de um algoritmo desenvolvido do ponto de vista do problema a ser resolvido e a escolha da tecnologia para sua implementação - ou seja, estamos falando sobre a familiarização com métodos de desenvolvimento de modelos algorítmicos, cuja implementação é possível no âmbito de qualquer paradigma.

O desenvolvimento de vários paradigmas de programação ocorreu paralelamente entre si. Durante muito tempo, a abordagem imperativa foi dominante; nas décadas de 70 e 80, a ênfase mudou para o estudo de paradigmas não clássicos; a década de 90 foi marcada pelo rápido desenvolvimento do paradigma orientado a objetos e pela introdução de seus elementos em outros. O desenvolvimento de linguagens de programação do ponto de vista de diversos paradigmas é apresentado na Fig.

Fortran

Algol,C

Pascal

Módulo

Oberon

Diretiva

Básico

LISP

ML, Esquema

Haskell

Declarativo

Prólogo

CProlog

VB, C++, Objeto Pascal

Java, C#

Orientado a Objeto

Conversa fiada

Rubi

SETL

Programação com restrições

Prólogo III

PCL (X)

Perl

Pitão

Cenário

PHP, ASP

Figura 1. Desenvolvimento de linguagens de programação e paradigmas

Para estudar um método alternativo de programação, podemos propor a tecnologia de utilização de símbolos recursivosproblemas ao estudar ciência da computação, uma vez que a recursão, sendo um conceito matemático fundamental, é implementada de forma muito semelhante no contexto de diferentes paradigmas de programação. As construções recursivas, em geral, não são naturais para a maioria das linguagens de programação e sua implementação requer um certo nível de abstração da metodologia escolhida para criação de programas. Ao mesmo tempo, deve-se atentar para a possível ineficiência e complexidade significativa dos algoritmos recursivos em alguns casos, por isso é aconselhável desenvolver algoritmos recursivos com posterior avaliação de sua complexidade.

Vamos rastrear as capacidades conceituais de vários paradigmas usados ​​para implementar a recursão.

2. Paradigma imperativo.

Programação imperativa – uma das abordagens mais naturais para escrever programas para a difundida arquitetura de von Neumann. O programa, neste caso, consiste em operadores de atribuição e cláusulas que controlam a sequência de sua execução. A programação diretiva é baseada em um modelo autômato de computador que separa as abstrações de estado e comportamento. Neste caso, o programa é considerado como um processo de mudança de estado através da execução de comandos individuais. A imperatividade aqui é entendida como uma indicação para a calculadora de que Como resolver um problema. A recursão em linguagens diretivas é implementada através da criação de um tipo especial de sub-rotinas que permitem fazer chamadas recursivas e utilizar uma tecnologia especial para traduzir programas recursivos em códigos de máquina. Nas linguagens diretivas existe a possibilidade de uma alternativa entre iteração e recursão, mas é a utilização desta última que permite construir algoritmos não apenas eficientes, mas também fáceis de ler.

3.1. Programação lógica apareceu como resultado de pesquisas de um grupo de cientistas franceses liderados por Colmerier no campo da análise da linguagem natural. Posteriormente, descobriu-se que a programação lógica é igualmente eficaz na implementação de outras tarefas de inteligência artificial, para as quais é atualmente utilizada principalmente. A programação lógica também se mostra conveniente para implementar outras tarefas complexas.

A programação lógica é baseada na lógica de predicados. A lógica de predicados é um ramo da lógica formal que se desenvolveu no século XX. Na programação lógica, o foco está na descrição da estrutura de um problema de aplicação, em vez de instruir o computador sobre o que ele deve fazer. Na programação lógica, um programa representa alguma teoria (descrita em uma linguagem bastante limitada) e uma afirmação que precisa ser provada. A prova desta afirmação consistirá na execução do programa.

O trabalho de um programa em linguagem lógica é realizado através da busca de provas da afirmação proposta na base de conhecimento existente, que é um conjunto de determinados fatos e regras. A recursão nas linguagens deste paradigma é implementada tanto no processo de busca de evidências quanto para especificar o mecanismo para tal busca. Estabelecer o valor verdadeiro de uma afirmação é de natureza recursiva e, portanto, a recursão é implementada aqui de uma forma bastante natural.

3.2. Programação funcional baseia-se na teoria das funções recursivas e no cálculo lambda de Church. A ênfase está na dependência entre as funções dos dados. Um programa de função consiste em uma coleção de definições de função, que por sua vez representam chamadas para outras funções e instruções que controlam a sequência de chamadas. Nas linguagens funcionais, a recursão é implementada naturalmente, pois é a base fundamental para a construção da semântica da linguagem. Em geral, um programa funcional não contém um operador de atribuição; o cálculo de qualquer função não leva a quaisquer efeitos colaterais além do cálculo real do seu valor. A ramificação dos cálculos é baseada no mecanismo de processamento dos argumentos de uma sentença condicional, e os cálculos cíclicos são implementados por meio de recursão.

4. Paradigma orientado a objetos.

Programação orientada a objetos (OOP) é ​​uma evolução natural das metodologias de programação anteriores. O resultado da decomposição de objetos é um conjunto de objetos, que são então implementados como variáveis ​​​​de alguns tipos (classes) especialmente desenvolvidos, que são um conjunto de campos de dados e métodos que funcionam com esses campos. Pode-se dizer que POO –é a modelagem de objetos por meio de classes relacionadas hierarquicamente. Ao mesmo tempo, detalhes insignificantes do objeto ficam ocultos de nós e, se dermos um comando a algum objeto, ele “sabe” como executá-lo. Um conceito fundamental em OOP é o conceito de responsabilidade ou responsabilidade para realizar uma ação.

Todos os objetos são representantes, ou cópias, Aulas. O método que um objeto invoca em resposta a uma mensagem é determinado pela classe à qual pertence o destinatário da mensagem. Todos os objetos da mesma classe usam os mesmos métodos em resposta às mesmas mensagens. As classes são representadas como uma estrutura hierárquica em árvore, na qual as classes com características mais gerais estão localizadas na raiz da árvore, e as classes especializadas e, em última análise, os indivíduos estão localizados nos ramos. Já a própria decomposição de objetos contém elementos de construções recursivas, uma vez que a hierarquia dos objetos assim obtida possui elementos de autossemelhança. Como você sabe, a programação orientada a objetos é baseada em três conceitos principais: encapsulamento (ocultar dados em uma classe ou método); herança; polimorfismo. Encapsulamento pode ser pensado como uma camada protetora em torno do código dos dados com os quais esse código opera. O shell define o comportamento e protege o código contra acesso arbitrário externo. Herança -é o processo pelo qual um tipo herda as propriedades de outro tipo. Polimorfismoé um conceito que permite ter diferentes implementações para o mesmo método, que serão escolhidas dependendo do tipo de objeto passado ao método quando chamado.

O paradigma orientado a objetos ocupa uma posição especial entre todos os existentes, uma vez que a maioria das linguagens modernas de vários estilos são orientadas a objetos, mas em geral, a implementação da linguagem orientada a objetos difere significativamente da padrão.

A recursão neste paradigma é implementada tanto no processo de decomposição de objetos quanto de forma direta. Em geral, o desenvolvimento de programas orientados a objetos é várias ordens de grandeza mais difícil do que os tradicionais, mas construir uma hierarquia recursiva de objetos não é apenas bastante viável, mas também uma tarefa vital para os alunos.

5. Programação com restrições.

A programação com restrições é uma direção relativamente nova na programação declarativa. Surgiu na década de 80 do século XX como resultado do desenvolvimento de sistemas de computação simbólica, inteligência artificial e pesquisa operacional. A ideia básica da programação com restrições é definir um conjunto de variáveis ​​e definir as restrições que elas devem satisfazer, e o sistema encontra os valores apropriados.

A programação com restrições está intimamente relacionada à programação lógica tradicional. A maioria dos sistemas de programação restritos são intérpretes de linguagem Prólogo com um mecanismo integrado para resolver uma certa classe de problemas de satisfação de restrições. A programação em tais sistemas é chamada de Programação Lógica de Restrições (CLP), e a maioria das linguagens ou bibliotecas são chamadas de CLP(X), onde X indica a classe de problemas que estão sendo resolvidos.

Por exemplo, CLP(B) significa a capacidade de resolver equações com variáveis ​​booleanas. CLP(Q) são equações em números racionais e CLP(R) estão em números reais. Os solucionadores mais populares para problemas em conjuntos finitos de inteiros são CLP(FD).

A declaração do problema é um conjunto finito de variáveis X = ( x 1 , ..., x n ), conjuntos finitos (enumeráveis) correspondentes de valores D X = ( dx 1 , ..., dx n ) e um conjunto de restrições C = ( c 1 ,..., cm ). Um sistema de restrições pode incluir equações, desigualdades, funções lógicas, bem como quaisquer construções formais admissíveis conectando variáveis ​​do conjunto X . A solução para o problema é construir um conjunto de variáveis ​​que satisfaça todas as restrições c eu , onde eu = 1,.., m.

Semanticamente, a programação com restrições difere da programação lógica tradicional principalmente porque a execução do programa é considerada não como uma prova de uma afirmação, mas como uma descoberta dos valores das variáveis. Neste caso, a ordem interna da solução para a execução das restrições individuais não importa, e o sistema de programação de restrições, via de regra, busca otimizar a ordem de prova das afirmações de forma a minimizar o rollback em caso de falha. Assim, ocorre o uso de um esquema de recursão regressiva. As construções recursivas são geralmente implementadas da mesma maneira que na programação lógica.

6. Paradigma de cenário.

Linguagens de script. As linguagens de script fizeram grandes avanços nos últimos anos. Há dez anos foi-lhes atribuído o papel de meios auxiliares, mas agora o cepticismo em relação a eles foi substituído pelo interesse e reconhecimento.

As linguagens de script têm uma longa história de desenvolvimento. O conceito de programação com script surgiu como um desenvolvimento natural da linguagem LISP . As primeiras linguagens de script incluem controles de shell de comando integrados para o sistema operacional. Um arquivo em lote na linguagem do sistema operacional é um script de controle que executa uma determinada sequência de ações. Podemos dizer que o script “une” as diversas partes do sistema operacional e interage com elas.

Atualmente, a popularidade das linguagens de script está associada ao desenvolvimento Internet -tecnologia. Linguagens de script são usadas para criar conteúdo dinâmico e interativo rede -páginas cujo conteúdo é modificado dependendo das ações do usuário e do estado de outras páginas e dados.

Uma característica distintiva das linguagens de script é a formação de um programa em alguma linguagem externa como resultado da execução do script. Uma linguagem de script depende, em pequena medida, da criação do produto final do zero e, em maior medida, do uso dos recursos do sistema operacional, ambiente gráfico, mecanismo de serviço de aplicativo e outros componentes semelhantes, cuja interação é realizada usando roteiros.

O paradigma do cenário envolve dividir uma tarefa em partes separadas, cada uma das quais é resolvida por software especializado; o cenário atua como um “despachante” responsável por organizar sua interação.

Linguagens de script para rede -os desenvolvimentos foram criados principalmente na década de 90 XX século e incluem elementos de vários paradigmas de programação, desde imperativo até orientado a objetos. Entre os sistemas de script mais poderosos e populares estão os seguintes: Perl, Python, PHP, ASP . A sintaxe e a semântica de várias linguagens de script são bastante semelhantes. Isso se deve à influência significativa das linguagens C e C++ na comunidade de programação. O suporte à recursão em linguagens de script é implementado de forma semelhante aos paradigmas imperativos e orientados a objetos.

A literatura metodológica e técnica moderna muitas vezes fornece exemplos de implementação de programas recursivos em vários paradigmas de programação. A grande atenção dada à recursão é uma confirmação de que a metodologia recursiva permite focar na própria lógica de resolução de um problema, e não nos detalhes de sua implementação. Assim, podemos concluir que a recursão não é apenas um dos métodos alternativos de programação, mas também um certo estilo de pensamento algorítmico abstrato.

Hoje vamos entender o que são paradigmas de programação e as características distintivas de cada um deles.

A definição de paradigma geralmente soa assim:

Paradigmas são um conjunto de princípios de ideias e conceitos que determinam o estilo de escrever um programa de computador.

Deve-se notar também que existem paradigmas não apenas na programação, mas também na filosofia, etc.

Com base na definição, podemos dizer que um paradigma de programação é um conjunto específico de princípios para escrever software de computador.

Tipos de paradigmas de programação

Acontece que muitos programadores propuseram seus princípios, formas de escrever um programa e, como resultado, surgiu um grande número de paradigmas.

Listamos os mais populares deles:

  • Programação imperativa
  • Programação estruturada
  • Programação declarativa
  • Programação orientada a objetos

Na verdade, existem muitos outros paradigmas que não listamos na lista; cobrimos apenas os mais famosos deles.

Vejamos brevemente cada um deles

Programação imperativa

O primeiro paradigma que se formou imediatamente após o advento dos computadores.

do inglês imperativo- ordem

Características distintivas da programação imperativa:

No código-fonte são escritas “ordens” de comandos e não classes, como é o caso, por exemplo, da programação orientada a objetos.

Todas as instruções devem ser executadas sequencialmente, uma após a outra (por exemplo, não podemos pular de uma seção de código para outra)

Após a execução das instruções, os dados podem ser gravados na memória e lidos da memória.

Linguagens representativas do paradigma: códigos de máquina (binários), Assembly, fortran, algol, cobol

Programação estruturada

Este método foi proposto por um cientista holandês

Edsger Dijkstra 1930 - 2002

Mas o conceito principal da programação estruturada é o conceito blocos e estrutura hierárquica e que utiliza três estruturas de controle principais:

  • subsequência
  • ramificação

A programação estruturada também possui 7 princípios descritos por Dijkstra:

  1. recusa total de uso do operador goto; *
  2. qualquer programa é construído sobre três estruturas de controle: sequência, ciclo e ramificação;
  3. estruturas de controle básicas podem ser aninhadas umas nas outras conforme desejado;
  4. Os componentes repetidos devem ser concebidos como sub-rotinas;
  5. Cada estrutura lógica deve ser formatada como bloquear;
  6. todas as estruturas devem ter uma entrada e uma saída, e nada mais;
  7. o desenvolvimento do programa deve prosseguir passo a passo usando um método de “escada” (método de cima para baixo)

* —
goto é um operador de salto incondicional que foi amplamente utilizado na década de 1970

Programação declarativa

representa uma especificação para resolver um problema e descreve qual é o problema e o resultado esperado do trabalho.

É contrastado com a programação imperativa porque a programação declarativa descreve O que fazer, e em outro Como fazer.

Programação orientada a objetos (OOP)

é o paradigma mais popular e comumente usado, aceito em todo o mundo por quase todos os programadores. Toda a programação industrial é baseada nisso. A ideia principal é representar um programa como objetos, que por sua vez representam uma instância de uma classe, e as classes, por sua vez, formam uma hierarquia de herança.

Conceitos básicos de OOP

Abstração de dados— destacar informações significativas e separá-las de informações insignificantes.

Encapsulamento- esta é uma propriedade que permite combinar dados e métodos em uma classe

Herança— uma propriedade que permite criar uma nova classe baseada em uma antiga (herdar todas as suas propriedades)

Polimorfismo- e esta propriedade permite usar objetos com a mesma interface

(BÁSICOS DE ALGORITMIZAÇÃO E PROGRAMAÇÃO)
  • Paradigmas e tecnologias de programação
    Objetivos do Capítulo 1. Estudar os conceitos de “paradigma de programação”, “tecnologia de programação”. 2. Obter uma compreensão geral das modernas tecnologias de desenvolvimento de software. 3. Estude as etapas de criação de um programa estrutural. 4. Familiarize-se com os modelos de ciclo de vida de desenvolvimento de software...
  • Paradigmas de programação SE
    SWEBOK inclui uma série de paradigmas de programação. Veja: Lavrishcheva E. M. Assembly-type programming paradigmas in softwareengineering // UKRProg-2014. Nº 2-3. págs. 121-133. . Seus bootcamps de programação incluem o seguinte: programação processual(curso CS1011 “Fundamentos de programação”),...
    (ENGENHARIA DE SOFTWARE E TECNOLOGIAS PARA PROGRAMAÇÃO DE SISTEMAS COMPLEXOS)
  • PARADIGMAS DE PROGRAMAÇÃO
    PROGRAMAÇÃO MODULAR. CONCEITOS BÁSICOS Um dos principais problemas da programação moderna é a reutilização de módulos e componentes (KPI). Podem ser programas, sub-rotinas, algoritmos, especificações, etc., adequados para uso no desenvolvimento de software novo e mais complexo....
    (ENGENHARIA DE SOFTWARE. PARADIGMAS, TECNOLOGIAS E FERRAMENTAS DE CASO)
  • Paradigma processual
    O paradigma processual foi cronologicamente primeiro e prevaleceu por muito tempo. Atualmente, está gradativamente dando lugar ao paradigma orientado a objetos, embora ainda ocupe cerca de metade do mercado de desenvolvimento de software. É aplicado em todos os níveis de desenvolvimento de software...
    (ALGORITMIZAÇÃO E PROGRAMAÇÃO)
  • Memória declarativa e processual
    Outra forma independente de organização funcional da memória, independente de outras, é a sua divisão em declarativo E processual. Esses dois métodos de organização da memória têm uma base funcional completamente compreensível. Uma forma de memória declarativa é projetada para apoiar...
    (Psicologia e pedagogia)
  • Um paradigma de programação é um conjunto de ideias e conceitos que determinam o estilo de escrever programas.

    O paradigma imperativo descreve o processo de computação na forma de instruções que alteram o estado do programa. Um programa imperativo é muito semelhante às ordens imperativas das linguagens naturais, ou seja, é uma sequência de comandos que o computador deve executar. Baseado no modelo de autômato finito de Turing-Post.

    As primeiras linguagens imperativas foram os códigos de máquina - a linguagem de programação nativa do computador. Nessas linguagens, as instruções eram extremamente simples, o que reduzia a carga dos computadores, mas dificultava a escrita de programas grandes. Em 1954, apareceu a primeira linguagem de programação “humana” - FORTRAN, depois ALGOL, COBOL, BASIC, Pascal, C.

    Uma das características da programação imperativa é a presença de variáveis ​​com a operação de “atribuição destrutiva”. Ou seja, havia uma variável A, ela tinha um valor X. O algoritmo instrui a atribuir o valor Y à variável A na próxima etapa. O valor que A tinha será “esquecido para sempre”.

    A programação imperativa é mais adequada para implementar pequenas subtarefas, onde a velocidade de execução em computadores modernos é muito importante. Além disso, o trabalho com dispositivos externos é geralmente descrito em termos de execução sequencial de operações (“abrir a torneira, tirar água”), o que torna tais tarefas candidatas ideais para implementação imperativa.

    A escolha do enquadramento do paradigma imperativo para o ensino dos fundamentos da programação parece ser indiscutível. Há várias razões para isso:

    · o paradigma imperativo está mais próximo da natureza humana e do conceito intuitivo de algoritmo nas fases iniciais do desenvolvimento do pensamento (há uma experiência positiva de educação desenvolvimentista com elementos de algoritmização já no ensino fundamental);

    · a programação no quadro do paradigma imperativo é eficaz para uma ampla classe de tarefas, muitas das quais se enquadram na zona de desenvolvimento proximal dos alunos dos anos finais do ensino básico;

    · o paradigma imperativo está mais próximo da natureza do computador, dos princípios básicos do seu funcionamento, pois, apesar de toda a complexidade de um computador moderno, ao nível do hardware ainda pode ser considerado uma espécie de autómato (processador + memória + ...) com um conjunto finito de estados (conteúdos) de memória);

    · a percentagem de produtos de software criados exclusivamente no âmbito do paradigma de programação declarativa é pequena; Via de regra, na resolução de problemas, utiliza-se uma combinação de paradigmas, um dos quais é imperativo;

    · uma grande seleção de sistemas de programação na forma de software independente e na forma de subsistemas integrados a outros sistemas, permitindo o desenvolvimento de produtos de software utilizando o paradigma imperativo;


    · uma extensa gama de publicações educacionais, de referência e outras sobre sistemas de programação relevantes em papel e em formato eletrônico em vários meios de comunicação e na rede global.

    Desvantagem: na sua forma pura permite resolver apenas problemas muito simples.

    A programação orientada a eventos é uma programação na qual as reações do programa a vários eventos (ações do usuário) são especificadas. O PMS pode ser considerado um “descendente” do paradigma imperativo. SUP tem 2 subclasses:

    1.A programação paralela representa um programa como um conjunto de processos de comunicação que podem ser executados em paralelo. Tais programas podem ser executados em um processador (alternando a execução das etapas de cada processo) ou em vários.

    Em um sistema de processos paralelos, cada processo individual processa eventos. Os eventos podem ser gerais para todo o sistema ou individuais para um ou vários processos. Nesses termos, é bastante conveniente descrever, por exemplo, elementos de uma interface gráfica de usuário ou a modelagem de quaisquer processos reais (por exemplo, controle de tráfego) - uma vez que o conceito de evento é natural para tais tarefas.

    2. A programação orientada a objetos é uma tecnologia de programação na qual um programa é visto como um conjunto de objetos e suas interações. Todo objeto de programa é uma instância de alguma classe; - as classes podem herdar os atributos e métodos de suas classes pai, enquanto adicionam os seus próprios. A hierarquia de classes permite modelar a essência do problema que está sendo resolvido em vários níveis de detalhe e depois usar uma classe que corresponda ao nível de detalhe necessário para resolver uma subtarefa específica.

    É importante destacar as seguintes propriedades básicas dos objetos:

    1.) Como um objeto pode influenciar outro apenas enviando mensagens a este último, ele não pode de forma alguma trabalhar diretamente com os próprios dados do “interlocutor” e, portanto, não pode violar sua consistência interna. Esta propriedade (ocultação de dados) é comumente chamada de encapsulamento.

    2.) Como os objetos interagem apenas por meio da troca de mensagens, os objetos interlocutores podem não saber nada sobre a implementação dos manipuladores de mensagens em sua contraparte. A interação ocorre apenas em termos de mensagens/eventos, que são bastante fáceis de vincular ao domínio. Esta propriedade (uma descrição da interação apenas em termos de domínio) é chamada de abstração.

    3.) Os objetos interagem exclusivamente enviando mensagens entre si. Portanto, se em algum cenário de interação de objetos você substituir um objeto arbitrário por outro capaz de processar as mesmas mensagens, o cenário também será implementável. Esta propriedade (a capacidade de substituir um objeto por outro objeto com uma estrutura de classe semelhante) é chamada de polimorfismo.

    Muitas linguagens modernas suportam POO, embora em graus variados: Linguagens puramente orientadas a objetos, como Smalltalk e Ruby, são projetadas para suportar e até mesmo impor um estilo de desenvolvimento orientado a objetos, e não suportam outros estilos de programação; - linguagens predominantemente orientadas a objetos, como Java, C++ e Python, são projetadas principalmente para suportar OOP, mas permitem o uso de elementos de programação processual; - Historicamente, as linguagens procedurais, por exemplo, Perl e Fortran 2002, foram refinadas e foi adicionado suporte para alguns elementos OOP.

    O paradigma de programação declarativa define o processo de computação descrevendo a lógica da computação em si, ao invés da lógica de controle do programa.

    A programação declarativa é o oposto da programação imperativa; a primeira descreve o que precisa ser feito e a segunda descreve exatamente como fazer.

    Os tipos mais importantes de programação declarativa são a programação funcional e lógica (ou relacional).

    1. A programação funcional é uma das alternativas à abordagem imperativa. É baseado no cálculo lambda de Church. Na programação imperativa, algoritmos são descrições de operações executadas sequencialmente. Existe o conceito de uma “etapa de execução atual” (ou seja, tempo) e um “estado atual” que muda ao longo desse tempo.

    Não existe conceito de tempo na programação funcional. Programas são expressões; a execução do programa consiste em avaliar essas expressões.

    Como a ordem em que as subexpressões são avaliadas não importa, a programação funcional pode ser implementada naturalmente em plataformas que suportam paralelismo.

    A programação funcional, como outros modelos de programação "não imperativos", é geralmente usada para resolver problemas difíceis de formular em termos de operações sequenciais. Quase todas as tarefas relacionadas à inteligência artificial se enquadram nesta categoria. Dentre elas, vale destacar as tarefas de reconhecimento de imagens, comunicação com o usuário em linguagem natural, implementação de sistemas especialistas, prova automatizada de teoremas e cálculos simbólicos. Essas tarefas estão longe da programação de aplicativos tradicional, por isso não recebem muita atenção nos currículos de ciência da computação.

    Programação lógica

    Na programação funcional, os programas são expressões e sua execução consiste no cálculo do seu valor. Na programação lógica, um programa é uma teoria (descrita em uma linguagem bastante limitada) e uma afirmação que precisa ser provada. A prova desta afirmação consistirá na execução do programa.

    A programação lógica e a linguagem Prolog surgiram de pesquisas na área de análise de linguagem natural. Posteriormente, descobriu-se que a programação lógica é igualmente eficaz na implementação de outras tarefas de inteligência artificial.

    A programação lógica permite a implementação paralela natural.

    Aula nº. Paradigmas de Programação. Programação imperativa.

      O conceito de paradigma de programação.

      Classificação dos paradigmas de programação.

      Programação imperativa.

    1. O conceito de paradigma de programação.

    Um paradigma de programação é um conjunto de abordagens, métodos, estratégias, ideias e conceitos que determinam o estilo de escrever programas.

    O paradigma de programação na indústria de programação moderna é muitas vezes determinado pelo kit de ferramentas do programador (linguagem de programação e sistema operacional).

    Um paradigma de programação representa (e define) como um programador vê a execução de um programa. Por exemplo, na programação orientada a objetos, o programador vê o programa como um conjunto de objetos interativos, enquanto na programação funcional o programa é representado como uma cadeia de avaliações de funções.

    O compromisso de uma determinada pessoa com um paradigma específico é por vezes tão forte que os debates sobre as vantagens e desvantagens de vários paradigmas são classificados nos círculos informáticos como as chamadas guerras “religiosas”.

    História do termo

    O termo “paradigma” aparentemente deve o seu significado moderno no campo científico e técnico a Thomas Kuhn e ao seu livro “A Estrutura das Revoluções Científicas” (ver paradigma). Kuhn chamou de paradigmas os sistemas estabelecidos de visões científicas dentro dos quais a pesquisa é conduzida. Segundo Kuhn, no processo de desenvolvimento de uma disciplina científica, um paradigma pode ser substituído por outro (como, por exemplo, a mecânica celeste geocêntrica de Ptolomeu foi substituída pelo sistema heliocêntrico de Copérnico), enquanto o antigo paradigma continua a existir há algum tempo e até se desenvolve pelo fato de muitos de seus apoiadores, por um motivo ou outro, não conseguirem se adaptar para trabalhar em um paradigma diferente.

    O termo “paradigma de programação” foi usado pela primeira vez por Robert Floyd em sua palestra vencedora do Prêmio Turing.

    Floyd observa que na programação pode-se observar um fenômeno semelhante aos paradigmas de Kuhn, mas, diferentemente deles, os paradigmas de programação não são mutuamente exclusivos:

    Se o progresso da arte da programação como um todo exige a constante invenção e aprimoramento de paradigmas, então o aprimoramento da arte de um programador individual exige que ele expanda seu repertório de paradigmas.

    Assim, segundo Robert Floyd, ao contrário dos paradigmas do mundo científico descritos por Kuhn, os paradigmas de programação podem ser combinados, enriquecendo as ferramentas do programador.

    2. Classificação dos paradigmas de programação.

    O principal paradigma de programação aplicada baseado no controle imperativo e no estilo de construção de programa de operador processual ganhou popularidade há mais de cinquenta anos no campo de atividades altamente profissionais de especialistas na organização de processos de computação e informação. A última década expandiu acentuadamente a geografia da ciência da computação, estendendo-a à esfera da comunicação de massa e do lazer. Isto altera os critérios de avaliação dos sistemas de informação e as preferências na escolha de ferramentas e métodos de processamento de informação.

    Os paradigmas gerais de programação que surgiram logo no início da era da programação de computadores - os paradigmas da programação aplicada, teórica e funcional, entre outros - são os mais estáveis.

    A programação aplicada está sujeita a uma orientação problemática, refletindo a informatização da informação e dos processos computacionais de processamento numérico, estudados muito antes do advento dos computadores. Foi aqui que surgiu rapidamente um resultado prático claro. Naturalmente, nessas áreas a programação difere pouco da codificação, para ela, via de regra, o estilo do operador de representação das ações é suficiente. Na prática da programação aplicada, é costume confiar em modelos e bibliotecas de procedimentos comprovados e evitar experimentos arriscados. A precisão e a estabilidade dos cálculos científicos são valorizadas. A linguagem Fortran é uma veterana em programação de aplicativos. Somente na última década tornou-se um pouco inferior nesta área ao Pascal-C, e em supercomputadores a linguagens de programação paralelas como o Sisal. [, , , ]

    A programação teórica segue uma orientação de publicação que visa a comparabilidade dos resultados de experiências científicas na área da programação e da informática. A programação tenta expressar os seus modelos formais, para mostrar o seu significado e natureza fundamental. Esses modelos herdaram as principais características de conceitos matemáticos relacionados e se estabeleceram como uma abordagem algorítmica na ciência da computação. O desejo de evidências de construções e avaliação de sua eficácia, plausibilidade, correção, correção e outras relações formalizadas em diagramas e textos de programas serviram de base para a programação estruturada [, ] e outros métodos para alcançar a confiabilidade do processo de desenvolvimento do programa, por exemplo , programação competente. Os subconjuntos padrão de Algol e Pascal, que serviam como material de trabalho para a teoria da programação, foram substituídos por linguagens aplicativas mais convenientes para experimentação, como ML, Miranda, Scheme e outros dialetos Lisp. Agora eles são unidos por subconjuntos de C e Java.

    A programação funcional surgiu como uma homenagem à orientação matemática na pesquisa e desenvolvimento da inteligência artificial e ao desenvolvimento de novos horizontes na ciência da computação. Uma abordagem abstrata para a apresentação de informações, um estilo lacônico e universal de construção de funções, clareza do ambiente de execução para diferentes categorias de funções, liberdade de construções recursivas, confiança na intuição do matemático e pesquisador, evitação do fardo de prematuramente resolver problemas sem princípios de alocação de memória, rejeição de restrições irracionais no escopo das definições - tudo isso está ligado por John McCarthy à ideia da linguagem Lisp. A ponderação e a validade metodológica das primeiras implementações do Lisp permitiram acumular rapidamente experiência na resolução de novos problemas e prepará-los para a programação aplicada e teórica. Atualmente, existem centenas de linguagens de programação funcionais focadas em diferentes classes de tarefas e tipos de meios técnicos. [,,,,,,]

    As ferramentas e métodos básicos de programação evoluíram à medida que a complexidade dos problemas a serem resolvidos aumentou. Tem havido uma estratificação dos paradigmas de programação em função da profundidade e generalidade da elaboração dos detalhes técnicos da organização dos processos de processamento de informação informática. Surgiram diferentes estilos de programação, sendo os mais maduros a programação de baixo nível (orientada à máquina), de sistema, lógica declarativa, transformacional de otimização e de alto desempenho/paralela.

    A programação de baixo nível é caracterizada por uma abordagem de hardware para organizar a operação de um computador, visando acessar quaisquer recursos de hardware. O foco está na configuração de hardware, estado de memória, comandos, transferências de controle, sequenciamento de eventos, exceções e surpresas, tempos de resposta de dispositivos e sucesso de resposta. A linguagem assembly foi ofuscada por algum tempo como meio visual preferido por Pascal e C, mesmo em microprogramação, mas as melhorias na interface do usuário podem recuperar sua posição. [,,,]

    A programação do sistema vem se desenvolvendo há muito tempo sob a pressão do serviço e do trabalho personalizado. A abordagem de fabricação inerente a esse trabalho depende da preferência por processos reproduzíveis e programas estáveis ​​projetados para uso repetido. Para tais programas, justifica-se um esquema de processamento de compilação, análise estática de propriedades, otimização e controle automatizados. Esta área é dominada pelo estilo de programação imperativo-procedimental, que é uma generalização direta do estilo de operador de programação de aplicativos. Permite alguma padronização e programação modular, mas adquire estruturas, especificações, métodos de teste, ferramentas de integração de programas bastante complexos, etc. Os rigorosos requisitos de eficiência e confiabilidade são atendidos pelo desenvolvimento de ferramentas profissionais que utilizam heurísticas semânticas associativas complexas, juntamente com métodos de design e geração de programas orientados sintaticamente. O potencial inegável de tais ferramentas na prática é limitado pela complexidade do desenvolvimento – surge um requisito de qualificação.

    A programação de alto desempenho visa alcançar o máximo desempenho possível na resolução de problemas particularmente importantes. A reserva natural de desempenho do computador são os processos paralelos. Sua organização exige uma consideração detalhada das relações temporais e um estilo não imperativo de gerenciamento de ações. Os supercomputadores que suportam computação de alto desempenho exigiam técnicas especiais de programação de sistemas. A abordagem de rede gráfica para representar sistemas e processos para arquiteturas paralelas foi expressa em linguagens de programação paralelas especializadas e supercompiladores adaptados para mapear a hierarquia abstrata de processos em nível de tarefa na estrutura espacial específica de processadores de equipamentos reais [,,] .

    A programação declarativa (lógica) surgiu como uma simplificação da programação funcional para matemáticos e linguistas resolvendo problemas de processamento simbólico. Particularmente atraente é a possibilidade de usar o não determinismo como base conceitual, o que nos livra da ordenação prematura ao programar o processamento de fórmulas. O estilo de produção de geração de processos com retornos é suficientemente natural para uma abordagem linguística de esclarecimento do conhecimento formalizado por especialistas e reduz a barreira inicial à implementação de sistemas de informação.

    A programação transformacional combinou metodologicamente as técnicas de otimização de programas, macrogeração e computação parcial. Um conceito central nesta área é a equivalência de informações. Manifesta-se na definição de transformações de programas e processos, na busca de critérios para a aplicabilidade das transformações, na escolha de uma estratégia para sua utilização. Cálculos mistos, ações diferidas, programação preguiçosa, processos atrasados, etc. são usados ​​​​como métodos para aumentar a eficiência do processamento de informações sob certas condições adicionalmente identificadas. [,]

    O maior desenvolvimento dos paradigmas de programação reflete uma mudança no círculo de pessoas interessadas na utilização de sistemas de informação. A formação de abordagens extensivas de programação é uma resposta natural às melhorias radicais nas características de desempenho de equipamentos e redes de computadores. Há uma transição das ferramentas computacionais da classe das ferramentas técnicas para a classe dos eletrodomésticos. Surgiu o terreno para a atualização das abordagens de programação, bem como a possibilidade de reabilitar ideias antigas e pouco desenvolvidas devido à baixa tecnologia e desempenho dos computadores. É de interesse desenvolver abordagens de pesquisa, evolutivas, cognitivas e de adaptação à programação, que criem a perspectiva de desenvolvimento racional de recursos reais de informação e potencial computacional. [,]

    Uma abordagem de pesquisa com um estilo de jogo educacional de programação profissional, educacional e amadora pode dar impulso à engenhosidade no aprimoramento da tecnologia de programação que não conseguia lidar com fenômenos de crise na base de elementos anterior. [,]

    A abordagem evolutiva com um estilo móvel de refinamento de programas é claramente visível no conceito de programação orientada a objetos, que está gradualmente evoluindo para uma programação orientada para o assunto e até mesmo orientada para o ego. A reutilização de definições e a herança de propriedades de objetos podem prolongar o ciclo de vida de ambientes de informações depurados, aumentar a confiabilidade de sua operação e a facilidade de uso. Uma abordagem cognitiva com um estilo interoperável de desenvolvimento de interface visual de sistemas abertos e o uso de novas ferramentas de áudio e vídeo e dispositivos não padronizados abrem caminhos para melhorar a percepção de informações complexas e simplificar seu processamento adequado. [,]

    Uma abordagem de adaptação com um estilo ergonômico de design individualizado de sistemas de informação personalizados oferece aos cientistas da computação a oportunidade de programar, organizar e apoiar com competência processos tecnológicos em tempo real que são sensíveis ao fator humano e à transferência de sistema [,].

    O domínio de uma linha arquitetônica, interface padrão, tecnologia de programação padrão, etc., que está se estabilizando hoje. está repleta de perda de agilidade na atualização das tecnologias de informação. As pessoas que estão acostumadas a assimilar tudo com firmeza de uma vez por todas são especialmente vulneráveis ​​nesse aspecto. No aprendizado de linguagens de programação, tais problemas são evitados ensinando diferentes linguagens de programação ao mesmo tempo ou apresentando previamente a base, que estabelece a estrutura gramatical para generalizar conceitos cuja variabilidade é difícil de apreender em exemplos educacionais simplificados. É precisamente esta a base que o estudo da programação funcional proporciona, na medida em que visa apresentar e analisar os paradigmas que se desenvolveram na prática da programação em diferentes domínios de actividade com diferentes níveis de qualificação especializada, o que pode ser útil como base conceptual. base para o estudo de novos fenômenos em ciência da computação.

    O paradigma da programação é uma ferramenta para moldar o comportamento profissional. A ciência da computação passou de uma programação profissional de uma elite altamente qualificada de especialistas técnicos e cientistas a um passatempo livre de uma parte ativa de uma sociedade civilizada. O domínio dos sistemas de informação através da compreensão para fins de ação competente e uso responsável da tecnologia foi substituído por habilidades intuitivas de influência caótica no ambiente de informação com uma modesta esperança de sorte, sem pretensões de conhecimento. A manutenção de centros de uso compartilhado, o suporte profissional à integridade da informação e a preparação de dados deram lugar quase totalmente ao autoatendimento de computadores pessoais, ao funcionamento independente de redes e servidores heterogêneos com interação de diversas comunicações.

    A justaposição de programas em desenvolvimento, dados em processamento e gerenciamento de tarefas está dando lugar à ideia de interfaces projetadas para participar de fluxos de informação como a navegação. Os antigos critérios de qualidade: velocidade, poupança de memória e fiabilidade do processamento da informação estão a ser cada vez mais ofuscados pelo apelo dos jogos e pela amplitude do acesso aos recursos de informação do mundo. Sistemas de software fechados com garantias conhecidas de qualidade e confiabilidade estão sendo substituídos por sistemas de informação abertos com desenvolvimento imprevisível de composição, métodos de armazenamento e processamento de informações.

    Muitos conceitos importantes para a prática de programação, como eventos, exceções e erros, potencial, hierarquia e ortogonalidade de construções, extrapolação e pontos de crescimento do programa, medição de qualidade, etc. não atingiu um nível suficiente de abstração e formalização. Isso permite prever o desenvolvimento de paradigmas de programação e selecionar material educacional para o futuro da programação de componentes (COM/DCOM, Corba, UML, etc.). Se os meios e métodos tradicionais de seleção de componentes reutilizáveis ​​estivessem sujeitos ao critério de modularidade, entendido como a escolha ideal de acoplamento mínimo com funcionalidade máxima, então a moderna base de elementos permite a operação de unidades multicontato que realizam operações simples. [,,,,,]

    Esses sintomas de atualização do paradigma de programação determinam a direção das mudanças que ocorrem no sistema de conceitos básicos, no conceito de informação e de informática. A tendência de usar interpretadores (mais precisamente, compilação incompleta) em vez de compiladores, anunciada no conceito de Java em comparação com C, e a tentação da programação orientada a objetos contra o pano de fundo do estilo de programação imperativo-procedural geralmente aceito pode ser visto como um movimento implícito em direção a um estilo funcional. O poder de modelação das fórmulas funcionais é suficiente para uma representação completa dos diferentes paradigmas, o que permite, a partir deles, extrapolar a aquisição de competências práticas na organização de processos de informação para o futuro.

    Em meados do século passado (20), o termo “programação” não implicava ligação a um computador. Pode-se ver o título do livro “Programação de Computadores”. Agora, por padrão, este termo significa a organização de processos em computadores e redes de computadores.

    A programação como ciência difere significativamente da matemática e da física em termos de avaliação de resultados. O nível dos resultados obtidos por físicos e matemáticos é geralmente avaliado por especialistas com qualificações semelhantes ou superiores. Na avaliação dos resultados da programação, a avaliação do usuário, que não pretende ter conhecimentos de programação, desempenha um papel importante. Portanto, diferentemente das ciências convencionais, os especialistas em programação desempenham parcialmente a função de traduzir seus termos profissionais em conceitos de usuário.

    A programação tem seu próprio método específico para estabelecer a confiabilidade dos resultados - este é um experimento de computador. Se na matemática a confiabilidade se resume a construções demonstrativas que são compreensíveis apenas para especialistas, e na física - a um experimento de laboratório reproduzível que requer equipamento especial, então um experimento computacional pode estar disponível ao público em geral.

    Outra característica da programação decorre de sua dependência da tecnologia eletrônica em rápido desenvolvimento. Por isso, o conhecimento de programação é uma combinação entre clássico e moda. O conhecimento específico sobre novos produtos da moda está se tornando desatualizado; portanto, para atualizar rapidamente conhecimentos e habilidades, você precisa de uma base clássica, cujo propósito direto não é totalmente óbvio para usuários e iniciantes. [,,]

    A programação utiliza aparatos matemáticos como base conceitual (teoria dos conjuntos, teoria dos números, álgebra, lógica, teoria dos algoritmos e funções recursivas, teoria dos grafos, etc.)

    Os critérios de qualidade do programa são muito diversos. A sua importância depende essencialmente da classe de tarefas e das condições de aplicação dos programas:

    eficácia

    confiabilidade

    sustentabilidade

    automação

    uso eficiente de recursos (tempo, memória, dispositivos, informações, pessoas)

    facilidade de desenvolvimento e uso

    visibilidade do texto do programa

    observabilidade do processo do programa

    diagnóstico do que está acontecendo

    A ordenação dos critérios muitas vezes sofre alterações à medida que o campo de aplicação do programa se desenvolve, aumenta a qualificação dos usuários, moderniza os equipamentos, tecnologia da informação e engenharia de software. O desenvolvimento contínuo resultante do espaço em que o problema é resolvido introduz requisitos adicionais para o estilo de programação dos sistemas de informação:

    flexibilidade

    modificabilidade

    capacidade de melhoria

    A programação como ciência, arte e tecnologia explora e desenvolve criativamente o processo de criação e uso de programas, determina os meios e métodos de construção de programas, cuja variedade conheceremos em palestras futuras dedicadas à análise de uma série de princípios básicos paradigmas de programação.

    Existem dificuldades óbvias em classificar linguagens de programação e determinar se elas pertencem a um paradigma de programação específico. Neste curso, o paradigma de programação é caracterizado pela interação de sistemas semânticos básicos, como processamento de dados, armazenamento de dados e controle de processamento de dados. Com esta abordagem, três categorias de paradigmas podem ser distinguidas:

    programação de baixo nível;

    programação em linguagens de alto nível;

    preparação de programas baseados em linguagens de altíssimo nível.

    A programação de baixo nível lida com estruturas de dados ditadas pela arquitetura e hardware. Ao armazenar dados e programas, são utilizadas memória global e um modelo de controle automático de processamento de dados. [,,,,,,,,]

    A programação em linguagens de alto nível é adaptada para especificar estruturas de dados que refletem a natureza dos problemas que estão sendo resolvidos. É utilizada uma hierarquia de áreas de visibilidade das estruturas de dados e procedimentos para seu processamento, subordinada a um modelo de controle lógico-estrutural que permite a convergência do processo de depuração do programa. [,,,,,,]