Apa arti kalimat "kami ingin dikompilasi sehingga tidak membakar CPU melakukan hal yang salah."

10

Saya sedang membaca artikel ini . Ini memiliki paragraf berikut.

Dan apakah Scala berubah menjadi cepat? Nah, apa definisi Anda tentang puasa? Tentang secepat Java. Tidak harus secepat C atau Assembly. Python tidak jauh lebih cepat daripada Ruby. Kami ingin berbuat lebih banyak dengan lebih sedikit mesin, mengambil keuntungan lebih baik dari konkurensi; kami ingin itu dikompilasi sehingga tidak membakar CPU melakukan hal yang salah.

Saya mencari arti dari kalimat terakhir. Bagaimana bahasa yang ditafsirkan akan membuat CPU melakukan hal yang "salah"?

pengguna2434
sumber
3
Memanggil apa pun yang dikompilasi ke kode byte JVM yang ditafsirkan sedikit liberal dengan penggunaannya.
Rig

Jawaban:

47

Jika kode mengatakan

A = A + 1

kode yang dikompilasi melakukan ini

add A, 1

kode yang ditafsirkan melakukan ini (atau beberapa variasi)

look up the location of A in the symbol table
find the value of A
see that 1 is a constant
get its value
add the value of A and the value of 1
look up the location of A in the symbol table
store the new value of A

dapatkan ide?

Mike Dunlavey
sumber
3
Kadang-kadang penyederhanaan yang berlebihan benar - benar membuat gambar lebih jelas ;-) (hanya untuk melengkapi: banyak penerjemah terkenal mengoptimalkan beberapa langkah jauhnya, sehingga mereka berada di antara dua contoh "implementasi" di sini).
Joachim Sauer
3
@ JoachimSauer: Tentu saja Anda benar. Masih sulit untuk membuat penerjemah berjalan dengan faktor penalti kecepatan kurang dari 10 dibandingkan dengan kode yang dikompilasi. Jika bahasa adalah bahasa yang benar-benar menghabiskan seluruh waktunya dalam fungsi-fungsi yang dikompilasi bawahan yang harus dipanggil, seperti perpustakaan matematika atau I / O, biaya penafsiran tidak menjadi masalah.
Mike Dunlavey
1
Ini adalah deskripsi yang luar biasa
Jamie Taylor
13

kami ingin itu dikompilasi sehingga tidak membakar CPU melakukan hal yang salah.

Kedengarannya seperti mereka mengacu pada dikompilasi vs ditafsirkan. Kemungkinan besar turun ke seluruh cerita tentang Twitter yang memindahkan tugas pemrosesan latar belakang ke Scala (dikompilasi) setelah awalnya berkembang di Ruby On Rails (ditafsirkan).

Penjelasan tentang kode yang dikompilasi vs ditafsirkan di sini .

Dengan bahasa yang dikompilasi, kode yang Anda masukkan dikurangi menjadi seperangkat instruksi khusus mesin sebelum disimpan sebagai file yang dapat dieksekusi. Dengan bahasa yang diterjemahkan, kode disimpan dalam format yang sama seperti yang Anda masukkan. Program yang dikompilasi umumnya berjalan lebih cepat daripada yang ditafsirkan karena program yang ditafsirkan harus dikurangi menjadi instruksi mesin saat runtime.

Keris
sumber
Senang memberi Anda +1 pertama Anda. Selamat datang di P.SE!
haylem
4
(Mungkin perlu disebutkan bahwa Scala - seperti yang ada di JVM - secara teknis hanya byte-dikompilasi).
haylem
Tidak tahu Scala berbasis JVM. Berarti mungkin JIT-nya dikompilasi. Dalam hal ini, mengapa Twitter tidak hanya berpindah dari Ruby on Rails ke JRuby? Anda akan berpikir itu akan menjadi migrasi yang lebih mudah dengan manfaat dikompilasi.
KrisG
3
Mereka juga mencari model konkurensi yang lebih baik dan mereka memiliki masalah dengan pengumpulan sampah Ruby. Artikel ini menjelaskannya secara rinci.
scrwtp
9

