O Python seria muito lento para uso do lado do cliente em navegadores?

17

Ouvi a afirmação de que o Python seria muito lento para ser útil em navegadores.

Eu acho que o Javascript é apenas superior nesse aspecto por causa de empresas como o Google que precisam rápido (e rápido) porque precisam para sobreviver, mas eu posso estar errado.

Existem diferenças na maneira como o Python e o Javascript são projetados que afetam o desempenho dos navegadores?

Como até o momento não há uma implementação Python no lado do cliente, minha pergunta vem da declaração de alguém, então talvez tenha algo a ver com as próprias linguagens (embora eu não acredite nisso).

Profpatsch
fonte
2
Python no navegador? Quando isso aconteceu?
yannis
6
Isso não aconteceu. Observe o would?
Profpatsch
16
Bem, se não aconteceu, então não vejo do que se trata a questão. Quando estamos falando de desempenho, não estamos falando de linguagens, mas de implementações de linguagens (e existem várias implementações para Python e Javascript). Se não há uma implementação Python do lado do cliente, o que há para falar?
yannis
1
Ciência teórica! : D Minha pergunta vem da afirmação que alguém fez, então talvez tenha algo a ver com os próprios idiomas (embora eu não acredite nisso).
Profpatsch
1
Era uma vez uma implementação de integração Python para o Internet Explorer, por meio da interface COM, que também habilitava uma opção VBScript para script do DOM. Eu acho que a Microsoft interrompeu a opção de usar a integração COM na versão 5 ou 6, não me lembro.
precisa

Respostas:

23

Para começar, precisamos fazer uma distinção clara entre idiomas e implementações . Uma linguagem é uma coisa abstrata, a implementação é uma coisa concreta que pode ter o desempenho medido. Por exemplo, o Lisp já foi considerado ineficiente demais para uso prático, mas os compiladores continuaram amadurecendo e, eventualmente, um hardware dedicado foi desenvolvido para ele; em um ponto da década de 1980, era a plataforma de desenvolvimento preferida para o desenvolvimento de estações de trabalho de alto desempenho.

Dito isso, a resposta mais simples é que uma implementação rápida de Javascript como a V8 do Google expulsa a implementação padrão do Python (CPython) . A V8 é uma máquina virtual altamente otimizada com um JITer incrivelmente rápido, enquanto o CPython é uma VM bastante simples em comparação. Existe uma implementação do Python com um JIT, mas ainda é apenas cerca de 5-6x mais rápido.

Cinco anos atrás, teria sido uma história diferente. Os navegadores tinham implementações simplificadas de Javascript porque a velocidade não era uma preocupação, já que ninguém construía software 'real' com ela e o Python teria sido igual, se não mais rápido.

Sean McSomething
fonte
Esta é a resposta mais perspicaz ainda. Portanto, não é potencial, mas tempo e dinheiro.
Profpatsch 12/03
7
"Cinco anos atrás, teria sido uma história diferente" ... e daqui a cinco anos poderá ser diferente novamente.
Bryan Oakley
1
>> Uma linguagem é uma coisa abstrata, a implementação é uma coisa concreta que pode ter o desempenho medido << Sim, uma implementação de linguagem de programação é uma coisa concreta. Não, uma implementação de linguagem de programação não possui um desempenho mensurável de propriedades. O desempenho é uma propriedade de programas específicos que usam uma implementação de linguagem, em um contexto específico.
31413 igouy
2
@igouy Então, se eu escrevesse dois programas funcionalmente idênticos, um em C e um em Python, você consideraria a diferença de desempenho uma propriedade do aplicativo, e não a implementação da linguagem?
ConditionRacer
1
@ConditionRacer: Existem muitas maneiras diferentes de escrever o mesmo programa, portanto, mesmo que uma versão em python do programa tivesse características de desempenho diferentes de uma versão em C, isso não provaria que nenhuma versão em python poderia ser equivalente à versão em C. Veja coisas como asm.js ... em qualquer idioma, você pode usar uma matriz gigante para armazenar todo o estado do seu programa e pode usar um pequeno subconjunto facilmente otimizável das operações primitivas da linguagem. (Como se costuma dizer "você pode escrever C em qualquer idioma".)
Mankarse
5

