scala clojure bioinformatics

Clojure o Scala para bioinformática/bioestadística/investigación médica



bioinformatics (9)

No soy un programador profesional (mi área es la investigación médica), pero soy bastante capaz en C / C ++ y varios lenguajes de scripting. Hace un tiempo, me intrigó Lisp, pero nunca tuve tiempo de aprenderlo en serio. Después de una breve exposición a R , decidí invertir más tiempo en un lenguaje de programación funcional.

Me gustaría la practicidad de un lenguaje JVM y por lo tanto reducido a Clojure y Scala. Por lo que entiendo, ambos pueden usar bibliotecas Java ya existentes y dado que el código crítico para el rendimiento puede ser delegado a Java, tienen el potencial de funcionar relativamente bien.

¿Cómo se comparan estos idiomas en el espacio de aplicación para el que los necesito? ¿Hay algún proyecto de la vida real en bioinformática con cualquiera de ellos?

El código ya existente sería una ventaja importante, ya que sería una buena documentación y una curva de aprendizaje bastante suave. Además, ¿cómo se compara el modelo de concurrencia de los dos?

¿Alguna ventaja / desventaja significativa que tenga cualquiera?


Personalmente puedo responder por Clojure como una gran herramienta para este tipo de trabajo. (Creo que Scala también sería genial, solo tengo menos experiencia con eso).

Mi investigación personal está en el campo del modelado predictivo / aprendizaje automático y es muy computacionalmente intensiva, así que creo que tiene muchos paralelismos con la bioinformática o la bioestadística.

Mi enfoque / configuración personal incluye:

  • Incanter se utiliza principalmente como una herramienta de visualización de datos. Ideal para producir visualizaciones rápidas que generalmente son solo 1 líneas en el REPL. También hay muchas herramientas estadísticas y de procesamiento numérico que creo que utilizan la biblioteca Colt bajo el capó. No soy un experto en R pero entiendo que Incanter es más o menos "traducido a Clojure / Lisp".

  • Explotando bastantes bibliotecas Java según sea necesario. Algunos de estos son míos, por ejemplo, algoritmos que he escrito en Java para obtener el mejor rendimiento afinado posible de la JVM. Pero también podría utilizar fácilmente cualquiera de las otras geniales bibliotecas de Java disponibles, ya que llamar a Java desde Clojure es muy simple (.methodName object param1 param2)

  • Bastantes funciones de orden superior para automatizar mi flujo de trabajo. Por ejemplo, tengo una función de orden superior que ejecutará un algoritmo de optimización de cualquier tipo en un ciclo durante un período de tiempo específico y luego generará un gráfico de la mejora en cada iteración. No ciencia de cohetes, pero realmente fácil de codificar en algunas líneas de Clojure.

  • Nunca realmente tengo que preocuparme por el rendimiento. Puede hacer que Clojure vaya bastante rápido si lo desea (por ejemplo, con sugerencias tipográficas, soporte aritmético primitivo, etc.) pero normalmente es irrelevante, ya que de todos modos va a gastar el 99% de sus ciclos en un código de biblioteca bien optimizado. Por lo tanto, un poco de sobrecarga en el código de "pegamento" es insignificante. Siento que gano mucho más en términos de productividad personal al tener un lenguaje dinámico, funcional y de alto nivel para trabajar.

  • Uso mayor de las características de concurrencia de Clojure: esta debe ser una de las características más fuertes de Clojure. Tiendo a usar el STM para codificar procesos simultáneos con transacciones que no pueden interferir entre sí, y luego iniciar cálculos de larga ejecución en un futuro para poder continuar con otras tareas y esperar la notificación del resultado.

  • Una colección de macros que crece lentamente para "extender el idioma" cuando sea necesario. De hecho, uso macros menos de lo que pensaba (las funciones de orden superior a menudo son una mejor opción). Pero cuando los necesitas son invaluables, aquí es donde realmente aprecias el valor de un lenguaje homoicónico . Como efectivamente le permiten agregar nueva sintaxis al idioma en sí, son muy poderosos cuando se usan correctamente para construir la DSL que necesita.

