Um JavaScript mais rápido e mais enxuto para a computação científica: quais recursos devo manter?

8

Aqui, estou realmente interessado em diminuir as barreiras à educação matemática.

Alvo:

Eu gostaria de ver criado para a comunidade JavaScript, um equivalente das bibliotecas de computação científica e de alto desempenho baseadas em Python / vinculadas (ótimas listas das quais estão disponíveis no Sage ou não ). E eu quero isso, porque gostaria de facilitar para as pessoas que aprendem JavaScript entrar na computação científica e numérica sem precisar aprender Python (& empresa). (Eu sei que é fácil aprender Python, como eu basicamente o fiz em algum momento, mas isso sugere que talvez seja fácil compilar um subconjunto restrito de JavaScript para Python.)

Método hipotético:

Estou interessado principalmente em uma nova linguagem com uma diferença mínima do JavaScript, porque o mercado ("compiladores humanos") que estou direcionando são programadores que já conhecem o JavaScript. O que eu quero direcionar para essas pessoas é fornecer a elas uma linguagem minimamente diferente na qual escrever código que compila para C mais rápido, da maneira que RPython e Cython fazem para Python. Estou disposto a lançar muitos recursos de JavaScript, só quero ter o cuidado de adicionar um número mínimo de recursos. Definitivamente, observarei Lua, Dart, ECMA Harmony (que não tem data formal de lançamento , ou estou enganado?), etc., pois todas elas são muito parecidas com as implementações contemporâneas (2012) do JavaScript.

Motivações questionáveis:

Pessoalmente, estou disposto a aprender qualquer idioma / conjunto de ferramentas que faça as coisas mais rapidamente (estou aprendendo o próprio Erlang, por isso), mas aqui estou especificamente interessado em baixar (desculpe) outras pessoas que talvez não tenham esse conhecimento. vontade. Essa é apenas uma daquelas situações em que "quero comer meu bolo e comê-lo também, por isso, dedico algum tempo à pesquisa do problema". Eu tenho uma experiência anterior muito limitada em design de linguagem de computador, mas até agora, do ponto de vista de hackers no ecossistema, o problema parece interessante o suficiente para ser estudado; portanto, espero fazer mais disso em breve.

jerng
fonte
5. Use símbolos em vez de cadeias para nomes de métodos.
Dave Clarke
4
Esta questão não é razoavelmente responsável em seu estado atual. Eu recomendo que você leia nossas perguntas frequentes ; sua pergunta é muito ampla e aberta e parece mais um discurso retórico contra a lentidão percebida do JavaScript do que uma tentativa genuína de melhorar algo. No entanto, há perguntas válidas ocultas aqui, e eu encorajo você a melhorar sua pergunta para que possa ser reaberta. Não faça a bola rolar, as respostas pertencem às respostas. Evite colocar muitas suposições pessoais em sua pergunta, pois as perguntas objetivas obterão respostas mais objetivas.
Gilles 'SO- stop be evil'
2
A principal coisa que falta na sua pergunta é seu objetivo. Você quer velocidade e deseja semelhança com Javascript; o que você está preparado para sacrificar? O que seu idioma deve fazer? A compatibilidade do código-fonte com o Javascript é importante? Deseja vincular-se ao código existente? Quais são os casos de uso do seu idioma? Um monte de código Javascript é carregado dinamicamente, o que está muito próximo de ter eval; seu idioma deve ter isso? Você tem como objetivo principal compilar código de máquina, VM ou interpretação? Que tipo de sistema de tipo estático você imagina?
Gilles 'SO- stop be evil'
2
Obrigado pela edição, a pergunta é respondida (ampla e subjetiva, mas acho que não muito) agora que sabemos qual é seu objetivo. Infelizmente, ninguém parece ter notado sua edição até agora; Espero que as respostas ainda possam ser úteis. Observe que, para que alguém seja notificado de que respondeu ao comentário, você precisa usar o @sinal antes do nome (por exemplo @Gilles- e acertar a ortografia) - clique no helpbotão ao lado da caixa de entrada do comentário para obter mais informações.
Gilles 'SO- stop be evil'
11
"Tenho experiência anterior muito limitada em design de linguagem de computador". Você deve consertar isso primeiro. Sem ofensa pessoal, mas já temos um dilúvio de designers amadores de idiomas que inundam o mercado com criações abaixo da média. Seja uma parte da solução, não o problema
gardenhead

