Sobrevivendo ao MATLAB e R como programador hardcore [fechado]

25

Adoro programar em linguagens que parecem voltadas para programadores hardcore. (Meus favoritos são Python e D.) O MATLAB é voltado para engenheiros e R é voltado para estatísticos, e parece que essas linguagens foram projetadas para pessoas que não são programadores hardcore e não pensam como programadores hardcore. Eu sempre os acho um pouco difíceis de usar, e até certo ponto não consigo entender o porquê. Aqui estão alguns problemas que eu consegui identificar:

  • (Ambos): A ênfase extrema em vetores e matrizes na medida em que não existem primitivas verdadeiras.
  • (Ambos): A dificuldade da manipulação básica de strings.
  • (Ambos): falta ou constrangimento no suporte a estruturas de dados básicas, como tabelas de hash e matrizes "reais", isto é, paramétricas e aninhadas.
  • (Ambos): Eles são muito, muito lentos, mesmo para os padrões de linguagem interpretados, a menos que você se incline para trás para vetorizar seu código.
  • (Ambos): Eles parecem não ter sido projetados para interagir com o mundo exterior. Por exemplo, ambos são programas bastante volumosos que demoram um pouco para serem iniciados e parecem não ter sido projetados para facilitar a gravação de programas simples de filtro de texto. Além disso, a falta de um bom processamento de string torna quase impossível a E / S do arquivo, exceto em formas muito padrão.
  • (Ambos): A orientação do objeto parece ter uma sensação muito aparafusada. Sim, você pode fazê-lo, mas não parece muito mais idiomático do que OO em C.
  • (Ambos): Não há maneira óbvia e simples de obter um tipo de referência. Sem ponteiros ou referências de classe. Por exemplo, não tenho ideia de como você rola sua própria lista vinculada em um desses idiomas.
  • (MATLAB): você não pode colocar várias funções de nível superior em um único arquivo, incentivando funções muito longas e codificação recortar e colar.
  • (MATLAB): aparentemente, os números inteiros não existem como um tipo de primeira classe.
  • (R): As estruturas básicas de dados internas parecem muito altas e estão mal documentadas, e nunca parecem fazer exatamente o que eu espero, dada a minha experiência com estruturas de dados semelhantes, mas de nível inferior.
  • (R): A documentação está espalhada por todo o lugar e é praticamente impossível navegar ou pesquisar. Até o D, que geralmente é criticado por documentação ruim e ainda é bastante alfa, é substancialmente melhor até onde eu sei.
  • (R): Pelo menos até onde eu saiba, não há um bom IDE para isso. Novamente, mesmo D, uma linguagem bastante alfa-ish com uma pequena comunidade, se sai melhor.

Em geral, também sinto que MATLAB e R poderiam ser facilmente substituídos por bibliotecas antigas simples em linguagens de uso geral, se existissem bibliotecas suficientemente abrangentes. Isso é especialmente verdadeiro nas linguagens de uso geral mais recentes, que incluem muitos recursos para os criadores de bibliotecas.

Por que R e MATLAB me parecem tão estranhos? Você notou algum outro problema importante que pode tornar essas linguagens estranhas aos programadores hardcore? Quando o uso é necessário, quais são algumas boas dicas de sobrevivência?

Edit: Estou vendo um problema de algumas das respostas que recebi. Tenho uma forte preferência pessoal, quando analiso dados, em ter um script que incorpore todo o pipeline. Isso implica que uma linguagem de uso geral precisa ser usada. Eu odeio ter que escrever um script para "limpar" os dados e cuspi-los, depois outro para lê-los em um ambiente completamente diferente, etc. Acho o atrito de usar o MATLAB / R para alguns dos meus trabalhos e linguagem diferente com um espaço de endereço completamente diferente e uma maneira de pensar para o resto ser uma enorme fonte de atrito. Além disso, eu sei que existem camadas de cola, mas elas sempre parecem ser terrivelmente complicadas e uma fonte de atrito.

