Survivre à MATLAB et R en tant que programmeur hardcore [fermé]

25

J'adore la programmation dans des langages qui semblent destinés aux programmeurs hardcore. (Mes favoris sont Python et D.) MATLAB est destiné aux ingénieurs et R est destiné aux statisticiens, et il semble que ces langages ont été conçus pour des personnes qui ne sont pas des programmeurs hardcore et qui ne pensent pas comme des programmeurs hardcore. Je les trouve toujours un peu difficiles à utiliser, et dans une certaine mesure, je ne peux pas mettre le doigt sur pourquoi. Voici quelques problèmes que j'ai réussi à identifier:

  • (Les deux): L'accent extrême mis sur les vecteurs et les matrices dans la mesure où il n'y a pas de véritables primitives.
  • (Les deux): La difficulté de manipulation de base des chaînes.
  • (Les deux): Manque ou maladresse dans la prise en charge des structures de données de base comme les tables de hachage et les tableaux "réels", c'est-à-dire paramétriques et emboîtables.
  • (Les deux): Ils sont vraiment très lents, même selon les normes de langage interprétées, à moins que vous ne vous incliniez en arrière pour vectoriser votre code.
  • (Les deux): Ils semblent ne pas être conçus pour interagir avec le monde extérieur. Par exemple, les deux sont des programmes assez volumineux qui prennent du temps à lancer et semblent ne pas être conçus pour faciliter l'écriture de programmes de filtrage de texte simples. De plus, le manque d'un bon traitement des chaînes rend les E / S de fichiers dans tout sauf des formes très standard presque impossibles.
  • (Les deux): L'orientation de l'objet semble avoir une sensation très boulonnée. Oui, vous pouvez le faire, mais cela ne semble pas beaucoup plus idiomatique que OO en C.
  • (Les deux): Pas de moyen simple et évident pour obtenir un type de référence. Aucun pointeur ou référence de classe. Par exemple, je n'ai aucune idée de la façon dont vous créez votre propre liste de liens dans l'une de ces langues.
  • (MATLAB): Vous ne pouvez pas mettre plusieurs fonctions de premier niveau dans un seul fichier, ce qui encourage les fonctions très longues et le codage couper-coller.
  • (MATLAB): Les entiers n'existent apparemment pas en tant que type de première classe.
  • (R): Les structures de données intégrées de base semblent beaucoup trop élevées et mal documentées, et ne semblent jamais faire exactement ce que j'attends étant donné mon expérience avec des structures de données de niveau similaire mais de niveau inférieur.
  • (R): La documentation est répartie partout et pratiquement impossible à parcourir ou à rechercher. Même D, qui est souvent frappé pour une mauvaise documentation et qui est encore assez alpha-ish, est nettement meilleur pour autant que je sache.
  • (R): Au moins pour autant que je sache, il n'y a pas de bon IDE pour cela. Encore une fois, même D, un langage assez alpha-ish avec une petite communauté, fait mieux.

En général, j'ai également l'impression que MATLAB et R pourraient être facilement remplacés par de vieilles bibliothèques simples dans des langages plus généraux, si des bibliothèques suffisamment complètes existaient. Cela est particulièrement vrai dans les nouveaux langages à usage général qui incluent de nombreuses fonctionnalités pour les rédacteurs de bibliothèques.

Pourquoi R et MATLAB me semblent-ils si étranges? Y a-t-il d'autres problèmes majeurs que vous avez remarqués qui peuvent rendre ces langages étranges pour les programmeurs hardcore? Lorsque leur utilisation est nécessaire, quels sont les bons conseils de survie?

