Sobrevivir a MATLAB y R como programador Hardcore [cerrado]

25

Me encanta programar en lenguajes que parecen estar orientados a programadores hardcore. (Mis favoritos son Python y D.) MATLAB está orientado a ingenieros y R está orientado a estadísticos, y parece que estos lenguajes fueron diseñados para personas que no son programadores hardcore y no piensan como programadores hardcore. Siempre los encuentro algo incómodos de usar, y hasta cierto punto no puedo entender por qué. Aquí hay algunos problemas que he logrado identificar:

  • (Ambos): El énfasis extremo en vectores y matrices en la medida en que no hay primitivas verdaderas.
  • (Ambos): La dificultad de la manipulación básica de cuerdas.
  • (Ambos): Falta o incomodidad en el soporte de estructuras de datos básicas como tablas hash y matrices "reales", es decir, paramétricas de tipo y anidables.
  • (Ambos): Son muy, muy lentos incluso para los estándares de lenguaje interpretados, a menos que se doble hacia atrás para vectorizar su código.
  • (Ambos): Parece que no están diseñados para interactuar con el mundo exterior. Por ejemplo, ambos son programas bastante voluminosos que tardan en iniciarse y parecen no estar diseñados para hacer que los programas de filtro de texto sean fáciles de escribir. Además, la falta de un buen procesamiento de cadenas hace que la E / S de archivos en cualquier cosa menos formas muy estándar sea casi imposible.
  • (Ambos): la orientación del objeto parece tener una sensación muy atornillada. Sí, puedes hacerlo, pero no se siente mucho más idiomático que OO en C.
  • (Ambos): no hay una forma obvia y simple de obtener un tipo de referencia. No hay punteros o referencias de clase. Por ejemplo, no tengo idea de cómo hacer rodar su propia lista vinculada en cualquiera de estos idiomas.
  • (MATLAB): No puede poner múltiples funciones de nivel superior en un solo archivo, fomentando funciones muy largas y codificación de cortar y pegar.
  • (MATLAB): Los enteros aparentemente no existen como un tipo de primera clase.
  • (R): Las estructuras básicas de datos incorporados parecen de un nivel demasiado alto y poco documentadas, y nunca parecen hacer lo que esperaba dada mi experiencia con estructuras de datos similares pero de nivel inferior.
  • (R): la documentación se extiende por todo el lugar y es prácticamente imposible de navegar o buscar. Incluso D, que a menudo se llama por mala documentación y todavía es bastante alfabético, es sustancialmente mejor por lo que puedo decir.
  • (R): Al menos hasta donde yo sé, no hay un buen IDE para ello. Nuevamente, incluso D, un lenguaje bastante alfa-ish con una comunidad pequeña, funciona mejor.

En general, también siento que MATLAB y R podrían reemplazarse fácilmente por bibliotecas antiguas simples en lenguajes más generales, si existieran bibliotecas lo suficientemente completas. Esto es especialmente cierto en los nuevos lenguajes de propósito general que incluyen muchas características para los escritores de bibliotecas.

¿Por qué R y MATLAB me parecen tan extraños? ¿Hay otros problemas importantes que haya notado que puedan hacer que estos lenguajes resulten extraños para los programadores expertos? Cuando su uso es necesario, ¿cuáles son algunos buenos consejos de supervivencia?

Editar: veo un problema de algunas de las respuestas que he recibido. Cuando analizo los datos, tengo una fuerte preferencia personal por tener un script que incorpore toda la canalización. Esto implica que debe usarse un lenguaje de propósito general. Odio tener que escribir un script para "limpiar" los datos y escupirlos, luego otro para volver a leerlos en un entorno completamente diferente, etc. Encuentro la fricción de usar MATLAB / R para parte de mi trabajo y lenguaje diferente con un espacio de direcciones completamente diferente y una forma de pensar para que el resto sea una gran fuente de fricción. Además, sé que existen capas de pegamento, pero siempre parecen ser terriblemente complicadas y una fuente de fricción.

