Nas faculdades e nos livros didáticos de algoritmos, é bastante comum que o professor e o autor expliquem o fluxo de controle no pseudo-código. Com o advento de linguagens mais expressivas, como Python e Haskell, entre outras, é razoável que as faculdades mudem para explicar algoritmos através de uma dessas linguagens?
A única vantagem do pseudo-código que consigo pensar é que ele é supostamente independente da linguagem. Mas não é. Alguns pseudocódigo usam uma abordagem imperativa, outros pseudocódigo parecem funcionais. Os autores apenas tomam emprestada a semântica de qualquer linguagem de programação que eles se sintam confortáveis usando, ou pior, apenas descrevem a semântica na linguagem natural. Portanto, se o pseudo-código não é realmente independente da linguagem, qual é a vantagem de usá-lo? Não seria melhor usar apenas um idioma existente?
fonte
Respostas:
Não. O objetivo do pseudo-código é que ele não precisa ser compilado. Eu posso rapidamente encobrir detalhes irrelevantes. Por outro lado, mesmo linguagens que se parecem com pseudocódigo à primeira vista, podem ter detalhes muito pouco intuitivos que prejudicariam apenas o algoritmo. Vamos pegar, por exemplo, o Quicksort em Haskell:
ou o mesmo em Python:
A vantagem em ambos os casos é que esse é um código executável e, como tal, pode ser testado, verificado e manipulado pelos alunos. No entanto, ambos incluem detalhes sintáticos que são perturbadores. Os alunos geralmente seriam melhor atendidos pelo pseudocódigo que ilustra a intenção do algoritmo, não os detalhes da implementação:
Diferenças notáveis:
Posso apenas criar uma sintaxe de compreensão de lista que se parece com matemática, em vez de precisar explicar por que o Python tem um
for
eif
aqui.Não preciso explicar a sintaxe desse idioma para concatenação de listas. Por que o Python usa
+
adição? O que há:
em Haskell? Posso apenas escolher uma sintaxe que mostre o ponto com mais clareza.a assinatura de tipo
Ord a => [a] -> [a]
é apenas um detalhe de implementação. Embora seja útil nesse caso, as assinaturas de tipo às vezes exigidas por Haskell podem ficar absurdas.Não preciso explicar por que o Python considera as coleções vazias falsas e o que
array[1:]
deve significar.Evito que alunos inteligentes apontem que realmente devo usar
yield
no exemplo do Python.Haskell é péssimo por explicar estruturas de dados mutáveis como Hash Tables, árvores RB,….
As coisas começam a ficar muito específicas da linguagem quando precisamos de registros complexos para expressar nossos algoritmos. Por exemplo, o sistema de objetos do Python tem algumas surpresas que são apenas perturbadoras.
Dito isso, pode ser muito valioso usar um desses idiomas além do pseudocódigo, apenas rotule cuidadosamente o que é o quê.
fonte
I don't have to explain ... what array[1:] is supposed to mean.
, mas acabou realmente explicandoarray[1, ...] -- the rest of the array without the pivot
nos comentários, porque ninguém poderia descobrir o quearray[1, ...]
significa (o seu array de pseudocódigos é 0 ou 1, o que diabos essas reticências significam, etc.). Eu acho que é realmente a favor do uso de linguagem real como base para o pseudocódigo, pois você pode simplesmente apontar as pessoas para a documentação / tutorial de uma linguagem real, em vez de precisar aprender as sintaxes do pseudocódigo.Não.
Todo o objetivo do pseudo-código é abstrair os detalhes e complexidades de linguagens individuais, para que você se concentre no que o programa deve fazer, e não em como ele o faz. Com o pseudo-código, você pode criar regras arbitrárias que não precisam estar em conformidade com os requisitos reais de implementação da maneira que os idiomas do mundo real, mas apenas com os requisitos do tópico real em questão.
Além disso, se a lógica é apresentada de uma maneira que você (como aluno) não pode simplesmente copiar / colar em um arquivo, compilá-lo e concluir, você é forçado a implementar a solução você mesmo, mesmo quando a própria solução é descrita para voce. Isso incentiva o pensamento individual sobre a trapaça de copiar / colar.
fonte
O que é real?
Porque o Real está apenas na definição de um intérprete .
O mandarim é mais ou menos real que o inglês?
Então, o Real nem é a questão. Vamos reformular:
Por que o pseudo-código é usado em vez de uma linguagem formal?
Um simples diagrama de VENN pode destacar o problema facilmente. O conjunto de todos os seres humanos que são falantes de inglês e mandarim é o subconjunto de falantes de inglês ou mandarim. Como é necessário esforço para obter proficiência em qualquer idioma, a interseção é geralmente muito menor que a união.
O livro de programação pode presumir que você entende pelo menos uma linguagem natural, a linguagem na qual o livro foi escrito. É geralmente seguro presumir isso, caso contrário, outro livro mais legível teria sido selecionado. Afinal, aprender um idioma é difícil o suficiente - dois é mais difícil.
Isso fornece o primeiro motivo para usar um pseudo-código. Maximiza o público que poderia facilmente ler o livro. Isso é feito seguindo as convenções linguísticas estabelecidas já encontradas na linguagem natural. Diga receitas de culinária, fórmulas matemáticas, etc ... Qualquer lacuna pode ser preenchida por uma rápida explicação da linguagem natural, ou na falta de um recurso final para o nosso sistema visual com fotos.
Quanto ao motivo pelo qual a linguagem comum não poderia ser a linguagem de programação. Deixo para você considerar o quanto de mandarim (ou qualquer idioma que você ainda não fala) você aprendeu lendo um livro sobre programação escrito com exemplos dados em uma linguagem de programação familiar.
O que um livro consegue
Quanto à segunda razão, considere o que um livro deve alcançar:
Porquê Programa
A maior parte do livro precisa convencê-lo do motivo pelo qual você gostaria de aprender e usar esse idioma alienígena ou qualquer outro idioma semelhante. Isso significa discutir a essência da programação em si.
A maior parte disso não tem nada a ver com as próprias máquinas, é principalmente uma discussão sobre como os utensílios de carne devem operar para criar um programa. Isso é bastante complexo porque precisa mostrar por que vincularíamos nossos objetivos espaciais humanos, para programar problemas espaciais e nos esforçarmos para resolvê-los.
Descrevendo um programa
A segunda conquista do livro está descrevendo um idioma. Agora a maioria das linguagens de programação pode ser descrita com uma gramática e algumas regras semânticas. No lado raso, existem linguagens como JSON, que podem ser definidas completamente dentro de três páginas. Linguagens mais complexas precisam de uma especificação maior, mas na maioria das vezes não precisam de um entendimento total para serem úteis. No entanto, essas descrições são o pseudo-código. Eles especificam a linguagem formal em termos de uma linguagem natural. A diferença é que esses pseudocódigos são especificados com antecedência.
Agora, considerando que mesmo as línguas formais são elas próprias pseudo-códigos (executáveis), a questão é o que é mais importante ao descrever um algoritmo? O próximo contexto maior.
Em nenhum momento a linguagem na qual o algoritmo está escrito é importante. Se alguma coisa, apenas algumas operações importantes são críticas para o sucesso dos algoritmos. Então, a pergunta se torna:
Dado que aprender um idioma é difícil, e o leitor deve ter aprendido / aprendido um idioma para entender o algoritmo, como redator de um livro, o que você deve perguntar ao leitor?
fonte
Eu iria contra a corrente aqui e argumentaria que sim, livros e tutoriais devem usar pseudocódigo que é baseado em linguagens reais de alto nível, em vez de inventar uma sintaxe totalmente nova de pseudocódigo.
No entanto, também gostaria de avisar a autores e leitores que, quando usados nesse contexto, essa deve ser uma pseudo-versão da linguagem real, e os autores devem estar atentos para não serem muito rigorosos quanto a seguir a sintaxe e as limitações da linguagem. Em vez disso, os autores devem pensar cuidadosamente sobre o que estão tentando se comunicar com o snippet e ocultar detalhes irrelevantes por trás de chamadas e / ou comentários de funções, em vez de se esforçarem por uma implementação ou código compilável e realmente compilável que seja idiomático para o idioma base escolhido. .
Os autores devem ter alguma liberdade criativa no idioma para expressar seu ponto de vista, de modo que mesmo alguém que conheça o básico do idioma ainda possa entender a essência do snippet, enquanto aqueles que buscam uma semântica mais exata podem se referir à documentação do idioma ou fazer o fallback para seu conhecimento prévio sobre o idioma para preencher os detalhes.
fonte