Pertanyaan Mengapa bahasa yang diketik secara dinamis lambat?


Apa yang membuatnya sulit untuk mempercepat bahasa yang diketik secara dinamis saat dibandingkan dengan bahasa yang diketik secara statis. Dengan kata lain, apa sifat bawaan dari bahasa-bahasa yang diketik secara statis yang membuatnya mudah dioptimalkan untuk kecepatan eksekusi?


14
2018-04-17 17:35


asal


Jawaban:


Ketika mengakses atribut / metode dalam bahasa yang diketik statis, pencarian biasanya dapat direduksi menjadi alamat fungsi statis. Bahkan dalam kasus metode virtual, yang lebih lambat, pencarian hanya membaca offset dari vtable.

Dalam bahasa dinamis, nama didasarkan pada string. Ingin mencari foo.bar? Menemukan foo di tabel hash variabel lokal, lalu temukan bar di footabel hash. Dalam beberapa bahasa dinamis, seperti Python dan Ruby, mungkin ada pencarian tambahan / pemanggilan metode untuk mengimplementasikan atribut yang dihasilkan secara dinamis.

Semua pencarian ini sangat sulit untuk berpuasa. Python memiliki salah satu implementasi tabel hash yang paling baik di dunia, dan JavaScript memiliki jutaan dolar uang penelitian yang dituangkan untuk membuatnya cepat. Taktik ini bekerja - bandingkan JavaScript Chrome dengan IE 5 untuk melihat seberapa banyak - tetapi mereka jauh, jauh lebih sulit daripada hanya secara statis menghasilkan panggilan fungsi.


Saya harus menyebutkan bahwa bagaimana "dinamis" suatu bahasa dapat bervariasi. Python memiliki beberapa cara berbeda untuk berinteraksi dengan pencarian variabel, yang bagus dalam beberapa keadaan, tetapi membuat pengoptimalan sangat sulit. Bahasa dinamis lainnya, seperti Common Lisp dan Smalltalk, dapat bersaing secara merata dengan bahasa statis dalam banyak kasus penggunaan karena lookup dinamis / modifikasi lebih terkontrol.


23
2018-04-17 17:45



Lihatlah contoh python ini:

def fact(n):
    if n==0:
        return n
    return n*fact(n-1)

Apa itu n? Apakah itu angka? Apakah itu String? Apakah ini kelas yang Anda tentukan sebelumnya? Tidak ada cara bagi compiler untuk mengetahui masukan apa yang akan didapatnya. Anda harus melakukan banyak pemeriksaan pada saat run-time, yang berarti bahwa Anda melakukan lebih banyak pekerjaan implisit untuk operasi sederhana.


12
2018-04-17 17:42



Jenis tertentu dari pengoptimalan waktu kompilasi hanya dapat dilakukan jika jenis yang tepat dari suatu variabel diketahui.

Bahasa yang diketik secara dinamis juga sering menambahkan logika untuk menentukan jenis dan memastikan bahwa nilainya benar untuk jenisnya.


10
2018-04-17 17:39



Bahasa yang diketik secara dinamis harus membuat semua pemeriksaan mereka saat runtime karena jenisnya mungkin berubah selama pelaksanaan.

Bahasa yang diketik statis menyelesaikan semua jenis selama waktu kompilasi sehingga biaya yang dikonsumsi di muka, satu kali.

Ini adalah alasan utama mengapa bahasa yang diketik dinamis biasanya lebih lambat. Tapi ada hal lain yang perlu dipikirkan. Banyak tergantung pada compiler atau interpreter, implementasi GC, tata letak tabel pengiriman dan algoritma pencarian bersama dengan optimasi lainnya.

Itu semua tergantung pada implementasi: Bahasa yang diketik dinamis bisa lebih cepat daripada bahasa yang dikompilasi, hanya butuh lebih banyak pekerjaan untuk mencapai hal ini.


5
2018-04-17 17:46



Pertanyaan Anda sedikit tidak aktif karena bahasa yang diketik secara dinamis sebenarnya tidak lambat. Banyak contoh mungkin dalam praktik, tetapi yang lain cepat (di mana cepat berarti "cukup sebanding dengan c" atau sesuatu seperti itu, cf cisp umum).

Banyak bahasa dinamis berjalan di VM atau bahkan ditafsirkan, yang mungkin menyebabkan pelambatan yang dapat dihindari. Pada tingkat tertentu, ada optimisasi yang tersedia untuk kompiler bahasa statis (atau yang dinamis yang telah membuat janji-janji yang tepat untuk tidak menjadi dinamis tentang sesuatu) yang tidak mungkin dalam situasi yang sepenuhnya dinamis.

Namun, jika Anda berpikir tentang perbedaan antara katakan, python dan c ++ misalnya, itu bukan dinamis vs statis yang benar-benar masalah.


1
2018-04-17 17:55



Itu karena bahasa yang diketik secara statis sering dikompilasi ke kode mesin sementara bahasa yang diketik secara dinamis dalam banyak kasus dijalankan oleh juru bahasa.


0
2018-04-17 17:37