2010-07-21 20 views
5

Mire, por ejemplo en AppleScript (y hay muchos otros, algunos ciertamente bastante buenos) que publicitan su uso de la metáfora del lenguaje natural. El código es aparentemente más legible porque puede ser/está destinado a ser construido en oraciones similares al inglés, dice ellos. Estoy seguro de que hay personas a las que nada les gustaría más que programar utilizando solo frases en inglés. Sin embargo, tengo dudas sobre la viabilidad de un lenguaje que lleva ese paradigma demasiado lejos (exceptuando los casos de nicho).¿La similitud con el "lenguaje natural" es un argumento de venta convincente para un lenguaje de programación?

Entonces, después de cierto punto razonable, ¿es el natural-languaginess un beneficio o un error? ¿Qué pasa si el concepto se lleva a un extremo? ¿El código será necesariamente más legible? ¿O podría ser innecesariamente largo, difícil de trabajar, y tan capaz de producir hilaridad en la escala de Perl ofuscado, C ofuscado, y la locura de escritura Bash?

Conozco algunos casos especiales como "Informar" que son inglés casi puro, pero estos tienen un nicho del que no es probable que salgan. Escucho y leo acerca de cuán grande sería para el código leer más como oraciones en inglés, pero ¿hay discusiones sobre las posibles desventajas? Si el lenguaje cotidiano es tan claro, simple, limpio, encantador, conciso, comprensible, ¿por qué inventamos la notación matemática en primer lugar?

¿Es realmente más fácil describir las instrucciones complejas de forma precisa y precisa en una máquina en lenguaje natural, o no es algo más parecido al lenguaje matemático una opción mucho mejor? ¿Dónde debería trazarse esa línea? Y, por último, ¿te atraen los idiomas que se consideran como frases en inglés? En caso de que toda esta cuestión simplemente haber sido un chiste:

naturalLanguage > computerishLanguage ? booAndHiss : cheerLoudly; 
+0

: -o ............. – PHP

+1

¿No te refieres a 'MAX (naturalLanguage, computerLangauge)'? –

+2

¿hay algo llamado Perl ofuscado? Pensé que todo en Perl está ofuscado :-) .. – Naveen

Respuesta

5

Mi respuesta a esto sería que el lenguaje de programación ideal se encuentra en algún lugar entre un lenguaje natural y un lenguaje muy formal.

En un extremo, están los lenguajes formales, mínimos y matemáticos. Tomemos, por ejemplo Brainfuck:

,>++++++[<-------->-],[<+>-]<. // according to Wikipedia, this means addition 

O, lo que es algo preferible el desorden anterior, cualquier tipo de lambda calculus.

λfxy.x 
λfxy.y 

Esta es una forma posible de expresar los valores de verdad booleanos en cálculo lambda. No se ve muy bien, especialmente cuando construyes operadores lógicos (como AND siendo, por ejemplo, λpq.pqp) a su alrededor.

Reclamo que la mayoría de la gente podría no escribir el código de producción en un lenguaje tan minimalista y difícil de comprender.


El problema en el otro extremo del espectro, las lenguas saber naturales medida que se pronuncian por los seres humanos, es que las lenguas con demasiada complejidad y flexibilidad permite al programador para expresar cosas vagas e indefinidas que pueden significar nada las computadoras de hoy. Tomemos este programa de ejemplo:

MAYBE IT WILL RAIN CATS AND DOGS LATER ON. WOULD YOU LIKE THIS, DEAR COMPUTER? 
IF SO, PRINT "HELLO" ON THE SCREEN. 
IF YOU HATE RAIN MORE THAN GEORGE DOES, PRINT SOME VAGUE GARBAGE INSTEAD. 
(IN THE LATTER CASE, IT IS UP TO YOU WHERE YOU OUTPUT THAT GARBAGE.) 

Ahora bien, este es un caso obvio de vaguedad. Pero a veces te lo dan cosas mal con programas de lenguaje natural más razonables, tales como:

READ AN INTEGER NUMBER FROM THE TERMINAL. 
READ ANOTHER INTEGER NUMBER FROM THE TERMINAL. 
IF IT IS LARGER THAN ZERO, PRINT AN ERROR. 

