¿Por qué los libros de texto usan pseudocódigo en lugar de lenguajes reales?

4

En las universidades y en los libros de texto de algoritmos, es bastante común que el profesor y el autor expliquen el flujo de control en el pseudocódigo. Con la llegada de lenguajes más expresivos como Python y Haskell, entre otros, ¿es razonable que las universidades cambien para explicar algoritmos a través de uno de estos idiomas?

La única ventaja del pseudocódigo que se me ocurre es que es supuestamente agnóstico del lenguaje. Pero no lo es. Algunos pseudocódigos utilizan un enfoque imperativo, otros pseudocódigos parecen funcionales. Los autores simplemente toman prestada la semántica del lenguaje de programación con el que se sienten cómodos, o peor aún, describen la semántica en lenguaje natural. Entonces, si el pseudocódigo no es realmente agnóstico del lenguaje, ¿cuál es la ventaja de usarlo entonces? ¿No sería mejor utilizar un idioma existente?

    
pregunta Asterisk 21.02.2016 - 15:18

2 respuestas

13

No. El punto del pseudocódigo es que no tiene que compilar. Puedo rápidamente pasar por alto detalles irrelevantes. Por el contrario, incluso los idiomas que parecen pseudocódigo a primera vista pueden tener detalles no intuitivos que podrían restar valor al algoritmo. Tomemos por ejemplo Quicksort en 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]

o lo mismo en 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)

La ventaja en ambos casos es que este es un código ejecutable, y como tal puede ser probado, verificado y jugado por los estudiantes. Sin embargo, ambos incluyen detalles sintácticos que distraen. Por lo general, los estudiantes recibirán un mejor servicio con un pseudocódigo que ilustra la intención del algoritmo, no los detalles de la implementación:

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)...]

Diferencias notables:

  • Simplemente puedo crear una sintaxis de comprensión de lista que parece matemática en lugar de tener que explicar por qué Python tiene for y if aquí.

  • No tengo que explicar la sintaxis de ese idioma para la concatenación de listas. ¿Por qué Python usa + agregado? ¿Qué es : en Haskell? Solo puedo elegir una sintaxis que haga entender el punto con mayor claridad.

  • la firma de tipo Ord a => [a] -> [a] es solo un detalle de implementación. Si bien es posible que sea útil en este caso, las firmas de tipo que Haskell requiere a veces pueden ser absurdas.

  • No tengo que explicar por qué Python considera que las colecciones vacías son falsas, y se supone que significa array[1:] .

  • Evito a los estudiantes inteligentes que señalan que realmente debería usar yield en el ejemplo de Python.

  • Haskell apesta por explicar estructuras de datos mutables como tablas hash, árboles RB, ...

  • Las cosas comienzan a ser muy específicas del idioma una vez que necesitamos registros complejos para expresar nuestros algoritmos. P.ej. El sistema de objetos de Python tiene algunas sorpresas que solo distraen.

Dicho esto, puede ser muy valioso utilizar uno de estos idiomas además de pseudocódigo, simplemente etiqueta qué es qué.

    
respondido por el amon 21.02.2016 - 15:58
6

No.

El propósito completo del pseudocódigo es abstraer los detalles y las complejidades de los idiomas individuales para que se centre en lo que se supone que debe hacer el programa, en lugar de cómo lo hace. Con el pseudocódigo puede crear reglas arbitrarias que no necesitan cumplir con los requisitos de implementación reales de la forma en que lo hacen los lenguajes del mundo real, sino solo con los requisitos del tema en cuestión.

    
respondido por el Lightness Races in Orbit 21.02.2016 - 15:24

Lea otras preguntas en las etiquetas