Вижили MATLAB та R як хардкор-програміст [закрито]


25

Я люблю програмування мовами, які здаються орієнтованими на хардкор-програмістів. (Мої улюблені - Python and D.) MATLAB спрямований на інженерів, а R орієнтований на статистиків, і, схоже, ці мови були розроблені для людей, які не є хардкор-програмістами і не думають як хардкор-програмісти. Я завжди вважаю їх дещо незручними у використанні, і я певною мірою не можу поставити палець на чому. Ось деякі проблеми, які мені вдалося визначити:

  • (Обидва): Надзвичайний наголос на векторах та матрицях настільки, що немає справжніх примітивів.
  • (Обидва): Труднощі основної маніпуляції з рядком.
  • (Обидва): Відсутність або незграбність у підтримці базових структур даних, таких як хеш-таблиці та "реальні", тобто тип-параметричні та нестабільні масиви.
  • (Обидва): Вони дійсно дуже повільні навіть за тлумаченнями мовних стандартів, якщо ви не нахилитесь назад, щоб векторизувати свій код.
  • (Обидва): Вони, здається, не розроблені для взаємодії із зовнішнім світом. Наприклад, обидві - досить громіздкі програми, які потребують певного часу, а запуск, здається, не призначений для спрощення запису простих програм з фільтруванням тексту. Крім того, відсутність хорошої обробки рядків робить введення / виведення файлів у будь-яких, крім дуже стандартних формах, майже неможливим.
  • (Обидва): Орієнтація на об'єкт, здається, має дуже прикріплене відчуття. Так, ви можете це зробити, але це не набагато ідіоматичніше, ніж OO в C.
  • (Обидва): Немає очевидного, простого способу отримання еталонного типу. Ні вказівників, ні посилань на клас. Наприклад, я не маю уявлення про те, як ви робите власний пов'язаний список на будь-якій з цих мов.
  • (MATLAB): Ви не можете розмістити кілька функцій верхнього рівня в одному файлі, заохочуючи дуже довгі функції та кодування "вирізати та вставити".
  • (MATLAB): Цілі особи, очевидно, не існують як тип першого класу.
  • (R): Основні вбудовані структури даних здаються занадто високим рівнем і погано задокументовані, і, здається, ніколи не роблять те, що я очікую, враховуючи свій досвід роботи з подібними, але нижчими рівнями даних.
  • (R): Документація розповсюджена по всьому світу і практично неможлива для перегляду чи пошуку. Наскільки я можу сказати, навіть D, який часто вибивається з-за поганої документації і все ще є досить альфа-іш, значно кращий.
  • (R): Принаймні, наскільки я знаю, немає хорошого IDE для цього. Знову навіть, навіть D, досить альфа-мова з невеликою спільнотою, робить краще.

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

Чому R і MATLAB здаються мені такими дивними? Чи є якісь основні проблеми, які ви помітили, які можуть зробити ці мови незвичайними для хардкор-програмістів? Коли їх використання необхідне, які хороші поради щодо виживання?

Редагувати: Я бачу одне питання з деяких відповідей, які я отримав. У мене є сильні особисті переваги, коли я аналізую дані, мати один сценарій, який включає весь конвеєр. Це означає, що потрібно використовувати мову загального призначення. Я ненавиджу писати сценарій, щоб "очистити" дані і виплюнути їх, потім інший, щоб прочитати їх назад у зовсім іншому середовищі і т. Д. Я вважаю, що тертя використання MATLAB / R для деяких моїх робіт і повністю інша мова з абсолютно іншим адресним простором і способом мислення для решти є величезним джерелом тертя. Крім того, я знаю, що існують шари клею, але вони завжди здаються страшенно складними та є джерелом тертя.


40
python зараз написаний для "хардкорних" програмістів? коли це сталося?
TZHX

3
@TZHX: Гаразд, тому, можливо, хардкор був неправильним словом. Кращою фразою було б "люди, які є програмістами і думають, як програмісти".
dimimcha

17
Мені дуже не подобається термін "хардкор-програміст". Здається, це виглядає як якась форма елітаризму, і термін "програміст загального призначення" був би достатньо, щоб зробити те саме.
блека

5
Ви скаржитеся, що R і Matlab не для хардкор-програмістів, але, схоже, ваші скарги на те, що ви недостатньо жорсткі, щоб використовувати R і Matlab. Якщо ви хочете писати мовою, яка не належить до родини Алголів, вам доведеться продумати її умови.
Пітер Тейлор

