Cuando todo lo que tienes es un par de cortadores de pernos y una botella de vodka, todo se parece a la cerradura de la puerta de la casa de botes de Wolf Blitzer. (Reemplace eso con un martillo y un clavo si no lee xkcd)
Actualmente programo Clojure, Python, Java y PHP, así que estoy familiarizado con la sintaxis de C y LISP, así como con los espacios en blanco. Sé imperativo, funcional, inmutable, OOP y un par de sistemas de tipo y otras cosas. ¡Ahora quiero más!
¿Qué lenguajes adoptan un enfoque diferente y serían útiles para la elección práctica de herramientas o la comprensión teórica?
No tengo ganas de aprender otro lenguaje funcional (Haskell) u otro lenguaje imperativo de OOP (Ruby), ni quiero practicar lenguajes divertidos poco prácticos como Brainfuck.
Una cosa muy interesante que encontré son lenguajes basados en pila monoicónicos como Factor.
Solo cuando siento que entiendo la mayoría de los conceptos y tengo respuestas a todas mis preguntas, quiero comenzar a pensar en mi propio lenguaje de juguetes para contener todas mis preferencias personales.
Respuestas:
Las cuestiones de practicidad son muy subjetivas, por lo que simplemente diré que aprender diferentes paradigmas de lenguaje solo servirá para hacerte un mejor programador. ¿Qué es más práctico que eso?
Funcional, Haskell . Sé que dijiste que no querías hacerlo, pero realmente deberías reconsiderarlo. Has tenido una exposición funcional con Clojure e incluso Python, pero no la has experimentado al máximo sin Haskell. Si realmente estás en contra de Haskell, entonces los buenos compromisos son ML u OCaml.
Declarativo, Datalog : muchas personas recomendarían Prolog en este espacio, pero creo que Datalog es un ejemplo más claro de un lenguaje declarativo.
Array, J : acabo de descubrir J, pero creo que es un lenguaje sorprendente. Torcerá tu mente en un pretzel. Le agradecerás a J por eso.
Stack, Factor / Forth - Factor es muy poderoso y planeo investigarlo lo antes posible Forth es el abuelo de los idiomas de Stack y, como beneficio adicional, es fácil de implementar . Hay algo que decir sobre el aprendizaje a través de la implementación.
Flujo de datos, Oz : creo que la influencia de Oz está en alza y solo continuará creciendo en el futuro.
Basado en prototipos, JavaScript / Io / Self - Self es el abuelo y tiene una gran influencia en todos los lenguajes basados en prototipos. Esto no es lo mismo que la OOP basada en clases y no debe tratarse como tal. Muchas personas llegan a un lenguaje prototipo y crean un sistema de clase ad-hoc, pero si su objetivo es expandir su mente, entonces creo que es un error. Usa el lenguaje al máximo. Lea Organizar programas sin clases para obtener ideas.
Sistema experto, CLIPS : siempre recomiendo esto. Si conoce Prolog, es probable que tenga la ventaja en ponerse al día, pero es un lenguaje muy diferente.
Frink : Frink es un lenguaje de propósito general, pero es famoso por su sistema de conversiones de unidades. Creo que este lenguaje es muy inspirador en su incesante impulso para ser el mejor en lo que hace. Además ... ¡es realmente divertido!
Tipos funcionales + opcionales, Qi : usted dice que tiene experiencia con algunos sistemas de tipos, pero ¿tiene experiencia con sistemas de tipos "skinnable *? Nadie lo ha hecho ... pero deberían hacerlo. Qi es como Lisp en muchos aspectos, pero es tipo de sistema te dejará boquiabierto.
Actores + Tolerancia a fallas, Erlang : el modelo de proceso de Erlang recibe mucha atención, pero sus mecanismos de tolerancia a fallas e intercambio de código activo cambian el juego. No aprenderá mucho sobre FP que no aprendería con Clojure, pero sus características FT lo harán preguntarse por qué parece que no hay más idiomas que lo hagan bien.
¡Disfrutar!
fuente
¿Qué pasa con Prolog (para unificación / retroceso, etc.), Smalltalk (para "todo es un mensaje"), Forth (pulido inverso, intérpretes roscados, etc.), Scheme (continuación)?
No es un lenguaje, pero el Arte del Protocolo de Metaobjetos es algo alucinante
fuente
Yo segundo Haskell. No piense "Sé un Lisp, entonces sé programación funcional". ¿Has oído hablar de las clases de tipos? Tipos de datos algebraicos? Mónadas? Los lenguajes funcionales "modernos" (más o menos, al menos no de 50 años;)), especialmente Haskell, han explorado una gran cantidad de nuevos conceptos útiles muy poderosos. Las clases de tipos agregan polimorfismos ad-hoc, pero la inferencia de tipos (otra cosa que los idiomas que ya conoce no tienen) funciona de maravilla. Los tipos de datos algebraicos son simplemente impresionantes, especialmente para modelar estructuras de datos similares a árboles, pero también funcionan bien para enumeraciones o registros simples. Y mónadas ... bueno, digamos que las personas los usan para hacer excepciones, E / S, analizadores, listas de comprensión y mucho más, ¡de manera puramente funcional!
Además, todo el tema es lo suficientemente profundo como para mantenerlo ocupado durante años;)
fuente
C
Hay un montón de código C por ahí, definitivamente es práctico. Si también aprende C ++, hay mucho más código (y el salto es corto una vez que conoce C y Java).
También te da (o te obliga a tener) una gran comprensión de algunos problemas teóricos; por ejemplo, cada programa en ejecución vive en una matriz de bytes de 4 GB, en cierto sentido. Los punteros en C son realmente solo índices en esta matriz --- son solo un tipo diferente de entero. No es diferente en Java, Python, PHP, excepto que está oculto debajo de una capa de superficie.
Además, puede escribir código orientado a objetos en C, solo tiene que ser un poco manual sobre vtables y tal. La colección de rompecabezas portátil de Simon Tatham es un gran ejemplo de código C orientado a objetos bastante accesible; También está bastante bien diseñado y vale la pena leerlo para un programador C principiante / intermedio. Esto es lo que sucede también en Haskell: las clases de tipos son, en cierto sentido, "simplemente otra tabla".
Otra gran cosa acerca de C: participar en Q&A con programadores de C capacitados le dará muchas respuestas que explican C en términos de construcciones de nivel inferior, lo que construye su base de conocimiento más cercana al hierro.
Puede que me esté perdiendo el punto de OP --- Creo que sí, a juzgar por las otras respuestas --- pero creo que podría ser una respuesta útil para otras personas que tienen una pregunta similar y leen este hilo.
fuente
Del sitio de Peter Norvig:
"Aprenda al menos media docena de lenguajes de programación. Incluya un lenguaje que admita abstracciones de clase (como Java o C ++), uno que admita abstracción funcional (como Lisp o ML), uno que admita abstracción sintáctica (como Lisp), uno que admita declarativa especificaciones (como las plantillas Prolog o C ++), una que admite corutinas (como Icon o Scheme) y otra que admite paralelismo (como Sisal) ".
http://norvig.com/21-days.html
fuente
Me sorprende que después de 6 meses y cientos de votos, nadie haya mencionado SQL ...
fuente
En los tipos como teoremas / sistemas de tipos avanzados: Coq (creo que Agda también entra en esta categoría).
Coq es un asistente de prueba integrado en un lenguaje de programación funcional.
Puede escribir pruebas matemáticas y Coq ayuda a construir una solución. Puede escribir funciones y probar propiedades al respecto.
Tiene tipos dependientes, eso solo me voló la cabeza. Un simple ejemplo:
es la firma de una función que concatena dos matrices de tamaño n y m de elementos de A y devuelve una matriz de tamaño (n + m). ¡No se compilará si la función no devuelve eso!
Se basa en el cálculo de las construcciones inductivas, y tiene una teoría sólida detrás. No soy lo suficientemente inteligente como para entenderlo todo, pero creo que vale la pena echarle un vistazo, especialmente si te inclinas hacia la teoría de tipos.
EDITAR: Necesito mencionar: usted escribe una función en Coq y luego puede PROBAR que es correcta para cualquier entrada, ¡eso es increíble!
fuente
Una de las lenguas que estoy interesado para tener un punto de vista muy diferente (incluyendo un nuevo vocabulario para definir los elementos del lenguaje y una sintaxis diff radical) es J . Haskell sería la opción obvia para mí, aunque es un lenguaje funcional, ya que su sistema de tipos y otras características únicas abren su mente y le hacen repensar sus conocimientos previos en programación (funcional).
fuente
Al igual que fogus te lo ha sugerido en su lista, te aconsejo que también mires el lenguaje OzML / Mozart Muchos paradigmas, principalmente dirigidos a la programación de concurrencia / multi agente.
En cuanto a la concurrencia y el cálculo distribuido, el equivalente del cálculo Lambda (que está detrás de la programación funcional) se llama cálculo Pi.
Solo he comenzado a comenzar a analizar algunas implementaciones del cálculo Pi. Pero ya han ampliado mis concepciones de la informática.
fuente
La programación de flujo de datos, también conocida como programación basada en flujo, es un buen paso adelante en el camino. Algunas palabras de moda: procesamiento paralelo, creación rápida de prototipos, programación visual (no tan mala como los sonidos primero).
Los artículos de Wikipedia son buenos:
Lea el libro de JPM: http://jpaulmorrison.com/fbp/
(Hemos escrito una implementación simple en C ++ para fines de automatización del hogar, y estamos muy contentos con ella. La documentación está en construcción).
fuente
Has aprendido muchos idiomas. Ahora es el momento de enfocarse en un idioma y dominarlo.
fuente
quizás desee probar LabView para su programación visual, aunque sea para fines de ingeniería.
sin embargo, pareces bastante interesado en todo lo que hay ahí fuera, de ahí la sugerencia
Además, puedes probar el Android Appinventor para crear cosas visualmente
fuente
Bruce A. Tate, tomando una página de The Pragmatic Programmer, escribió un libro sobre exactamente eso: Siete idiomas en siete semanas: una guía pragmática para aprender lenguajes de programación
En el libro, cubre Clojure, Haskell, Io, Prolog, Scala, Erlang y Ruby.
fuente
Mercurio : http://www.mercury.csse.unimelb.edu.au/
Es un Prolog escrito, con tipos y modos de unicidad (es decir, especificando que el predicado que
append(X,Y,Z)
significa X agregado a Y es Z produce una Z dada una X e Y, pero puede producir múltiples X / Y para una Z dada). Además, sin corte u otros predicados extralógicos.Si quieres, es para Prolog como Haskell es para Lisp.
fuente
El primer sistema de base de datos fue dBaseIII para mí, pasé aproximadamente un mes para escribir pequeños ejemplos (dBase / FoxPro / Clipper es una base de datos basada en tablas con índices). Luego, en mi primer lugar de trabajo, conocí a MUMPS y me dio dolor de cabeza. Era joven y de cerebro fresco, pero me llevó 2 semanas entender el modelo de base de datos MUMPS. Hubo un momento, como en los cómics: después de 2 semanas, se activó un botón y la bombilla se aclaró en mi mente. MUMPS es natural, de bajo nivel y muy, muy rápido. (Es un btree sin tipos desequilibrado y sin formato). Las tendencias de hoy muestran el camino de regreso a él: NoSQL, db de valor clave, db multidimensional, por lo que solo quedan algunos pasos y llegamos a Paperas.
Aquí hay una presentación sobre las ventajas de MUMPS: http://www.slideshare.net/george.james/mumps-the-internet-scale-database-presentation
Un breve documento sobre db jerárquico: http://www.cs.pitt.edu/~chang/156/14hier.html
Una introducción a los globales MUMPS (en MUMPS, variables locales, breve: los locales son las variables de memoria, y las variables globales, breve: los globales son las "variables db", estableciendo que una variable global va al disco inmediatamente): http: // gradvs1.mgateway.com/download/extreme1.pdf (PDF)
fuente
Digamos que quieres escribir un poema de amor ...
En lugar de usar un martillo solo porque ya tiene uno en la mano, aprenda las herramientas adecuadas para la tarea: aprender a hablar francés.
Una vez que haya alcanzado el nivel de habla casi nativo, estará listo para comenzar su poema.
fuente
Si bien aprender nuevos idiomas a nivel académico es un pasatiempo interesante, en mi humilde opinión, realmente no puedes aprender a usar uno hasta que trates de aplicarlo a un problema del mundo real. Entonces, en lugar de buscar un nuevo idioma para aprender, primero buscaría nuevas cosas para construir, y solo entonces buscaría el idioma adecuado para ese proyecto específico. Primero elija el problema, luego la herramienta, no al revés ...
fuente
Para cualquiera que no haya existido desde mediados de los 80, sugiero aprender BASIC de 8 bits. Es de muy bajo nivel, muy primitivo y es un ejercicio interesante para programar alrededor de sus agujeros.
En la misma línea, elegiría una calculadora de la serie HP-41C (o emulador, aunque nada supera al hardware real). Es difícil comprenderlo, pero vale la pena. Un TI-57 servirá, pero será una experiencia completamente diferente. Si logra resolver ecuaciones de segundo grado en una TI-55, se lo considerará un maestro (no tenía condicionales ni ramas, excepto un RST, que saltó el programa al paso 0).
Y por último, elegiría FORTH (se mencionó antes). Tiene una agradable característica Lisp-ish de "construye tu lenguaje", pero es mucho más simple. Le enseñará por qué Rails es interesante y cuándo las DSL tienen sentido y tendrá una idea de lo que piensa su calculadora que no es RPN mientras escribe.
fuente
Posdata. Es un lenguaje bastante interesante, ya que está basado en la pila, y es bastante práctico una vez que quiere poner las cosas en papel y quiere hacerlo o solucionar el problema de por qué no se hace.
Erlang El paralelismo intrínseco le da una sensación bastante inusual y de nuevo puedes aprender cosas útiles de eso. No estoy tan seguro de la practicidad, pero puede ser útil para algunas tareas de creación rápida de prototipos y sistemas altamente redundantes.
Intente programar GPU, ya sea CUDA u OpenCL. Son solo extensiones C / C ++, pero el modelo mental de la arquitectura es nuevamente completamente diferente del enfoque clásico, y definitivamente se vuelve práctico una vez que necesita hacer un cálculo de números reales.
fuente
Erlang, Forth y algunos trabajos integrados con lenguaje ensamblador. De Verdad; compre un kit Arduino o algo similar y cree un pitido polifónico en el ensamblaje. Realmente aprenderás algo.
fuente
También hay anic :
https://code.google.com/p/anic/
Desde su sitio:
Parece que ya no se encuentra en desarrollo activo, pero parece tener algunos conceptos interesantes (y eso, después de todo, es lo que parece estar buscando).
fuente
Si bien no cumple con su requisito de "diferente", apuesto a que Fantom es un lenguaje que un programador profesional debería considerar. Por su propia admisión, los autores de fantom lo llaman un lenguaje aburrido. Simplemente apuntala los casos de uso más comunes de Java y C #, con una sintaxis de cierre prestada de ruby y lenguajes similares más nuevos.
Y, sin embargo, se las arregla para tener su propio compilador de arranque, proporcionar una plataforma que tiene una caída en la instalación sin dependencias externas, obtiene paquetes correctamente, y funciona en Java, C # y ahora en la Web (a través de js).
Puede que no amplíe sus horizontes en términos de nuevas formas de programación, pero ciertamente le mostrará mejores formas de programación.
fuente
Una cosa que veo que falta en las otras respuestas: idiomas basados en la reescritura de términos.
Puede echar un vistazo a Pure: http://code.google.com/p/pure-lang/ .
Mathematica también se basa en la reescritura, aunque no es tan fácil darse cuenta de lo que está sucediendo, ya que es bastante cerrado.
fuente
APL, adelante y Asamblea.
Diviértete un poco. Elija un kit de robot Lego Mindstorm y el RobotC de CMU y escriba un código de robótica. Las cosas suceden cuando escribes código que tiene que "ensuciarse" e interactuar con el mundo real que no puedes aprender de ninguna otra manera. Sí, el mismo idioma, pero una perspectiva muy diferente.
fuente