En las universidades y en los libros de texto de algoritmos, es bastante común que el maestro y el autor expliquen el flujo de control en pseudocódigo. Con el advenimiento 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 lenguajes?
La única ventaja del pseudocódigo que se me ocurre es que supuestamente no tiene en cuenta el lenguaje. Pero no lo es. Algunos pseudocódigos usan un enfoque imperativo, otros pseudocódigos parecen funcionales. Los autores simplemente toman prestada la semántica de cualquier lenguaje de programación con el que se sientan cómodos, o peor aún, simplemente describen la semántica en lenguaje natural. Entonces, si el pseudocódigo no es realmente independiente del lenguaje, ¿cuál es la ventaja de usarlo? ¿No sería mejor usar un idioma existente?
fuente
Respuestas:
No. El punto del pseudocódigo es que no tiene que compilarse. Puedo pasar por alto rápidamente detalles irrelevantes. Por el contrario, incluso los lenguajes que parecen pseudocódigo a primera vista pueden tener detalles muy no intuitivos que simplemente restarían valor al algoritmo. Tomemos por ejemplo Quicksort en Haskell:
o lo mismo en Python:
La ventaja en ambos casos es que este es un código ejecutable y, como tal, los estudiantes pueden probarlo, verificarlo y jugarlo. Sin embargo, ambos incluyen detalles sintácticos que distraen. Por lo general, los estudiantes recibirían un mejor servicio con un pseudocódigo que ilustra la intención del algoritmo, no los detalles de implementación:
Diferencias notables:
Solo puedo hacer una sintaxis de comprensión de listas que parezca matemática en lugar de tener que explicar por qué Python tiene un
for
yif
aquí.No tengo que explicar la sintaxis de ese lenguaje para la concatenación de listas. ¿Por qué Python usa la
+
suma? ¿Qué hay:
en Haskell? Solo puedo elegir una sintaxis que haga que el punto sea más claro.la firma de tipo
Ord a => [a] -> [a]
es solo un detalle de implementación. Aunque posiblemente sea útil en este caso, las firmas de tipo que a veces requiere Haskell pueden ser absurdas.No tengo que explicar por qué Python considera que las colecciones vacías son falsas, y qué
array[1:]
se supone que significa.Evito que los estudiantes inteligentes señalen que realmente debería usarlo
yield
en el ejemplo de Python.Haskell apesta por explicar estructuras de datos mutables como tablas de hash, árboles RB, ...
Las cosas comienzan a ser muy específicas del idioma una vez que necesitamos registros complejos para expresar nuestros algoritmos. Por ejemplo, el sistema de objetos de Python tiene algunas sorpresas que solo distraen.
Dicho esto, puede ser muy valioso usar uno de estos lenguajes además del pseudocódigo, simplemente etiquete cuidadosamente qué es qué.
fuente
I don't have to explain ... what array[1:] is supposed to mean.
, pero realmente terminaste teniendo que explicararray[1, ...] -- the rest of the array without the pivot
en los comentarios porque nadie podría haber descubierto quéarray[1, ...]
significa (es tu matriz de pseudocódigo basada en 0 o 1, qué diablos significan esos puntos suspensivos, etc.). Creo que realmente está a favor de usar el lenguaje real como base para el pseudocódigo, ya que simplemente puede dirigir a las personas a la documentación / tutorial de un idioma real en lugar de tener que aprender sus sintaxis de pseudocódigo.No.
El propósito completo del pseudocódigo es abstraer los detalles y las complejidades de los idiomas individuales para que pueda centrarse en lo que se supone que debe hacer el programa, en lugar de cómo lo hace. Con el pseudocódigo, puede inventar reglas arbitrarias que no necesitan ajustarse a los requisitos de implementación reales como lo hacen los lenguajes del mundo real, sino solo a los requisitos del tema actual en cuestión.
Además, si la lógica se presenta de una manera que usted (como estudiante) no puede simplemente copiar / pegar en un archivo, compilarlo y listo, entonces se ve obligado a implementar la solución usted mismo, incluso cuando se describe la solución en sí misma para ti. Esto fomenta el pensamiento individual sobre copiar / pegar trampas.
fuente
¿Qué es real?
Porque Real es solo en definición para un intérprete .
¿El mandarín es más o menos real que el inglés?
Entonces, Real ni siquiera es la pregunta. Vamos a reformularlo:
¿Por qué se utiliza el pseudocódigo en lugar de un lenguaje formal?
Un simple diagrama de VENN puede resaltar el problema fácilmente. El conjunto de todos los humanos que hablan inglés y mandarín es el subconjunto de hablantes de inglés o mandarín. Debido a que se requiere esfuerzo para obtener competencia en cualquier idioma, la intersección es generalmente mucho más pequeña que la unión.
El libro de texto sobre programación puede presumir que comprende al menos un lenguaje natural, el idioma en el que está escrito el libro de texto. En general, es seguro presumir esto, ya que de lo contrario se hubiera seleccionado un libro de texto diferente y más legible. Después de todo, aprender un idioma es bastante difícil, dos es más difícil.
Esto da la primera razón para usar un pseudocódigo. Maximiza la audiencia que podría leer fácilmente el libro. Esto se hace siguiendo las convenciones de lenguaje establecidas que ya se encuentran en el lenguaje natural. Digamos recetas de cocina, fórmulas matemáticas, etc. Cualquier brecha se puede cerrar con una explicación rápida del lenguaje natural o, si no, un recurso final a nuestro sistema visual con imágenes.
En cuanto a por qué el lenguaje común no podría ser el lenguaje de programación. Le dejo que considere cuánto mandarín (o cualquier idioma que aún no hable) haya aprendido al leer un libro sobre programación escrito con ejemplos dados en un lenguaje de programación familiar.
Lo que logra un libro de texto
En cuanto a la segunda razón, considere lo que debe lograr un libro de texto:
Por qué programa
La mayor parte del libro tiene que convencerte de por qué querrías aprender y usar este idioma extraño o cualquier otro idioma similar. Esto significa discutir la esencia de la programación misma.
La mayor parte de esto no tiene nada que ver con las máquinas en sí, es principalmente una discusión sobre cómo debe funcionar la carne para llevar a cabo un programa. Eso es bastante complejo porque tiene que mostrar por qué vincularíamos nuestros objetivos espaciales humanos, para programar problemas espaciales y tratar de resolverlos.
Describiendo un programa
El segundo logro del libro de texto es describir un idioma. Ahora la mayoría de los lenguajes de programación se pueden describir con una gramática y algunas reglas semánticas. En el extremo poco profundo están los lenguajes como JSON, que se pueden definir de manera bastante completa en aproximadamente tres páginas. Los lenguajes más complejos necesitan una especificación más grande, pero en su mayor parte no necesitan una comprensión total para ser útiles. Sin embargo, estas descripciones son Pseudocódigo. Especifican el lenguaje formal en términos de un lenguaje natural. La diferencia es que estos pseudocódigos se especifican de antemano.
Ahora que incluso los lenguajes formales son pseudocódigos (ejecutables), la pregunta es ¿qué es lo más importante al describir un algoritmo? El siguiente contexto más grande.
En ningún momento es importante el lenguaje en el que está escrito el algoritmo. En todo caso, solo unas pocas operaciones clave son críticas para el éxito de los algoritmos. Entonces la pregunta se convierte en:
Dado que aprender un idioma es difícil, y el lector debe haber aprendido / aprender un idioma para comprender el algoritmo, como escritor de un libro de texto, ¿qué debe preguntarle al lector?
fuente
Iría contra la corriente aquí y argumentaría que sí, los libros y tutoriales deberían usar pseudocódigo basado en lenguajes reales de alto nivel en lugar de inventar una sintaxis de pseudocódigo completamente nueva.
Sin embargo, también advertiría a los autores y lectores que cuando se usan en este contexto, esto debería ser una pseudo versión del lenguaje real, y los autores deberían tener en cuenta que no deben ser demasiado estrictos acerca de seguir la sintaxis y las limitaciones del lenguaje. En cambio, los autores deberían pensar cuidadosamente sobre qué es lo que están tratando de comunicar con el fragmento, y ocultar detalles irrelevantes detrás de las llamadas a funciones y / o comentarios en lugar de luchar por una implementación completa o código compilable que sea idiomático para el idioma base elegido. .
Los autores deben tomarse un poco de libertad creativa en el idioma para expresar su punto de vista, de modo que incluso alguien que conozca solo los conceptos básicos del idioma pueda comprender la esencia del fragmento, mientras que aquellos que buscan una semántica más exacta pueden consultar la documentación del idioma o recurrir a su conocimiento previo sobre el idioma para completar los detalles.
fuente