5
Боже, моєю другою мовою програмування була асамблея. Не важке ядро ​​Python - воно знаходиться на точно такому ж рівні, як R і Matlab. Припустити, що це інше - це не зрозуміти багато іншого за межами Python ... Python є фантастичним для загального програмування. Matlab чудовий тому, що багато матеріалів, які Mathworks полегшує. R чудовий тому, що наявні інструменти статистичного, машинного навчання, підготовки даних, аналізу та візуалізації (також статистичні дані). Перл чудовий к / с ... Так само, як і я, - вивчіть їх усіх і виберіть потрібну для роботи. :)
Ітератор

Відповіді:


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, в інших системах

3
Те, що ви говорите, має ідеальний сенс і, як правило, я роблю речі, коли мені доводиться використовувати Matlab або R. Розчаровуюча частина цього полягає в терті, викликаному необхідністю інтегрування декількох мов із кількома способами здійснення справ та кількома адресними просторами. Зазвичай це передбачає скидання речей до текстових файлів у, здавалося б, довільних точках та їх читання назад, або використання якогось крихкого, негарного, важкого для налаштування шару клею.
dimimcha

25

Я передмовлю це, зазначивши, що я знайомий з MATLAB, але не з Р.

Причина того, що MATLAB не справляється з OO, обробкою рядків або користувацькими структурами даних, полягає в тому, що це не призначено для цього. Є багато мов для OO, багато, які добре справляються з обробкою рядків, і багато іншого, що підтримує шалені типові дані. Жоден з них не допомагає множині матриць, оскільки вони не були призначені для цього.

Просто оптимізувати векторні та матричні операції, які робить 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, вони все ще дещо повільні.
dimimcha

4
@dsimcha, це фактично неправильно . У цьому дослідженні про ефективність Numpy знаходиться нарівні з MATLAB, а Pyrex знаходиться в межах коефіцієнта 2 C ++.
wvoq

@wvoq: Уточнення: я мав на увазі, що інтерпретатор Python повільний, а не Numpy. Я знаю, що Numpy - це в основному обгортка для BLAS і LAPACK, які швидко проходять. Звичайно, все ще є виправлена ​​накладні витрати на введення цього коду. Я також знаю про Pyrex, Cython тощо, і вони допомагають, але ви все ще змішуєте мови на тонкозернистому рівні, і це все ще може стати джерелом тертя.
dimimcha

2
@dsimcha, Накладні витрати на виклик Numpy практично постійні. У дослідженні про ефективність, про яке я згадав, ви набираєте кілька десятих частин секунди за допомогою C ++. Цей час необхідно порівняти з часом, витраченим на написання та налагодження, і налагодження викликів BLAS при цьому. Може бути повчальним запитати, чому б не написати все на зборах? Або навіть прямий машинний код, оскільки перетворення від збірки до машинного коду додає певну фіксовану накладну вартість?
wvoq

3
@dsimcha Так? Ви хочете робити все однією (швидкою) мовою, найбільше вам подобається Python, і тоді ви скаржитеся на те, що Python повільний? Тож у чому вся суть. Я думаю, ви просто хочете, щоб MATLAB мав більш загальні функції та був швидшим, ніж інтерпретована мова?
Кріс каже, що відбудеться Моніка

14

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

Якщо ви хочете прочитати серйозну критику до R, ви б добре прочитали цей твір Росса Іхака, одного з дизайнерів R. Мені здається, значно важче ядро ​​для проектування R, ніж використання D або Python.


2
-1. Я ніколи не мав на увазі, що дизайнери MATLAB і R - це не що інше, як дуже хороші, хардкор-програмісти. Однак MATLAB і R не розроблені для хардкор-програмістів.
dimimcha

3
"... здається, що ці мови були розроблені людьми, які не є хардкор-програмістами і не думають, як хардкор-програмісти".
wvoq

6
Ви досі не уточнили, що таке "хардкор-програміст". На ваших прикладах "хардкор" звучить так, що він означає лише "найзручніше з C ++", і в цьому випадку R і MATLAB не будуть жорсткими за визначенням. Майже всі ваші приклади зводяться до скарг на те, що ці мови - це не те, до чого ви звикли, не запитуючи, чому фахівці з цих сфер вважають за потрібне реалізувати їх таким чином.
wvoq

1
Також, з точки зору визначення, я вважав, що це очевидно, але "хардкор-програміст" - це просто той, кому зручно використовувати базові концепції програмування, такі як посилання / покажчики, орієнтація на об'єкти, лямбда-функції, основні структури даних тощо. мовою загального призначення.
dimimcha

