Apakah Python terlalu lambat untuk digunakan sisi klien di Browser?

17

Saya telah mendengar pernyataan bahwa Python akan terlalu lambat untuk digunakan di browser.

Saya rasa Javascript hanya unggul dalam aspek ini karena perusahaan seperti Google yang membutuhkannya cepat (dan membuatnya cepat) karena mereka membutuhkannya untuk bertahan hidup, tetapi saya bisa saja salah.

Apakah ada perbedaan dalam bagaimana Python dan Javascript dirancang yang berdampak pada bagaimana mereka (akan) tampil di browser?

Karena sampai sekarang tidak ada implementasi Python sisi klien, pertanyaan saya berasal dari pernyataan yang dibuat seseorang, jadi mungkin itu ada hubungannya dengan bahasa itu sendiri (walaupun saya tidak percaya itu).

Profpatsch
sumber
2
Python di browser? Kapan itu terjadi?
yannis
6
Tidak. Perhatikan would?
Profpatsch
16
Nah, jika itu belum terjadi, maka saya tidak mengerti apa pertanyaannya. Ketika kita berbicara kinerja, kita tidak berbicara tentang bahasa, tetapi tentang implementasi bahasa (dan ada beberapa implementasi untuk Python seperti halnya untuk Javascript). Jika tidak ada implementasi Python sisi klien, apa yang harus dibicarakan?
yannis
1
Ilmu Teoritis! : D Pertanyaan saya berasal dari pernyataan yang dibuat seseorang, jadi mungkin itu ada hubungannya dengan bahasa itu sendiri (meskipun saya tidak percaya itu).
Profpatsch
1
Pernah ada implementasi integrasi Python untuk Internet Explorer, melalui antarmuka COM yang juga mengaktifkan opsi VBScript untuk skrip DOM. Saya pikir MS menghentikan opsi untuk menggunakan integrasi COM dalam versi 5 atau 6, tidak dapat mengingat.
Martijn Pieters

Jawaban:

23

Untuk memulainya, kita harus membuat perbedaan yang jelas antara bahasa dan implementasi . Bahasa adalah hal yang abstrak, implementasi adalah hal konkret yang dapat diukur kinerjanya. Sebagai contoh, Lisp pernah dianggap terlalu tidak efisien untuk penggunaan praktis tetapi kompiler terus jatuh tempo dan, akhirnya, perangkat keras khusus dikembangkan untuk itu; pada satu titik di tahun 1980-an itu adalah platform pengembangan pilihan untuk pengembangan workstation berkinerja tinggi.

Yang mengatakan, jawaban paling sederhana adalah bahwa implementasi Javascript cepat seperti Google V8 meniup implementasi standar Python (CPython) keluar dari air . V8 adalah mesin virtual yang sangat dioptimalkan dengan JITer yang luar biasa cepat sedangkan CPython adalah VM yang cukup sederhana sebagai perbandingan. Ada implementasi Python dengan JIT tetapi itu masih sekitar 5-6x lebih cepat.

Lima tahun yang lalu itu akan menjadi cerita yang berbeda. Browser memiliki implementasi Javascript sederhana karena kecepatan bukan masalah karena tidak ada yang membangun perangkat lunak 'nyata' dengan itu dan Python akan sama, jika tidak lebih cepat.

Sean McSomething
sumber
Ini adalah jawaban yang paling masuk akal. Jadi itu bukan potensi, melainkan waktu dan uang.
Profpatsch
7
"Lima tahun yang lalu itu akan menjadi cerita yang berbeda" ... dan lima tahun dari sekarang mungkin akan berbeda lagi.
Bryan Oakley
1
>> Bahasa adalah hal yang abstrak, implementasinya adalah hal nyata yang dapat diukur kinerjanya. << Ya, implementasi bahasa pemrograman adalah hal yang konkret. Tidak, implementasi bahasa pemrograman tidak memiliki kinerja properti yang terukur. Kinerja adalah properti dari program tertentu yang menggunakan implementasi bahasa, dalam konteks tertentu.
igouy
2
@igouy Jadi jika saya menulis dua program yang identik secara fungsional, satu di C, dan satu di Python, Anda akan menganggap perbedaan kinerja sebagai properti aplikasi, dan bukan implementasi bahasa?
ConditionRacer
1
@ConditionRacer: Ada banyak cara berbeda untuk menulis program yang sama, jadi walaupun versi program python memiliki karakteristik kinerja yang berbeda dari versi C, itu tidak akan membuktikan bahwa tidak ada versi python yang bisa setara dengan versi C. Lihat hal-hal seperti asm.js ... dalam bahasa apa pun Anda dapat menggunakan array raksasa untuk menyimpan semua status program Anda, dan dapat menggunakan subset kecil operasi yang mudah dioptimalkan dari bahasa primitif bahasa. (Seperti yang mereka katakan "Anda dapat menulis C dalam bahasa apa pun".)
Mankarse
5