dsimcha
fuente
40
Python está escrito para programadores "hardcore" ahora? cuando sucedio eso?
TZHX
3
@TZHX: Ok, entonces quizás hardcore era la palabra incorrecta. Una frase mejor sería "personas que son programadores y piensan como programadores".
dsimcha
17
Realmente no me gusta el término "programador hardcore". Parece una especie de elitismo, y el término "programador de propósito general" habría bastado para señalar el mismo punto.
blubb
55
Te estás quejando de que R y Matlab no son para programadores hardcore, pero tus quejas parecen ser que no eres lo suficientemente hardcore como para usar R y Matlab. Si desea escribir en un idioma que no sea de la familia Algol, debe pensar en sus términos.
Peter Taylor
55
Gee, mi segundo lenguaje de programación fue Assembly. Python no es el núcleo duro: está exactamente en el mismo nivel que R y Matlab. Asumir que es diferente es no entender mucho más allá de Python ... Python es fantástico para la programación de propósito general. Matlab es excelente debido a la gran cantidad de cosas que Mathworks facilita. R es excelente debido a las incomparables herramientas estadísticas, de aprendizaje automático, preparación de datos, análisis y visualización disponibles (también conocidas como estadísticas). El gran b / c de Perl ... Haz lo que yo hago: aprende todos y elige el adecuado para el trabajo. :)
Iterator

Respuestas:

29

Probablemente sea una mala idea abordar lenguajes específicos de dominio con la mentalidad necesaria para programar en general, o para programar programas generales con lenguajes de propósito general. Al ser específicos del dominio, es probable que requieran una curva de aprendizaje más pronunciada y una mentalidad incómoda para ser utilizados de manera más eficiente. Considero escribir código en Matlab equivalente a escribir un código específico de dominio altamente optimizado (a la par con, por ejemplo, escribir código OpenGL eficiente y limpio). También los he visto moverse cada vez más para volverse útiles como bibliotecas para ser utilizadas en otros idiomas; ver, por ejemplo, http://www.mathworks.com/matlabcentral/fileexchange/12987-integrating-matlab-with-c

Yo diría que use el mismo proceso para estos DSL como lo haría para cualquier otro:

  • Seleccione cuidadosamente los problemas que está resolviendo usando Matlab o R, para asegurarse de que sean exactamente el tipo de problemas que mejor resuelven. Por ejemplo, use Matlab para manipular sus vectores, y no para el resto de su trabajo, si puede evitarlo.
  • En general, combine / combine la solución para restringir las partes que programe en Matlab o R al subconjunto exacto del problema para el que están diseñadas.
  • Siga la mentalidad de un usuario típico en el dominio para el que están construidos los idiomas, al diseñar y construir su solución: adapte una actitud matemática vectorial hacia el mundo antes de comenzar a trabajar en un programa de Matlab, por ejemplo; posiblemente escriba su trabajo en papel, usando notación matemática estándar, primero
  • Haga el trabajo adicional requerido para crear un ambiente de trabajo cómodo y obtenga las herramientas necesarias para hacer el trabajo, incluso si es diferente del estándar para el DSL. Si es un usuario de emacs, por ejemplo, considere usar el modo matlab para que emacs haga su trabajo; asegúrese de que funciona tan bien como los modos que ha configurado para otros idiomas
  • Prepárate para cambiar. Especialmente si tiene que volver al idioma con frecuencia, asegúrese de crear un ecosistema confiable donde el trabajo que realiza en el DSL esté contenido solo para el trabajo específico del dominio, y es lo más fácil posible cambiar a otro idioma para el resto de tu trabajo Recuerde, más a menudo que de costumbre, buscar formas de hacer el trabajo no específico de DSL en otros sistemas
blueberryfields
fuente
3
Lo que usted dice tiene mucho sentido y normalmente es cómo hago las cosas cuando tengo que usar Matlab o R. La parte frustrante de esto es la fricción causada por tener que integrar múltiples idiomas con múltiples formas de hacer cosas y múltiples espacios de direcciones. Por lo general, esto implica volcar cosas en archivos de texto en puntos aparentemente arbitrarios y volver a leerlos, o usar algunas capas de pegamento frágiles, feas y difíciles de configurar.
dsimcha
25

Prefacio a esto señalando que estoy familiarizado con MATLAB, pero no con R.

La razón por la que MATLAB no funciona bien con OO, el procesamiento de cadenas o las estructuras de datos personalizadas es que no está destinado a hacer esas cosas. Hay muchos idiomas para OO, muchos que hacen un buen trabajo con el procesamiento de cadenas y muchos más que admiten tipos de datos personalizados locos. Ninguno de ellos es bueno en la multiplicación de matrices, porque no fueron diseñados para ello.

