Pergunta

Eu li o artigo Wikipedia em línguas Concatenative , e agora estou mais confuso do que eu era quando eu comecei. : -)

O que é uma linguagem concatenativa em termos povos estúpidos?

Foi útil?

Solução

Para a sua pergunta simples, aqui está uma resposta subjetiva e argumentativa.

Eu olhei para o artigo e várias páginas da web relacionadas. As páginas web dizer-se que não há uma teoria real, então não é de admirar que as pessoas estão tendo dificuldade em chegar com uma definição precisa e compreensível. Eu diria que, neste momento, é não é útil para línguas classificar como "concatenativa" ou "não concatenativa".

Para mim parece um termo que dá Manfred von Thun um lugar para pendurar seu chapéu, mas pode não ser útil para outros programadores.

Enquanto PostScript e Forth são vale a pena estudar, eu não vejo nada terrivelmente novo ou interessante em linguagem de programação Alegria de Manfred von Thun. Na verdade, se você ler o artigo de Chris Okasaki em Técnicas para incorporação Postfix Línguas em Haskell você pode experimentar tudo isso em um cenário que, em relação à Alegria, é totalmente mainstream.

Assim, a minha resposta é não há nenhuma explicação simples porque não há amadurecer teoria subjacente a ideia de uma linguagem concatenativa. (Como Einstein e Feynman disse, se você não consegue explicar a sua idéia para um calouro de faculdade, você realmente não entendo isso.) Eu vou mais longe e dizer embora estudando algumas dessas línguas, como Forth e PostScript, é uma excelente uso do tempo, tentando descobrir exatamente o que as pessoas querem dizer quando dizem "concatenativa" é provavelmente um desperdício de seu tempo.

Outras dicas

Em linguagens de programação normais, você tem variáveis ??que podem ser definidos livremente e você chamar os métodos que utilizam essas variáveis ??como argumentos. Estes são simples de entender, mas um pouco limitado. Muitas vezes, é difícil de reutilizar um método existente, porque você simplesmente não pode mapear as variáveis ??existentes nos parâmetros as necessidades método ou o método A chama outro método B e A seria perfeito para você se você só poderia substituir a chamada para B com uma chamada para C.

uso da linguagem concatenativa uma estrutura de dados fixa para salvar valores (geralmente uma pilha ou uma lista). Não há variáveis. Isto significa que muitos métodos e funções têm a mesma "API": Eles trabalham em algo que alguém deixou na pilha. Além disso código em si é pensado para ser "dados", ou seja, é comum escrever código que pode modificar-se ou que aceita outro código como um "parâmetro" (ou seja, como um elemento na pilha).

Estes atributos fazem este línguas perfeito para encadeamento código existente para criar algo novo. Reutilização é construído em. Você pode escrever uma função que aceita uma lista e um pedaço de código e chama o código para cada item na lista. Este vai agora trabalhar em qualquer tipo de dados como tempo de se comporta como uma lista:. Resultados de um banco de dados, uma fileira de pixels de uma imagem, caracteres em uma corda, etc

O maior problema é que você não tem nenhum indício o que está acontecendo. Há apenas um par de tipos de dados (lista, corda, número), de modo que tudo é mapeado para isso. Quando você pegar um pedaço de dados, você normalmente não me importo o que é ou de onde vem. Mas isso faz com que seja difícil de seguir dados através do código para ver o que está acontecendo com ele.

Eu acredito que é preciso um certo conjunto de mente para usar as línguas com sucesso. Eles não são para todos.

[EDIT] Forth tem alguma penetração, mas não muito. Você pode encontrar PostScript em qualquer impressora laser moderna. Então, eles são linguagens de nicho.

A partir de um nível funcional, eles estão a par com LISP, C-como idiomas e SQL: Todos eles são Turing completa, assim você pode calcular qualquer coisa. É apenas uma questão de quanto código que você tem que escrever. Algumas coisas são mais simples em LISP, alguns são mais simples em C, alguns são mais simples em linguagens de consulta. A questão que é "melhor" é inútil, a menos que você tem um contexto.

Primeiro eu vou fazer uma refutação à afirmação de Norman Ramsey que não há nenhuma teoria.

Teoria da Concatenative Idiomas

A linguagem concatenativa é uma linguagem de programação funcional, onde a operação padrão (o que acontece quando dois termos estão lado a lado) é a composição função em vez de aplicação de função. É tão simples quanto isso.

Assim, por exemplo, no SKI Combinator Calculus (um dos mais simples linguagens funcionais) dois termos lado a lado são equivalentes a aplicação do primeiro prazo para o segundo mandato. Por exemplo: S K K é equivalente a S(K)(K).

Em um S K K linguagem concatenativa seria equivalente a S . K . K em Haskell.

Então, o que é o grande negócio

A linguagem concatenativa puro tem a propriedade interessante que a ordem de avaliação dos termos não importa. Em um (S K) K linguagem concatenativa é o mesmo que S (K K). Isto não se aplica à SKI cálculo ou qualquer outra linguagem de programação funcional com base na aplicação de função.

Uma das razões desta observação é interessante porque revela oportunidades para paralelização na avaliação de código expresso em termos de composição de função, em vez de aplicação.

Agora, para o mundo real

A semântica de linguagens baseadas em pilha que suportam funções de ordem superior pode ser explicado usando um cálculo concatenativa. Você simplesmente mapear cada termo (/ expressão / sub-programa de comando) para ser uma função que leva uma função como entrada e retorna uma função como saída. Todo o programa é efetivamente uma única função de transformação pilha.