dsimcha
fonte
40
python é escrito para programadores "hardcore" agora? quando isso aconteceu?
TZHX
3
@TZHX: Ok, então talvez hardcore fosse a palavra errada. Uma frase melhor seria "pessoas que são programadores e pensam como programadores".
dsimcha
17
Eu realmente não gosto do termo "programador hardcore". Parece ser uma forma de elitismo, e o termo "programador de propósito geral" seria suficiente para fazer o mesmo ponto.
26611
5
Você está reclamando que R e Matlab não são para programadores hardcore, mas suas queixas parecem ser que você não é suficientemente hardcore para usar R e Matlab. Se você deseja escrever em um idioma que não seja da família Algol, deve pensar nos termos dele.
22411 Peter Peter
5
Nossa, minha segunda linguagem de programação foi Assembly. O núcleo não é rígido do Python - está exatamente no mesmo nível do R e do Matlab. Assumir que é diferente é não entender muito além do Python ... Python é fantástico para programação de uso geral. O Matlab é ótimo por causa das muitas coisas que o Mathworks facilita. R é ótimo por causa das ferramentas estatísticas incomparáveis, aprendizado de máquina, preparação de dados, análise e visualização disponíveis (também conhecidas como estatísticas). O excelente b / c de Perl ... Faça o que eu faço - aprenda todos eles e escolha o caminho certo para o trabalho. :)
Iterator

Respostas:

29

Provavelmente, é uma má idéia abordar linguagens específicas de domínio com a mentalidade necessária para a programação em geral, ou para programar programas gerais com linguagens de uso geral. Sendo específicos do domínio, eles provavelmente exigirão uma curva de aprendizado mais íngreme e uma mentalidade desconfortável para serem usados ​​com mais eficiência. Considero escrever código no Matlab equivalente a escrever código específico de domínio altamente otimizado (a par com, por exemplo, escrever código OpenGL eficiente e limpo). Também os vi se mover cada vez mais para se tornarem úteis como bibliotecas para serem usadas em outros idiomas - veja, por exemplo, http://www.mathworks.com/matlabcentral/fileexchange/12987-integrating-matlab-with-c

Eu diria, use o mesmo processo para esses DSL e para outros:

  • Selecione cuidadosamente os problemas que você está resolvendo usando o Matlab ou o R, para garantir que eles sejam exatamente os tipos de problemas com os quais eles são melhores. Por exemplo, use o Matlab para manipular seus vetores, e não pelo resto do seu trabalho, se você puder evitá-lo
  • Geralmente, misture / combine a solução para restringir as partes que você programa no Matlab ou R ao subconjunto exato do problema com o qual elas foram criadas para lidar.
  • Siga a mentalidade de um usuário típico no domínio para o qual as linguagens foram criadas, ao projetar e construir sua solução - adapte uma atitude matemática vetorial para o mundo antes de começar a trabalhar em um programa Matlab, por exemplo; possivelmente escreva seu trabalho em papel, usando notação matemática padrão, primeiro
  • Faça o trabalho extra necessário para criar um ambiente de trabalho confortável e obtenha as ferramentas necessárias para fazer o trabalho, mesmo que sejam diferentes do padrão para o DSL. Se você é um usuário do emacs, por exemplo, considere usar o modo matlab para que o emacs faça seu trabalho; verifique se ele funciona bem como os modos que você configurou para outros idiomas
  • Esteja pronto para mudar. Especialmente se você precisar voltar ao idioma com frequência, crie um ecossistema confiável, onde o trabalho que você faz no DSL está contido apenas no trabalho específico do domínio e é o mais fácil possível alternar para outro idioma para o resto do seu trabalho. Lembre-se, com mais frequência do que o habitual, de procurar maneiras de executar o trabalho específico não DSL em outros sistemas
blueberryfields
fonte
3
O que você diz faz todo o sentido e geralmente é como eu faço as coisas quando preciso usar o Matlab ou R. A parte frustrante disso é o atrito causado pela necessidade de integrar vários idiomas com várias maneiras de fazer as coisas e vários espaços de endereço. Geralmente, isso envolve despejar coisas em arquivos de texto em pontos aparentemente arbitrários e lê-las de volta, ou usar alguma camada de cola quebradiça, feia e difícil de configurar.
dsimcha
25

Eu prefácio isso observando que estou familiarizado com o MATLAB, mas não com o R.

O motivo pelo qual o MATLAB não se dá bem com OO, processamento de strings ou estruturas de dados personalizadas é que ele não deve fazer essas coisas. Existem muitas linguagens para OO, muitas que fazem um bom trabalho com o processamento de strings e muitas outras que suportam tipos de dados personalizados malucos. Nenhum deles é bom em multiplicação de matrizes, porque não foram projetados para isso.