Simplemente optimizar las operaciones de vectores y matrices que MATLAB hace es bastante difícil sin tratar con tipos o punteros definidos por el usuario o lo que no (si no fuera difícil, no podrían cobrar tanto por ello). Agregar soporte rápido de vectores a los lenguajes de propósito general existentes también es difícil de hacer --- agrega una gran sobrecarga para una característica que pocos programadores usarán alguna vez (muy pocos programadores entienden las listas vinculadas, ¿cómo se espera que usen la descomposición de valores propios? )

MATLAB es muy extraño para usted porque fue diseñado para permitir que científicos e ingenieros realicen cálculos de ODE y multiplicación de matrices muy rápido. MATLAB no está a la altura de su definición de lenguaje "hardcore" porque nunca se suponía que lo hiciera. Intentar pensar en MATLAB en términos de Python o D es como tratar de pensar en LISP o Haskell en términos de C o en Verilog y VHDL en términos de JavaScript --- resuelven diferentes problemas y abordan la resolución de problemas de maneras radicalmente diferentes. Para ser justos, MATLAB tomó algunas (bien, muchas) extrañas elecciones de diseño de lenguaje que simplemente no puedo entender, incluso desde la perspectiva de un lenguaje específico de dominio. Pero no hay ninguna razón particular por la que un astrónomo deba preocuparse de que el cuerpo celeste X esté exactamente a 48 UA del cuerpo celeste Y en lugar de 48.0 UA.

Ahora, afortunadamente, algunas bibliotecas están llegando a la escena que hacen exactamente lo que usted sugiere: buen soporte para la computación científica en un lenguaje de propósito general. Para Python, hay NumPy / Matplotlib que tiene algunos bordes ásperos pero que, por lo demás, proporciona una funcionalidad MATLAB razonable dentro de Python. La razón por la que no ha habido otro proyecto como este es que las bibliotecas son increíblemente difíciles de escribir y sirven a un mercado ya cubierto por MATLAB y FORTRAN.

Si absolutamente tiene que usar MATLAB o R, no puede abordar la programación en ellos como un programador "hardcore", debe abordarlo como un científico o ingeniero "hardcore". Para LISP, que ha pensar en la recursividad. En MATLAB, solo tienes que pensar en matrices. Repase el álgebra lineal ( las conferencias del MIT sobre el tema son una excelente revisión). De lo contrario, la única forma de "sobrevivir" MATLAB es con la práctica de reconocer cuándo un bucle puede ser reemplazado por una operación vectorial o cuando su problema se reduce a encontrar los valores propios de un producto externo.

Hoa Long Tam
fuente
Sí, en general me encanta Numpy / Scipy / Matplotlib y los uso siempre que la alternativa obvia sea MATLAB / R. Mis únicas quejas sobre estos son que no son tan profundos como MATLAB / R y que, dado que son Python, todavía son algo lentos.
dsimcha
44
@dsimcha, esto es incorrecto de hecho . En este estudio de rendimiento, Numpy está a la par con MATLAB, y Pyrex está dentro de un factor de 2 de C ++.
wvoq
@wvoq: Aclaración: quise decir que el intérprete de Python es lento, no Numpy. Sé que Numpy es principalmente un contenedor para BLAS y LAPACK, que son rápidos. Por supuesto, todavía existe la sobrecarga fija de llamar a este código. También conozco Pyrex, Cython, etc., y ayudan, pero todavía estás mezclando idiomas a un nivel detallado y esto puede ser una fuente de fricción.
dsimcha
2
@dsimcha, La sobrecarga de llamar a Numpy es prácticamente una constante. En el estudio de rendimiento que mencioné, estás ganando unas décimas de segundo con C ++. Ese tiempo debe compararse con el tiempo dedicado a escribir y depurar, y depurar llamadas BLAS en ese momento. Podría ser instructivo preguntar ¿por qué no escribir todo en conjunto? ¿O incluso el código de máquina directo, ya que la conversión del código de ensamblaje al código de máquina agrega una sobrecarga fija?
wvoq
3
@dsimcha ¿Eh? ¿Quiere hacer todo en un solo lenguaje (rápido), le gusta más Python y luego se queja de que Python es lento? Entonces, ¿cuál es el punto? ¿Supongo que solo quieres que MATLAB tenga características más generales y sea más rápido que un lenguaje interpretado?
Chris dice que reinstala a Mónica el
14