2
Ну, по-перше, "хардкор" - це досить навантажений термін, якщо він покликаний позначати "когось, хто відповідає основним поняттям в oo / процедурному / функціональному програмуванні". По-друге, я не можу говорити за MATLAB, але R має всі ці речі. Єдина відмінність полягає в тому, що в мові R вас заохочують мови вирішити свою проблему таким чином, що елементи статистичної лексики стають вашими примітивами. Причиною цього є те, що статистики та люди з машинного навчання часто працюють із легко вираженими таким чином проблемами, що робить R природним пристосованим, навіть якщо вам зручніше "складніші" речі.
wvoq

9

Надзвичайний наголос на векторах і матрицях настільки, що немає справжніх примітивів.

Це залежить від того, що ви називаєте справжнім примітивом. В R вектор - справжній примітив; тобто всі змінні є векторами. Так само в MATLAB всі змінні є матрицями.

Складність маніпуляції з базовими струнами.

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

Відсутність або незручність у підтримці базових структур даних, таких як хеш-таблиці та "реальні", тобто тип-параметричні та нестабільні масиви.

У R вектори мають імена, які працюють як хеш. Є також hashі filehashпакети. Не впевнені в реалізації MATLAB, але ви можете легко зателефонувати у версії JAVA або .NET, якщо хочете.

Вони дійсно, дуже повільні навіть за тлумаченнями мовних стандартів, якщо ви не нахилитесь назад, щоб векторизувати свій код.

Як тільки ви отримаєте завісу векторизації (я впевнений, що ви будете, якщо ви справді хардкор), ви будете проклинати необхідність використання циклів, коли повернетесь до інших мов. Швидкість виконання - це компроміс за швидкість програмування.

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

Вони обидва можуть читати та записувати дані у будь-якому форматі. Їх можна назвати з більшості інших мов програмування. Або з командного рядка. Ви можете створювати графічні інтерфейси з ними. Як це не взаємодіяти із зовнішнім світом? Якщо ви боретеся з програмою фільтрування тексту, запитайте про stackoverflow.

Орієнтація на об'єкт, здається, має дуже підкреслений характер. Так, ви можете це зробити, але це не набагато ідіоматичніше, ніж OO в C.

Домовились; вони передусім процедурні мови.

Немає очевидного, простого способу отримання еталонного типу. Ні вказівників, ні посилань на клас. Наприклад, я не маю уявлення про те, як ви робите власний пов'язаний список на будь-якій з цих мов.

Узгоджено в Р. У MATLAB посилання називаються ручками.

Ви не можете розмістити кілька функцій верхнього рівня в одному файлі, заохочуючи дуже довгі функції та кодування "вирізати та вставити".

Дурниці. Просто створіть кілька файлів.

Цілі особи, очевидно, не існують як тип першого класу.

Вони роблять. Див int8, int16, int32і int64.

Основні вбудовані структури даних здаються занадто високим рівнем та погано задокументованими, і, здається, ніколи не роблять те, що я очікував, враховуючи мій досвід роботи з подібними, але нижчими рівнями даних.

Вони підходять для аналізу даних. Наведіть конкретні приклади несподіваної поведінки.

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

Існує багато видів документації. Почніть з ?some_function, RSiteSearch('some concept'), rseek.org , і sosпакет. Не кажучи вже про посібники, які поставляються із встановленням. Або хороша книга .

Принаймні, наскільки я знаю, немає хорошого IDE для цього. Знову навіть, навіть D, досить альфа-мова з невеликою спільнотою, робить краще.

Спробуйте Архітектор або RStudio або IDE революції Analytics. Див. Розділ "IDE та редактори для R" на сторінці інформації про переповнення стека для посилань та інших опцій.


3

MATLAB може інтегруватися з Java та C / C ++. Ви можете реалізувати всі ваші нечислові навантаження на цих мовах та викликати їх у MATLAB.

їх використання необхідне

Чи є причина, чому це потрібно? Ви працюєте над існуючою базою кодів MATLAB, написаною іншими людьми? Це вимога до роботи? (або вимога до класу, якщо ви навчаєтесь у школі) Якщо ні, ви можете розглянути можливість використання SciPy або NumPy.

На жаль, на мою особисту думку, якщо ця ситуація когось змушує, вона не завжди витримана. Навіть у коледжі не кожен студент-інженер може звикнути до способу обчислювального мислення MATLAB.


2
Я знаю ці рішення, але вони здаються досить зворотними. Я хотів би зателефонувати на MATLAB з C ++, Java тощо, а не навпаки. Мені б хотілося, щоб що-небудь, крім MATLAB, було моєю "водійською" мовою.
dimimcha

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.