Por que os livros escolares usam pseudocódigo em vez de idiomas reais?


8

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?


5
"Eu poderia ter escolhido o idioma de uma máquina X específica, mas as pessoas que não possuem a máquina X pensariam que este livro é apenas para pessoas X. Além disso, a máquina X provavelmente tem muitas idiossincrasias que são completamente irrelevantes para o o material deste livro ainda que precisa ser explicado; e em dois anos o fabricante da máquina X lançará a máquina X + 1 ou a máquina 10X, e a máquina X não será mais do interesse de ninguém ". (Donald Knuth, TAOCP)
Kilian Foth

@KilianFoth Nice. Acredito que Knuth também disse que previu um futuro em que os programas seriam escritos em inglês e separados por espaços em branco (embora eu não consiga encontrar a fonte), o que é quase como dizer que o pseudo-código seria executável :) Embora as idiossincrasias sejam realmente perturbadoras, um subconjunto formal de recursos seria aceitável.
Asterisk

1
@ Aststerisk você está pensando em programação alfabetizada . Eu garantiria que também se lesse EWD667: Sobre a tolice da "programação em linguagem natural". por Dijkstra. Eu também apontaria a dificuldade que as pessoas têm em formular perguntas aqui que seguem regras inglesas consistentes de pontuação, uso de maiúsculas e ortografia. Estremeço ao pensar nessas pessoas escrevendo código seguindo estilos semelhantes ao escrever programação em prosa.

1
"advento"? Ambos os idiomas têm mais de 20 anos. E Haskell pelo menos foi precedido por Miranda, que tinha uma sintaxe quase idêntica, e acredito que agora tenha 30 anos.
Jules

@Jules Bem, eu os nomeei porque eles têm a sintaxe mais limpa e sucinta que parece adequada para pseudo-código. Ambos ganharam maior tração nos últimos 10 anos (ou mais como nos últimos 5 anos). Python quebrando o top 10 no PyPl e Haskell com menos de 50 anos. Existem outros idiomas que estão crescendo (por qualquer motivo), mas eles têm sintaxe mais pesada e recursos de wierded. A indústria ainda é 50% C ++ e Java e, em seguida, há JavaScript (que parece uma linguagem projetada ao contrário, primeiro adicione recursos e depois defina regras e restrições).
Asterisk

Respostas:


18

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:

qs :: Ord a => [a] -> [a]
qs [] = []
qs (pivot:xs) = (qs smaller) ++ pivot:(qs larger)
  where smaller = [x | x <- xs, x <= pivot]
        larger  = [x | x <- xs, x > pivot]

ou o mesmo em Python:

def qs(array):
  if not array:
    return []
  pivot = array[0]
  xs = array[1:]
  smaller = [x for x in xs if x <= pivot]
  larger  = [x for x in xs if x > pivot]
  return qs(smaller) + [pivot] + qs(larger)

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:

algorithm QUICKSORT(array)
  return [] if array is empty
  pivot  array[0]
  xs  array[1, ...] -- the rest of the array without the pivot
  smaller  [x | x  xs, x <= pivot] -- all smaller or equal elements
  larger  [x | x  xs, x  > pivot] -- all larger elements
  return [QUICKSORT(smaller)..., pivot, QUICKSORT(larger)...]

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 fore ifaqui.

  • 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 yieldno 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ê.


9
Eu concordo com você em geral, mas seu exemplo contradiz alguns de seus argumentos - seu pseudo-código e o exemplo de Python são extremamente semelhantes. Isso é IMHO uma consequência da linguagem Python que contém muito "senso comum".
Doc Brown

2
Se apenas um subconjunto de recursos de linguagem / API for usado, ele estará sincronizado com a essência do pseudo-código. No entanto, se começarmos a investigar qual seria a melhor maneira ou a maneira mais esotérica de realizá-lo em um idioma específico, seria uma distração. Os cientistas que descreveram o algoritmo apresentaram sua própria notação, que se assemelhava fortemente à teoria dos conjuntos. Após a idéia de máquina de Turing foi estabelecido e C, Fortran, Lisp surgiu pseudo-código começaram a tomar emprestado idéias a partir delas
Asterisk

2
Eu acrescentaria que, se o código puder ser compilado "como está", existe um risco muito real de "o aluno usar o recurso de copiar e colar e não aprender nada".
Brendan

3
Você argumentou I don't have to explain ... what array[1:] is supposed to mean., mas acabou realmente explicando array[1, ...] -- the rest of the array without the pivotnos comentários, porque ninguém poderia descobrir o que array[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.
Lie Ryan

1
@amon Para melhor ou pior, as notações matemáticas não são tão bem definidas quanto as linguagens de programação. Além disso, o uso de reticências em seqüências não tem um significado específico. Às vezes, isso significa que é uma sequência aritmética, às vezes significa geométrico, às vezes significa o próximo item de alguma sequência arbitrária sobre a qual o autor está falando e você precisa ler cinco parágrafos do código para entender isso. A notação de fatia tem um significado bem definido, não é ambígua. Além disso, embora as reticências possam ter sido comuns em sequência, você ainda não havia especificado como a sequência interage com colchetes.
Lie Ryan

10

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.


0

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?

  • Certamente o mandarim não é particularmente útil para quem fala inglês
  • Da mesma forma, o inglês é um absurdo para quem fala mandarim
  • a menos que falem os dois.

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:

  • explique por que eles se incomodariam em aprender uma língua estrangeira em vez de apenas usar sua linguagem natural.
  • explique uma língua estrangeira ao leitor para que ele possa falar por si próprio.

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.

  • Como você identifica um problema
  • Como você divide um problema
  • Como você arquiteta os dados
  • Como você arquiteta os processos
  • Como você gerencia as dependências
  • Como você identifica falhas
  • e mais

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.

  1. O algoritmo tem uma meta razoável nesse contexto,
  2. esse contexto tem algumas restrições,
  3. e o algoritmo é uma descrição de como essas restrições podem ser tratadas ao atingir a meta.

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:

  • é melhor descrever um programa de software capaz de interpretar a especificação completa de uma linguagem formal como C ++ / C # / Python / etc ... para entender o algoritmo
  • ou apenas Defina as quatro primitivas necessárias para entender o algoritmo.

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?


0

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.