Nos tempos antigos da web, quando os miniaplicativos java, onde a principal forma de conteúdo interativo do lado do cliente, as pessoas percebiam que era preciso haver uma maneira de obter formulários em uma página da web para poder interagir com os miniaplicativos na página da web.

A partir disso, uma linguagem de script para vincular o applet java à página da web foi criada com o nome ... javascript.

Podemos ver os vestígios desse legado com perguntas do SO, como [ 1 ], [ 2 ], [ 3 ] - e os dois documentos oficiais: Invocando Código JavaScript de um Applet e Invocando Métodos de Applet do Código JavaScript

Com essa linguagem disponível, os navegadores da época (Netscape sendo o predominante) disponibilizaram o javascript como uma vantagem competitiva (javascript desenvolvido na Netscape - o Netscape foi o primeiro javascript do lado do servidor com seu servidor em 94 - quase duas décadas antes do nó .js). Outros navegadores seguiram o exemplo. As pessoas estavam escrevendo páginas que usavam javascript, outras tentativas de script no cliente significariam páginas completamente incompatíveis entre coisas que funcionam e coisas que não funcionam - ou duplicação de código (aqui está o bloco {insert language here}} que faz isso para não-javascript navegadores e aqui está o bloco javascript para todos os outros).

Como o Netscape foi o navegador dominante por um período, o javascript entrou em ação. Enquanto o legado do Netscape é perdido nas notas de rodapé dos arquivos de origem do Mozilla, o javascript permanece vivo e nada foi capaz de exagerar.

O problema permanece para qualquer outra linguagem de script de slides do cliente. Javascript é suportado em todos os navegadores. Se alguém fizesse um navegador que suporta python (por exemplo) em vez de javascript, ele não seria capaz de usar a grande maioria dos sites. Além disso, a menos que o navegador tenha conseguido uma parcela significativa do tráfego do navegador, os web designers não desejam criar dois conjuntos de páginas com diferentes linguagens de script para a mesma página.

Pode-se tentar criar um plugin de script python para algum navegador que habilite um script python na página ... semelhante a como o vrml funciona hoje. Mas, a menos que você tenha ouvido e visto uma página da Web que usa vrml, é provável que um deles encontre uso para outra página da Web para outra linguagem de script.

Comunidade
fonte
1
Esta é uma visão geral muito boa de "como aconteceu ..." e, tanto quanto eu gostaria de marcá-la como resposta correta, responde à pergunta "Por que o Javascript é o idioma do cliente usado hoje?", Não " existe um problema de design que faria Python muito lento para uso do lado do cliente “?
Profpatsch
VRML ... uau, isso me leva de volta!
FrustratedWithFormsDesigner
1
@Profpatsch, não há nenhum problema de design técnico com o javascript que o torna inadequado por ser uma linguagem do lado do cliente - além de que nada o usa e a menos que ofereça alguma vantagem significativa (provavelmente incluindo a interatividade com os applets java), nada será. Os problemas não são técnicos e, a menos que se entenda o histórico de "por que javascript", não é possível responder "por que não python".
2
@ MichaelT: Você escreveu "não há problema de design técnico com javascript que o torne inadequado por ser uma linguagem do lado do cliente". Você quer dizer Python não JS ??
Carl Smith
@CarlSmith Ahh sim. Meu erro ... e não consigo editar comentários além de um certo tempo. Obrigado pela correção.
4

Eu não acho que o Python seria muito lento. Não há nada na linguagem que o impeça de executar rápido o suficiente para corresponder ao JavaScript. Ele pode ser compilado em JavaScript; portanto, se nada mais, você pode incluir um compilador no navegador e aumentar potencialmente o tempo de carregamento da página.