¿Qué número es IT refiere? Y qué tipo de error se debe imprimir (se olvidó de especificarlo). — Debería ser realmente teniendo cuidado de ser extremadamente explícito sobre lo que quiere decir.

Ya es muy fácil confundir a otros humanos. ¿Cómo esperas que una computadora funcione mejor?

Por lo tanto, la sintaxis y la gramática de un lenguaje informático tienen que ser lo suficientemente estrictas para que no permita la ambigüedad. Una declaración debe evaluar de una manera determinista. (Quizás haya casos de esquina, estoy hablando del caso general aquí.)


Personalmente prefiero los idiomas con un conjunto muy limitado de palabras clave. Puede aprender rápidamente ese idioma y no tiene que elegir entre 10,000 formas de lograr un objetivo simplemente porque hay 10,000 palabras clave para hacer lo mismo (como en: GO/WALK/RUN/TROD/SLEEPWALK/etc. TO THE FRIDGE AND GET ME A BEER!) Significa que si necesitas pensar en 10,000 maneras diferentes de hacer algo, no será por el lenguaje, sino porque hay 9,999 maneras estúpidas de hacerlo, y 1 solución elegante que simplemente brilla más que todas los demás.

Tenga en cuenta que escribí todos los ejemplos de lenguaje natural en mayúsculas. Eso es porque tenía una especie de buena GW-BASIC y COBOL en mente mientras escribía esto. Hubo algunos ejemplos de lenguajes de programación que se apoyan en el lenguaje natural, y creo que la historia ha demostrado que, en general, están algo menos difundidos que, por ejemplo. lenguajes estilo C escuetos.

+0

Si estuviera escribiendo ese segundo idioma, tendría "TI" como una palabra clave incorporada que hace referencia a la última variable/objeto sobre el que actúa el código. (Que puede ser el mismo que el último uso de "IT"). – JAB

+0

@JAB: en un lenguaje de programación similar al lenguaje natural, lo más probable es que ni siquiera tenga el _concepto_ de palabras clave como sabemos si proviene de la programación "normal" idiomas. – stakx

+0

Tienes un punto. – JAB

14

Bueno, por supuesto, las lenguas naturales son raramente claro, simple, limpio, encantador, concisa, comprensible que es una de las razones por las que la mayoría de programación es hecho en idiomas lejos de natural.

+0

Muchos grandes comedias y comedias de sitcom se basan en la cantidad de oportunidades para la mala comunicación en el lenguaje natural. – Thien

0

Parece ser una gran característica para principiantes, o personas que programan como una "actividad secundaria". Pero dudo que pueda alcanzar la complejidad y la polivalencia de los lenguajes de programación reales con el lenguaje natural.

4

Recientemente leí que de acuerdo con Gartner hay más de 400 mil millones de líneas de código fuente COBOL en uso activo en todo el mundo en la actualidad.

Eso no prueba nada más que los bancos y los gobiernos son aficionados a su código heredado, pero podría interpretarlo como un testimonio del éxito de los lenguajes de programación similares al inglés. No conozco ningún otro lenguaje de programación que esté tan cerca del inglés y tan detallado.


Aparte de eso, estoy de acuerdo con el resto de los encuestados: Los programadores prefieren no escribir tanto, y en un lenguaje general basada en la taquigrafía matemática similar es tanto más expresiva y más precisa que una basada en Inglés.

Hay un punto en el que el código expresivo y escueto se parece al ruido de la línea. Perl, APL y J vienen a la mente como ejemplos con "frases ilegibles de una sola línea". Los programadores son humanos, y puede ser beneficioso dejarlos con alguna similitud con el lenguaje natural para darles a sus cerebros algo familiar a lo que aferrarse. Por lo tanto, propago un medio feliz que recuerda pero no demasiado cerca del lenguaje natural.

+1

400 mil millones de líneas de COBOL ... Con un éxito como este, ¿quién necesita fracasar? – Rab

+0

APL, no, acabas de traer flashbacks del infierno APL. – HLGEM