Su uso repetido del término "programador hardcore" en referencia a usted mismo. junto con su insinuación de que los diseñadores de R y MATLAB no lo son , me parece muy tonto y alienta a las personas a no tomar en serio sus críticas.

Si desea leer algunas críticas serias sobre R, haría bien en leer esta pieza de Ross Ihaka, uno de los diseñadores de R. Me parece mucho más difícil diseñar R que usar D o Python.

wvoq
fuente
2
-1. Nunca quise dar a entender que los diseñadores de MATLAB y R son otra cosa que muy buenos programadores hardcore. Sin embargo, MATLAB y R no están diseñados para programadores hardcore.
dsimcha
3
"... parece que estos lenguajes fueron diseñados por personas que no son programadores hardcore y no piensan como programadores hardcore".
wvoq
66
Todavía no has aclarado qué es un "programador hardcore". Según sus ejemplos, "hardcore" parece que simplemente significa "más cómodo con C ++", en cuyo caso R y MATLAB no serán hardcore por definición. Casi todos sus ejemplos se reducen a quejas de que estos idiomas no son lo que está acostumbrado, sin preguntar por qué los expertos en estos campos han considerado adecuado implementarlos de esa manera.
wvoq
1
Además, en términos de definición, pensé que era obvio, pero un "programador incondicional" es alguien que se siente cómodo con los conceptos básicos de programación como referencias / punteros, orientación a objetos, funciones lambda, estructuras de datos básicas, etc. y está acostumbrado a desarrollar en un lenguaje de uso general.
dsimcha
2
Bueno, en primer lugar, "hardcore" es un término bastante cargado si se pretende denotar "alguien familiarizado con los conceptos básicos de la programación oo / procedimental / funcional". En segundo lugar, no puedo hablar por MATLAB, pero R tiene todas estas cosas. La única diferencia es que en R el lenguaje te alienta a resolver tu problema de tal manera que los elementos del vocabulario estadístico se conviertan en tus primitivos. La razón de esto es que los estadísticos y las personas de aprendizaje automático a menudo trabajan con problemas que se expresan fácilmente de esta manera, lo que hace que R sea un ajuste natural incluso si se siente cómodo con las cosas "más difíciles".
wvoq
9

El énfasis extremo en vectores y matrices en la medida en que no hay primitivas verdaderas.

Depende de lo que llames un verdadero primitivo. En R, un vector es un verdadero primitivo; es decir, todas las variables son vectores. Asimismo, en MATLAB todas las variables son matrices.

La dificultad de la manipulación básica de cuerdas.

En MATLAB, la manipulación de cadenas es poderosa, pero estoy de acuerdo en que el código a menudo es feo y poco intuitivo (al menos por ahora). Para R, está el stringrpaquete, que es tan agradable de usar como las herramientas en cualquier otro idioma.

Falta o incomodidad en el soporte de estructuras de datos básicas como tablas hash y matrices "reales", es decir, paramétricas de tipo y anidables.

En R, los vectores tienen nombres que funcionan como un hash. También están los paquetes hashy filehash. No estoy seguro acerca de las implementaciones de MATLAB, pero puede llamar a las versiones JAVA o .NET fácilmente si lo desea.

Son muy, muy lentos incluso para los estándares de lenguaje interpretados, a menos que se doble hacia atrás para vectorizar su código.

Una vez que domine la vectorización (estoy seguro de que lo hará, si es realmente duro) maldecirá tener que usar bucles cuando regrese a otros idiomas. La velocidad de ejecución es una compensación por la velocidad de programación.

Parecen no estar diseñados para interactuar con el mundo exterior. Por ejemplo, ambos son programas bastante voluminosos que tardan en iniciarse y parecen no estar diseñados para hacer que los programas de filtro de texto sean fáciles de escribir. Además, la falta de un buen procesamiento de cadenas hace que la E / S de archivos en cualquier cosa menos formas muy estándar sea casi imposible.

Ambos pueden leer y escribir datos en casi cualquier formato. Ambos pueden ser llamados desde la mayoría de los otros lenguajes de programación. O desde un símbolo del sistema. Puede crear GUI con ellos. ¿Cómo es que eso no interactúa con el mundo exterior? Si tiene problemas con su programa de filtro de texto, pregunte en stackoverflow.