A realidade é que as coisas estão sempre distorcida do mundo real (por exemplo ADIANTE tem um dicionário global, PostScript faz coisas estranhas quando as matérias ordem de avaliação). A maioria das linguagens de programação práticos não aderem perfeitamente a um modelo teórico.

Palavras Finais

Eu não acho que um programador típico ou 8 anos de idade nunca deve se preocupar com o que uma linguagem concatenativa é. Eu também não acham particularmente útil para linguagens de programação pombo-buraco como tipo de ser X ou digitar Y.

Depois de ler http://concatenative.org/wiki/view/Concatenative%20language e desenho sobre o pouco que eu me lembro de brincar com Forth como um adolescente, eu acredito que a principal coisa sobre programação concatenativa tem a ver com:

  • visualização de dados em termos de valores em uma dados específicos pilha
  • e funções manipular coisas em termos de popping / empurrando valores na mesma os dados pilha

Confira estas citações da página acima:

Existem dois termos que são jogados ao redor, linguagem pilha e linguagem concatenativa. ambos definem classes semelhantes, mas não iguais de línguas. Para a maior parte, embora, eles são idênticos.

A maioria das línguas em uso difundido hoje são linguagens aplicativas: central construto na língua é uma forma de chamada de função, em que uma função é aplicado a um conjunto de parâmetros, onde cada parâmetro é em si o resultado de uma chamada de função, o nome de um variável, ou uma constante. na pilha línguas, uma chamada de função é feita por simplesmente escrever o nome do função; os parâmetros estão implícitas, e eles têm que estar já na empilhar quando a chamada é feita. o resultado da chamada de função (se houver) é então deixada na pilha após a função retorna, para a próxima função de consumir, e assim por diante. Porque as funções são invocadas simplesmente ao mencionar seu nome sem qualquer sintaxe adicional, adiante e o Factor referem-se a funções como "palavras", porque na sintaxe eles realmente são apenas palavras.

Este é em contraste com línguas aplicativas que se aplicam as suas funções diretamente a variáveis ??específicas.

Exemplo:. A adição de dois números

Idioma Applicative :

int foo(int a, int b)
{
    return a + b;
}

var c = 4;
var d = 3;
var g = foo(c,d);

Idioma concatenativa (I tornou-se, deveria ser semelhante a Forth ...;))

push 4
push 3
+
pop

Enquanto eu não acho que a linguagem concatenativa = linguagem de pilha, como apontam os autores acima, parece similar.

Eu acho a idéia principal é 1. Podemos criar novos programas simplesmente juntando-se outros programas juntos.

Além disso, 2. Qualquer pedaço aleatório do programa é uma função válida (ou sub-programa).

Boa RPN puro velho Forth tem essas propriedades, excluindo qualquer sintaxe não-RPN aleatória.

No programa 1 2 + 3 *, o sub-programa + 3 * leva 2 argumentos, e dá um resultado. O sub-programa 2 leva 0 args e retorna 1 resultado. Qualquer pedaço é uma função, e isso é bom!

Você pode criar novas funções, agregando dois ou mais outros juntos, opcionalmente, com um pouco de cola. Ele funcionará melhor se os tipos combinar!

Estas ideias são realmente bom, valor simplicidade.

Ele não se limita a RPN linguagem de série Forth de estilo, nem programação imperativa ou funcional. O trabalho duas idéias também para uma linguagem gráfica, onde unidades de programa pode ser, por exemplo funções, procedimentos, relações, ou processos.

Em uma rede de processos que comunicam, cada sub-rede pode agir como um processo.

Em um gráfico de relações matemáticas, cada sub-gráfico é uma relação válido.

Estas estruturas são 'concatenativa', podemos separá-las de qualquer maneira (desenhar círculos), e juntá-las em muitos aspectos (desenhar linhas).

Bem, é assim que eu vê-lo. Eu tenho certeza que eu perdi muitas outras idéias boas do campo concatenativa. Enquanto eu estou interessado em programação gráfica, eu sou novo a este foco na concatenação.

A minha definição pragmática (e subjetiva) para a programação concatenativa (agora, você pode evitar ler o resto dela):

-> composição de função de maneira extrema (com sintaxe RPN):

( Forth code )
: fib
  dup 2 <= if
    drop 1
  else
    dup 1 - recurse
    swap 2 - recurse +
  then ;

-> tudo é uma função, ou, pelo menos, pode ser uma função:

( Forth code )
: 1 1 ; \ define a function 1 to push the literal number 1 on stack

-> argumentos são passados ??implicitamente sobre funções (ok, isso parece ser uma definição para tácita-programação), mas, isso em Forth:

a b c

pode estar em Lisp:

(c a b)
(c (b a))
(c (b (a)))

assim, é fácil gerar o código ambígua ... você pode escrever definições que empurram a xt (token de execução) na pilha e definir um pequeno alias para 'executar':

( Forth code )
: <- execute ; \ apply function

Assim, você obterá:

a b c <- \ Lisp: (c a b)
a b <- c <- \ Lisp: (c (b a))
a <- b <- c <- \ Lisp: (c (b (a)))

Você não pode explicar uma linguagem, é só pegar um ( Fator , de preferência) e tente alguns tutoriais sobre ele . Tutoriais são melhores do que respostas Stack Overflow.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top