En resumen, no creo que puedas equivocarte con Clojure como investigador.

La única cosa con la que probablemente no lo utilizaría (todavía) es escribir una nueva biblioteca numérica: probablemente sería mejor hacerlo en Scala o en Java puro, ya que es probable que desee adoptar un estilo más imperativo / OOP.


Solo estoy familiarizado con Scala, así que lo mejor que puedo hacer es evangelizar un poco para Clojure. Es un gran lenguaje, pero toma todo este consejo con un grano de sal ya que viene de un entusiasta.

Si está buscando concurrencia, Clojure es fantástico tanto para facilitar la programación como para el rendimiento. Las estructuras de datos inmutables significan que es trivial trabajar con una instantánea coherente del mundo sin ningún bloqueo manual y propenso a errores; el STM hace que sea bastante simple cambiar los datos de una manera sensible a los hilos sin romper las instantáneas de los demás.

Tengo entendido que Scala tiene muchas herramientas funcionales agradables que Clojure hace, pero Clojure siempre ganará sintácticamente en virtud de ser un Lisp. Si está buscando hacer algo de bioinformática especializada, Clojure puede ocultar los bits de Lisp que no desea, y elevar sus propios constructos al mismo nivel que los constructos de lenguaje integrados. No puedo encontrar la referencia ahora, pero hay alguna cita conocida sobre Lisp que dice así:

Lisp no es el lenguaje perfecto para ningún programa. Pero es el lenguaje perfecto para construir el lenguaje perfecto para cada programa.

Eso está horriblemente parafraseado, pero en mi experiencia ha sido cierto. Parece que querrá un conjunto de herramientas bastante especializado, y ningún idioma hará que se sientan tan naturales como un Lisp.


Debe preguntarse qué tan importante es la programación funcional para usted. Conoces C ++, entonces probablemente conozcas OO. Diría que es más fácil hacer FP en Clojure (porque realmente no puedes volver al estilo OO) en Scala terminarás perdiendo FP y harás más estilo OO.

No puedo decir nada sobre tu espacio de aplicación.

Como mencionó R, hay una biblioteca Clojure de tipo R para estadísticas llamada Incanter . No sé sobre otros proyectos existentes en su espacio de aplicación.

Hay mucha información sobre ambos idiomas, por lo que no debería ser un problema. La curva de aprendizaje es bastante pronunciada con ambos idiomas. Clojure es un lenguaje mucho más pequeño y, como ya sabes algo de ceceo, no debería ser difícil aprender cosas importantes. Scala tiene un sistema de tipos que será difícil de seleccionar, especialmente dado que su experiencia principal es con C / C ++.

Ambos idiomas tienen excelentes modelos de simultaneidad y probablemente estés contento con ambos.


Si te gusta R, ¡ prueba Incanter ! Es R para Clojure .

Scala''s está orientado a ser sintácticamente fácil para las personas provenientes de Java, que fue pensado para ser sintácticamente fácil para las personas que vienen de C, aunque con dos niveles de indirección como este la ventaja se puede perder.

Clojure está obteniendo mucha tracción en el espacio de Big Data y se asigna muy bien a los trabajos de Hadoop para Huge Data. Creo que esto sería una gran ventaja en el mundo de la bioinformática.

Realmente, estas cosas son en gran parte del gusto personal, así que prueba ambas y verás que te hace feliz :)

Si está buscando tener una idea de Clojure sin una gran cantidad de "gastos intelectuales", ¿puedo sugerir usar leiningen para comenzar un proyecto de prueba rápidamente?


Hemos estado trabajando en algún código experimental en el proyecto Rudolf / BioClojure en GitHub. Además, mira el proyecto BioClojure de Jan Aert, que está más estructurado.

Además, hay un proyecto de BioCaml en proceso ...


No conozco a Scala, así que no puedo ofrecer una comparación, pero estoy usando activamente Clojure en proyectos de bioinformática.

La integración de Java es excelente y no tuve problemas para utilizar las bibliotecas de BioJava .