La orientación a objetos parece tener una sensación muy atornillada. Sí, puedes hacerlo, pero no se siente mucho más idiomático que OO en C.

Convenido; son principalmente lenguajes de procedimiento.

No hay forma obvia y simple de obtener un tipo de referencia. No hay punteros o referencias de clase. Por ejemplo, no tengo idea de cómo hacer rodar su propia lista vinculada en cualquiera de estos idiomas.

Acordado en R. En MATLAB, las referencias se denominan identificadores.

No puede poner múltiples funciones de nivel superior en un solo archivo, fomentando funciones muy largas y codificación de cortar y pegar.

Disparates. Solo crea múltiples archivos.

Los enteros aparentemente no existen como un tipo de primera clase.

Ellas hacen. Ver int8, int16, int32y int64.

Las estructuras básicas de datos incorporados parecen de un nivel demasiado alto y poco documentadas, y nunca parecen hacer lo que esperaba dada mi experiencia con estructuras de datos similares pero de nivel inferior.

Son adecuados para hacer análisis de datos. Por favor, dé ejemplos específicos de comportamiento inesperado.

La documentación se extiende por todo el lugar y es prácticamente imposible de navegar o buscar. Incluso D, que a menudo se llama por mala documentación y todavía es bastante alfabético, es sustancialmente mejor por lo que puedo decir.

Hay muchos tipos de documentación. Comenzar con ?some_function, RSiteSearch('some concept'), rseek.org , y el sospaquete. Sin mencionar los manuales que vienen con la instalación. O un buen libro .

Al menos hasta donde yo sé, no hay un buen IDE para ello. Nuevamente, incluso D, un lenguaje bastante alfa-ish con una comunidad pequeña, funciona mejor.

Pruebe Architect o RStudio o Revolution Analytics IDE. Consulte la sección "IDEs y editores para R" de la página de información de desbordamiento de pila para obtener enlaces y más opciones.

Algodón Richie
fuente
3

MATLAB puede integrarse con Java y C / C ++. Puede implementar toda su carga de trabajo no numérica en estos idiomas e invocarlos desde MATLAB.

su uso es necesario

¿Hay alguna razón por la cual es necesario? ¿Está trabajando en una base de código MATLAB existente escrita por otras personas? ¿Es un requisito de trabajo? (o requisito de clase si estás en la escuela) Si no, puedes considerar usar SciPy o NumPy en su lugar.

Desafortunadamente, en mi opinión personal, si esta situación se ve obligada a alguien, no siempre se puede sobrevivir. Incluso en la universidad, no todos los estudiantes de ingeniería pueden acostumbrarse a la forma MATLAB de pensamiento computacional.

rwong
fuente
2
Soy consciente de estas soluciones, pero parecen bastante al revés. Me gustaría llamar a MATLAB desde C ++, Java, etc., no al revés. Me gustaría cualquier cosa menos MATLAB para ser mi lenguaje "conductor".
dsimcha
2
@dsimcha puede llamar a las bibliotecas MATLAB y R desde C. Vea mathworks.com/help/techdoc/matlab_external/f38569.html o math.univ-montp2.fr/~pudlo/R_files/call_R.pdf
Charles E. Grant
0

Trabajo con MATLAB, Python y C (y a veces C ++), y me considero (principalmente) un desarrollador de software, sentado frente a colegas que tienden a ser científicos de datos, matemáticos u otros especialistas de dominio.

Aunque sería el primero en admitir que no es un lenguaje de programación de propósito general en el sentido en que lo es C o Python, en realidad disfruto mucho escribir guiones en MATLAB, particularmente para cosas como análisis de series temporales o procesamiento de imágenes.

Hay un par de características del lenguaje que, aunque generalmente se implementan de manera bastante ineficiente, es un placer usarlo. Por ejemplo, tome la indexación lógica: puedo crear un vector lógico o matriz que seleccione una región de interés y denomínelo "isInROI", realizando una operación de filtro para seleccionar elementos del vector o matriz "datos" en esa región entonces simplemente es cuestión de escribir: "roiData = data (isInROI)".

Son momentos como este los que realmente me hacen apreciar MATLAB y me permiten pasar por alto sus otros pecados numerosos y muy discutidos.

William Payne
fuente
Tenga en cuenta que numpy también tiene indexación lógica: docs.scipy.org/doc/numpy/user/…
jarondl