Edit: je vois un problème de certaines des réponses que j'ai obtenues. J'ai une forte préférence personnelle, lorsque j'analyse des données, d'avoir un script qui incorpore l'ensemble du pipeline. Cela implique qu'un langage à usage général doit être utilisé. Je déteste devoir écrire un script pour "nettoyer" les données et les recracher, puis un autre pour les relire dans un environnement complètement différent, etc. Je trouve le frottement de l'utilisation de MATLAB / R pour une partie de mon travail et une langue différente avec un espace d'adressage et une façon de penser complètement différents pour que le reste soit une énorme source de friction. De plus, je sais qu'il existe des couches de colle qui existent, mais elles semblent toujours horriblement compliquées et source de friction.

dsimcha
la source
40
python est écrit pour les programmeurs "hardcore" maintenant? quand est-ce arrivé?
TZHX
3
@TZHX: Ok, alors peut-être que hardcore n'était pas le bon mot. Une meilleure expression serait «les gens qui sont des programmeurs et pensent comme des programmeurs».
dsimcha
17
Je n'aime vraiment pas le terme "programmeur hardcore". Cela ressemble à une forme d'élitisme, et le terme "programmeur généraliste" aurait suffi pour faire la même remarque.
blubb
5
Vous vous plaignez que R et Matlab ne sont pas pour les programmeurs hardcore, mais vos plaintes semblent être que vous n'êtes pas assez hardcore pour utiliser R et Matlab. Si vous voulez écrire dans une langue qui n'est pas de la famille Algol, vous devez penser en ses termes.
Peter Taylor
5
Gee, mon 2ème langage de programmation était Assembly. Le noyau dur de Python n'est pas exactement au même niveau que R et Matlab. Supposer que c'est différent, c'est ne pas comprendre grand-chose au-delà de Python ... Python est fantastique pour la programmation à usage général. Matlab est génial en raison du grand nombre de choses que Mathworks facilite. R est excellent en raison des outils statistiques, d'apprentissage automatique, de préparation des données, d'analyse et de visualisation disponibles (alias statistiques). Le grand b / c de Perl ... Faites comme moi - apprenez tous et choisissez celui qui convient le mieux. :)
Iterator

Réponses:

29