"Barang-barang yang salah" di sini berarti overhead yang diperlukan oleh juru bahasa untuk mengurai dan memproses kode. Ini terhubung dengan gagasan bahasa yang ditafsirkan vs dikompilasi. Ada beberapa model terjemahan kode yang digunakan, yang secara kasar masuk dalam salah satu kategori berikut:

  • Kompilasi asli - kode sumber langsung dikompilasi ke dalam kode mesin. Performa terbaik dengan mengorbankan portabilitas. Umumnya dikaitkan dengan C dan C ++,
  • Kompilasi menengah - kode sumber dikompilasi ke dalam bahasa perantara yang disederhanakan (bytecode), yang kemudian ditafsirkan atau dikompilasi (kompilasi just-in-time) ke dalam kode mesin selama eksekusi. Portabilitas yang lebih baik daripada kode asli, kinerja yang lebih baik daripada interpretasi murni sambil mempertahankan beberapa sisi buruk interpretasi (seperti keterlambatan mengikat). Contohnya termasuk C #, Java dan bahasa lain yang menargetkan JVM dan .NET CLR,
  • Interpretasi - kode sumber tidak langsung diterjemahkan ke dalam kode mesin, melainkan ditafsirkan dan dieksekusi oleh program juru bahasa khusus. Penerjemah bervariasi dalam kecanggihannya, dalam implementasi yang naif namun itu bermuara pada penguraian, menganalisis dan mengeksekusi kode sumber baris demi baris. Interpretasi memungkinkan fleksibilitas yang lebih besar daripada kompilasi, karenanya bahasa yang ditafsirkan membuat penggunaan yang lebih luas dari pengetikan dinamis atau refleksi, misalnya. Bahasa yang ditafsirkan sering dilihat sebagai menawarkan peningkatan produktivitas pengembang, karena mereka membutuhkan lebih sedikit kode boilerplate dan meminjamkan diri mereka dengan baik untuk pembuatan prototipe cepat. Kekurangannya adalah berkurangnya kinerja. Umumnya dikaitkan dengan JavaScript, Ruby, atau Python.

Oleh karena itu pilihan antara bahasa yang ditafsirkan dan dikompilasi bermuara pada pertanyaan, apa yang kita nilai lebih, produktivitas atau kinerja pengembang? Migrasi yang dijelaskan dalam artikel ini tampaknya mengikuti garis pemikiran yang sama, dengan bahasa prototip yang kuat Ruby digantikan oleh Scala berbasis JVM karena pertimbangan kinerja.

scrwtp
sumber
-1 cara jawabannya diucapkan, terlihat terlalu sederhana. Itu benar-benar mengabaikan hal-hal seperti JIT ( kompilasi just-in-time ) - yang merupakan cara Scala menjalankan JVM / CLR
nyamuk
Benar. Menulis ulang jawabannya, ia menambahkan sedikit ke topik seolah-olah.
scrwtp
-3

Dalam hal ini saya menganggap the wrong stuffkurangnya jenis keamanan dalam kode yang tidak dikompilasi.

Dengan demikian, tidak hanya ditafsirkan kode lebih lambat, tetapi juga lebih buggy ...

Twil Neil
sumber
8
Anda mengasumsikan bahwa bahasa yang dikompilasi adalah tipe aman dan yang ditafsirkan tidak. Ada banyak contoh counter Sebagai contoh lisp dapat dikompilasi dan tidak diketik dengan kuat, sementara Haskell dapat diartikan dan sangat SANGAT aman
Zachary K
1
Menyamakan "tidak mengetik aman" dengan "lebih buggy" adalah FUD didorong oleh orang-orang dengan produk untuk dijual.
user16764
1
@ user16764: Bukan FUD jika itu benar. IME orang-orang yang mendorong omong kosong tentang subjek untuk menjual produk adalah mereka yang mencoba meremehkan hubungan antara pengetikan dinamis dan kesalahan. ("Ini hanya satu jenis kesalahan ," dll.)
Mason Wheeler