O que é uma arquitetura prática não von Neumann?

16

Existem aplicações práticas para modelos de programação que não sejam da von Neumann? Quais são as linguagens de programação não-von Neumann mais amplamente adotadas?

Len Yabloko
fonte
6
o que é um modelo de programação "não von Neumann"?
precisa
Também não entendo a pergunta, talvez você possa adicionar alguns antecedentes à pergunta para que fique mais fácil entender o que você está perguntando.
Kaveh
3
A arquitetura de von neumann possui uma CPU. portanto, uma arquitetura de processamento paralelo é sem dúvida não-von Neumann (a arquitetura neumann foi inventada antes do processamento paralelo). mas concordou que a pergunta parece ambígua ou definida com nebulosidade. von neumann refere-se a uma arquitetura de computador, não exatamente a um modelo de programação. o modelo de programação e a arquitetura cpu / computer existem em uma espécie de sinergia / simbiose, mas também são um pouco independentes um do outro .... arquiteturas diferentes podem implementar diferentes modelos de programação sem que o modelo de programação seja "acoplado" à arquitetura ...
vzn 28/12/12
1
O que é uma linguagem de programação que não seja von Neumann ? Nesse caso, o que é uma linguagem de programação von Neumann? (Eu não encontrar definição Backus' --- essencialmente 'linguagens imperativas' --- mesmo um pouco convincente.)
Jeffε
1
@ Ronny: A página da Wikipedia apenas repete o artigo de Backus.
Jeffε

Respostas:

12

Quando digo "arquitetura de von Neumann", quero dizer algum hardware limitado pelo "gargalo de von Neumann" - ou seja, todos os dados são canalizados através de um barramento de dados estreito.

As linguagens de programação que não são da von Neumann nas quais me deparo com mais frequência são VHDL e Verilog . No VHDL e no Verilog, por padrão, tudo acontece ao mesmo tempo. O programador precisa fazer um esforço extra para que uma série de eventos ocorra em ordem seqüencial. Isso é muito diferente da maioria das outras linguagens de programação que implicam um "ponteiro de instrução" que, por padrão, executa no máximo uma linha de código a qualquer instante, e o programador precisa fazer um esforço extra para que várias coisas aconteçam ao mesmo tempo. Tempo.

Algumas pessoas diriam que esse é um padrão mais natural. Muitos estudantes de programação iniciantes esperam que um loop "while (x> 0) {...}" saia no instante em que x se torna igual a zero, e eles ficam surpresos ao saber que o computador não avalia continuamente essa condição.

A maioria das pessoas que escrevem códigos VHDL e Verilog compila seus programas em FPGAs, criando pequenos blocos de atividades que são executados em velocidade máxima o tempo todo. Frequentemente, essas pessoas criam um "pipeline" que lê dados dos pinos de entrada, processa-os através de uma série de blocos, os pinos de saída de um bloco diretamente conectados aos pinos de entrada do próximo bloco e o bloco final envia o resultado os pinos de saída. É uma reminiscência do pipeline do Unix , exceto que uma nova parte de dados entra e uma nova parte de dados sai a cada ciclo do relógio.

Os pinos de entrada, os estágios intermediários e os pinos de saída são todos independentes - você não precisa reutilizar um único barramento de dados multiplexado entre as várias partes de dados.

Você também pode estar interessado em: Existem outras arquiteturas de computadores além das arquiteturas von neumann / turing?

David Cary
fonte
11

Suponho que por não Von Neumann, você quer dizer idiomas que contornaram o "Gargalo de Von Neumann", conforme o artigo de Backus "A programação pode ser libertada do estilo Von Neumann?". Para os interessados, você pode encontrar uma cópia aqui: http://www.thocp.net/biographies/papers/backus_turingaward_lecture.pdf

A resposta à sua pergunta terá que ser ambígua por alguns motivos.

Primeiro, quais idiomas atendiam aos critérios de seu artigo? Embora existam aqueles que rastreiam a programação funcional neste artigo, isso agora é considerado um mal-entendido, pois ele quis dizer algo como programação sem pontos. Então você segue o mal-entendido original ou a verdadeira intenção do artigo? Para um pouco de elaboração sobre o que ele quis dizer, consulte o seguinte: http://en.wikipedia.org/wiki/Function-level_programming

Segundo, se você entender o mal-entendido, quão funcional é funcional? Você possui linguagens funcionais puras, linguagens funcionais impuras e linguagens relativamente amigáveis ​​ao paradigma funcional. Considerando que você menciona popularidade e há uma relação inversa entre isso e pureza funcional, apenas quais idiomas devem ser incluídos? Deseja a linguagem funcional pura mais popular (que não seria popular) ou uma linguagem mais popular que atenda a alguns critérios mínimos de "funcionalidade"? Neste último caso, quais são esses critérios?

Então, dependendo do seu ponto de vista:

  1. Haskell é a mais popular das linguagens funcionais completamente puras que eu conheço e existem aplicativos escritos nela. No entanto, embora um peso pesado na comunidade de programação funcional, ele não seja popular na comunidade de programação maior. Além disso, depois de usá-lo, não achei que fosse prático para uso no mundo real e parece ser valorizado pelo trabalho teórico. Ele permite um estilo sem pontos, para que você possa abordar alguns dos objetivos de Backus com isso.

  2. Clojure, Scala e F # são linguagens funcionais menos puras, mas mais práticas e populares. O F # também é amigável ao estilo sem pontos.

  3. Quarto adiante, pode ser o exemplo prototípico de uma linguagem sem pontos, e era bastante difundida em seus dias, embora agora ... O fator é outra linguagem sem pontos que ganhou alguma atenção, mas duvido que tenha correspondido à popularidade de Forth em seu apogeu. .

  4. Backus foi mencionado por Backus em um ponto (talvez não em seu artigo) como um passo em direção, mas não totalmente compatível com seus objetivos. Na sua época, era grande no setor financeiro. Não deixe de conferir seus descendentes, como J.

  5. O JavaScript não é funcional, mas é bastante amigável para um estilo de programação de ordem superior, como evidenciado pelo uso intenso de fechamentos. Dada a sua popularidade, pode apenas atender aos critérios. Não deixe de conferir algumas das coisas interessantes feitas com JavaScript, como currying e implementação de combinadores.

Como nota de rodapé, para lhe dar mais perspectiva dos objetivos dele, você pode conferir os dois idiomas que ele projetou para atender a seus critérios. Eles não são populares de todo o AFAIK, portanto, isso seria puramente por uma questão de conhecimento:

http://en.wikipedia.org/wiki/FP_(programming_language )

http://en.wikipedia.org/wiki/FL_(programming_language )

Ronny
fonte
1
Agora parece que ele quis dizer algo como programação sem pontos, em vez de programação funcional - há algum indicador para uma discussão sobre isso? Soa interessante.
Suresh Venkat
O modelo de programação de Backus é chamado de "Programação em nível de função" e há um artigo aqui: en.wikipedia.org/wiki/Function-level_programming . Eu não conheço links realmente bons (eu adoraria saber se você encontra algum!), Mas o Google "Programação em nível de função" exibe alguns links interessantes, incluindo um vídeo.
Ronny
1
@SureshVenkat: As linguagens FP e FL foram criadas por Backus especificamente para apoiar sua ideia de programação em nível de função. Consulte também "programação tácita" e, mais especificamente, a linguagem J , que combina APL e FP / FL para criar o que pode ser a linguagem de uso geral mais enigmática e mais expressiva em uso real. Também recordo um post sobre SO sobre o uso de programação tácita em linguagens funcionais.
CA McCann
Aliás, a cronologia neste post parece significativamente errada. A programação funcional (nas tradições Lisp e ML) é anterior à palestra do Prêmio Backuring de Turing, assim como a maioria ou todos os paradigmas de programação existentes - incluindo a programação em nível de função em si, na forma de Lógica Combinatória , que antecede o cálculo lambda da Igreja e o de Turing. trabalhe na teoria da computação! (Oh, e eu muito prefiro usar Haskell para fins do mundo real prático do que uma atrocidade como Javascript.)
CA McCann
@camccann Eu nunca defini uma cronologia no post. Além disso, o Lisp é muito amplo para suportar reivindicações. Por exemplo, nem todos os Lisps são funcionais, nem todos são recursivos na cauda. Gosto da sua referência à Lógica Combinatória, mas acho que o ponto de Backus era ter uma linguagem com a qual se pudesse programar um computador que suporte o paradigma. Portanto, embora a Lógica Combinatória ilumine seu argumento, isso não afeta seu argumento.
Ronny
2

Acho que a programação de Linda e tuplespace poderia se encaixar na conta. As operações de memória associativa / de correspondência de padrões com simultaneidade significam que (conceitualmente) o gargalo de Von-Neuman é eliminado.

Indo nessa direção, uma linguagem pura de modelo de ator também modela a comunicação, e não o seqüenciamento de instruções. E, embora sejam formalismos e não linguagens de programação reais, cálculos de processos como o cálculo Pi, CSP e redes de Petri modelam a comunicação de maneiras relacionadas.

Consulte a wikipedia para obter links (eu sou um novo usuário e com proteção contra spam), mas para obter algum humor sofisticado sobre o nome de Linda, leia http://c2.com/cgi/wiki?LindaEtymology .

Jim Meier
fonte