Выжившие MATLAB и R в качестве хардкорного программиста [закрыто]

25

Я люблю программирование на языках, которые, похоже, ориентированы на хардкорных программистов. (Мои любимые - Python и D.) MATLAB ориентирован на инженеров, а R - на статистиков, и кажется, что эти языки были разработаны для людей, которые не являются хардкорными программистами и не думают, как хардкорные программисты. Я всегда нахожу их несколько неудобными в использовании, и в какой-то степени я не могу понять, почему. Вот некоторые проблемы, которые мне удалось выявить:

  • (Оба): крайний акцент на векторах и матрицах в той степени, в которой нет настоящих примитивов.
  • (Оба): сложность базовых манипуляций со строками.
  • (Оба): Отсутствие или неудобство в поддержке базовых структур данных, таких как хеш-таблицы и «реальные», то есть параметрические и вложенные массивы.
  • (Оба): Они действительно очень медленные даже по интерпретированным языковым стандартам, если только вы не наклонитесь назад, чтобы векторизовать свой код.
  • (Оба): Кажется, они не предназначены для взаимодействия с внешним миром. Например, обе являются довольно громоздкими программами, для запуска которых требуется некоторое время, и, похоже, они не предназначены для облегчения написания простых программ с текстовым фильтром. Кроме того, отсутствие хорошей обработки строк делает файловый ввод-вывод практически невозможным, кроме очень стандартных форм.
  • (Оба): кажется, что объектная ориентация имеет очень сильное впечатление. Да, вы можете сделать это, но это не кажется намного более идиоматическим, чем ОО в C.
  • (Оба): Нет очевидного, простого способа получить ссылочный тип. Нет указателей или ссылок на классы. Например, я понятия не имею, как вы создадите свой собственный связанный список на любом из этих языков.
  • (MATLAB): Вы не можете поместить несколько функций верхнего уровня в один файл, поощряя очень длинные функции и кодирование «вырезать и вставить».
  • (MATLAB): Целые числа, очевидно, не существуют как тип первого класса.
  • (R): Базовые встроенные структуры данных кажутся слишком высокоуровневыми и плохо документированными, и, кажется, никогда не выполняют то, что я ожидаю, учитывая мой опыт работы с подобными, но низкоуровневыми структурами данных.
  • (R): документация распространена повсеместно и практически невозможна для просмотра или поиска. Насколько я могу судить, даже D, который часто выбрасывается за плохую документацию и все еще довольно альфа-иш, значительно лучше.
  • (R): По крайней мере, насколько я знаю, для этого нет хорошей IDE. Опять же, даже D, довольно альфа-иш-язык с небольшим сообществом, справляется лучше.

В общем, я также чувствую, что MATLAB и R могут быть легко заменены простыми старыми библиотеками на более универсальных языках, если бы существовали достаточно полные библиотеки. Это особенно актуально в новых языках общего назначения, которые включают множество функций для авторов библиотек.

Почему R и MATLAB кажутся мне такими странными? Есть ли еще какие-то серьезные проблемы, которые могут сделать эти языки странными для программистов? Когда их использование необходимо, каковы некоторые хорошие советы по выживанию?

Изменить: я вижу одну проблему из некоторых ответов, которые я получил. У меня есть сильное личное предпочтение, когда я анализирую данные, чтобы у меня был один сценарий, включающий весь конвейер. Это подразумевает необходимость использования языка общего назначения. Я ненавижу писать сценарий, чтобы «очистить» данные и выплюнуть их, потом другой, чтобы прочитать их обратно в совершенно другой среде и т. Д. Я нахожу трения использования MATLAB / R для некоторых моих работ и полностью другой язык с совершенно другим адресным пространством и мышлением для остальных, чтобы быть огромным источником трений. Кроме того, я знаю, что существуют слои клея, но они всегда кажутся ужасно сложными и источником трения.

dsimcha
источник
40
Python написан для "хардкорных" программистов сейчас? когда это случилось?
TZHX
3
@TZHX: Ладно, возможно, хардкор был не тем словом. Лучшая фраза была бы «люди, которые являются программистами и думают как программисты».
дсимча
17
Мне действительно не нравится термин «хардкорный программист». Это звучит как какая-то форма элитарности, и термин «программист общего назначения» был бы достаточным, чтобы подчеркнуть ту же мысль.
blubb
5
Вы жалуетесь, что R и Matlab не для хардкорных программистов, но вы, похоже, жалуетесь на то, что вы недостаточно хардкорны, чтобы использовать R и Matlab. Если вы хотите писать на языке, не принадлежащем к семейству Алгол, вы должны думать с его точки зрения.
Питер Тейлор
5
Ну и дела, мой второй язык программирования был Assembly. Не твердое ядро языка Python - это на точно таком же уровне , как R и Matlab. Предполагать, что все по-другому, значит не разбираться во многом за пределами Python ... Python отлично подходит для программирования общего назначения. Matlab великолепен из-за множества вещей, которые Mathworks делает легко. R отлично подходит из-за несравненных доступных статистических, машинных средств обучения, подготовки данных, анализа и визуализации (то есть статистики). Perl - отличный б / к ... Просто делай как я - изучи их все и выбери подходящий для работы. :)
Итератор