Donde el modelo de simultaneidad de Clojure brilla en los tipos de datos predeterminados inmutables y la programación funcional con la abstracción seq .

En mi trabajo bioinformático, a menudo me encuentro con muchos datos de entrada (por ejemplo, secuencias de genes) que deben someterse al mismo análisis. Una vez que tengo mi función de análisis puedo map sobre una secuencia de entradas (con los resultados generados perezosamente). Obtuve la plena utilización de un gran servidor de 48 núcleos simplemente cambiando ese map a un pmap .

¡La paralelización a gran escala con un solo cambio de carácter es difícil de superar!

Por supuesto, pmap no es una bala mágica y solo ayuda cuando la función de análisis domina computacionalmente, pero el hecho de que el map y pmap solo se puedan conectar y desconectar muestra la elegancia y simplicidad que permite el diseño de Clojure.


Tengo algo de experiencia en Scala y muy poco conocimiento en Clojure, pero programé Lisp hace muchos años.

Lisp es un lenguaje hermoso, pero nunca lo hizo en el mundo, porque era demasiado limitado. Creo que necesitas un lenguaje de tipo estático para desarrollar sistemas robustos. El sistema de tipos en Scala no es difícil de dominar para beneficiarse de él. Si quieres hacer cosas muy avanzadas para hacer que tus bibliotecas sean a prueba de idiotas, puedes hacerlo, pero luego necesitarás estudiar el sistema de tipos un poco más.

Scala prefiere los tipos inmutables, pero puedes usar mutables sin ningún problema, que a veces necesitas. La concurrencia en Scala está muy bien implementada y los marcos como Akka extienden y mejoran estas posibilidades.

Scala tiene una mejor oportunidad de convertirse en un idioma general, ya que es un lenguaje más completo. Me temo que Clojure es muy parecido a Lisp (pero reimplementado en la JVM). Me gustó mucho Lisp, pero tenía demasiadas desventajas para los programas de la vida real. Con Scala, creo que tenemos lo mejor de ambos mundos (OO y funcional) en un matrimonio limpio. Además de eso, Scala parece captar realmente en el mercado.


Para aprovechar la respuesta de Rex, me gustaría agregar algunas bibliotecas / productos de Scala que pueden ser de su interés:


No estoy seguro acerca de la bioinformática y la bioestadística per se, pero hago un análisis de datos científicos con frecuencia y aprecio que Scala me permita escribir un código tan rápido como Java con relativa facilidad. Creo que a menudo es posible en Clojure ahora, pero no he visto los puntos de referencia para respaldar eso. Por el momento, creo que lo prudente es suponer que no funcionan igual de bien. Véase, por ejemplo, el juego de comparación de idiomas de computadora , donde Scala es más rápido que Clojure en cada prueba. (Ignore el horrible resultado "pidigits" para Clojure - Scala (y Java) están llamando a la biblioteca GMP escrita en C, lo que Clojure podría hacer, pero debido a un detalle técnico que requiere una envoltura diferente para la biblioteca, actualmente no está permitido el juego). Ver las comparaciones multinúcleo no mejora la presentación de Clojure, y tenga en cuenta que el código Clojure no es más corto para este tipo de tareas algorítmicas de bajo nivel.

Clojure está por el momento con colecciones paralelas, aunque la próxima versión 2.9 de Scala debería representar gran parte de la diferencia. Tampoco tiene una curva de aprendizaje suave cuando proviene de C ++; Scala es quizás un poco más fácil dado que la sintaxis externamente parece un poco más familiar. Creo que hay buenos materiales para aprender cada uno de ellos.

Editar: PS Puedes llamar a R desde Java (y por lo tanto desde Clojure o Scala) usando rJava (específicamente la interfaz de JRI). Editar para editar: y, en estos días, rScala .

Editar # 2: Scala era más rápido que Clojure en todo al momento de escribir; a partir de esta edición, Clojure está un poco adelante en uno (a costa de una gran cantidad de código), pero de todos modos, el punto general es el siguiente. (Y la implementación de Scala en esa prueba podría acelerarse).