2010-09-07 8 views
12

Prácticamente cada idioma que conozco es básicamente una variación de un tema: crea variables y funciones, luego las manipula utilizando condicionales y otras construcciones. Entiendo que la Programación Funcional y similares son algo diferentes de los lenguajes "tradicionales", pero por debajo son casi los mismos. Todavía está trabajando con variables (algo, aunque son inmutables y similares) y creando funciones.

¿Hay algún idioma o sistema que elimine completamente lo que tendemos a usar ahora y tiene un enfoque completamente diferente?¿Existen paradigmas de programación que no se basan en la manipulación de variables y funciones?

+0

¿Desea algo que no tiene funciones ni forma de almacenar resultados? – foraidt

+0

Debería echar un vistazo a http://en.wikipedia.org/wiki/Programming_paradigm –

+0

@mxp - No, lo que estoy preguntando es si hay una alternativa a nuestro sistema actual. Obviamente, habría una manera de almacenar valores, solo estoy preguntando si hay otro enfoque al respecto. – bennybdbc

Respuesta

8

No es un idioma per se, pero analog computers son de alguna manera bastante diferentes de las computadoras digitales más populares.

+0

Esta respuesta es lo más cercano a estar fuera de la definición de "variación en un tema" del póster. –

6

Bueno, hay Piet. Eso es bastante diferente. (A continuación se muestra Hello World en Piet). Aunque incluso así, podría argumentar que se trata de una estructura de datos (en este caso, una pila) que contiene un cierto número de enteros y luego está agregando y eliminando cosas de la pila, manipulando los valores, etc. así que en realidad sigue siendo el mismo.

alt text

+0

esto se ve muy bien ... – pop850

1

Salida Forth, que es un sistema bastante diferente, donde casi todo es acerca de cómo manipular una pila. Es casi como una pequeña máquina virtual muy primitiva.

8

Ha habido varios intentos en los lenguajes gráficos. El sistema LabVIEW de National Instruments es probablemente el más exitoso. Utiliza un gráfico del flujo de datos con componentes que actúan sobre los datos.

Otro intento en un lenguaje gráfico es UML. Supongo que el jurado está en esto. Probablemente fue una buena idea antes de que un comité de estándares se involucrara y lo convirtiera en algo para todos.

Una gran cantidad de sistemas electromecánicos están controlados por PLC s, que son programados con ladder logic. Es esencialmente una disciplina para crear altamente confiables máquinas de estado finito , pero tiene muy poco parecido con los lenguajes de procedimiento .

Luego están los lenguajes esotéricos, oscuros y alternativos que en gran medida no sirven para otro propósito práctico que no sea recordarles a las personas que Turing-complete no requiere que el lenguaje sea sensato. Algunos podrían poner una máquina de Turing en esta categoría, pero BrainF*ck y Piet realmente se destacan por mí en esta multitud.

El lenguaje esotérico whenever es también un ejercicio interesante ya que no tiene ningún control de flujo.

Editar: Casi me olvido de Befunge. Su texto fuente es una grilla de caracteres ASCII, donde cada celda es un código de operación. La ejecución se ejecuta en cualquiera de las cuatro direcciones, por lo que es posible fluir a través de un único código de operación en cuatro secuencias diferentes. Es otro lenguaje esotérico, y fue diseñado para ser lo más difícil posible (en 1993) para escribir un compilador. No es que eso haya impedido que alguien lo haga.

Varios de los idiomas que he señalado han sido idiomas esotéricos. En general, se trata de idiomas con comunidades de usuarios pequeñas (a menudo solo una o dos).Se crean por una variedad de razones, y explorar los límites de lo que significa ser completo y cómo uno puede representar un programa son las razones más serias citadas.

El abuelo de todos los lenguajes esotéricos es INTERCAL que se creó en 1972. Se trata de un lenguaje que superficialmente se parece a COBOL, pero que entre sus muchas peculiaridades requiere que el programa sea lo suficientemente educado (pero no demasiado educado) con el fin de continuar ejecutando En apoyo de la cortesía, PLEASE DO es una forma cortés de DO. Una extensión notable es la declaración COME FROM, que puede hacer que el control fluya aquí desde la ubicación indicada.

+2

+1 por mencionar a Piet – hydrogen

+0

@hydrogen, aunque ciertamente no es un lenguaje en el que escribiría el código, seguro que es bonito. – RBerteig

+0

Excelente respuesta, gracias. La lógica de escalera ciertamente parece interesante. – bennybdbc

