La verbosidad es una tendencia a usar grandes cantidades de texto, y en pocas palabras el uso de muy poco texto ...
La verbosidad es mala porque:
- presenta más oportunidades de error tipográfico
- hace que sea más difícil leer el código en la pantalla o papel, y / o ingresar en la tarjeta perforada
- esto aumenta los tiempos de depuración
- esto dificulta la comprensión del código para la actualización / mantenimiento
- Esto puede conducir a una duplicación de código no deseada
- aumenta un poco la probabilidad de error de sintaxis
- disminuye la flexibilidad de codificación, ya que la mayoría de los lenguajes detallados están altamente estructurados y no tienen múltiples formas de decir lo mismo.
- aumenta los tiempos de codificación y compilación
- Puede tomar más espacio de almacenamiento.
Sin embargo, un cierto nivel de verbosidad es esencial para la claridad ...
un nivel mínimo de verbosidad es bueno porque:
- Es más fácil para los humanos leer y atribuir valor semántico que un código puramente simbólico
- En los nombres de variables y funciones, facilita la depuración, el puerto y el mantenimiento del código
- en operaciones de lenguaje de nivel base y palabras clave de idiomas complejos, conduce a menos operaciones incorrectas / asignaciones de palabras clave.
Algunos ejemplos maravillosos de comandos demasiado concisos para muchas personas incluyen los viejos modos BASIC de val(x$)
, str$(x)
y chr$(x)
... devuelven un número de su representación de cadena, devuelven una cadena para un número y devuelven un solo carácter que tiene un valor ascii x como cadena.
O el puntero C / C ++ y por operadores de referencia &
y *
contra la byref
palabra clave BASIC . En C / C ++, puedo tener una variable X y pasar un puntero a esa variable, pero tengo que recordar cuál es el puntero y cuál es el "usar puntero como la variable a la que apunta"; en básico, simplemente paso la referencia con una palabra clave byref en la llamada a la función, que es más clara, pero menos flexible:
def fn Foo(x byref as float) foo= (x += x+1)
...
Foo(x)
En este código, el contenido de x se modifica debido al indicador byref. Algunos sabores permiten byref en llamada, otros en definición, algunos en cualquiera.
La verbosidad es importante para que los programadores casuales puedan usar el simbolismo más fácilmente; BASIC o python son más legibles para los humanos y más detallados que C / C ++, y por lo tanto mucho más útiles para programadores casuales; La brevedad de C / C ++ lo hace mucho mejor para los programadores más experimentados, que necesitan ver más código y código más complejo en una sola pantalla, pero han tenido que aprender las diversas convenciones de estructura simbólica. En el otro extremo está APL, que es casi completamente humano ilegible.
Un tema íntimamente relacionado es la claridad: el código breve a menudo no está claro, y el código excesivamente detallado (como en AppleScript) puede ser igualmente incierto. La familiaridad con un lenguaje dado aumenta la claridad del código conciso dentro de ese lenguaje: un principiante en bruto, que enfrenta el código C ++ es probable que pueda analizar solo las fórmulas, e incluso mucho código BASIC o Python funcional es demasiado conciso para la comprensión, pero AppleScript puede estar desconcertado, en general, sin recurrir a diccionarios de idiomas. Lo menos claro que he encontrado sin ofuscación intencional es Inform 7 ...
En los viejos tiempos
Otra consideración importante en el pasado, pero que ya no es tan importante para el codificador de pasatiempos, es el espacio de operación y almacenamiento. (Sigue siendo vital en el extremo superior). Teniendo en cuenta que se interpretaron muchos idiomas, especialmente los sabores BÁSICOS, y muchos más se compilaron en tiempo de ejecución, el espacio de código era importante, especialmente cuando los discos solo contenían 128 KB y las tarjetas perforadas individuales solo 80 B.
Existían varias soluciones: la tokenización era extremadamente común en BASIC; las palabras clave de idioma individuales se redujeron a una palabra de 1 o 2 bytes en el espacio superior de 128 o en el espacio de caracteres de control. La tokenización también conduce a la compilación de bytecode (como en Inform y la máquina Z).
La compilación y vinculación de archivos de objetos múltiples también se utilizó para sortear las limitaciones de espacio. Una sección de código Pascal de 100 KB puede compilarse a solo 5 KB; Al vincular múltiples archivos compilados, uno podría construir aplicaciones masivas sin tener acceso a unidades de gran formato (recordando que 10MiB era asombrosamente grande, y comprar un auto nuevo caro).
Sin embargo, los lenguajes más concisos obtuvieron más código en una porción dada de disco y ram, y así compilaron porciones más grandes a la vez. Teniendo en cuenta: las "minicomputadoras" de principios de la década de 1970 podrían tener solo 64KiB de ram (Honeywell 800 tenía una instalación base de 4 bancos cada uno de 2048 palabras de 8B cada una). APL y lenguajes simbólicos similares se acercaron a 1B por instrucción más sus operandos, en comparación con los 3B-10B mucho más grandes por instrucción más operandos. (Fue una pesadilla escribir en tarjetas perforadas, especialmente porque los símbolos eran esencialmente una fuente en type-ball, y muchos punzones no tenían los símbolos en las teclas ...)
Además, tenga en cuenta que las tarjetas no se pueden borrar ... y muchos programas se ingresaron en las tarjetas. Si bien no es costoso individualmente, cuanto más comprimido esté su código en la tarjeta, menos necesitará y más grandes serán los programas o menos costosos. Esto es parte de la razón por la que BASIC tiene una concatenación de múltiples instrucciones por línea en la mayoría de los sabores: se introdujo para ahorrar en tarjetas perforadas. (O eso dice mi texto de programación de Vax Basic). Si bien no he programado para un lector de tarjetas, he hecho la perforación de la tarjeta para un Honeywell 800 en FORTRAN, BASIC, APL y un par de otros lenguajes altamente simbólicos.