Apenas otimizar as operações de vetor e matriz que o MATLAB faz já é bastante difícil sem lidar com tipos ou ponteiros definidos pelo usuário ou o que não (se não fosse difícil, eles não seriam capazes de cobrar muito por isso). Também é difícil adicionar suporte rápido a vetores a linguagens de uso geral existentes - acrescenta uma grande sobrecarga para um recurso que poucos programadores jamais usarão (poucos programadores entendem listas vinculadas, como é esperado que eles usem a decomposição de autovalores? )

O MATLAB é tão estranho para você porque foi projetado para permitir que cientistas e engenheiros façam cálculos de multiplicação de matrizes e ODE muito rapidamente. O MATLAB não se enquadra na sua definição de linguagem "hardcore" porque nunca deveria. Tentar pensar em MATLAB em termos de Python ou D é como tentar em LISP ou Haskell em termos de C ou em Verilog e VHDL em termos de JavaScript - eles resolvem problemas diferentes e abordam a solução de problemas de maneiras radicalmente diferentes. Para ser justo, o MATLAB fez algumas (ok, muitas) escolhas de design de linguagem bizarras que eu simplesmente não consigo entender, mesmo da perspectiva de uma linguagem específica de domínio. Mas não há nenhuma razão particular para que um astrônomo se importe com o fato de o corpo celeste X estar exatamente a 48 UA do corpo celeste Y, em oposição a 48,0 AU.

Agora, felizmente, algumas bibliotecas estão entrando em cena e fazem exatamente o que você sugere: bom suporte para computação científica em uma linguagem de uso geral. Para o Python, existe o NumPy / Matplotlib, que possui algumas arestas, mas fornece funcionalidade razoável do MATLAB dentro do Python. A razão pela qual não houve outro projeto como esse é que as bibliotecas são incrivelmente difíceis de escrever e atendem a um mercado já coberto pelo MATLAB e FORTRAN.

Se você absolutamente precisar usar o MATLAB ou R, não poderá abordar a programação neles como um programador "hardcore", precisará abordá-lo como um cientista ou engenheiro "hardcore". Para LISP, você se acha em recursão. No MATLAB, você só precisa pensar em matrizes. Atualize a álgebra linear ( as palestras do MIT sobre o assunto são uma ótima revisão). Caso contrário, a única maneira de "sobreviver" ao MATLAB é, com a prática, reconhecer quando um loop pode ser substituído por uma operação vetorial ou quando o seu problema se reduz à localização dos valores próprios de um produto externo.

Hoa Long Tam
fonte
Sim, no geral, eu amo o Numpy / Scipy / Matplotlib e os uso sempre que a alternativa óbvia for o MATLAB / R. Minhas únicas reclamações sobre isso são que eles não são tão profundos quanto o MATLAB / R e que, por serem Python, ainda são um pouco lentos.
dsimcha
4
@dsimcha, isso é incorreto . Neste estudo de desempenho, o Numpy está em pé de igualdade com o MATLAB e o Pyrex está dentro de um fator de 2 do C ++.
Wvoq
@wvoq: Esclarecimento: eu quis dizer que o interpretador Python é lento, não Numpy. Eu sei que o Numpy é principalmente um invólucro para BLAS e LAPACK, que são rápidos. É claro que ainda existe a sobrecarga fixa de chamar esse código. Também estou ciente de Pyrex, Cython, etc, e eles ajudam, mas você ainda está misturando linguagens em um nível refinado e isso ainda pode ser uma fonte de atrito.
Dsimcha
2
@dsimcha, A sobrecarga de ligar para o Numpy é praticamente uma constante. No estudo de desempenho que mencionei, você está ganhando alguns décimos de segundo com C ++. Esse tempo deve ser comparado ao tempo gasto na gravação e depuração, e na depuração de chamadas BLAS. Pode ser instrutivo perguntar por que não escrever tudo na montagem? Ou mesmo código de máquina direto, já que a conversão de montagem em código de máquina adiciona alguma sobrecarga fixa?
Wvoq
3
@dsimcha Hein? Você quer fazer tudo em uma única linguagem (rápida), gosta mais do Python e depois reclama que o Python é lento? Então, qual é o objetivo? Eu acho que você só quer que o MATLAB tenha recursos de uso geral e seja mais rápido que uma linguagem interpretada?
Chris diz Reinstate Monica
14