Ответы:

29

Вероятно, плохая идея подходить к предметно-ориентированным языкам с мышлением, необходимым для программирования в целом или для программирования общих программ с языками общего назначения. Будучи специфичными для предметной области, они, вероятно, потребуют более крутой кривой обучения и некомфортного мышления, чтобы их можно было использовать наиболее эффективно. Я считаю, что написание кода в Matlab эквивалентно написанию высокооптимизированного кода, специфичного для предметной области (например, написание эффективного и чистого кода OpenGL). Я также видел, как они все больше и больше становятся полезными в качестве библиотек для использования на других языках - см., Например, http://www.mathworks.com/matlabcentral/fileexchange/12987-integrating-matlab-with-c

Я бы сказал, используйте тот же процесс для этих DSL, как и для любых других:

  • Тщательно выбирайте проблемы, которые вы решаете с помощью Matlab или R, чтобы убедиться, что это именно те проблемы, которые они лучше всего решают. Например, используйте Matlab для управления вашими векторами, а не для остальной части вашей работы, если вы можете избежать этого
  • Как правило, смешивайте / сопоставляйте решение, чтобы ограничить части, которые вы программируете в Matlab или R, точным подмножеством проблемы, для решения которой они созданы.
  • При проектировании и построении своего решения следуйте образу мышления типичного пользователя в области, для которой созданы языки - адаптируйте векторно-математическое отношение к миру, например, перед началом работы над программой Matlab; возможно, напишите свою работу на бумаге, используя стандартные математические обозначения, сначала
  • Выполните дополнительную работу, необходимую для создания комфортной рабочей среды, и получите инструменты, необходимые для выполнения работы, даже если они отличаются от стандартных для DSL. Если вы, например, пользователь emacs, подумайте об использовании режима matlab для emacs, чтобы выполнять свою работу; убедитесь, что он работает так же, как режимы, которые вы установили для других языков
  • Будь готов к выключению. Особенно, если вам приходится часто возвращаться к языку, постарайтесь создать себе надежную экосистему, в которой работа, которую вы выполняете в DSL, относится только к работе, специфичной для конкретной области, и как можно проще переключиться на другой язык для остальная часть вашей работы. Напоминайте себе, чаще, чем обычно, искать способы выполнения работы, не относящейся к DSL, в других системах.
blueberryfields
источник
3
То, что вы говорите, имеет смысл, и, как правило, я так поступаю, когда мне приходится использовать Matlab или R. Разочаровывающая часть этого - трения, вызванные необходимостью интеграции нескольких языков с несколькими способами выполнения операций и несколькими адресными пространствами. Обычно это включает в себя создание дампов в текстовые файлы в произвольно произвольных точках и считывание их назад, или использование какого-то хрупкого, уродливого, трудно настраиваемого слоя клея.
дсимча
25

Я предвосхищу это, отметив, что я знаком с 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 - это на практике распознать, когда цикл можно заменить векторной операцией или когда ваша проблема сводится к поиску собственных значений внешнего произведения.

Хоа Лонг Там
источник
Да, в целом я люблю Numpy / Scipy / Matplotlib и использую их всякий раз, когда очевидной альтернативой будет MATLAB / R. Мои единственные жалобы на это состоят в том, что они не такие глубокие, как MATLAB / R, и, поскольку они Python, они все еще несколько медленные.
дсимча
4
@dsimcha, это на самом деле неверно . В этом исследовании производительности Numpy находится на одном уровне с MATLAB, а Pyrex находится в пределах 2 баллов от C ++.
Wvoq
@wvoq: разъяснение: я имел в виду, что интерпретатор Python работает медленно, а не Numpy. Я знаю, что Numpy - это в основном оболочка для BLAS и LAPACK, которые работают быстро. Конечно, есть все еще фиксированные накладные расходы при вызове в этот код. Я также знаю о Pyrex, Cython и т. Д., И они действительно помогают, но вы все еще смешиваете языки на детальном уровне, и это все еще может быть источником трений.
dsimcha
2
@dsimcha, накладные расходы на вызов Numpy практически постоянны. В исследовании производительности, которое я упомянул, вы получаете несколько десятых секунды с C ++. Это время нужно сравнить с временем, потраченным на написание и отладку, а также на отладку вызовов BLAS. Может быть поучительно спросить, почему бы не написать все в сборке? Или даже прямой машинный код, поскольку преобразование из сборки в машинный код добавляет некоторые фиксированные накладные расходы?
Wvoq
3
@dsimcha А? Вы хотите сделать все на одном (быстром) языке, вам больше всего нравится Python, а потом вы жалуетесь на медленный Python? Так в чем весь смысл. Я полагаю, вы просто хотите, чтобы MATLAB имел более общие функции и был быстрее интерпретируемого языка?
Крис говорит восстановить Монику
14

