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.
Réponses:
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:
la source
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.
la source
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.
la source
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.
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
stringr
package, qui est aussi agréable à utiliser que les outils dans n'importe quel autre langage.Dans R, les vecteurs ont des noms qui fonctionnent comme un hachage. Il y a aussi les packages
hash
etfilehash
. Vous n'êtes pas sûr des implémentations MATLAB, mais vous pouvez appeler les versions JAVA ou .NET facilement si vous le souhaitez.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 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.
D'accord; ce sont principalement des langages procéduraux.
Convenu dans R. Dans MATLAB, les références sont appelées poignées.
Absurdité. Créez simplement plusieurs fichiers.
Ils font. Voir
int8
,int16
,int32
etint64
.Ils sont adaptés à l'analyse de données. Veuillez donner des exemples spécifiques de comportement inattendu.
Il existe de nombreux types de documentation. Commencez avec
?some_function
,RSiteSearch('some concept')
, rseek.org et l'sos
emballage. Sans parler des manuels fournis avec l'installation. Ou un bon livre .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.
la source
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.
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.
la source
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.
la source