Seu uso repetido do termo "programador hardcore" em referência a si mesmo. juntamente com sua insinuação de que os designers de R e MATLAB não são , me parece muito bobo e incentiva as pessoas a não levarem suas críticas a sério.

Se você gostaria de ler algumas críticas sérias a R, faria bem em ler esta peça de Ross Ihaka, um dos designers de R. Parece-me muito mais difícil projetar R do que usar D ou Python.

wvoq
fonte
2
-1. Eu nunca quis sugerir que os designers do MATLAB e R são algo além de programadores hardcore muito bons. No entanto, o MATLAB e o R não são projetados para programadores hardcore.
Dsimcha
3
"... parece que essas linguagens foram projetadas por pessoas que não são programadores hardcore e não pensam como programadores hardcore".
Wvoq
6
Você ainda não esclareceu o que é um "programador hardcore". Por seus exemplos, "hardcore" parece apenas significar "mais confortável com C ++"; nesse caso, R e MATLAB não serão hardcore por definição. Quase todos os seus exemplos se reduzem a reclamações de que esses idiomas não são o que você está acostumado, sem perguntar por que os especialistas nessas áreas consideraram adequado implementá-los dessa maneira.
Wvoq
1
Além disso, em termos de definição, pensei que era óbvio, mas um "programador hardcore" é apenas alguém que se familiariza com conceitos básicos de programação como referências / ponteiros, orientação a objetos, funções lambda, estruturas básicas de dados, etc., e está acostumado a desenvolver em uma linguagem de uso geral.
dsimcha
2
Bem, primeiro, "hardcore" é um termo bastante carregado se pretender denotar "alguém familiarizado com conceitos básicos em programação oo / processual / funcional". Em segundo lugar, não posso falar pelo MATLAB, mas R tem todas essas coisas. A única diferença é que em R você é incentivado pela linguagem a abordar seu problema de tal maneira que os elementos do vocabulário estatístico se tornem suas primitivas. A razão para isso é que estatísticos e profissionais de aprendizado de máquina geralmente trabalham com problemas facilmente expressos dessa maneira, o que faz do R um ajuste natural, mesmo que você se sinta à vontade com coisas "essenciais".
Wvoq
9

A ênfase extrema em vetores e matrizes na medida em que não existem primitivas verdadeiras.

Depende do que você chama de verdadeiro primitivo. Em R, um vetor é um verdadeiro primitivo; isto é, todas as variáveis ​​são vetores. Da mesma forma, no MATLAB todas as variáveis ​​são matrizes.

A dificuldade da manipulação básica de strings.

No MATLAB, a manipulação de strings é poderosa, mas eu concordo que o código geralmente é feio e pouco intuitivo (pelo menos por enquanto). Para o R, existe o stringrpacote, que é tão bom de usar quanto as ferramentas em qualquer outro idioma.

Falta ou constrangimento no suporte a estruturas básicas de dados, como tabelas de hash e matrizes "reais", isto é, paramétricas e aninhadas.

Em R, vetores têm nomes que funcionam como um hash. Há também os hashe filehashpacotes. Não tem certeza sobre as implementações do MATLAB, mas você pode chamar as versões JAVA ou .NET facilmente, se desejar.

Eles são muito, muito lentos, mesmo para os padrões de linguagem interpretados, a menos que você se incline para trás para vetorizar seu código.

Quando você pegar o jeito da vetorização (tenho certeza que sim, se você for realmente hardcore), amaldiçoará ter que usar loops quando voltar para outros idiomas. A velocidade de execução é uma compensação pela velocidade da programação.

Eles parecem não ter sido projetados para interagir com o mundo exterior. Por exemplo, ambos são programas bastante volumosos que demoram um pouco para serem iniciados e parecem não ter sido projetados para facilitar a gravação de programas simples de filtro de texto. Além disso, a falta de um bom processamento de string torna quase impossível a E / S do arquivo, exceto em formas muito padrão.

Ambos podem ler e gravar dados em praticamente qualquer formato. Ambos podem ser chamados da maioria das outras linguagens de programação. Ou em um prompt de comando. Você pode criar GUIs com eles. Como isso não está interagindo com o mundo exterior? Se você está tendo problemas com o seu programa de filtro de texto, pergunte no stackoverflow.

