¿Cuáles son los idiomas importantes para aprender a entender diferentes enfoques y conceptos? [cerrado]


172

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.


3
Yo haría +1 solo para referencia xkcd, pero la pregunta también es interesante.

63
Pareces ser un programador exitoso, el resto es incremental. No estoy tratando de ser un imbécil, pero ... ¿cómo es tu vida en lo que respecta a las finanzas, las relaciones, la salud, la diversión, la afición? Quizás ahora es el momento de perseguir algunas de esas cosas. No creo que necesite saber más de una docena de idiomas a la vez. Si le pagan por usar uno, apréndalo. Si quieres escribir un libro sobre uno, aprende. Aparte de eso, tienes una buena base de programación. ¿Por qué aprender algo (como J - mi opinión subj :)) que no usarás en serio (lee make $) en ningún lado? No seas el mejor hacker en un cementerio.
Hamish Grubijan

66
Sí, soy un programador exitoso de acuerdo con mis propios estándares. Actualmente no gano mucho dinero, pero bueno, tengo 19 años. Invierto tiempo en todos esos puntos y más, pero encuentro la afición y la diversión en la programación. También quiero decir que hay una diferencia entre entender un idioma y dominarlo. Dominar Python y Clojure es suficiente para mí. Quiero entender las otras opciones que existen, porque mejorará mi código, me ayudará a entender mi computadora y me ayudará a definir mi propio lenguaje de programación.
Pepijn

55
¿Has visto Programmers.SE ? Esto cae en el tipo de pregunta que se hace mejor allí.

Respuestas:


287

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!


8
+1: una gran respuesta.
duffymo

2
Gracias por señalarme a tantos idiomas para aprender.

2
Agregaría Erlang para programación basada en actores y Fortress para cosas de programación paralela.
nickik

2
+1 para el intercambio en caliente de Erlang y el reconocimiento de tolerancia a fallas
Mic

14
No asamblea? Es bueno comprender cómo funcionan los procesadores para saber qué tipo de código les gusta.
Nick T

33

¿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


Corrígeme si me equivoco, pero creo que Python ya hace continuaciones. Y por lo que he leído, prefiero aprender Factor y Objective-C que Forth y Smalltalk, pero podría estar cortando esquinas allí.
Pepijn

1
@pepijn, pitón no tiene continuaciones de primera clase (aunque estoy trabajando en un corte del código de bytes que fingir)
aaronasterling

1
Objective-C se basa en Smalltalk, pero creo que la verdadera conclusión de ST es el dinamismo del entorno en sí.
John Cromartie

33

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;)


"Además, todo el tema es lo suficientemente profundo como para mantener a uno ocupado durante años;)" - Me pregunto, ¿por qué sería algo bueno? Después de todo, nuestras vidas son finitas.
vegai

1
@vegai: ¿Por qué sería algo malo? Hay peores maneras de pasar toda la vida que aprender. Y nadie dijo que tienes que estudiar durante años solo para usar el lenguaje correctamente, solo que el tema no se agota después de un corto tiempo. (También tenga en cuenta el smiley: esa parte no es del todo seria)

32

Actualmente programo Clojure, Python, Java y PHP [...] ¿Cuáles son los lenguajes que adoptan un enfoque diferente y serían útiles para la elección práctica de herramientas o la comprensión teórica?

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.


1
Esto necesita más votos a favor. C es el idioma número uno cuando necesita o quiere llegar al metal desnudo y comprender el funcionamiento de la máquina, o los lenguajes de programación de nivel superior, desde cero. Además, también es muy universal, existen compiladores de C para (casi) todas las arquitecturas de CPU que se hayan diseñado.
dietr

27

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



10

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:

concatenate: forall (A:Set)(n m:nat), (array A m)->(array A n)->(array A (n+m))

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!


Yo segundo coq. Al aprender la mayoría de los idiomas, aún puede usar sus técnicas anteriores, pero coq lo obliga a escribir programas totales que siempre funcionan.
Bruno Martinez

Traté de aprender Coq el verano pasado, pero me di por vencido porque me resultaba difícil encontrar buena documentación sobre el aprendizaje y su uso . ¿Alguna sugerencia?

Aprendí de un curso en mi universidad y luego leí "Coq'Art: El cálculo de las construcciones inductivas" No es suficiente para dominarlo realmente, sino suficiente para apreciarlo.
Bruno Martinez

6

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).


5

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.


5

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:

En informática, la programación basada en flujo (FBP) es un paradigma de programación que define las aplicaciones como redes de procesos de "caja negra", que intercambian datos a través de conexiones predefinidas mediante el paso de mensajes, donde las conexiones se especifican externamente a los procesos. Estos procesos de caja negra se pueden volver a conectar sin fin para formar diferentes aplicaciones sin tener que cambiarlos internamente. FBP, por lo tanto, está naturalmente orientado a componentes.

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).


+1, creo que el flujo de datos y la programación basada en el flujo (posiblemente también la programación funcional-reactiva) se convertirán en una parte importante de nuestro futuro multinúcleo.

5

Has aprendido muchos idiomas. Ahora es el momento de enfocarse en un idioma y dominarlo.


3

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


LabView tiene una "sintaxis" divertida, pero es muy difícil hacer clic y arrastrar todo el código. No lo recomendaría a un programador.
Ishtar

Eso es lo que se incluye con el Lego NXT, ¿verdad? Totalmente no funcionó para mí. Gracias por la sugerencia sin embargo.
Pepijn

Es de National Instruments. LabVIEW es un entorno de desarrollo gráfico que hace que los científicos e ingenieros sean más productivos
Belun

2

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.


2
Tenga en cuenta que el libro está repleto de referencias a películas que aparentemente se han convertido en parte de la cultura pop estadounidense. Si no has visto las películas, te preguntarás de qué se trata Tate. Si ha visto las películas, aún puede desanimarse por la constante antropomorfización de los lenguajes de programación o simplemente porque no le gustan los personajes en cuestión (no me gusta Mary Poppins; casualmente, tampoco me gusta Ruby, así que la analogía puede estar en algo).
Alan Plum

2

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.


1
  1. La programación no cubre la tarea de los programadores.
  2. Las cosas nuevas siempre son interesantes, pero hay algunas cosas antiguas muy interesantes.

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)


1

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.


44
Por supuesto, será un poema de basura, porque necesitas hablar muy por encima del nivel nativo ordinario para escribir poesía. Y tu novia necesitará aprender francés para leerlo. A menos que ya sea francesa, en cuyo caso probablemente le resulte vergonzoso.
John Lawrence Aspden

Deliciosa ironía, John, me gusta (soy francés, por cierto)
Vinzz

1

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 ...


1

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.


1

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.


1

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.


1

También hay anic :

https://code.google.com/p/anic/

Desde su sitio:

Más rápido que C, más seguro que Java, más simple que * sh

anic es el compilador de implementación de referencia para el lenguaje de programación de flujo de datos de propósito general ANI, de alto rendimiento, implícitamente paralelo, libre de puntos muertos.

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).


1

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.


1

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.


0

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.