0

Si existiera un lenguaje de programación que realmente se adhiriera a todas las convenciones del lenguaje natural que imita, sería fantástico.

En realidad, sin embargo, una gran cantidad de los llamados lenguajes de programación "naturales" tienen una sintaxis mucho más estrictas que Inglés, lo que significa que a pesar de que son fáciles de leer, es discutible si son realmente tan fácil de escribir.

Lo que tiene sentido en inglés es a menudo un error de sintaxis en AppleScript.

1

Un lenguaje natural es demasiado ambiguo para ser utilizado como lenguaje de programación. Tiene que ser restringido artificialmente para eliminar ambigüedades.

Pero se le niega el propósito de tener un lenguaje de programación "natural", porque tiene su verbosidad y ninguna de sus ventajas en cuanto a expresividad.

2

El problema no es tanto que sea más fácil describir ideas complejas usando un enfoque u otro, sino que es más fácil entender los lenguajes de máquina (al menos para máquinas). El mayor problema es, como siempre, ambigüedad. Las computadoras son terribles para entenderlo, por lo que la mayoría de las gramáticas para lenguajes de programación necesitan para eliminar toda ambigüedad o el lenguaje general debe construirse de modo que la ambigüedad no sea realmente un problema (esto es complicado).

Cualquier lenguaje de programación que permita la ambigüedad sería terriblemente propenso a errores; y cualquier lenguaje natural que no permite permitir que la ambigüedad sea terriblemente prolija y complicada (te estoy mirando, Lojban [vale, tal vez Lojban no es tan malo, todavía ...]).

La propensión que algunas personas muestran por preferir los lenguajes naturales para lenguajes de programación podría esencialmente erradicar el deseo de eventualmente poder ingresar un libro de texto de física en un analizador sintáctico, y luego harán su tarea cuando se les solicite.

Por supuesto, eso no quiere decir que los lenguajes de programación no deberían tener consejos del lenguaje natural: Especialmente para programación orientada a objetos es de sentido común para tener la gramática llamando asemejan a la gramática natural, como en Obj-C, que es una especie de un juego de espacios para rellenar:

[pot makeCoffee:strong withSugar:NO]; 

hacer lo mismo en BrainFuck sería, así, un brainfuck, tres páginas completas de código para accionar un interruptor va a hacer eso.

In essensce; los mejores idiomas son (probablemente) los que se parecen a los lenguajes naturales, sin pretender ser uno. (Evitando el misterioso valle de los lenguajes de programación, [si existe tal cosa] si lo desea. [Subcláusulas! ¡Sí!])

+0

Gerald Jay Sussman escribió un libro de texto de física llamado * Estructura e Interpretación de la Mecánica Clásica * que usa el Esquema en lugar de la notación matemática tradicional, precisamente * porque * del problema de la ambigüedad. El hecho de que esto también le permita "ingresar un libro de texto de física en un analizador sintáctico, con lo cual hará su tarea cuando se le pregunte" es solo un efecto secundario de eso, el objetivo principal es hacer que la física sea más fácil de aprender al no tener que luchar con notación arcana, ambigua, informal. –

4

"Cuando se crea un lenguaje de programación que permite a los programadores programar en inglés simple, lo hará ser descubierto que los programadores no pueden hablar inglés ". ~ Desconocido

+1

¡Incluso aquellos de nosotros que "hablamos inglés" como lengua materna! – HLGEM

0

Everyday language no es tan claro, simple, limpio, adorable, conciso y comprensible - a una computadora. Sin embargo, para un ser humano, la legibilidad cuenta mucho, y cuanto más te acercas a un lenguaje natural, más fácil es leerlo. Es por eso que no todos estamos usando el lenguaje ensamblador.

Si usted tiene un lenguaje completamente natural, hay un montón de cosas que necesitan ser manejadas - la sentencia tiene que ser analizada, cada palabra debe entenderse - y hay un montón de espacio para la ambigüedad. En general, eso no es algo bueno para un lenguaje de programación, porque entonces nos estamos aventurando en la programación psíquica: la computadora tiene que descubrir lo que estás pensando, lo cual no es nada fácil de conseguir.