Di masa lalu web, ketika applet java di mana satu - satunya bentuk utama dari konten interaktif sisi klien orang menyadari bahwa perlu ada cara untuk mendapatkan formulir pada halaman web untuk dapat berinteraksi dengan applet pada halaman web.

Dari ini, bahasa scripting untuk menautkan java applet ke halaman web dibuat dengan nama ... javascript.

Seseorang dapat melihat sisa-sisa warisan ini dengan pertanyaan SO seperti [ 1 ], [ 2 ], [ 3 ] - dan dua dokumen resmi: Meminta Kode JavaScript Dari Applet dan Memunculkan Metode Applet Dari Kode JavaScript

Dengan bahasa yang tersedia, browser pada saat itu (Netscape menjadi yang utama) membuat javascript tersedia sebagai keunggulan kompetitif (javascript dirancang di Netscape - Netscape adalah server sisi javascript pertama dengan servernya kembali pada '94 - hampir dua dekade sebelum node .js). Browser lain mengikutinya. Orang-orang menulis halaman yang menggunakan javascript, upaya lain pada skrip sisi klien akan berarti halaman yang sepenuhnya tidak dapat dipertukarkan antara hal-hal yang berfungsi dan hal-hal yang tidak - atau duplikasi kode (inilah blok {masukkan bahasa di sini} yang melakukan ini untuk non-javascript browser dan di sini adalah blok javascript untuk semua orang).

Karena Netscape adalah browser yang dominan untuk suatu periode, javascript mulai berlaku. Sementara warisan Netscape hilang pada catatan kaki dari file sumber Mozilla, javascript tetap hidup dan tidak ada yang bisa melewati tempatnya.

Masalahnya masih ada untuk bahasa skrip slide klien lainnya. Javascript didukung di setiap browser. Jika seseorang membuat browser yang mendukung python (misalnya) daripada javascript, itu tidak akan dapat menggunakan sebagian besar situs web. Selain itu, kecuali browser itu bisa mendapatkan bagian yang signifikan dari lalu lintas browser, perancang web tidak ingin membuat dua set halaman dengan bahasa skrip yang berbeda untuk halaman yang sama.

Orang mungkin mencoba membuat plugin skrip python untuk beberapa browser yang mengaktifkan skrip python pada halaman ... mirip dengan cara kerja vrml hari ini. Tetapi kecuali jika Anda telah mendengar dan melihat halaman web yang menggunakan vrml, satu kemungkinan akan digunakan untuk halaman web lain untuk bahasa skrip lain.

Komunitas
sumber
1
Ini adalah gambaran yang sangat bagus tentang "bagaimana hal itu terjadi ..." dan sebanyak yang saya ingin menandainya sebagai jawaban yang benar, itu menjawab pertanyaan "Mengapa Javascript bahasa sisi klien digunakan hari ini?", Bukan " Apakah ada masalah desain yang akan membuat Python terlalu lambat untuk penggunaan sisi klien? "
Profpatsch
VRML ... wow, itu membawaku kembali!
FrustratedWithFormsDesigner
1
@Profpatsch tidak ada masalah desain teknis dengan javascript yang membuatnya tidak pantas untuk menjadi bahasa sisi klien - selain itu tidak ada yang menggunakannya dan kecuali itu menawarkan beberapa keuntungan yang signifikan (kemungkinan termasuk interaktivitas dengan applet java), tidak ada yang pernah mau. Masalahnya tidak teknis dan kecuali seseorang memahami sejarah "mengapa javascript", seseorang tidak dapat menjawab "mengapa tidak python."
2
@MichaelT: Anda menulis "tidak ada masalah desain teknis dengan javascript yang membuatnya tidak pantas untuk menjadi bahasa sisi klien". Maksudmu Python bukan JS ??
Carl Smith
@CarlSmith Ahh ya. Kesalahan saya ... dan saya tidak dapat mengedit komentar di luar waktu tertentu. Terima kasih atas koreksinya.
4

Saya tidak berpikir Python akan terlalu lambat sama sekali. Tidak ada apa-apa tentang bahasa yang mencegahnya berjalan cukup cepat untuk setidaknya mencocokkan JavaScript. Ini dapat dikompilasi ke JavaScript, jadi, jika tidak ada yang lain, Anda dapat memasukkan kompiler di browser dan hanya berpotensi menambah waktu pemuatan halaman.

UPDATE: Silakan lihat komentar di bawah ini membahas mengapa kompilasi Python ke JS akan jauh lebih mahal daripada tersirat di sini.

Masalahnya adalah mencoba meyakinkan vendor browser dan W3C untuk terlebih dahulu memilih Python, lebih dari Ruby atau bahasa skriping bagus lainnya, kemudian menentukan subset standar, karena mereka tidak dapat mengizinkan panggilan sistem dan sebagainya, dan kemudian mengimplementasikannya dengan baik, sementara itu masih mendukung JavaScript. Itu tidak akan terjadi, tetapi jika itu terjadi, saya ragu kecepatan akan menjadi masalah serius.

Carl Smith
sumber
7
Poin pertama Anda tidak mengikuti. Semuanya dapat dikompilasi ke hampir semua (termasuk kode mesin), tetapi itu tidak berarti program yang ditulis dalam beberapa bahasa L dan dikompilasi ke beberapa bahasa C secepat program setara yang ditulis dalam bahasa C.
1
Nah, CoffeeScript pada dasarnya adalah sintaks yang berbeda untuk konsep inti yang sama dengan JavaScript, dan C pada dasarnya adalah bahasa rakitan portabel. Python dan Javascript, di sisi lain, sangat berbeda. Untuk mengimplementasikan Python dengan benar, Anda perlu mendukung (di antara miliaran hal lainnya) model kelas, overloading operator, metaclasses, dll. Dan sebagian besar tidak memetakan ke JavaScript dengan mudah dan efisien. Masalah yang sama dengan mengkompilasi keduanya ke C atau kode mesin. JIT khusus mungkin satu-satunya harapan Anda, tetapi kompiler JIT yang menargetkan JS belum terbukti praktis.
3
Salah satu masalah adalah fakta bahwa Anda tidak dapat mengompres Python seperti halnya Anda dapat JS - hilangkan semua ruang dan baris baru tersebut dan lepaskan cakupan Anda! Jadi, Anda akan berakhir dengan waktu muat yang lebih lama untuk bongkahan signifikan Python.
TMN
1
@TMN poin menarik, meskipun orang akan berharap bahwa ekspresif Python akan pergi jauh untuk mengurangi itu (dan ya, itu menghitung garis, bukan karakter, tapi tetap saja, Python adalah bahasa yang cukup ekspresif).
Daniel B
2
@TMN Apa yang dikatakan Daniel B, dan juga gzip harus mengurangi perbedaannya. Oh, dan Python tidak membutuhkan sebagian besar garis dan spasi baru itu. Banyak (walaupun tidak semua) baris dapat digabungkan menjadi satu dengan baik dalam Python, misalnya a = something(); frobincate(a); return quuxdan if condition: react()masing-masing satu baris. Dan level indentasi hanya membutuhkan n spasi, bukan n * 4 spasi.
2

Saya pikir Python memiliki mesin virtual sendiri. Saya tidak punya banyak pengalaman dengan Python, tapi saya tidak melihat alasan mengapa ia tidak berkinerja sebaik mesin JavaScript yang tidak dioptimalkan.

Beberapa pemikiran acak:

(1) Anda mungkin dapat menjalankan Python secara lokal melalui applet Java menggunakan Jython. Bagian sulit yang saya lihat di sini adalah applet sangat terbatas, jadi Anda mungkin perlu memodifikasi Jython agar sesuai dengan batasan akses. Misalnya, jika ia menulis ke file log, Anda mungkin perlu menghapus kode logging. Applet tidak perlu terlihat secara nyata.

(2) Seseorang dapat membuat "compiler" / konverter Python-ke-JavaScript. Ini akan banyak pekerjaan.

Aaron S
sumber
5
Someone could build a Python-to-JavaScript "compiler"/converterYah, seseorang sudah melakukannya .
yannis
Brython juga
Insinyur Dunia
Saya tidak pernah melakukan ini sendiri, tetapi saya tahu orang-orang telah menulis applet Java menggunakan Jython. Itu bukan hal yang sama dengan mengganti Javascript di browser dengan Python.
Martijn Pieters
Brythonbekerja sangat cepat, setidaknya untuk bagian yang agak terisolasi pada halaman (interaksi rendah dengan DOM tree).
Profpatsch
@ Profilpatsch Dari keadaan terakhir kali saya melihat, itu bahkan tidak menerapkan bagian yang sangat besar dari bahasa Python. Mudahnya, di antara fitur-fitur yang tidak diterapkan adalah yang sulit diimplementasikan dengan baik di atas JavaScript. Mengutip salah satu penulis PyPy: Sangat mudah untuk membuat subset nontrivial dari Python cepat, Python penuh adalah di mana ia menjadi sulit.
1

Itu tergantung pada implementasi bahasa dan belum tentu bahasa itu sendiri. Kebanyakan penerjemah JavaScript jauh lebih cepat daripada hampir semua implementasi Python.

Ini tidak berarti bahwa bahasa Python tidak dapat digunakan pada kecepatan yang hampir sama dengan JavaScript. Opal mengimplementasikan hampir seluruh bahasa Ruby dan pustaka standar di browser dengan mengkompilasi kode Ruby ke dalam kode JavaScript yang ditutup. Mengesampingkan overhead termasuk perpustakaan Opal, kecepatannya jauh lebih dekat dengan JavaScript lurus daripada penerjemah Ruby lainnya yang saya tahu.

Saya tidak tahu apakah ada Python yang setara dengan Opal, tetapi proyek semacam itu mungkin akan berarti bahwa jawaban untuk pertanyaan Anda adalah "tidak". Dengan meningkatnya penggunaan JavaScript sebagai "bahasa rakitan untuk web", tidak akan mengejutkan saya jika itu akan digunakan lebih dan lebih sebagai platform untuk bahasa lain, terutama ketika daya komputasi seluler meningkat dan biaya tambahan untuk memiliki bahasa diimplementasikan dalam JavaScript menjadi semakin lalai.

EDIT: Berikut adalah daftar implementasi Python untuk browser yang dikompilasi / dijalankan pada JavaScript.

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

Dan jika Anda tertarik, Anda dapat melihat Opal, yang sangat saya sukai.

http://opalrb.org/

Karena saya ragu bahwa peramban akan datang dengan dukungan untuk penerjemah terpisah, penyusun seperti itu mungkin adalah cara masa depan dalam hal menggunakan bahasa selain JavaScript. Bahkan sekarang, Anda akan mendapatkan kinerja yang sebanding di sebagian besar wilayah. Namun ini adalah pendapat saya, jadi ingatlah itu.

Ravenstine
sumber
0

Bahkan ketika Anda mengajukan pertanyaan ini, sudah ada sejumlah implementasi python yang tersedia di javascript yang dapat digunakan di halaman web hari ini.

Lihat http://www.skulpt.org/ atau http://www.brython.info/ sebagai permulaan.

Performanya tampaknya tidak terlalu buruk, tetapi Anda harus mengujinya sendiri dan mengetahuinya.

fabspro
sumber
-4

Python adalah bahasa "konsol", yang berjalan di server

Javascript adalah bahasa "browser", yang berjalan di klien

Dengan demikian, mereka tidak bersaing secara langsung

... tentu saja ada node.js dan mungkin plugin browser python, tapi kemudian lebih merupakan pertanyaan tentang kinerja tentang implementasi tertentu.

Selain itu, untuk sebagian besar aplikasi python akan baik-baik saja, kecuali jika Anda harus melakukan semacam perhitungan yang luas dan menekan siklus CPU.

Sebagai catatan terakhir, python dan javascript memiliki banyak kesamaan. Karena sifatnya yang dinamis, keduanya harus ditafsirkan pada saat runtime dan tidak dapat dikompilasi sekuat bahasa yang diketik statis. Karena itu, saya menganggap kinerja yang dapat dicapai mereka akan serupa.

dagnelies
sumber
2
Javascript sisi server ada di sekitar '94. jscmemungkinkan Anda bekerja dengan javascript sebagai konsol, sama seperti yang akan Anda dapatkan jika mereka mengetik pythondi konsol.
@MichaelT: Ok, saya mengedit tanggapan saya sesuai
dagnelies
2
Anda juga dapat menulis aplikasi desktop dengan Python .... Saya tidak melihat alasan nyata untuk perbedaan yang Anda buat.
Chris Travers
Selain itu, alat pemodelan 3D Blender menggunakan Python untuk semuanya, mulai dari UI hingga generasi mesh. Jika itu tidak kompetitif kompetitif, apa?
Andrew Gray
@ Chris: perbedaannya adalah bahwa javascript terutama merupakan teknologi browser, sedangkan python terutama merupakan teknologi desktop / konsol. Maksud saya adalah membandingkan keduanya tidak masuk akal karena keduanya melayani tujuan yang sama sekali berbeda.
dagnelies