ATUALIZAÇÃO: Por favor, veja os comentários abaixo discutindo por que compilar Python para JS seria consideravelmente mais caro do que o implícito aqui.

O problema está tentando convencer os fornecedores de navegadores e o W3C a escolher primeiro Python, em vez de Ruby ou qualquer outra linguagem de script agradável, depois definir um subconjunto padronizado, pois eles não podem permitir chamadas do sistema e assim por diante, e implementá-lo bem, enquanto isso. ainda suporta JavaScript. Isso não vai acontecer, mas se isso acontecer, duvido que a velocidade acabe sendo um problema sério.

Carl Smith
fonte
7
Seu primeiro ponto não segue. Tudo pode ser compilado para quase tudo (incluindo código de máquina), mas isso não significa que um programa escrito em alguma linguagem L e compilado em alguma linguagem C seja tão rápido quanto um programa equivalente escrito na linguagem C.
1
Bem, o CoffeeScript é essencialmente uma sintaxe diferente para os mesmos conceitos principais do JavaScript, e C é essencialmente uma linguagem de montagem portátil. Python e Javascript, por outro lado, diferem bastante. Para implementar o Python corretamente, você precisa oferecer suporte (entre bilhões de outras coisas) ao modelo de classe, sobrecarga de operador, metaclasses etc. e a maior parte disso não é mapeada para o JavaScript com facilidade e eficiência. O mesmo problema ao compilar qualquer um deles em C ou código de máquina. Um JIT especializado pode ser sua única esperança, mas os compiladores JIT voltados para JS ainda precisam ser comprovados.
3
Uma questão será o fato de que você não pode compactar o Python como o JS - elimine todos esses espaços e novas linhas e lá vai o seu escopo! Então, você terá tempos de carregamento mais longos para qualquer parte significativa do Python.
TMN
1
@TMN ponto interessante, embora se esperasse que a expressividade do Python ajudasse bastante (e sim, isso é contar linhas, não caracteres, mas ainda assim, o Python é uma linguagem bastante expressiva).
22813 Daniel B
2
@TMN O que Daniel B disse, e também o gzip deve reduzir a diferença. Ah, e o Python não precisa da maioria dessas novas linhas e espaços. Muitas (embora nem todas) as linhas podem ser unidas muito bem em Python, por exemplo, a = something(); frobincate(a); return quuxe if condition: react()cada uma possui uma linha. E os níveis de indentação n precisam de apenas n espaços, não n * 4 espaços.
2

Eu acho que o Python tem sua própria máquina virtual. Não tenho muita experiência com Python, mas não vejo nenhuma razão para que ele não funcione tão bem quanto um mecanismo JavaScript não otimizado.

Alguns pensamentos aleatórios:

(1) Você provavelmente pode executar o Python localmente através de um applet Java usando o Jython. A parte difícil que vejo aqui é que os applets são muito restritivos; portanto, você pode precisar modificar o Jython para se ajustar às restrições de acesso. Por exemplo, se ele grava em um arquivo de log, pode ser necessário remover o código de log. Um applet não precisa ser visivelmente visível.

(2) Alguém poderia criar um "compilador" / conversor de Python para JavaScript. Isso daria muito trabalho.

Aaron S
fonte
5
Someone could build a Python-to-JavaScript "compiler"/converterBem, alguém já fez .
yannis
Brython também
World Engineer
Eu nunca tive que fazer isso sozinho, mas estou ciente de que as pessoas escreveram applets Java usando Jython. Isso não é a mesma coisa que substituir o Javascript no navegador por Python.
Martijn Pieters
Brythonfunciona curiosamente rápido, pelo menos para partes isoladas nas páginas (baixa interação com o DOM tree).
Profpatsch 12/03
@Profpatsch Desde o último momento em que olhei, ele nem sequer implementa partes muito grandes da linguagem Python. Convenientemente, entre os recursos não implementados estão aqueles que são difíceis de implementar bem no topo do JavaScript. Parafraseando um dos autores do PyPy: É fácil tornar rápido um subconjunto não trivial do Python, o Python completo é onde fica difícil.
1