15

A pesar de su descarado despido de Functional Programming, creo que debe volver a consultarlo solo esta vez leyendo para comprensión y aprendizaje en lugar de utilizar el sesgo de confirmación para descartarlo como "más de lo mismo". Escribir código en un estilo funcional es profundamente diferente que escribir código en un imperative style. Si no es lo suficientemente diferente para que, sin embargo, ¿por qué no echar un vistazo a cualquiera de estos ?:

  • Logic programming tipificado por lenguajes como Prolog y (IIRC) Mercury.
  • Concatenative lenguajes como Forth son bastante trippy.
  • Function-level programming (¡a diferencia de lo funcional!) Deshazte de las variables si eso es lo que te ofende sobre el cálculo. J es prácticamente tu única opción en este ámbito en estos días.
  • Array programming es bastante estrecha relación con lo anterior. Echar un vistazo a APL para el ejemplo clásico de esto (aunque J y K ambos tienen elementos de este año).

Básicamente, sólo tiene que buscar en cualquiera de las docenas de programming paradigms disponibles y leer las descripciones para la comprensión y la iluminación en lugar de despido a través de sesgo de confirmación. Aprende un idioma por cada uno que parezca lo suficientemente diferente para la vaga definición de "diferente" que estás usando y diviértete.

+0

+1 Buena respuesta. Solo para el registro, no estaba reduciendo la programación funcional en mi pregunta, solo quería obtener otras respuestas. – bennybdbc

+0

No pensé que lo estabas bajando. Pensé que lo estabas descartando por motivos inválidos. ;) –

+0

¿Cuál es la diferencia entre un "despido arbitrario" y una decepción? De hecho, tat no * rechazó * la programación funcional en absoluto y su respuesta es grosera al acusarlo de no comprender o aprender de lo que leyó. Los parámetros de su pregunta son completamente legítimos y los términos que usa son correctos. Tanto los paradigmas funcionales como los OO son los mismos * en la medida en que presentan la declaración de variables y funciones *, que es lo que concierne a su pregunta. –

3

Depende de lo que pregunte, pero la respuesta es probablemente no.

La razón es que todos los lenguajes de computadora actuales que son Turing Complete son, bueno, Turing completos. Esto significa que cualquiera de estos idiomas puede ser simulado por cualquiera de los otros en este grupo. Entonces, cualquier lenguaje de programación puede tener un compilador o intérprete que pueda ejecutarse en nuestras computadoras actuales (aproximación). Estos tienen arquitectónicamente el concepto de código y datos.

Por lo tanto, si usted piensa que la programación funcional y la programación imperativa ('tradicional') son las mismas porque debajo se ejecutan en una computadora, entonces no hay otras opciones.

código y los datos se traducen en funciones y estructuras de datos (variables). Permiten variaciones:

  1. La inmutabilidad es el factor principal para la programación funcional.
  2. La diferencia entre el código y los datos pueden ser borrosa. Por ejemplo, homoiconicity significa que una función se puede usar como estructura de datos. Ver los lenguajes Lisp.
  3. Relacionados con esto es self-modifying code.

Por otro lado, la forma de expresar el programa puede ser escrito también un poco diferente. El uso de la composición de funciones como base puede conducirlo en la dirección de la programación concatenativa, aunque la programación del flujo de datos (incluidos muchos lenguajes gráficos) y la programación funcional también lo soportan de manera similar.

El último grupo de formas de expresar un lenguaje son los que modelan como una optimización o proceso de búsqueda a través de una estructura de datos:

  1. programación lógica como Prolog.
  2. Evolutionary Computation genera el programa en un lenguaje de programación estándar. Pero presumiblemente se puede escribir un lenguaje descriptivo que pueda "ejecutarse" para encontrar el programa resultante y ejecutarlo. Esto también se puede usar para muchos métodos de aprendizaje automático.

Esto es algo académico. Mi consejo es que intente identificar lo que quiere decir con diferente. Probablemente, la programación funcional es lo suficientemente diferente para sus propósitos.

Editar: Acabo de notar el uso de la expresión "manipularlos utilizando condicionales y otras construcciones". Las construcciones de flujo de control no necesitan ser construcciones diferentes para el código y los datos. Por ejemplo, un if condicional se puede expresar como filter o un bucle se puede expresar como map. Dadas las funciones de orden superior y la evaluación diferida, puede prescindir de un if o for explícito, utilizando únicamente funciones y estructuras de datos. Eso no significa que realmente hayas perdido la habilidad de hacer eso. Puede que le interese Haskell si quiere ver algo así.

