Apakah lama mengkompilasi sesuatu dari masa lalu?

38

Ada banyak kisah perang yang tak terhitung jumlahnya tentang berapa lama kompilasi dapat berlangsung. Bahkan xkcd menyebutkannya.

Sekarang, saya belum pemrograman untuk waktu yang lama dan sebagian besar baru saja terkena Java dan Python (dan Python adalah bahasa yang ditafsirkan, bukan yang dikompilasi). Saya menyadari mungkin saja saya belum menemukan proyek yang membutuhkan waktu sangat lama untuk dikompilasi, tetapi bahkan untuk aplikasi berukuran layak, itu sudah seketika bagi saya (biasanya ditangani di latar belakang oleh IDE) atau mengambil tidak lebih dari 30 detik atau lebih untuk proyek yang sangat besar. Bahkan dalam lingkungan bisnis (tempat komik berlangsung), saya tidak pernah memiliki kode yang terlalu lama untuk dikompilasi.

Apakah saya belum pernah terpapar proyek dengan waktu kompilasi yang lama? Apakah ini peninggalan masa lalu yang bukan lagi sesuatu yang terjadi di zaman modern? Mengapa kompilasi membutuhkan waktu yang lama?

Thunderforge
sumber
31
Coba kompilasi kromium.
UldisK
2
Ambil salinan kernel linux. Lakukan pembangunan yang lengkap. Lihat diri mu sendiri. Atau Spring dari sumber jika Anda seorang Java coder. Seperti itu, pertanyaan ini memiliki beberapa jawaban yang menjawab pertanyaan seolah-olah itu adalah polling ("Saya sudah melakukan kompilasi 30 menit ..." ketik jawaban) yang merupakan indikasi bahwa pertanyaan itu sendiri tidak cocok. .
Sebuah proyek besar baru-baru ini membutuhkan waktu 40 menit untuk mengkompilasi (40.000 file kode sumber dikompilasi dengan Maven). Solusinya adalah untuk melumpuhkan kompilasi pada banyak core CPU.
Niklas Rosencrantz
2
Ambil distribusi Linux sumber (gentoo, LFS, ...) lalu habiskan berhari-hari untuk mengkompilasi setiap perangkat lunak yang Anda instal.
Basile Starynkevitch
6
tentukan panjang ... Untuk beberapa anak yang baru keluar dari sekolah 1 menit mungkin tampak panjang, bagi seorang tua yang sudah berada di parit selama beberapa dekade, beberapa jam tidak mengangkat alis.
jwenting

Jawaban:

48

Kompilasi dapat memakan waktu cukup lama, terutama untuk proyek besar yang ditulis dalam bahasa seperti C, C ++, atau Scala. Mengompilasi bagian di latar belakang dapat mengurangi waktu kompilasi, tetapi kadang-kadang Anda harus melakukan kompilasi baru. Faktor-faktor yang dapat menyebabkan waktu kompilasi yang lama termasuk:

  • Ukuran kode besar, jelas. Proyek besar akan memiliki ratusan ribu baris kode.

  • #includeArahan preprocessor C , yang secara efektif menyebabkan kode yang sama dikompilasi ratusan kali. Sistem makro memiliki masalah yang sama, karena bekerja pada level teks. Preprocessor benar-benar membesar-besarkan ukuran kode yang sebenarnya diteruskan ke kompiler. Melihat file setelah preprocessing (misalnya via gcc -E) harus membuka mata Anda.

  • Template C ++ adalah Turing selesai, yang berarti bahwa secara teori Anda dapat melakukan perhitungan sewenang-wenang pada waktu kompilasi. Tidak ada yang benar-benar ingin melakukan itu, tetapi bahkan banyak kasus sederhana menambah waktu yang dihabiskan untuk membuat template.

  • Scala adalah bahasa yang cukup muda, dan kompilernya sangat kurang dioptimalkan. Saat ini, kompiler menggunakan sejumlah besar kompilasi pass (C dirancang hanya membutuhkan dua pass kompilasi). Pemeriksaan huruf adalah salah satu dari lintasan ini, dan dapat memakan waktu karena sistem jenis yang rumit yang ditampilkan oleh bahasa.