Ваше повторное использование термина "хардкорный программист" по отношению к себе. наряду с вашими намеками на то, что дизайнеры R и MATLAB не такие , мне кажется очень глупым и призывает людей не принимать вашу критику всерьез.

Если вы хотите прочитать серьезную критику R, вам лучше почитать эту статью Росса Ихаки, одного из дизайнеров R. Мне кажется, что для разработки R гораздо сложнее, чем для использования D или Python.

wvoq
источник
2
-1. Я никогда не имел в виду, что разработчики MATLAB и R - это не что иное, как очень хорошие, хардкорные программисты. Тем не менее, MATLAB и R не предназначены для хардкорных программистов.
dsimcha
3
«... кажется, что эти языки были разработаны людьми, которые не являются хардкорными программистами и не думают как хардкорные программисты».
Wvoq
6
Вы до сих пор не выяснили, что такое «хардкорный программист». По вашим примерам, «хардкор» звучит так, как будто он просто означает «наиболее комфортно с C ++», и в этом случае R и MATLAB не будут хардкорными по определению. Почти все ваши примеры сводятся к жалобам на то, что эти языки не являются теми, к которым вы привыкли, и не задаются вопросом, почему эксперты в этих областях сочли целесообразным применять их таким образом.
Wvoq
1
Кроме того, с точки зрения определения, я думал, что это очевидно, но «хардкорный программист» - это просто тот, кто знаком с базовыми концепциями программирования, такими как ссылки / указатели, ориентация объектов, лямбда-функции, базовые структуры данных и т. Д., И используется для разработки на языке общего назначения.
джимча
2
Ну, во-первых, «хардкор» - довольно загруженный термин, если он предназначен для обозначения «кого-то, знакомого с основными понятиями в oo / процедурном / функциональном программировании». Во-вторых, я не могу говорить за MATLAB, но у R есть все эти вещи. Единственная разница в том, что в R язык побуждает вас формулировать вашу проблему таким образом, чтобы элементы статистического словаря стали вашими примитивами. Причиной этого является то, что статистики и специалисты по машинному обучению часто работают с проблемами, которые легко выражаются таким образом, что делает R естественным, даже если вы знакомы с «более сложным» материалом.
Wvoq
9

Чрезвычайный акцент на векторах и матрицах в той степени, в которой нет настоящих примитивов.

Это зависит от того, что вы называете истинным примитивом. В R вектор является истинным примитивом; то есть все переменные являются векторами. Аналогично, в MATLAB все переменные являются матрицами.

Сложность базовых манипуляций со струнами.

В MATLAB манипулирование строками является мощным, но я согласен, что код часто уродлив и не интуитивен (по крайней мере, на данный момент). Для R есть stringrпакет, который так же хорошо использовать, как и инструменты на любом другом языке.

Отсутствие или неудобство в поддержке базовых структур данных, таких как хеш-таблицы и «реальные», то есть параметрические и вложенные массивы.

В R векторы имеют имена, которые работают как хэш. Есть также hashи filehashпакеты. Не уверен насчет реализаций MATLAB, но вы можете легко вызывать версии JAVA или .NET, если хотите.

Они очень-очень медленные даже по интерпретированным языковым стандартам, если только вы не наклонитесь назад, чтобы векторизовать свой код.

Как только вы овладеете навыком векторизации (я уверен, что вы это сделаете, если вы действительно хардкор), вы проклянете необходимость использовать циклы, когда вернетесь на другие языки. Скорость выполнения является компромиссом для скорости программирования.

Кажется, они не предназначены для взаимодействия с внешним миром. Например, обе являются довольно громоздкими программами, для запуска которых требуется некоторое время, и, похоже, они не предназначены для облегчения написания простых программ с текстовым фильтром. Кроме того, отсутствие хорошей обработки строк делает файловый ввод-вывод практически невозможным, кроме очень стандартных форм.