Además, vea las otras respuestas para los idiomas que se ven diferente, como lenguajes gráficos y lenguajes esortic, sin dejar de utilizar las funciones aplicadas a las estructuras de datos con enfoque de estructuras de control.

+0

Una observación sobre su segundo párrafo: la completitud de Turing caracteriza la computación * secuencial *. Pero no tenemos ningún modelo universal de concurrencia: los idiomas concurrentes (especialmente aquellos que modelan la distribución) sí tienen una expresividad diferente. – Gilles

+0

@Giles: ¿Puedes dar un ejemplo de un idioma simultáneo que es más poderoso que Turing? O si te entendí mal, ¿qué quieres decir con "expresividad"? Hay modelos para programación concurrente como el cálculo Pi. –

0

No se trata del idioma, es lo que se hace con él lo que hace la mayor diferencia. Muchos idiomas te empujarán en una dirección determinada, los lenguajes funcionales puros como Haskell harán que sea prácticamente imposible programar imperativamente, por ejemplo, pero mientras no te tomes el tiempo para aprender los paradigmas, la mayoría de los idiomas se verán igual que la máquina el lenguaje que se está ejecutando, evaluando los condicionales y asignando valores a los espacios de memoria.

Los paradigmas le dan las abstracciones que está buscando. Un buen código orientado a objetos o funcional no se parecerá en nada a lo que describes. Y no necesitas idiomas para hacer esto. He visto un gran código orientado a objetos escrito en C simple y código funcional en C++. Aunque usar el lenguaje correcto para el trabajo correcto ayuda mucho. Lamentablemente, las cosas también funcionan al revés. Si no te tomas el tiempo para entender los paradigmas, escribirás un código imperativo en Scheme o Smalltalk.

3

Buena pregunta. Retrocedamos un paso. En mi primer intento, intentaré explein, que lo que estás buscando no es un lenguaje nuevo, sino una nueva arquitectura, y estoy seguro de que conoces al menos los más importantes.Hace

de 20 años, los programas de ordenador se construyeron usando la lógica "en serie", al igual que un programa básico:

10 INPUT "PASSWORD: ";A$ 
20 IF A$="PASSWORD" THEN GOTO 40 
30 PRINT "TRY AGAIN" : GOTO 10 
40 PRINT "WELCOME" 

programas de MS-DOS son los mismos: se ejecutan para un wile, a continuación, a la espera de la entrada del usuario, luego corre de nuevo. En los sistemas Unix, incluso si se trata de un sistema multitarea, el juego es muy similar, más de un usuario puede ejecutar programas de esa manera.

Había dos onda berakthrough:

  • sistemas basados ​​en eventos: el flujo del programa ha cambiado radicalmente (controladores de eventos, de devolución de llamada, oyente);
  • sistemas web, especialmente AJAX: el programa se ejecuta en diferentes máquinas (procesamiento distribuido, arquitectura cliente-servidor, servicio).

Mientras tanto, la construcción de compilación y el programa se cambia, pero creo que algunos menos:

  • metaprogramming (generador de código basado en IDE, preprocesador),
  • pluging thecnique,
  • bibliotecas dinámicas .

Además, entornos de destino de programación cambió mucho:

máquinas
  • virtuales (Java),
  • plataformas de intérprete (PHP),
  • servicios del sistema,
  • marcos,
  • portal sistemas (Drupal).

Algunos programas grandes, gordos se convirtió en la plataforma:

  • Lotus Notes (propio idioma, y ​​ahora: Java),
  • MS Excel (Visual Basic).

No mencioné ningún lenguaje nuevo, pero puede haber programación tan diferente incluso en el mismo idioma, por ejemplo, escribiendo un juego J2ME para teléfono móvil y escribiendo procedimientos almacenados para Oracle SQL, ambos en JAVA.

Tal vez lo que está buscando no son los lenguajes de programación. Digamos que la tarea es mostrar una lista de datos, alguna tabla en un navegador. La aplicación web debería verse:

  • Un script PHP realiza la consulta SQL, y un sistema de plantillas inserta los datos obtenidos en una plantilla HTML preparada.
  • Una secuencia de comandos PHP pone los datos obtenidos de SQL en un XML, y el navegador los convierte a HTML final utilizando la transformación XSLT.
  • Una aplicación de JavaScript solicita los datos del script PHP, que envía el resultado de SQL en formato JSON, luego la aplicación JS representa el HTML final.