Kompilasi bukan satu-satunya hal yang membutuhkan waktu. Setelah proyek dikompilasi, test suite harus dijalankan. Waktu yang dihabiskan untuk ini dapat berkisar dari beberapa detik hingga beberapa jam (jika tes ditulis dengan buruk).

amon
sumber
14
Sebenarnya, sistem tipe Scala adalah Turing-complete, jadi pengecekan tipe bisa memakan waktu tak terbatas, dan tidak mungkin bagi kompiler untuk menentukan itu.
Jörg W Mittag
7
Jangan lupa optimisasi. Banyak optimisasi yang akan dilakukan oleh kompiler C / C ++ sangat mahal (mis. Begitu mahal sehingga JIT tidak mampu melakukannya sama sekali). Untuk kasus terburuk, sebagian besar rantai-alat mendukung optimisasi seluruh program sekarang, yang diketahui meningkatkan waktu pembuatan secara signifikan.
Brendan
Saya telah menerima jawaban ini karena Anda menunjukkan sejumlah hal yang tidak saya pertimbangkan, secara khusus mengkompilasi semuanya versus mengkompilasi menjadi potongan-potongan dan fakta bahwa suite tes mungkin termasuk dalam "kompilasi" saat ini.
Thunderforge
1
bukan hanya suite uji - analisis cakupan kode, pengemasan otomatis, penyebaran otomatis ke sistem pengujian; ada banyak hal yang dimasukkan ke dalam sistem build terintegrasi saat ini. Dan jika Anda ditahan sampai sampai ke lingkungan dev atau qa, Anda tentu punya waktu untuk naik-turun kursi kecil.
corsiKa
1
Jawaban yang bagus, saya hanya akan mencatat bahwa penyebaran waktu kompilasi mungkin bisa jauh lebih besar. Saya telah bekerja pada proyek-proyek di mana kompilasi penuh bisa memakan waktu dua hingga tiga hari (ya itu menghebohkan!) Dan saya membayangkan ada pelanggar yang lebih buruk di luar sana.
Roy T.
17

Ini sama sekali bukan peninggalan masa lalu. Salah satu proyek yang saya kerjakan membutuhkan 45 menit untuk bangunan yang bersih dari awal. Selain kode kita sendiri, kita juga harus menarik dan membangun sumber dari beberapa pustaka C dan C ++ besar dari repositori eksternal. Mengkompilasi dan menghubungkan kode C dan C ++ mahal secara komputasi. Seperti yang Anda tunjukkan, Python biasanya diimplementasikan sebagai bahasa yang ditafsirkan, dan Java biasanya menggunakan kompiler JIT (Just in Time), sehingga proyek Anda melewatkan kompilasi dimuka dan menghubungkan biaya sekaligus. Harga yang Anda bayar adalah waktu start up yang lebih lama dan (setidaknya untuk Python) kecepatan eksekusi yang lebih lambat.

Ketika waktu pembuatan berlangsung selama itu menjadi lebih penting untuk mengambil keuntungan dari sistem integrasi berkelanjutan seperti Jenkins atau TeamCity . Hal ini memungkinkan setiap pengembang untuk (kebanyakan) menghindari rasa sakit karena membangun dari awal, sambil tetap menguji bahwa perubahan tidak merusak bangunan.

Charles E. Grant
sumber
1
javac tidak " melewatkan kompilasi dimuka dan menghubungkan biaya sama sekali ". Ini melewatkan banyak biaya pengoptimalan, tetapi masih mengubah sumber menjadi bytecode dan melakukan banyak pemeriksaan statis dalam prosesnya. Itu tidak sebanyak menghubungkan sebagai kompiler C. Perbedaan kinerja yang sebenarnya adalah bahwa proses kompilasi Java dirancang di era ketika diasumsikan mungkin untuk memuat seluruh program dan ketergantungannya ke dalam memori sekaligus daripada harus memecahnya menjadi potongan-potongan kecil dan memproses ulang file yang sama ribuan kali.
Peter Taylor
10

Proyek besar bisa memakan waktu lama. Bisa jadi satu jam atau lebih untuk proyek yang cukup besar. Ada beberapa perpustakaan yang harus saya kompilasi dari sumber di komputer saya yang membutuhkan waktu sangat lama - misalnya OpenCascade. Kernel Linux itu sendiri juga membutuhkan waktu yang cukup lama jika Anda harus membuatnya dari awal.