Sin embargo, si puede hacer algo lo suficientemente parecido al lenguaje natural, y sí, Inform 7 es probablemente el mejor ejemplo, las frases se ven naturales, pero todavía tiene alguna estructura que debe seguir, entonces el código es casi instantáneamente legible , incluso a personas que no conocen el idioma. Por lo general, también hay una sintaxis menos especializada que recordar, porque en realidad solo estás hablando (una forma ligeramente modificada) de inglés, pero si tienes que hacer algo fuera de lo común, entonces tendrás que pasar por algunos aros para hacerlo.

En la práctica, la mayoría de los idiomas no se molestan con esto, porque eso les permite ser más precisos. Sin embargo, algunos aún se acercarán más al "lenguaje natural". Esto puede ser algo bueno: si tiene que traducir algún algoritmo de pseudocódigo a un idioma, no necesita manipularlo tanto para hacerlo funcionar, lo que reduce el riesgo de que cometa un error en la traducción.

Como ejemplo, comparemos C y Pascal. Este código Pascal:

for i := 1 to 10 do begin 
    j := j + 1; 
end; 

es equivalente a este código C:

for (i = 1; i <= 10; i++) { 
    j = j + 1; 
} 

Si usted no tenía ningún conocimiento previo de cualquiera de sintaxis, la versión de Pascal es por lo general va a ser más fácil de leer, aunque sólo sea porque no es tan complejo como una C para.

Consideremos también los operadores. Pascal y C comparten +, - y *. También ambos tienen /, pero con semántica diferente: en C,/hace una división entera si ambos operandos son enteros; en Pascal, siempre hace una división "real" y usa div para la división de enteros. Eso significa que debes tener en cuenta los tipos al determinar qué sucede realmente en esa línea de código.

C también tiene un montón de otros operadores: & &, ||, &, |, ^, < <, >> - en Pascal, los operadores están en su lugar nombró and, or, and, or, xor, shl , shr. En lugar de confiar en una secuencia semi-arbitraria de caracteres, se detalla más. Es instantáneamente obvio que xor es, bueno, XOR, a diferencia de la versión C, donde no existe una relación obvia entre^y XOR.

Por supuesto, esto es hasta cierto punto una cuestión de opinión: prefiero una sintaxis similar a Pascal a una sintaxis similar a C, porque creo que es más legible, pero eso no significa que todos los demás lo hagan: A el lenguaje más natural suele ser más detallado, y algunas personas simplemente no les gusta ese nivel extra de verbosidad.

Básicamente, es una cuestión de elegir lo que tiene más sentido para el dominio del problema: si el dominio del problema es muy limitado (al igual que con Inform), a continuación, un lenguaje natural tiene mucho sentido.Si se trata de un dominio muy genérico (como con C), entonces necesita un procesamiento mucho más avanzado de lo que actualmente somos capaces, o una gran cantidad de detalles para completar los detalles, y en ese caso, debe elegir un equilibrio dependiendo de sobre qué tipo de usuarios usarán los idiomas (para las personas normales, necesitas más naturalidad, para las personas que conocen la programación, suelen ser lo suficientemente cómodos con los idiomas menos naturales y prefieren algo más cercano a ese fin).

3

En mi (no tan) humilde opinión, no.

El lenguaje natural está lleno de ambigüedades. Normalmente no pensamos en ellos porque los humanos pueden fácilmente eliminar la ambigüedad de ellos, según muchos criterios que a menudo no están disponibles para la computadora. En primer lugar, tenemos conocimiento del mundo (los elefantes no caben en pijamas), pero también usamos más sentidos que solo oír cuando nos hablamos, el lenguaje corporal para nombrar uno. La entonación y la manera en que se dicen las cosas también ayudan a desambiguar. Es más difícil captar la ironía o el sarcasmo en el texto escrito, que es más o menos una transcripción de lo que diríamos, más en el caso de IM menos en el caso de artículos bien escritos. En general, hay montones y montones de ambigüedad en el lenguaje natural, por ejemplo, cuando el PP, frases preposicionales adjuntar:

