Я люблю программирование на языках, которые, похоже, ориентированы на хардкорных программистов. (Мои любимые - Python и D.) MATLAB ориентирован на инженеров, а R - на статистиков, и кажется, что эти языки были разработаны для людей, которые не являются хардкорными программистами и не думают, как хардкорные программисты. Я всегда нахожу их несколько неудобными в использовании, и в какой-то степени я не могу понять, почему. Вот некоторые проблемы, которые мне удалось выявить:
- (Оба): крайний акцент на векторах и матрицах в той степени, в которой нет настоящих примитивов.
- (Оба): сложность базовых манипуляций со строками.
- (Оба): Отсутствие или неудобство в поддержке базовых структур данных, таких как хеш-таблицы и «реальные», то есть параметрические и вложенные массивы.
- (Оба): Они действительно очень медленные даже по интерпретированным языковым стандартам, если только вы не наклонитесь назад, чтобы векторизовать свой код.
- (Оба): Кажется, они не предназначены для взаимодействия с внешним миром. Например, обе являются довольно громоздкими программами, для запуска которых требуется некоторое время, и, похоже, они не предназначены для облегчения написания простых программ с текстовым фильтром. Кроме того, отсутствие хорошей обработки строк делает файловый ввод-вывод практически невозможным, кроме очень стандартных форм.
- (Оба): кажется, что объектная ориентация имеет очень сильное впечатление. Да, вы можете сделать это, но это не кажется намного более идиоматическим, чем ОО в C.
- (Оба): Нет очевидного, простого способа получить ссылочный тип. Нет указателей или ссылок на классы. Например, я понятия не имею, как вы создадите свой собственный связанный список на любом из этих языков.
- (MATLAB): Вы не можете поместить несколько функций верхнего уровня в один файл, поощряя очень длинные функции и кодирование «вырезать и вставить».
- (MATLAB): Целые числа, очевидно, не существуют как тип первого класса.
- (R): Базовые встроенные структуры данных кажутся слишком высокоуровневыми и плохо документированными, и, кажется, никогда не выполняют то, что я ожидаю, учитывая мой опыт работы с подобными, но низкоуровневыми структурами данных.
- (R): документация распространена повсеместно и практически невозможна для просмотра или поиска. Насколько я могу судить, даже D, который часто выбрасывается за плохую документацию и все еще довольно альфа-иш, значительно лучше.
- (R): По крайней мере, насколько я знаю, для этого нет хорошей IDE. Опять же, даже D, довольно альфа-иш-язык с небольшим сообществом, справляется лучше.
В общем, я также чувствую, что MATLAB и R могут быть легко заменены простыми старыми библиотеками на более универсальных языках, если бы существовали достаточно полные библиотеки. Это особенно актуально в новых языках общего назначения, которые включают множество функций для авторов библиотек.
Почему R и MATLAB кажутся мне такими странными? Есть ли еще какие-то серьезные проблемы, которые могут сделать эти языки странными для программистов? Когда их использование необходимо, каковы некоторые хорошие советы по выживанию?
Изменить: я вижу одну проблему из некоторых ответов, которые я получил. У меня есть сильное личное предпочтение, когда я анализирую данные, чтобы у меня был один сценарий, включающий весь конвейер. Это подразумевает необходимость использования языка общего назначения. Я ненавижу писать сценарий, чтобы «очистить» данные и выплюнуть их, потом другой, чтобы прочитать их обратно в совершенно другой среде и т. Д. Я нахожу трения использования MATLAB / R для некоторых моих работ и полностью другой язык с совершенно другим адресным пространством и мышлением для остальных, чтобы быть огромным источником трений. Кроме того, я знаю, что существуют слои клея, но они всегда кажутся ужасно сложными и источником трения.
Ответы:
Вероятно, плохая идея подходить к предметно-ориентированным языкам с мышлением, необходимым для программирования в целом или для программирования общих программ с языками общего назначения. Будучи специфичными для предметной области, они, вероятно, потребуют более крутой кривой обучения и некомфортного мышления, чтобы их можно было использовать наиболее эффективно. Я считаю, что написание кода в Matlab эквивалентно написанию высокооптимизированного кода, специфичного для предметной области (например, написание эффективного и чистого кода OpenGL). Я также видел, как они все больше и больше становятся полезными в качестве библиотек для использования на других языках - см., Например, http://www.mathworks.com/matlabcentral/fileexchange/12987-integrating-matlab-with-c
Я бы сказал, используйте тот же процесс для этих DSL, как и для любых других:
источник
Я предвосхищу это, отметив, что я знаком с MATLAB, но не с R.
Причина, по которой MATLAB плохо работает с ОО, обработкой строк или пользовательскими структурами данных, заключается в том, что она не предназначена для таких целей. Есть много языков для ОО, много, которые хорошо справляются с обработкой строк, и много других, которые поддерживают сумасшедшие пользовательские типы данных. Ни один из них не хорош в умножении матриц, потому что они не были предназначены для этого.
Просто оптимизировать векторные и матричные операции, которые выполняет MATLAB, достаточно сложно, не имея дело с пользовательскими типами, указателями или чем-то еще (если бы это было не сложно, они бы не смогли за это так много заплатить). Также сложно добавить быструю векторную поддержку в существующие языки общего назначения - она добавляет большие издержки для функции, которую когда-либо будут использовать немногие программисты (слишком мало программистов понимают связанные списки, как они могут использовать декомпозицию по собственным значениям? ).
MATLAB вам настолько чужд, потому что он был разработан, чтобы позволить ученым и инженерам очень быстро выполнять умножение матриц и вычисления ODE. MATLAB не соответствует вашему определению «хардкорного» языка, потому что никогда не предполагалось. Попытка думать о MATLAB с точки зрения Python или D - это то же самое, что пытаться думать о LISP или Haskell с точки зрения C или о Verilog и VHDL с точки зрения JavaScript - они решают разные проблемы и решают проблемы совершенно другими способами. Чтобы быть справедливым, MATLAB сделал несколько (ну, ладно, много) причудливых вариантов выбора языка, которые я просто не могу обернуть, даже с точки зрения предметно-ориентированного языка. Но нет особой причины, по которой астроном должен заботиться о том, чтобы небесное тело X находилось точно на 48 а.е. от небесного тела Y, а не на 48,0 а.е.
Теперь, к счастью, на сцену выходят некоторые библиотеки, которые делают именно то, что вы предлагаете: хорошая поддержка научных вычислений на языке общего назначения. Для Python есть NumPy / Matplotlib, который имеет некоторые неровные края, но в остальном обеспечивает разумную функциональность MATLAB внутри Python. Причина, по которой не было другого подобного проекта, заключается в том, что библиотеки невероятно сложно писать и обслуживать рынок, уже охваченный MATLAB и FORTRAN.
Если вам абсолютно необходимо использовать MATLAB или R, вы не можете подходить к программированию в них, как к "хардкорному" программисту, вы должны подходить к нему как к "хардкорному" ученому или инженеру. Для LISP вы должны думать в рекурсии. В MATLAB вам просто нужно думать в матрицах. Разберитесь в линейной алгебре ( лекции MIT по этой теме - отличный обзор). В противном случае единственный способ «выжить» в MATLAB - это на практике распознать, когда цикл можно заменить векторной операцией или когда ваша проблема сводится к поиску собственных значений внешнего произведения.
источник
Ваше повторное использование термина "хардкорный программист" по отношению к себе. наряду с вашими намеками на то, что дизайнеры R и MATLAB не такие , мне кажется очень глупым и призывает людей не принимать вашу критику всерьез.
Если вы хотите прочитать серьезную критику R, вам лучше почитать эту статью Росса Ихаки, одного из дизайнеров R. Мне кажется, что для разработки R гораздо сложнее, чем для использования D или Python.
источник
Это зависит от того, что вы называете истинным примитивом. В R вектор является истинным примитивом; то есть все переменные являются векторами. Аналогично, в MATLAB все переменные являются матрицами.
В MATLAB манипулирование строками является мощным, но я согласен, что код часто уродлив и не интуитивен (по крайней мере, на данный момент). Для R есть
stringr
пакет, который так же хорошо использовать, как и инструменты на любом другом языке.В R векторы имеют имена, которые работают как хэш. Есть также
hash
иfilehash
пакеты. Не уверен насчет реализаций MATLAB, но вы можете легко вызывать версии JAVA или .NET, если хотите.Как только вы овладеете навыком векторизации (я уверен, что вы это сделаете, если вы действительно хардкор), вы проклянете необходимость использовать циклы, когда вернетесь на другие языки. Скорость выполнения является компромиссом для скорости программирования.
Они оба могут читать и записывать данные практически в любом формате. Они оба могут быть вызваны из большинства других языков программирования. Или из командной строки. Вы можете создавать графические интерфейсы с ними. Как это не взаимодействует с внешним миром? Если вы боретесь с вашей программой текстового фильтра, спросите на stackoverflow.
Согласовано; это в основном процедурные языки.
Согласовано в R. В MATLAB ссылки называются дескрипторами.
Ерунда. Просто создайте несколько файлов.
Они делают. См
int8
,int16
,int32
иint64
.Они подходят для анализа данных. Пожалуйста, приведите конкретные примеры неожиданного поведения.
Есть много видов документации. Начните с
?some_function
,RSiteSearch('some concept')
, rseek.org , иsos
пакет. Не говоря уже о руководствах, которые идут с установкой. Или хорошая книга .Попробуйте Architect, RStudio или Revolution Analytics IDE. См. Раздел «Среды разработки и редакторы для R» информационной страницы «Переполнение стека» для получения ссылок и дополнительных параметров.
источник
MATLAB может интегрироваться с Java и C / C ++. Вы можете реализовать всю вашу нечисловую нагрузку на этих языках и вызывать их из MATLAB.
Есть ли причина, по которой это необходимо? Работаете ли вы над существующей кодовой базой MATLAB, написанной другими людьми? Это рабочее требование? (или требование к классу, если вы учитесь в школе) Если нет, вы можете вместо этого использовать SciPy или NumPy.
К сожалению, по моему личному мнению, если эта ситуация навязывается кому-то, она не всегда выживаема. Даже в колледже не каждый студент инженерного факультета может привыкнуть к вычислительному мышлению MATLAB.
источник
Я работаю с MATLAB, Python и C (а иногда и C ++) и считаю себя (в первую очередь) разработчиком программного обеспечения, встречаясь с коллегами, которые, как правило, являются специалистами по данным, математиками или другими специалистами в области.
Хотя я был бы первым, кто признал, что это не язык программирования общего назначения в том смысле, как C или Python, на самом деле мне довольно нравится писать сценарии в MATLAB, особенно для таких вещей, как анализ временных рядов или обработка изображений.
Есть несколько особенностей языка, которые, хотя в целом реализованы довольно неэффективно, приятно использовать. Например, возьмите логическое индексирование: я могу создать логический вектор или матрицу, которая выбирает интересующую область, и назвать ее «isInROI», выполняя операцию фильтра, чтобы выбрать элементы из вектора или матрицы «данные» в этой области тогда просто вопрос написания: "roiData = data (isInROI)".
Именно такие моменты действительно заставляют меня ценить MATLAB и позволяют мне упускать из виду другие, многочисленные и широко обсуждаемые грехи.
источник