Respostas:

7

Se você deseja usar JavaScript para computação científica, por que não tentar o Node.js. ? O Node é baseado no mecanismo V8 do Google, com algumas funcionalidades adicionais para interagir com o sistema de arquivos, gravar servidores e vincular-se às bibliotecas C e C ++ (essa definitivamente não é uma lista exaustiva). Possui tempos de execução rápidos e fornece um console interativo e também uma maneira de executar seus programas a partir da linha de comando. Achei o comentário de @ DaveClarke sobre Python agindo como "código de cola" interessante por causa da redação. Aqui está um trecho da documentação do nó sobre addons :

Os complementos são objetos compartilhados dinamicamente vinculados. Eles podem fornecer cola para as bibliotecas C e C ++.

O Node também possui um excelente gerenciador de pacotes chamado NPM, o que facilitaria o compartilhamento de módulos científicos que você escreveu. O repositório do NPM já contém alguns módulos científicos, como "natural" (para processamento de linguagem natural) ou "clusterfck" (uma biblioteca de cluster). Definitivamente, existem muitas outras bibliotecas disponíveis para uma variedade de aplicações.

O melhor dessa solução é que você não precisaria modificar o JavaScript ou criar um novo idioma. A sintaxe é essencialmente a mesma, mas seu código não precisa de um navegador para ser executado. Se você planeja acompanhar o nó, uma boa primeira etapa pode ser começar a criar complementos para bibliotecas científicas de código aberto existentes escritas em C e C ++, ou você pode portá-las para JavaScript. Na verdade, eu estava pensando em usar o nó para programação científica hoje, e foi isso que me levou a essa pergunta. Seria ótimo ver ferramentas mais robustas, como você encontra no Python.

Inicialmente, eu tinha links para natural e clusterfck, mas não tenho representante suficiente para publicá-los. Felizmente, eles aparecem como os primeiros resultados se você pesquisar no "clusterfck node" e "natural node".

JasonLynch426
fonte
Obrigado @ JasonLynch426, isso faz sentido. Eu concordo com a conveniência do NPM.
jerng
6

O ponto das bibliotecas científicas do Python é que o Python atua apenas como um código de cola para embaralhar os dados entre as bibliotecas científicas. O próprio Python faz pouco do trabalho de moagem de alto desempenho. O Python é uma boa linguagem para isso, pois suporta os paradigmas procedurais e orientados a objetos (e funcionais em grande parte), e é possível vincular-se facilmente a bibliotecas externas.

Javascript está fortemente ligado às tecnologias do navegador. É principalmente uma linguagem horrível, nada projetada para ser eficiente ou para escrever software em larga escala, embora na prática as duas coisas ocorram devido a enormes investimentos em tecnologia de compiladores e uso cuidadoso da linguagem, respectivamente. O Javascript é 1000 vezes melhor por bibliotecas bem projetadas, como o JQuery. Não tenho certeza se o Javascipt fornece algum suporte para vincular facilmente as bibliotecas C (embora eu ache que deve, indiretamente pelo navegador e via Java).

Não pretendo desanimar, mas toda a idéia parece infundada. Javascript e computação de alto desempenho são encontrados apenas em frases que começam com "Um homem entrou em um bar ...."

Dito isto, estou disposto a provar que estou errado. O Java em tempo real existe, o que é uma combinação estranha e é bem-sucedida, portanto, quem sabe.

