programming-languages - clean - programming language elixir
¿Por qué decidiste "contra" usar Erlang? (15)
¿Has "probado" realmente (significa programado, no solo leído un artículo) Erlang y decidió no hacerlo para un proyecto? Si es así, ¿por qué? Además, si optó por volver a su idioma anterior o utilizar otro idioma funcional como F #, Haskell, Clojure, Scala o alguna otra cosa, esto también cuenta y explica por qué.
Amo a Erlang desde el punto de vista de concurrencia. Erlang realmente hizo la concurrencia correcta. No terminé usando erlang principalmente debido a la sintaxis.
No soy un programador funcional de oficio. Generalmente uso C ++, por lo que codicio mi habilidad para cambiar de estilos (OOP, imperativo, meta, etc.). Sentí que Erlang me obligaba a adorar a la vaca sagrada de datos inmutables.
Me encanta su enfoque de concurrencia, simple, hermoso, escalable y poderoso. Pero durante todo el tiempo que estuve programando en Erlang, seguí pensando, hombre, preferiría un subconjunto de Java que no permitiera el intercambio de datos entre el hilo y el modelo de simultaneidad de Erlangs. Pensé que Java tendría la mejor opción de restringir el idioma, el conjunto de características compatibles con los procesos y canales de Erlang.
Recientemente descubrí que el lenguaje de programación D ofrece concurrencia de estilo Erlang con una sintaxis de estilo c familiar y un lenguaje de múltiples paradigmas. Todavía no he probado nada masivamente con D, así que no puedo decir si es una traducción perfecta.
Así que profesionalmente uso C ++ pero hago mi mejor esfuerzo para modelar aplicaciones concurrentes masivas como lo haría en Erlang. En algún momento me gustaría darles a las herramientas de simultaneidad de D''una verdadera prueba de manejo.
Aunque me gustaron muchos aspectos de diseño del tiempo de ejecución de Erlang y la plataforma OTP, encontré que era un lenguaje de programa bastante molesto para desarrollar. Las comas y los períodos son totalmente cojos, y a menudo requieren volver a escribir el último carácter de muchas líneas de código solo para cambiar una línea. Además, algunas operaciones que son simples en Ruby o Clojure son tediosas en Erlang, por ejemplo, manejo de cadenas.
Para los sistemas distribuidos que dependen de una base de datos compartida, el sistema Mnesia es realmente poderoso y probablemente una buena opción, pero programo en un idioma para aprender y divertirme, y el factor molesto de Erlang comenzó a superar el factor diversión una vez superado el básico tutoriales de cuentas bancarias y comenzó a escribir complementos para un servidor XMPP.
Conozco a Erlang desde la universidad, pero nunca lo he usado en mis propios proyectos hasta ahora. Principalmente porque estoy desarrollando principalmente aplicaciones de escritorio, y Erlang no es un buen lenguaje para hacer buenas GUI. Pero pronto implementaré una aplicación de servidor, y probaré con Erlang, porque para eso es bueno. Pero me preocupa que necesito más bibliotecas, así que tal vez lo intente con Java.
Decidí no usar Erlang para mi proyecto que se iba a ejecutar con una gran cantidad de datos compartidos en un único sistema multiprocesador y fui con Clojure porque Clojure realmente tiene concurrencia de memoria compartida. Cuando trabajé en sistemas distribuidos de almacenamiento de datos, Erlang encajó perfectamente porque Erlang realmente brilla en los sistemas de paso de mensajes distribuidos. Comparo el proyecto con la mejor característica en el idioma y elijo en consecuencia
La JVM no es una herramienta, es una plataforma. Aunque estoy a favor de elegir la mejor herramienta para el trabajo, la plataforma ya está determinada en su mayoría. A menos que esté desarrollando algo independiente, desde cero y sin el deseo de reutilizar ningún código / biblioteca existente (tres aspectos que ya es poco probable que estén aislados), puedo elegir libremente la plataforma.
Utilizo múltiples herramientas e idiomas, pero principalmente me enfoco en la plataforma JVM. Eso excluye a Erlang para la mayoría, si no para todos mis proyectos, por interesantes que sean algunos de sus conceptos.
Silvio
La mejor razón para evitar Erlang es cuando no puede comprometerse con la forma funcional de programación.
Hace algunas semanas leí una redada anti blog de Erlang, y una de las críticas del autor a Erlang es que no podía encontrar la forma de hacer que una función devolviera un valor diferente cada vez que lo llamaba con los mismos argumentos. Lo que realmente no había descubierto es que Erlang es así a propósito. Así es como Erlang logra ejecutarse muy bien en múltiples procesadores sin bloqueo explícito. La programación puramente funcional es la programación sin efectos secundarios. Puede hacer que Erlang trabaje como lo quería nuestro blogger despotricante, agregando efectos secundarios, pero al hacerlo, descarta el valor que ofrece Erlang.
La programación funcional pura no es la única forma correcta de programar. No todo debe ser matemáticamente riguroso. Si determina que su aplicación se redactaría mejor en un lenguaje que use mal el término "función", es mejor que separe a Erlang de su lista.
Lo usé para una puerta de enlace de mensajes para un protocolo binario patentado de múltiples capas. Los patrones OTP para los servidores y las relaciones entre los servicios, así como la coincidencia de patrones binarios, hicieron que el proceso de desarrollo fuera muy fácil. Para ese caso de uso, probablemente volvería a favorecer a Erlang sobre otros idiomas.
Mientras que yo no tengo, otros en Internet tienen, por ejemplo
Investigamos los méritos relativos de C ++ y Erlang en la implementación de un algoritmo paralelo de trazado de rayos acústicos para la Armada de los EE. UU. Encontramos una curva de aprendizaje mucho más pequeña y un mejor entorno de depuración para Erlang en paralelo que para la programación en C ++ basada en pthreads. Nuestra implementación en C ++ superó al programa Erlang en al menos 12x. Los intentos de utilizar Erlang en el microprocesador IBM Cell BE se vieron frustrados por la huella de memoria de Erlang. (Source)
Y algo más cercano a mi corazón, que recuerdo leer después del concurso de ICFP:
La codificación fue muy sencilla, traduciendo pseudocódigo en C ++. Podría haber usado Java o C #, pero estoy en el punto en que la programación a alto nivel en C ++ es igual de fácil, y quería retener la opción de caer rápidamente en un poco de twiddling de bajo nivel si llegaba hacia abajo. Erlang es mi otro idioma favorito para hackear, pero estaba preocupado por encontrarme con algún problema de rendimiento del que no pudiera salir. (Source)
Ni siquiera voy a mirar a Erlang.
Dos publicaciones de blog me lo dieron:
Erlang machinery recorre toda la lista para averiguar si tienen que procesar un mensaje, y la única forma de recibir un mensaje significa recorrer toda la lista (sospecho que filtrar los mensajes por pid también implica recorrer toda la lista de mensajes)
http://www.lshift.net/blog/2010/02/28/memory-matters-even-in-erlang
No hay milagros, de hecho, Erlang no proporciona demasiados servicios para lidiar con sobrecargas inevitables, por ejemplo, todavía le queda al programador de la aplicación revisar el espacio disponible en la cola de mensajes (supuestamente caminando la cola para descubrir la corriente de longitud y supongo que no hay mecanismos incorporados para garantizar cierta equidad entre los remitentes).
Tanto (1) como (2) están muy por debajo de lo ingenuo en mi libro, y estoy seguro de que hay más "gemas" de software de naturaleza similar dentro de la maquinaria de Erlang.
Entonces, no Erlang para mí.
Parece que una vez que tienes que lidiar con un gran sistema que requiere un alto rendimiento bajo sobrecarga, C ++ + Boost sigue siendo el único juego de la ciudad.
Voy a ver a D a continuación.
Para mí, el hecho de que Erlang esté tipeado dinámicamente es algo que me hace desconfiar. Aunque sí uso lenguajes de tipado dinámico porque algunos de ellos están muy orientados a los problemas (tome Python, resuelvo muchos problemas con él), desearía que estuvieran estáticos en su lugar.
Dicho esto, en realidad tuve la intención de probar Erlang durante un tiempo, y recién comencé a descargar la fuente. Entonces tu "pregunta" logró algo después de todo. ;-)
Quería usar Erlang para un proyecto, debido a su increíble escalabilidad con la cantidad de CPU. (Usamos otros idiomas y de vez en cuando golpeamos la pared, dejándonos con tener que modificar la aplicación)
El problema es que debemos entregar nuestra aplicación en varias plataformas: Linux, Solaris y AIX, y desafortunadamente no hay una instalación de Erlang para AIX en este momento.
Ser una operación pequeña no permite el esfuerzo de portar y mantener una versión de AIX de Erlang, y pedirle a nuestros clientes que usen Linux para una parte de nuestra aplicación es una tarea imposible.
Todavía estoy esperando que llegue un AIX Erlang para que podamos usarlo.
Un numero de rasones:
Porque parece extraño para cualquiera que esté acostumbrado a la familia de idiomas C
Porque quería poder ejecutar en la máquina virtual de Java para aprovechar las herramientas que conocía y entendía (como JConsole) y los años de esfuerzo que han pasado en JIT y GC.
Porque no quería tener que volver a escribir todas las bibliotecas (Java) que he creado a lo largo de los años.
Porque no tengo idea sobre el "ecosistema" de Erlang (acceso a la base de datos, configuración, construcción, etc.).
Básicamente estoy familiarizado con Java, su plataforma y ecosistema y he invertido mucho esfuerzo en construir cosas que se ejecutan en JVM. Fue mucho más fácil moverse a scala
Usamos Haskell, OCaml y (ahora) F #, así que para nosotros no tiene nada que ver con la falta de sintaxis similar a C. Más bien omitimos Erlang porque:
- Está tipeado dinámicamente (somos fanáticos del sistema de tipos de Haskell)
- No proporciona un tipo de cadena "real" (entiendo por qué, pero es molesto que esto no haya sido corregido en el nivel de idioma aún)
- Tiende a tener controladores de base de datos pobres (incompletos o no mantenidos)
- No se incluyen las baterías y no parece tener una comunidad trabajando para corregir esto. Si lo hace, no es muy visible. Haskell al menos tiene Hackage, y supongo que eso es lo que nos hace elegir ese idioma sobre cualquier otro. En entornos Windows, F # está a punto de tener la ventaja definitiva aquí.
Probablemente hay otras razones por las que no puedo pensar en este momento, pero estos son los puntos principales.
Volví a Haskell para mis proyectos personales de Erlang por la sencilla virtud del asombroso sistema de tipos de Haskell. Erlang te da una tonelada de herramientas para manejar cuando las cosas van mal. Haskell te da herramientas para evitar que vayas mal en primer lugar.
Cuando trabajas en un lenguaje con un sistema de tipo fuerte, estás probando teoremas gratuitos sobre tu código cada vez que compilas.
También obtienes un montón de azúcar sobrecargado de la maquinaria de clase de Haskell, pero eso es en gran medida secundario para mí, incluso si me permite expresar una serie de abstracciones que serían terriblemente verbosas o no idiomáticas e inutilizables en Erlang (por ejemplo, Haskell categoría-extras).
Amo a Erlang, me encantan sus canales y su escalabilidad sin esfuerzo. Me dirijo a él cuando estas son las cosas que necesito. Haskell no es una panacea. Renuncio a una mejor comprensión operacional del consumo de espacio. Renuncio al colector de basura mágico de un paso. Renuncio a los patrones OTP y toda esa escalabilidad sin esfuerzo.
Pero es difícil para mí renunciar a la capa de seguridad que, como se dice comúnmente, en Haskell, si se realiza una verificación de tipo, probablemente sea correcta.
Ya he usado Erlang en algunos proyectos. A menudo lo uso para servicios de descanso. Donde no lo uso, sin embargo, es para aplicaciones web frontales complejas donde las herramientas como Ruby on Rails son mucho mejores. Pero para el corredor de poder detrás de escena no conozco una herramienta mejor que Erlang.
También uso algunas aplicaciones escritas en Erlang. Uso CouchDB y RabbitMQ un poco y he configurado algunos servidores EJabberd. Estas aplicaciones son las herramientas más potentes, fáciles y flexibles en su campo.
No querer usar Erlang porque no usa JVM es en mi mente bastante tonto. JVM no es una herramienta mágica que es la mejor para hacer todo en el mundo. En mi opinión, la capacidad de elegir entre un arsenal de herramientas diferentes y no estar atrapado en un solo idioma o marco es lo que separa a los expertos de los códigos de los monos.
PD: Después de leer mi comentario en contexto, me di cuenta de que parecía que llamaba a oxbow_lakes un código mono. Realmente no lo era y me disculpo si lo tomó así. Estaba generalizando sobre tipos de programadores y nunca llamaría a un individuo un nombre tan negativo basado en un comentario de él. Es probable que sea un buen programador, aunque lo aliento a que no haga de la JVM una especie de factor decisivo.