A orientação a objetos parece ter uma sensação muito aparafusada. Sim, você pode fazê-lo, mas não parece muito mais idiomático do que OO em C.

Acordado; são principalmente linguagens processuais.

Não há maneira óbvia e simples de obter um tipo de referência. Sem ponteiros ou referências de classe. Por exemplo, não tenho ideia de como você rola sua própria lista vinculada em um desses idiomas.

Acordado em R. No MATLAB, as referências são chamadas de identificadores.

Você não pode colocar várias funções de nível superior em um único arquivo, incentivando funções muito longas e codificando recortar e colar.

Absurdo. Basta criar vários arquivos.

Aparentemente, números inteiros não existem como um tipo de primeira classe.

Eles fazem. Veja int8, int16, int32e int64.

As estruturas de dados internas básicas parecem muito altas e estão mal documentadas, e nunca parecem fazer exatamente o que eu espero, dada a minha experiência com estruturas de dados semelhantes, mas de nível inferior.

Eles são adequados para a análise de dados. Por favor, dê exemplos específicos de comportamento inesperado.

A documentação está espalhada por todo o lugar e praticamente impossível de navegar ou pesquisar. Até o D, que geralmente é criticado por documentação ruim e ainda é bastante alfa, é substancialmente melhor até onde eu sei.

Existem muitos tipos de documentação. Comece com ?some_function, RSiteSearch('some concept'), rseek.org , eo sospacote. Sem mencionar os manuais que acompanham a instalação. Ou um bom livro .

Pelo menos até onde sei, não há um bom IDE para isso. Novamente, mesmo D, uma linguagem bastante alfa-ish com uma pequena comunidade, se sai melhor.

Experimente o Architect, o RStudio ou o Revolution Analytics IDE. Consulte a seção "IDEs e editores para R" da página de informações Estouro de pilha para obter links e mais opções.

Richie Cotton
fonte
3

O MATLAB pode se integrar com Java e C / C ++. Você pode implementar toda a sua carga de trabalho não numérica nesses idiomas e invocá-los no MATLAB.

seu uso é necessário

Existe uma razão para isso ser necessário? Você está trabalhando em uma base de código MATLAB existente, escrita por outras pessoas? É um requisito de trabalho? (ou requisito de aula se você estiver na escola) Caso contrário, considere usar o SciPy ou o NumPy.

Infelizmente, na minha opinião pessoal, se essa situação está sendo imposta a alguém, nem sempre é possível sobreviver. Mesmo na faculdade, nem todo estudante de engenharia pode se acostumar com o modo de pensar computacional do MATLAB.

rwong
fonte
2
Estou ciente dessas soluções, mas elas parecem bastante atrasadas. Eu gostaria de chamar o MATLAB de C ++, Java etc., e não o contrário. Eu gostaria que qualquer coisa, menos o MATLAB, fosse minha linguagem "motorista".
dsimcha
2
@dsimcha, você pode chamar as bibliotecas MATLAB e R de C. Consulte mathworks.com/help/techdoc/matlab_external/f38569.html ou math.univ-montp2.fr/~pudlo/R_files/call_R.pdf
Charles E. Grant
0

Trabalho com MATLAB, Python e C (e às vezes C ++) e me considero (principalmente) um desenvolvedor de software, sentado ao lado de colegas que tendem a ser cientistas de dados, matemáticos ou outros especialistas em domínio.

Embora eu seja o primeiro a admitir que não é uma linguagem de programação de propósito geral no sentido em que C ou Python é, eu realmente gosto muito de escrever scripts no MATLAB, principalmente para coisas como análise de séries temporais ou processamento de imagens.

Existem algumas características da linguagem que, embora geralmente sejam implementadas de maneira bastante ineficiente, são uma alegria de usar. Por exemplo, considere a indexação lógica: eu posso criar um vetor ou matriz lógica que seleciona uma região de interesse e nomeá-la "isInROI", executando uma operação de filtro para selecionar elementos do vetor ou matriz "dados" nessa região. basta escrever: "roiData = data (isInROI)".

São momentos como esse que realmente me fazem apreciar o MATLAB e me permitem ignorar seus outros pecados numerosos e muito discutidos.

William Payne
fonte
Observe que o numpy também possui indexação lógica: docs.scipy.org/doc/numpy/user/…
jarondl