Dave Clarke
fonte
2
Javascript em um navegador não tem um FFI, mas a implementação da linguagem não-JS que o jerng estava pensando em projetar poderia ter um. JS também suporta paradigmas procedurais, OO e funcionais em grande parte. Portanto, não compartilho sua relutância em relação a JS aqui. (No entanto, também não acho que esse seja o caminho certo, por um motivo diferente: para criar um novo idioma, você deve ter um bom motivo, e não vejo um aqui. Acho que Vor está à direita quando ele sugere Java.)
Gilles 'SO- stop be evil'
2
“O Javascript está fortemente vinculado às tecnologias do navegador”: Historicamente era, mas ainda é o caso? De acordo com o padrão ECMAScript, a linguagem me parece uma linguagem de programação decente de uso geral que não está particularmente ligada aos navegadores.
Tsuyoshi Ito
11
O Javascript IMO é uma linguagem muito boa para scripts, mas seu suporte a OO é um pouco estranho (a herança deve ser simulada com protótipos, uma "classe" é uma função em Javascript, ...) ... mas, por outro lado, protótipos são muito poderosos em um ambiente de programação dinâmico, por exemplo, métodos podem ser adicionados dinamicamente (interativamente) às "classes" e suas instâncias.
Vor
3
"É principalmente uma linguagem horrível que não foi projetada para ser eficiente ou para escrever software em larga escala, embora na prática as duas coisas ocorram devido a enormes investimentos em tecnologia de compiladores e uso cuidadoso da linguagem, respectivamente" - eu poderia dizer o mesmo para Python. Pessoalmente, acho difícil de usar. Quanto à eficiência - isso resulta em fazer com que o C / C ++ faça o trabalho pesado, e é assim que a JS alcança alto desempenho. Ambos são horríveis para multithread. Eu tive> 100x aceleração por reescrever funções simples Python em C.
Mark K Cowan
11
@Ski A resposta de cinco anos é de cinco anos. Chocante!
David Richerby
5

Apenas uma idéia: você pode usar bibliotecas científicas escritas em Java (acho que já encontrará muito trabalho disponível) com Javascript - que tem uma sintaxe semelhante ao Java - usada apenas como uma linguagem de empacotamento para:

  • scripting
  • interação com o usuário
  • (re) modelagem e padronização das classes / pacotes / funções de alto nível subjacentes ... embora eu ache que seria melhor fazer isso na "camada" Java

Veja o projeto Rhino para um interpretador Javascript estável escrito em Java.

Se desejar, você pode usar o Java JNI para usar bibliotecas científicas escritas em C / C ++.

A figura inteira:

                              ____ disparate Java libraries
Javascript   ----- Java      /
(scripting,      ("package   \____ JNI ____ C/C++ libraries
 interaction,     remodeling")   
high-level stuff)

EDIT : apenas pesquisando em um material encontrado como este: Biblioteca Java GNU Scientific , Lista de bibliotecas numéricas (Java) , biblioteca Java Graph , ambiente jHepWork Multiplatform para computação científica e análise de dados

Vor
fonte
2

Criar um novo idioma não é necessário. Hoje, pode-se escrever computação numérica de alto desempenho em JavaScript, sem compilação / transpilação. Como uma linguagem de script, o JavaScript se compara favoravelmente a Python e R. Para benchmarks, execute os benchmarks de linguagem no stdlib , que comparam o desempenho em uma ampla variedade de APIs.

Para aplicativos do lado do servidor, é possível gravar complementos nativos do Node.js. para interagir com as mesmas bibliotecas C / C ++ / Fortran usadas em outros ambientes de computação numérica, como R, Python e Julia. Como mostrado no meu trabalho, os complementos nativos do Node.js. permitem vincular a bibliotecas de computação numérica otimizadas por hardware, permitindo assim a computação numérica de alto desempenho a partir do JavaScript.

Para aplicativos do lado do cliente, é possível compilar no WebAssembly para obter 1,5-2x do desempenho nativo. Para ambientes mais antigos, é possível compilar para o asm.js., que é um subconjunto reduzido de JavaScript mais passível de otimização do compilador. No meu trabalho, o asm.js pode corresponder a implementações de referência ingênua (ou seja, não otimizadas para hardware) escritas em C / C ++ / Fortran.

Em resumo, não há razões técnicas para você não poder escrever bibliotecas de computação numéricas e científicas no próprio JavaScript. O que é necessário são pessoas com tempo e recursos para escrever implementações rigorosas e robustas.

divulgação : Eu e outros estamos trabalhando no projeto stdlib , que visa trazer recursos de computação numérica robustos e de alto desempenho para JavaScript e Node.js.

kgryte
fonte