Namun, ada proses mirip kompilasi lain yang bisa memakan waktu lebih lama. Desain sirkuit digital (baik untuk ASIC atau FPGA) membutuhkan tempat dan rute langkah. Langkah tempat dan rute adalah tempat penempatan gerbang logika individu, sandal jepit, register, RAM, dan komponen lainnya ditentukan bersama dengan perutean untuk kabel interkoneksi. Perangkat lunak ini menggunakan model timing untuk menentukan gerbang dan keterlambatan perutean untuk kemungkinan penempatan, membandingkannya dengan batas yang diberikan oleh batasan waktu, dan kemudian menyesuaikan lokasi penempatan dan jalur kawat untuk mencoba memenuhi persyaratan waktu. Terkadang perangkat lunak bahkan harus mengubah ukuran gerbang dan menambahkan buffer untuk memenuhi waktu. Langkah ini sangat komputasional dan dapat memakan waktu berjam-jam atau bahkan berhari-hari untuk diselesaikan. Itu juga tidak benar-benar memparalelkan dengan sangat baik. Ada desain FPGA yang saya kerjakan sekitar setahun yang lalu yang menghabiskan sekitar setengah dari Virtex 6 HXT 565 FPGA (~ 300k dari 565k LUT) dan membutuhkan waktu sekitar 7 jam untuk menyelesaikan tempat dan rute. Saya tidak bisa membayangkan berapa lama waktu yang dibutuhkan untuk menjalankan tempat dan rute pada sesuatu seperti desain CPU Core i7 - mungkin setidaknya beberapa minggu.

alex.forencich
sumber
4

Jawaban lain telah menyebutkan bahwa ya, kode pada proyek-proyek besar, di mana besar berarti 500k garis ke atas, dapat memakan waktu yang signifikan, terutama ketika membangun dari awal.

Poin tambahan adalah bahwa beberapa proyek harus dibangun untuk beberapa lingkungan target. Ketika mesin yang meng-host lingkungan itu tidak tersedia, build harus dilakukan dengan kompilasi silang, secara serial pada mesin yang Anda miliki. Ini dapat menyebabkan waktu pengembangan yang signifikan . Untuk satu proyek yang saya kerjakan, pembangunan malam akan memakan waktu 10 jam. Celakalah Anda adalah orang yang melanggarnya!

Saya akan menambahkan bahwa Anda tidak akan lolos dengan alasan seperti membuang-buang waktu. Seseorang profesional harus merencanakan tugas-tugas mereka sehingga mereka tidak memiliki sesuatu yang berguna yang dapat dilakukan di periode tersebut.

andy256
sumber
3

Sedikit dari keduanya. C ++ (dan C pada tingkat yang lebih rendah) terkenal karena waktu kompilasi yang lambat, terutama pada perangkat keras periode. Sekitar pergantian milenium, saya mengerjakan sebuah proyek yang membutuhkan waktu sekitar 4 jam untuk dibangun karena masalah makro.

Saat ini segalanya lebih baik, tetapi dalam 30 detik pengalaman saya cukup rendah - terutama dalam bangunan formal di mana hal-hal perlu diperiksa dari kontrol sumber, uji unit dijalankan, installer dibuat, dan semuanya dikirim ke beberapa SAN di suatu tempat.

Telastyn
sumber
2

Itu tergantung pada proyek dan lingkungan di mana ia dikompilasi. Saya telah bekerja pada proyek-proyek C ++ yang membutuhkan beberapa menit untuk dikompilasi (ditetapkan sebagai beberapa proyek di MSVS), yang mungkin cukup waktu untuk pertempuran pedang.

Jika Anda bekerja untuk perusahaan besar dengan kode besar dan basis data (Proctor dan Gamble, Google, dll.) Atau untuk perusahaan kecil atau startup yang berfokus pada satu atau dua produk utama yang sangat kompleks (misalnya simulasi dan render ilmiah), kemudian menunggu proyek besar untuk dikompilasi adalah hal yang realistis untuk diharapkan bahkan pada mesin yang kuat. Ini dapat memengaruhi cara Anda mengembangkan dan men-debug kode (serta seberapa sering Anda memilih untuk memperbarui dan menggabungkan perubahan melalui versi).

Trixie Wolf
sumber