Они оба могут читать и записывать данные практически в любом формате. Они оба могут быть вызваны из большинства других языков программирования. Или из командной строки. Вы можете создавать графические интерфейсы с ними. Как это не взаимодействует с внешним миром? Если вы боретесь с вашей программой текстового фильтра, спросите на stackoverflow.

Кажется, что объектная ориентация очень прочная. Да, вы можете сделать это, но это не кажется намного более идиоматическим, чем ОО в C.

Согласовано; это в основном процедурные языки.

Нет очевидного, простого способа получить ссылочный тип. Нет указателей или ссылок на классы. Например, я понятия не имею, как вы создадите свой собственный связанный список на любом из этих языков.

Согласовано в R. В MATLAB ссылки называются дескрипторами.

Вы не можете поместить несколько функций верхнего уровня в один файл, поощряя очень длинные функции и кодирование «вырезать и вставить».

Ерунда. Просто создайте несколько файлов.

Целые числа, по-видимому, не существуют как тип первого класса.

Они делают. См int8, int16, int32и int64.

Базовые встроенные структуры данных кажутся слишком высокоуровневыми и плохо документированными, и, кажется, никогда не выполняют то, что я ожидаю, учитывая мой опыт работы с аналогичными, но низкоуровневыми структурами данных.

Они подходят для анализа данных. Пожалуйста, приведите конкретные примеры неожиданного поведения.

Документация распространяется повсеместно и практически невозможно просматривать или искать. Насколько я могу судить, даже D, который часто выбрасывается за плохую документацию и все еще довольно альфа-иш, значительно лучше.

Есть много видов документации. Начните с ?some_function, RSiteSearch('some concept'), rseek.org , и sosпакет. Не говоря уже о руководствах, которые идут с установкой. Или хорошая книга .

По крайней мере, насколько я знаю, для этого нет хорошей IDE. Опять же, даже D, довольно альфа-иш-язык с небольшим сообществом, справляется лучше.

Попробуйте Architect, RStudio или Revolution Analytics IDE. См. Раздел «Среды разработки и редакторы для R» информационной страницы «Переполнение стека» для получения ссылок и дополнительных параметров.

Ричи Коттон
источник
3

MATLAB может интегрироваться с Java и C / C ++. Вы можете реализовать всю вашу нечисловую нагрузку на этих языках и вызывать их из MATLAB.

их использование необходимо

Есть ли причина, по которой это необходимо? Работаете ли вы над существующей кодовой базой MATLAB, написанной другими людьми? Это рабочее требование? (или требование к классу, если вы учитесь в школе) Если нет, вы можете вместо этого использовать SciPy или NumPy.

К сожалению, по моему личному мнению, если эта ситуация навязывается кому-то, она не всегда выживаема. Даже в колледже не каждый студент инженерного факультета может привыкнуть к вычислительному мышлению MATLAB.

rwong
источник
2
Я знаю об этих решениях, но они кажутся довольно задом наперед. Я бы хотел вызывать MATLAB из C ++, Java и т. Д., А не наоборот. Я бы хотел, чтобы все, кроме MATLAB, было моим языком "водителя".
дсимча
2
@dsimcha Вы можете позвонить в библиотеки MATLAB и R из C. См. mathworks.com/help/techdoc/matlab_external/f38569.html или math.univ-montp2.fr/~pudlo/R_files/call_R.pdf
Чарльз Грант,
0

Я работаю с MATLAB, Python и C (а иногда и C ++) и считаю себя (в первую очередь) разработчиком программного обеспечения, встречаясь с коллегами, которые, как правило, являются специалистами по данным, математиками или другими специалистами в области.

Хотя я был бы первым, кто признал, что это не язык программирования общего назначения в том смысле, как C или Python, на самом деле мне довольно нравится писать сценарии в MATLAB, особенно для таких вещей, как анализ временных рядов или обработка изображений.

Есть несколько особенностей языка, которые, хотя в целом реализованы довольно неэффективно, приятно использовать. Например, возьмите логическое индексирование: я могу создать логический вектор или матрицу, которая выбирает интересующую область, и назвать ее «isInROI», выполняя операцию фильтра, чтобы выбрать элементы из вектора или матрицы «данные» в этой области тогда просто вопрос написания: "roiData = data (isInROI)".

Именно такие моменты действительно заставляют меня ценить MATLAB и позволяют мне упускать из виду другие, многочисленные и широко обсуждаемые грехи.

Уильям Пейн
источник
Обратите внимание, что numpy также имеет логическую индексацию: docs.scipy.org/doc/numpy/user/…
jarondl