C'est probablement une mauvaise idée d'approcher des langages spécifiques à un domaine avec l'état d'esprit requis pour la programmation en général ou pour la programmation de programmes généraux avec des langages à usage général. Étant spécifiques au domaine, ils nécessiteront probablement une courbe d'apprentissage plus abrupte et un état d'esprit inconfortable pour être utilisés le plus efficacement possible. Je considère que l'écriture de code dans Matlab équivaut à l'écriture de code spécifique au domaine hautement optimisé (comparable à, par exemple, l'écriture de code OpenGL efficace et propre). Je les ai également vus de plus en plus devenir utiles en tant que bibliothèques à utiliser dans d'autres langues - voir, par exemple, http://www.mathworks.com/matlabcentral/fileexchange/12987-integrating-matlab-with-c

Je dirais, utilisez le même processus pour ces DSL que pour tout autre:

  • Sélectionnez soigneusement les problèmes que vous résolvez à l'aide de Matlab ou de R, pour vous assurer qu'ils correspondent exactement aux types de problèmes qu'ils sont les meilleurs à résoudre. Par exemple, utilisez Matlab pour manipuler vos vecteurs, et non pour le reste de votre travail, si vous pouvez l'éviter
  • Généralement, mélangez / faites correspondre la solution pour limiter les parties que vous programmez dans Matlab ou R au sous-ensemble exact du problème qu'elles sont conçues pour gérer.
  • Suivez la mentalité d'un utilisateur typique dans le domaine pour lequel les langues sont conçues, lors de la conception et de la construction de votre solution - adaptez une attitude mathématique vectorielle envers le monde avant de commencer à travailler sur un programme Matlab, par exemple; éventuellement rédiger votre travail sur papier, en utilisant la notation mathématique standard, d'abord
  • Faites le travail supplémentaire nécessaire pour vous créer un environnement de travail confortable et obtenez les outils nécessaires pour faire le travail, même s'ils sont différents de la norme pour la DSL. Si vous êtes un utilisateur emacs, par exemple, envisagez d'utiliser le mode matlab pour qu'emacs fasse votre travail; assurez-vous que cela fonctionne ainsi que les modes que vous avez configurés pour d'autres langues
  • Soyez prêt à vous déconnecter. Surtout si vous devez revenir souvent à la langue, assurez-vous de vous construire un écosystème fiable où le travail que vous effectuez dans la DSL est contenu dans le travail spécifique au domaine uniquement, et il est aussi facile que possible de passer à une autre langue pour le reste de votre travail. Rappelez-vous, plus souvent que d'habitude, de chercher des moyens de faire le travail non spécifique à la DSL dans d'autres systèmes
blueberryfields
la source
3
Ce que vous dites est parfaitement logique et c'est généralement la façon dont je fais les choses lorsque je dois utiliser Matlab ou R. La partie frustrante de cela est la friction causée par le fait d'intégrer plusieurs langues avec plusieurs façons de faire et plusieurs espaces d'adressage. Habituellement, cela implique de vider des éléments dans des fichiers texte à des points apparemment arbitraires et de les relire, ou d'utiliser une couche de colle fragile, laide et difficile à configurer.
dsimcha
25

Je préface ceci en notant que je connais MATLAB, mais pas R.

La raison pour laquelle MATLAB ne fonctionne pas bien avec OO, le traitement de chaîne ou les structures de données personnalisées est qu'il n'est pas destiné à faire ces choses. Il existe de nombreuses langues pour OO, de nombreuses qui font du bon travail avec le traitement des chaînes, et bien d'autres qui prennent en charge des types de données personnalisés fous. Aucun d'eux n'est bon à la multiplication matricielle, car ils n'ont pas été conçus pour cela.

L'optimisation des opérations vectorielles et matricielles que MATLAB fait est déjà assez difficile sans traiter avec des types ou des pointeurs définis par l'utilisateur ou quoi (si ce n'était pas difficile, ils ne pourraient pas facturer autant). L'ajout d'une prise en charge vectorielle rapide aux langages à usage général existants est également difficile à faire --- cela ajoute une surcharge importante pour une fonctionnalité que peu de programmeurs utiliseront jamais (trop peu de programmeurs comprennent les listes liées, comment devraient-ils utiliser la décomposition de valeurs propres? ).

MATLAB vous est si étranger car il a été conçu pour permettre aux scientifiques et aux ingénieurs d'effectuer très rapidement des multiplications matricielles et des calculs ODE. MATLAB ne correspond pas à votre définition d'un langage "hardcore" car il n'a jamais été supposé le faire. Essayer de penser à MATLAB en termes de Python ou D, c'est comme penser à LISP ou Haskell en termes de C ou à Verilog et VHDL en termes de JavaScript --- ils résolvent différents problèmes et abordent la résolution de problèmes de manière radicalement différente. Pour être juste, MATLAB a fait des choix de conception de langue (d'accord, beaucoup) bizarres que je ne peux tout simplement pas comprendre, même du point de vue d'une langue spécifique au domaine. Mais il n'y a aucune raison particulière pour qu'un astronome se soucie du fait que le corps céleste X est exactement à 48 UA du corps céleste Y par opposition à 48,0 AU.

Maintenant, heureusement, certaines bibliothèques arrivent sur la scène qui font exactement ce que vous suggérez: un bon support pour le calcul scientifique dans un langage à usage général. Pour Python, il y a NumPy / Matplotlib qui a des bords rugueux mais fournit autrement une fonctionnalité MATLAB raisonnable à l'intérieur de Python. La raison pour laquelle il n'y a pas eu d'autre projet comme celui-ci est que les bibliothèques sont incroyablement difficiles à écrire et à desservir un marché déjà couvert par MATLAB et FORTRAN.

Si vous devez absolument utiliser MATLAB ou R, vous ne pouvez pas aborder la programmation en eux comme un programmeur "hardcore", vous devez l'approcher comme un scientifique ou un ingénieur "hardcore". Pour LISP, vous devez penser en récursivité. Dans MATLAB, il suffit de penser dans des matrices. Révisez l'algèbre linéaire ( les conférences du MIT sur le sujet sont une excellente revue). Sinon, le seul moyen de «survivre» à MATLAB est de s’exercer à reconnaître quand une boucle peut être remplacée par une opération vectorielle ou lorsque votre problème se réduit à trouver les valeurs propres d’un produit extérieur.

Hoa Long Tam
la source
Oui, dans l'ensemble, j'adore Numpy / Scipy / Matplotlib et je les utilise chaque fois que l'alternative évidente serait MATLAB / R. Mes seules plaintes à ce sujet sont qu'elles ne sont pas aussi profondes que MATLAB / R et que, comme elles sont en Python, elles sont encore un peu lentes.
dsimcha
4
@dsimcha, c'est en fait incorrect . Dans cette étude de performance, Numpy est à égalité avec MATLAB, et Pyrex est bien dans un facteur 2 de C ++.
wvoq
@wvoq: Clarification: je voulais dire que l'interpréteur Python est lent, pas Numpy. Je sais que Numpy est principalement un wrapper pour BLAS et LAPACK, qui sont rapides. Bien sûr, il y a toujours la surcharge fixe d'appeler dans ce code. Je connais également Pyrex, Cython, etc., et ils aident, mais vous mélangez toujours des langages à un niveau fin et cela peut toujours être une source de friction.
dsimcha
2
@dsimcha, La surcharge de l'appel de Numpy est pratiquement une constante. Dans l'étude de performance que j'ai mentionnée, vous gagnez quelques dixièmes de seconde avec C ++. Ce temps doit être comparé au temps passé à écrire et déboguer, et à déboguer les appels BLAS à cela. Il pourrait être instructif de se demander pourquoi ne pas tout écrire dans l'assemblage? Ou même un code machine simple, puisque la conversion de l'assemblage en code machine ajoute une surcharge fixe?
wvoq
3
@dsimcha Huh? Vous voulez tout faire dans un seul langage (rapide), vous aimez le plus Python et vous vous plaignez du fait que Python soit lent? Alors, quel est le point. Je suppose que vous voulez juste que MATLAB ait des fonctionnalités plus générales et soit plus rapide qu'un langage interprété?
Chris dit de rétablir Monica
14

Votre utilisation répétée du terme "programmeur hardcore" en référence à vous-même. avec votre insinuation que les concepteurs de R et MATLAB ne le sont pas , me semble très stupide et encourage les gens à ne pas prendre vos critiques au sérieux.

Si vous souhaitez lire une critique sérieuse de R, vous feriez bien de lire cette pièce de Ross Ihaka, l'un des designers de R. Il me semble beaucoup plus difficile de concevoir R que d' utiliser D ou Python.

wvoq
la source
2
-1. Je n'ai jamais voulu laisser entendre que les concepteurs de MATLAB et R sont autre chose que de très bons programmeurs hardcore. Cependant, MATLAB et R ne sont pas conçus pour les programmeurs hardcore.
dsimcha
3
"... il semble que ces langages ont été conçus par des gens qui ne sont pas des programmeurs hardcore et qui ne pensent pas comme des programmeurs hardcore."
wvoq
6
Vous n'avez toujours pas clarifié ce qu'est un "programmeur hardcore". Par vos exemples, "hardcore" sonne comme s'il signifiait simplement "plus à l'aise avec C ++", auquel cas R et MATLAB ne seront pas hardcore par définition. Presque tous vos exemples se réduisent à des plaintes selon lesquelles ces langues ne sont pas ce à quoi vous êtes habitué, sans demander pourquoi les experts dans ces domaines ont jugé bon de les mettre en œuvre de cette façon.
wvoq
1
De plus, en termes de définition, je pensais que c'était évident, mais un "programmeur hardcore" est juste quelqu'un qui est à l'aise avec les concepts de programmation de base comme les références / pointeurs, l'orientation des objets, les fonctions lambda, les structures de données de base, etc. et est habitué à développer dans une langue d'usage général.
dsimcha
2
Eh bien tout d'abord, "hardcore" est un terme assez chargé s'il vise à désigner "quelqu'un qui connaît les concepts de base de la programmation oo / procédurale / fonctionnelle". Deuxièmement, je ne peux pas parler pour MATLAB, mais R a toutes ces choses. La seule différence est qu'en R, le langage vous encourage à formuler votre problème de telle manière que les éléments du vocabulaire statistique deviennent vos primitifs. La raison en est que les statisticiens et les gens de l'apprentissage automatique travaillent souvent avec des problèmes facilement exprimés de cette façon, ce qui fait de R un ajustement naturel même si vous êtes à l'aise avec des trucs "plus durs".
wvoq
9

L'accent extrême mis sur les vecteurs et les matrices dans la mesure où il n'y a pas de véritables primitives.

Cela dépend de ce que vous appelez une vraie primitive. Dans R, un vecteur est une vraie primitive; c'est-à-dire que toutes les variables sont des vecteurs. De même, dans MATLAB, toutes les variables sont des matrices.

La difficulté de manipulation de chaîne de base.

Dans MATLAB, la manipulation de chaînes est puissante mais je conviens que le code est souvent laid et peu intuitif (du moins pour l'instant). Pour R, il y a le stringrpackage, qui est aussi agréable à utiliser que les outils dans n'importe quel autre langage.

Manque ou maladresse dans la prise en charge des structures de données de base comme les tables de hachage et les tableaux "réels", c'est-à-dire paramétriques et emboîtables.

Dans R, les vecteurs ont des noms qui fonctionnent comme un hachage. Il y a aussi les packages hashet filehash. Vous n'êtes pas sûr des implémentations MATLAB, mais vous pouvez appeler les versions JAVA ou .NET facilement si vous le souhaitez.

Ils sont vraiment, vraiment lents, même selon les normes de langage interprétées, à moins que vous ne vous incliniez en arrière pour vectoriser votre code.

Une fois que vous aurez maîtrisé la vectorisation (je suis sûr que vous le ferez, si vous êtes vraiment hardcore), vous maudirez d'avoir à utiliser des boucles lorsque vous reviendrez dans d'autres langues. La vitesse d'exécution est un compromis pour la vitesse de programmation.

Ils semblent ne pas être conçus pour interagir avec le monde extérieur. Par exemple, les deux sont des programmes assez volumineux qui prennent du temps à lancer et semblent ne pas être conçus pour faciliter l'écriture de programmes de filtrage de texte simples. De plus, le manque d'un bon traitement des chaînes rend les E / S de fichiers dans tout sauf des formes très standard presque impossibles.

Ils peuvent tous deux lire et écrire des données dans à peu près n'importe quel format. Ils peuvent tous deux être appelés à partir de la plupart des autres langages de programmation. Ou à partir d'une invite de commande. Vous pouvez créer des GUI avec eux. Comment cela n'interagit-il pas avec le monde extérieur? Si vous rencontrez des difficultés avec votre programme de filtrage de texte, demandez sur stackoverflow.

L'orientation des objets semble avoir une sensation très boulonnée. Oui, vous pouvez le faire, mais cela ne semble pas beaucoup plus idiomatique que OO en C.

D'accord; ce sont principalement des langages procéduraux.

Pas de moyen simple et évident pour obtenir un type de référence. Aucun pointeur ou référence de classe. Par exemple, je n'ai aucune idée de comment vous pouvez rouler votre propre liste chaînée dans l'une de ces langues.

Convenu dans R. Dans MATLAB, les références sont appelées poignées.

Vous ne pouvez pas mettre plusieurs fonctions de premier niveau dans un seul fichier, ce qui encourage les fonctions très longues et le codage couper-coller.

Absurdité. Créez simplement plusieurs fichiers.

Les entiers n'existent apparemment pas en tant que type de première classe.

Ils font. Voir int8, int16, int32et int64.

Les structures de données intégrées de base semblent beaucoup trop élevées et mal documentées, et ne semblent jamais faire exactement ce que j'attends étant donné mon expérience avec des structures de données de niveau similaire mais de niveau inférieur.

Ils sont adaptés à l'analyse de données. Veuillez donner des exemples spécifiques de comportement inattendu.

La documentation est répartie partout et pratiquement impossible à parcourir ou à rechercher. Même D, qui est souvent frappé pour une mauvaise documentation et qui est encore assez alpha-ish, est nettement meilleur pour autant que je sache.

Il existe de nombreux types de documentation. Commencez avec ?some_function, RSiteSearch('some concept'), rseek.org et l' sosemballage. Sans parler des manuels fournis avec l'installation. Ou un bon livre .

Pour autant que je sache, il n'y a pas de bon IDE pour cela. Encore une fois, même D, un langage assez alpha-ish avec une petite communauté, fait mieux.

Essayez Architect ou RStudio ou l'IDE de Revolution Analytics. Voir la section «IDE et éditeurs pour R» de la page d'informations sur le débordement de pile pour des liens et d'autres options.

Richie Cotton
la source
3

MATLAB peut s'intégrer avec Java et C / C ++. Vous pouvez implémenter la totalité de votre charge de travail non numérique dans ces langues et les appeler à partir de MATLAB.

leur utilisation est nécessaire

Y a-t-il une raison pour laquelle cela est nécessaire? Travaillez-vous sur une base de code MATLAB existante écrite par d'autres personnes? Est-ce une exigence de travail? (ou exigence de classe si vous êtes à l'école) Sinon, vous pouvez envisager d'utiliser SciPy ou NumPy à la place.

Malheureusement, à mon avis personnel, si cette situation est imposée à quelqu'un, elle ne peut pas toujours survivre. Même au collège, tous les étudiants en génie ne peuvent pas s'habituer à la façon MATLAB de la pensée informatique.

rwong
la source
2
Je connais ces solutions, mais elles semblent assez en arrière. Je voudrais appeler MATLAB à partir de C ++, Java, etc., pas l'inverse. Je voudrais que MATLAB soit ma langue de "pilote".
dsimcha
2
@dsimcha vous pouvez appeler les bibliothèques MATLAB et R depuis C. Voir mathworks.com/help/techdoc/matlab_external/f38569.html ou math.univ-montp2.fr/~pudlo/R_files/call_R.pdf
Charles E. Grant
0

Je travaille avec MATLAB, Python et C (et parfois C ++), et je me considère comme (principalement) un développeur de logiciels, assis en face de collègues qui ont tendance à être des scientifiques des données, des mathématiciens ou d'autres spécialistes du domaine.

Bien que je sois le premier à admettre qu'il ne s'agit pas d'un langage de programmation à usage général dans le sens où C ou Python l'est, j'aime plutôt beaucoup écrire des scripts dans MATLAB, en particulier pour des choses comme l'analyse de séries chronologiques ou le traitement d'images.

Il y a quelques fonctionnalités du langage qui, bien que généralement mises en œuvre de manière assez inefficace, sont un plaisir à utiliser. Par exemple, prenez l'indexation logique: je peux créer un vecteur logique ou une matrice qui sélectionne une région d'intérêt, et la nommer "isInROI", en effectuant une opération de filtrage pour sélectionner des éléments du vecteur ou de la matrice "données" dans cette région. il suffit alors d'écrire: "roiData = data (isInROI)".

Ce sont des moments comme celui-ci qui me font vraiment apprécier MATLAB et me permettent d'oublier ses autres péchés, nombreux et très discutés.

William Payne
la source
Notez que numpy a également une indexation logique: docs.scipy.org/doc/numpy/user/…
jarondl