Depende da implementação da linguagem e não necessariamente da própria linguagem. A maioria dos intérpretes JavaScript é muito mais rápida do que quase todas as implementações do Python.

Isso não significa que a linguagem Python não possa ser usada quase na mesma velocidade que o JavaScript. O Opal implementa quase toda a linguagem Ruby e a biblioteca padrão no navegador, compilando o código Ruby no código JavaScript envolvido em fechamentos. Deixando de lado a sobrecarga de incluir a biblioteca Opal, sua velocidade é muito mais próxima da do JavaScript direto do que qualquer outro intérprete de Ruby que eu conheça.

Não sei se existe um equivalente em Python do Opal, mas esse projeto provavelmente significaria que a resposta para sua pergunta é "não". Com o crescente uso do JavaScript como uma "linguagem assembly para a web", não me surpreenderia se ele fosse cada vez mais usado como plataforma para outros idiomas, especialmente à medida que o poder da computação móvel aumenta e a sobrecarga de ter uma linguagem implementado em JavaScript se torna cada vez mais negligente.

EDIT: Aqui está uma lista de implementações Python para o navegador que compilam / executam em JavaScript.

https://github.com/jashkenas/coffeescript/wiki/list-of-languages-that-compile-to-js#python

E caso você esteja interessado, pode conferir o Opal, que eu realmente gosto.

http://opalrb.org/

Como duvido que os navegadores venham a oferecer suporte para intérpretes separados, esses compiladores provavelmente são o caminho do futuro em termos de uso de idiomas diferentes do JavaScript. Mesmo agora, você obterá um desempenho comparável na maioria das áreas. Esta é a minha opinião, no entanto, tenha isso em mente.

Ravenstine
fonte
0

Mesmo quando você fez essa pergunta, já havia várias implementações python disponíveis em javascript que podem ser usadas nas páginas da web hoje.

Dê uma olhada em http://www.skulpt.org/ ou http://www.brython.info/ para iniciantes.

O desempenho não parece muito ruim, mas você deve testá-los e descobrir.

fabspro
fonte
-4

Python é uma linguagem de "console", rodando no servidor

Javascript é uma linguagem de "navegador", em execução no cliente

Como tal, eles não competem diretamente

... é claro que existem node.js e provavelmente plugins de navegador python, mas é mais uma pergunta sobre o desempenho de uma implementação específica.

Além disso, para a maioria dos aplicativos, o python funcionará perfeitamente, exceto se você tiver que fazer algum tipo de computação extensa e reduzir os ciclos da CPU.

Como última nota, python e javascript compartilham muitas semelhanças. Devido à sua natureza dinâmica, ambos precisam ser interpretados em tempo de execução e não podem ser compilados com tanta força quanto as linguagens estáticas. Como tal, presumo que o desempenho alcançável deles seja semelhante.

dagnelies
fonte
2
O javascript do servidor estava em torno de 94. jscpermite que você trabalhe com javascript como um console, da mesma forma que seria possível se eles digitassem pythonem um console.
@MichaelT: Ok, editado minha resposta em conformidade
dagnelies
2
Além disso, você pode escrever aplicativos de desktop em Python .... Eu não vejo nenhuma razão real para a distinção que você está fazendo.
Chris Travers
Além disso, a ferramenta de modelagem 3D Blender usa Python para tudo, desde a interface do usuário até a geração de malha. Se isso não é desempenho competitivo, o que é?
Andrew Gray
@ Chris: a distinção é que o javascript é uma tecnologia de navegador principalmente, enquanto o python é principalmente uma tecnologia de desktop / console. Meu argumento era que comparar os dois faz pouco sentido, porque eles servem a propósitos totalmente diferentes.
dagnelies