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.
Respuestas:
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:
fuente
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.
fuente
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.
fuente
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.
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
stringr
paquete, que es tan agradable de usar como las herramientas en cualquier otro idioma.En R, los vectores tienen nombres que funcionan como un hash. También están los paquetes
hash
yfilehash
. No estoy seguro acerca de las implementaciones de MATLAB, pero puede llamar a las versiones JAVA o .NET fácilmente si lo desea.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.
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.
Convenido; son principalmente lenguajes de procedimiento.
Acordado en R. En MATLAB, las referencias se denominan identificadores.
Disparates. Solo crea múltiples archivos.
Ellas hacen. Ver
int8
,int16
,int32
yint64
.Son adecuados para hacer análisis de datos. Por favor, dé ejemplos específicos de comportamiento inesperado.
Hay muchos tipos de documentación. Comenzar con
?some_function
,RSiteSearch('some concept')
, rseek.org , y elsos
paquete. Sin mencionar los manuales que vienen con la instalación. O un buen libro .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.
fuente
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.
¿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.
fuente
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.
fuente