"Workers [dumped [sacks [with flour]]]" 
"Workers [dumped [sacks] [with a fork-lift]]]" 

Cualquier ser humano dice inmediatamente que el PP va a unir, es razonable tener sacos con harina en ellos, y es razonable usar una carretilla elevadora para descargar algo. Otra área muy problemática es la palabra "y" que arruina la gramática horrendo, o todas las referencias que usamos, los pronombres en general, pero también las referencias más complejas, es decir. "Bill compró un Dodge Viper, por desgracia, el coche era un limón".

Así que tenemos tres opciones, mantener las ambigüedades y tratar de lidiar con ellas, aceptando muchos errores de desambiguación y muy lento de análisis, no LALR o LL funcionarán aquí, o intentarán hacer una gramática artificial parecida a la natural lenguaje, y mantenerlo determinista, que es más razonable pero aún horrible. Ahora tenemos un lenguaje que se asemeja falsamente al inglés, pero no es lo que es confuso. No tenemos ninguno de los beneficios de una sintaxis adecuada y ninguno de los beneficios del lenguaje natural, sino un monstruo demasiado grande y sobredimensionado, con una gramática difícil de entender y intuitiva, difícil de aprender y lenta para escribir.

La tercera forma es darnos cuenta de que necesitamos una forma concisa de expresarnos, que también puede ser procesada por una computadora, no se asemeja a ningún lenguaje natural, sino que se centra en ser una descripción inequívoca de un algoritmo. Esto aumentará la legibilidad, especialmente si lo comparamos con una parte de contador de lenguaje natural muy precisa. Esta es la razón por la cual muchas personas prefieren leer el pseudocódigo cuando se trata de problemas difíciles o algoritmos avanzados, nos alivia de los problemas para manejar las ambigüedades y es más óptimo para expresar las instrucciones de la computadora.

+0

Personalmente, yo diría sacos de harina, pero así soy yo. – JAB

1

Creo que el cuarto idioma que codifiqué profesionalmente (después de Fortran, Pascal y Cobol) fue Natural. Que es una 4GL bastante oscura de la añada de 1980 para el desarrollo de sistemas mainframe contra una base de datos ADABAS.

Llamado Natural Creo porque tenía la pretensión de serlo. Supuestamente legible por la gerencia como el cobol, pero sin la pelusa.

Lo que debería decirle que los intentos de lenguajes de programación "naturales" tienen una historia comercial de más de 30 años (más si se cuenta el cobol) pero que han perdido idiomas que no pretenden ser "naturales" 'pero permita que el programador defina el problema de manera sucinta. Cuando comencé a codificar el 1GL -> 2GL -> 3GL, la evolución no era tan antigua y la progresión a 4GL (definida entonces como un lenguaje de programación más similar al inglés) para el trabajo principal parece un siguiente paso obvio. No funcionó de esa manera. Si algo se pone al día con la codificación ahora es más difícil porque hay más conceptos abstractos para aprender.

0

Creo que la pregunta es, ¿quién lee y quién escribe el código de la aplicación en cuestión? Creo que, independientemente del idioma o la arquitectura, un desarrollador de software capacitado debe escribir el código y analizar el código a medida que surgen errores.

1

SQL fue diseñado con el lenguaje natural en mente originalmente. Afortunadamente, no se ha aferrado demasiado a esto y avanza ya que su concepción es menos "naturalista".

Pero cualquiera que haya intentado escribir una consulta complicada en SQL le dirá que no es tan fácil. Te preocupa el rango de algunas palabras clave sobre tu consulta. Tienes esta pregunta increíblemente difícil de entender, que hace una mierda loca, pero la reescribes cada vez que necesitas cambiar algo porque es más fácil.

La programación del lenguaje natural es una mala idea. cuanto más se obtiene del ensamblado, más errores se pueden cometer, no en términos de errores lógicos ni nada por el estilo, sino en términos de tener una suposición errónea sobre cómo el intérprete de script/bytecode intepreter/compilador hace que su código se ejecute en la CPU .

+0

Buena respuesta. +1 – Rab

Cuestiones relacionadas