¿HTML + XSLT es un lenguaje de programación? No. ¿Realizan la misma tarea que el PHP hace en el lado del servidor, o JS lo hace en el lado del cliente? Absolutamente ¿Es una plataforma común? Sí, todo el navegador lo admite.

Creo que hay suficientes lenguajes de programación de bajo nivel, me refiero a los procedimientos, OOP u otros lenguajes de Turing completos. El objetivo de los nuevos (menos-que-programación) idiomas es ser más eficaces : generación de código más rápido, las aplicaciones más flexibles de trabajo, apoyo de la comunidad, la escalabilidad, fácil maintanence, reutilización, etc.

(I dividido mi respuesta aquí ; en la siguiente parte, te mostraré uno, con el que estoy jugando durante un tiempo.)

0

Estudia en el Turing Machine. El artículo de Wikipedia enumera algunos simuladores en los que puede ejecutar programas. Será al menos estéticamente diferente.

1

Como dije, hoy hay muchas plataformas o entornos que se pueden programar. En el caso de alguna plataforma, puede elegir entre una larga lista de idiomas, p. Microsoft .NET, que se puede programar en VisualBasic, C# etc .; En otros casos, plataformas muy diferentes usan el mismo idioma, p. JAVA, que se utiliza en Android, procedimientos almacenados de Oracle SQL server, etc.

Además, existen lenguajes no de programación, que cubren un dominio o articulan algún tipo de configuración, que es muy simple como un lenguaje de programación real, pero se puede usar mejor que un lenguaje de programación. Un ejemplo: programación lógica de escalera de los PLC.

La programación de flujo de datos es uno de este tipo de programación. Veamos Wikipedia, lo que es la programación de flujo de datos (también llamada programación basado en flujo):

En informática, basada en el flujo de programación (FBP) es un paradigma de programación que define aplicaciones como redes de "recuadro negro "procesos, que intercambian datos a través de las conexiones predefinidas mediante el envío de mensajes, donde las conexiones se especifican de forma externa a los procesos. Estos procesos de caja negra se pueden volver a conectar interminablemente para formar diferentes aplicaciones sin tener que ser cambiado internamente. FBP es así naturalmente orientado a componentes.

de: http://en.wikipedia.org/wiki/Flow-based_programming, ver también http://en.wikipedia.org/wiki/Dataflow_programming

Los artículos de Wikipedia son grandes, y he respondido a algunas otras preguntas, por lo que no quiero repetirme. En cambio, estoy describiendo el lenguaje que estoy usando para mi servidor de flujo de datos asincrónico.

Hay 3 elementos de idioma.

  • declaración Componente

    cmp: Compara

Esto se refiere una instancia de componente, llamada "cmp", que es un tipo de comparación.

  • definición mensaje

    src.out >> cmp.value cmp.gt >> dst1.in cmp.lt >> dst2.in cmp.eq >> dst3.in

Las palabras antes de los puntos son los nombres de las instancias de los componentes, las palabras después del punto son nombres de puertos, el par componente-puerto izquierdo es la fuente, el derecho es el destino. (Los puertos son los puntos de pasador de componentes para enviar o recibir mensajes. Ver artículos Wkikpedia.)

  • Propiedades

    cmp.base = 8

Esto define el valor de un puerto de la instancia del componente.

(Al juntar estas líneas, obtenemos un programa de flujo de datos corto, lo que significa: un valor proviene de src, cmp verifica su valor y lo pasa a dst1, si es más de 8, dst2, si es menor que 8 y dst3 si es exactamente 8.)

Creo que este lenguaje cumple con sus criterios, no es de procedimiento, no hay variables tradicionales, no hay subrutina, no hay ciclo.

Es curioso que hay algunos proyectos serios, que implementa la programación de flujo de datos, sino que ni siquiera lo mencionan:

(no tengo ninguna página Web para mi proyecto de flujo de datos aún, está en construcción.)

Los programas de flujo de datos se pueden mostrar, o se pueden editar ted como gráfico (ver SynthEdit).

+0

+1 Gracias por la excelente respuesta y gracias por todo ese esfuerzo. Agregue el enlace a su proyecto cuando la página web esté lista, parece muy interesante. – bennybdbc

+0

Estamos un poco retrasados, pero estamos trabajando en ello http://homeaut.com/ – ern0

Cuestiones relacionadas