Jawaban:
Perbedaan antara waktu kompilasi dan waktu lari adalah contoh dari apa yang oleh para ahli teori berkepala runcing disebut sebagai pembedaan fase . Ini adalah salah satu konsep yang paling sulit untuk dipelajari, terutama bagi orang-orang tanpa banyak latar belakang dalam bahasa pemrograman. Untuk mendekati masalah ini, saya merasa perlu untuk bertanya
Apa yang bisa salah adalah kesalahan run-time :
Juga ada kesalahan yang terdeteksi oleh program itu sendiri:
Saya memikirkannya dalam hal kesalahan, dan kapan mereka bisa ditangkap.
Waktu kompilasi:
string my_value = Console.ReadLine();
int i = my_value;
Nilai string tidak dapat ditetapkan sebagai variabel bertipe int, sehingga kompiler tahu pasti pada waktu kompilasi bahwa kode ini memiliki masalah
Jalankan waktu:
string my_value = Console.ReadLine();
int i = int.Parse(my_value);
Di sini hasilnya tergantung pada string apa yang dikembalikan oleh ReadLine (). Beberapa nilai dapat diuraikan ke int, yang lain tidak bisa. Ini hanya dapat ditentukan pada saat run time
.app
ekstensi? atau itu terjadi saat diluncurkan oleh setiap kali pengguna memulai aplikasi?
Waktu kompilasi: periode waktu di mana Anda, pengembang, menyusun kode Anda.
Run-time: periode waktu di mana pengguna menjalankan perangkat lunak Anda.
Apakah Anda memerlukan definisi yang lebih jelas?
int x = 3/0
tetapi Anda tidak melakukan apa pun dengan variabel ini. Kami tidak mencetaknya atau apa pun. Apakah itu masih dianggap sebagai kesalahan runtime?
( sunting : yang berikut ini berlaku untuk C # dan bahasa pemrograman sejenis yang sangat diketik. Saya tidak yakin apakah ini membantu Anda).
Misalnya, kesalahan berikut akan dideteksi oleh kompiler (pada waktu kompilasi ) sebelum Anda menjalankan program dan akan menghasilkan kesalahan kompilasi:
int i = "string"; --> error at compile-time
Di sisi lain, kesalahan seperti berikut ini tidak dapat dideteksi oleh kompiler. Anda akan menerima kesalahan / pengecualian saat run-time (ketika program dijalankan).
Hashtable ht = new Hashtable();
ht.Add("key", "string");
// the compiler does not know what is stored in the hashtable
// under the key "key"
int i = (int)ht["key"]; // --> exception at run-time
Penerjemahan kode sumber ke hal-hal yang terjadi pada [layar | disk | jaringan] dapat terjadi dalam (kira-kira) dua cara; menyebutnya kompilasi dan interpretasi.
Dalam program yang dikompilasi (contohnya c dan fortran):
Hal-hal yang terjadi pada langkah pertama dikatakan terjadi pada "waktu kompilasi", hal-hal yang terjadi pada langkah kedua dikatakan terjadi pada "waktu berjalan".
Dalam program yang ditafsirkan (contoh MicroSoft basic (on dos) dan python (saya pikir)):
Dalam hal ini perbedaan antara waktu kompilasi dan waktu menjalankan agak sulit untuk dijabarkan, dan jauh lebih tidak relevan bagi programmer atau pengguna.
Java adalah sejenis hibrida, di mana kode dikompilasi ke bytecode, yang kemudian berjalan pada mesin virtual yang biasanya merupakan interpreter untuk bytecode.
Ada juga kasus menengah di mana program dikompilasi untuk bytecode dan dijalankan segera (seperti dalam awk atau perl).
Pada dasarnya jika kompiler Anda dapat mengetahui apa yang Anda maksud atau apa nilainya "pada waktu kompilasi", ia dapat mengubah kode ini menjadi kode runtime. Tentunya jika kode runtime Anda harus melakukan perhitungan setiap kali akan berjalan lebih lambat, jadi jika Anda dapat menentukan sesuatu pada waktu kompilasi, itu jauh lebih baik.
Misalnya.
Lipat konstan:
Jika saya menulis:
int i = 2;
i += MY_CONSTANT;
Kompilator dapat melakukan perhitungan ini pada waktu kompilasi karena ia tahu apa itu 2, dan apa itu MY_CONSTANT. Karena itu menghemat dari melakukan perhitungan setiap eksekusi tunggal.
Hal-hal yang dilakukan pada waktu kompilasi menimbulkan (hampir) tanpa biaya ketika program yang dihasilkan dijalankan, tetapi mungkin dikenakan biaya besar ketika Anda membangun program.
Kurang lebih kebalikannya. Sedikit biaya saat Anda membangun, lebih banyak biaya saat program dijalankan.
Dari sisi lain; Jika sesuatu dilakukan pada waktu kompilasi, itu hanya berjalan pada mesin Anda dan jika sesuatu dijalankan, itu berjalan pada mesin pengguna Anda.
Contoh di mana ini penting akan menjadi tipe pembawa unit. Versi waktu kompilasi (seperti Boost.Units atau versi saya di D ) berakhir secepat menyelesaikan masalah dengan kode titik apung asli sementara versi run-time akhirnya harus mengemas informasi tentang unit yang nilainya masuk dan lakukan pemeriksaan di dalamnya di samping setiap operasi. Di sisi lain, versi waktu kompilasi meminta bahwa unit nilai diketahui pada waktu kompilasi dan tidak dapat menangani kasus di mana mereka berasal dari input run-time.
Mengikuti dari jawaban pertanyaan serupa sebelumnya Apa perbedaan antara run-time error dan compiler error?
Kompilasi / waktu kompilasi / Kesalahan sintaksis / semantik: Kesalahan kompilasi atau waktu kompilasi adalah kesalahan yang terjadi karena kesalahan pengetikan, jika kita tidak mengikuti sintaks dan semantik yang tepat dari bahasa pemrograman apa pun maka kesalahan waktu kompilasi dilemparkan oleh kompiler. Mereka tidak akan membiarkan program Anda untuk mengeksekusi satu baris sampai Anda menghapus semua kesalahan sintaks atau sampai Anda men-debug kesalahan waktu kompilasi.
Contoh: Kehilangan titik koma di C atau salah ketik int
sebagai Int
.
Kesalahan runtime: Kesalahan runtime adalah kesalahan yang dihasilkan saat program dalam keadaan berjalan. Jenis kesalahan ini akan menyebabkan program Anda berperilaku tidak terduga atau bahkan dapat mematikan program Anda. Mereka sering disebut sebagai Pengecualian.
Contoh: Misalkan Anda membaca file yang tidak ada, akan menghasilkan kesalahan runtime.
Baca lebih lanjut tentang semua kesalahan pemrograman di sini
Sebagai tambahan untuk jawaban lain, inilah cara saya menjelaskannya kepada orang awam:
Kode sumber Anda seperti cetak biru sebuah kapal. Ini mendefinisikan bagaimana kapal harus dibuat.
Jika Anda menyerahkan cetak biru Anda ke galangan kapal, dan mereka menemukan cacat saat membangun kapal, mereka akan berhenti membangun dan segera melaporkannya kepada Anda, sebelum kapal meninggalkan dok kering atau air yang tersentuh. Ini adalah kesalahan waktu kompilasi. Kapal itu bahkan tidak pernah benar-benar mengambang atau menggunakan mesinnya. Kesalahan ditemukan karena mencegah kapal bahkan dibuat.
Ketika kode Anda dikompilasi, itu seperti kapal sedang diselesaikan. Dibangun dan siap untuk digunakan. Ketika Anda mengeksekusi kode Anda, itu seperti meluncurkan kapal dalam perjalanan. Penumpang naik, mesin menyala dan lambungnya di atas air, jadi ini runtime. Jika kapal Anda memiliki cacat fatal yang menenggelamkannya pada pelayaran perdananya (atau mungkin beberapa pelayaran setelah karena sakit kepala tambahan) maka ia mengalami kesalahan runtime.
Misalnya: Dalam bahasa yang sangat diketik, tipe dapat diperiksa pada waktu kompilasi atau pada saat runtime. Pada waktu kompilasi itu berarti, bahwa kompiler mengeluh jika jenisnya tidak kompatibel. Pada saat runtime berarti, bahwa Anda dapat mengkompilasi program Anda dengan baik tetapi pada saat runtime, ia melempar pengecualian.
waktu kompilasi: Pengembang menulis program dalam format .java & mengonversi ke dalam Bytecode yang merupakan file kelas, selama kompilasi ini setiap kesalahan yang terjadi dapat didefinisikan sebagai kesalahan waktu kompilasi.
Run time: File .class yang dihasilkan digunakan oleh aplikasi untuk fungsionalitas tambahannya & logika ternyata salah dan melempar kesalahan yang merupakan kesalahan run time
Berikut adalah kutipan dari Daniel Liang, penulis 'Pengantar pemrograman JAVA', tentang masalah kompilasi:
"Program yang ditulis dalam bahasa tingkat tinggi disebut program sumber atau kode sumber. Karena komputer tidak dapat menjalankan program sumber, program sumber harus diterjemahkan ke dalam kode mesin untuk dieksekusi . Terjemahan dapat dilakukan dengan menggunakan alat pemrograman lain yang disebut penerjemah atau kompiler . " (Daniel Liang, "Pengantar pemrograman JAVA" , p8).
...Dia melanjutkan...
"Kompiler menerjemahkan seluruh kode sumber menjadi file kode mesin , dan file kode mesin kemudian dieksekusi"
Ketika kita memasukkan kode tingkat tinggi / yang bisa dibaca manusia, ini awalnya tidak berguna! Itu harus diterjemahkan ke dalam urutan 'kejadian elektronik' di CPU kecil Anda! Langkah pertama menuju ini adalah kompilasi.
Sederhananya: kesalahan waktu kompilasi terjadi selama fase ini, sementara kesalahan waktu berjalan terjadi kemudian.
Ingat: Hanya karena suatu program dikompilasi tanpa kesalahan tidak berarti itu akan berjalan tanpa kesalahan.
Kesalahan waktu berjalan akan terjadi di bagian siap, berjalan atau menunggu siklus hidup program sementara kesalahan waktu kompilasi akan terjadi sebelum tahap 'baru' dari siklus hidup.
Contoh kesalahan waktu kompilasi:
Kesalahan Sintaks - bagaimana kode Anda dapat dikompilasi menjadi instruksi level mesin jika mereka ambigu ?? Kode Anda perlu menyesuaikan 100% dengan aturan sintaksis bahasa jika tidak dapat dikompilasi ke dalam kode mesin yang berfungsi .
Contoh kesalahan run-time:
Kehabisan memori - Panggilan ke fungsi rekursif misalnya dapat menyebabkan stack overflow mengingat variabel tingkat tertentu! Bagaimana ini bisa diantisipasi oleh kompiler !? itu tidak bisa.
Dan itu adalah perbedaan antara kesalahan waktu kompilasi dan kesalahan waktu berjalan
Waktu kompilasi:
Hal-hal yang dilakukan pada waktu kompilasi menimbulkan (hampir) tanpa biaya ketika program yang dihasilkan dijalankan, tetapi mungkin dikenakan biaya besar ketika Anda membangun program. Run-Time:
Kurang lebih kebalikannya. Sedikit biaya saat Anda membangun, lebih banyak biaya saat program dijalankan.
Dari sisi lain; Jika sesuatu dilakukan pada waktu kompilasi, itu hanya berjalan pada mesin Anda dan jika sesuatu dijalankan, itu berjalan pada mesin pengguna Anda.
Waktu kompilasi: Waktu yang diambil untuk mengubah kode sumber menjadi kode mesin sehingga menjadi executable disebut waktu kompilasi.
Run time: Ketika suatu aplikasi sedang berjalan, itu disebut run time.
Kesalahan waktu kompilasi adalah kesalahan sintaksis, kesalahan referensi file yang hilang. Kesalahan runtime terjadi setelah kode sumber dikompilasi menjadi program yang dapat dieksekusi dan saat program sedang berjalan. Contohnya adalah crash program, perilaku program yang tidak terduga atau fitur tidak berfungsi.
Bayangkan bahwa Anda adalah bos dan Anda memiliki asisten dan pelayan, dan Anda memberi mereka daftar tugas yang harus dilakukan, asisten (waktu kompilasi) akan mengambil daftar ini dan melakukan pemeriksaan untuk melihat apakah tugas tersebut dapat dipahami dan bahwa Anda tidak menulis dalam bahasa atau sintaks yang canggung, jadi dia mengerti bahwa Anda ingin menugaskan seseorang untuk suatu pekerjaan sehingga dia menugaskannya untuk Anda dan dia mengerti bahwa Anda ingin kopi, jadi perannya sudah selesai dan pelayan (waktu berjalan) mulai menjalankan tugas-tugas itu sehingga dia pergi untuk membuatkan Anda kopi tetapi tiba-tiba dia tidak menemukan kopi untuk membuatnya jadi dia berhenti membuatnya atau dia bertindak berbeda dan membuatkan Anda teh (ketika program bertindak berbeda karena dia menemukan kesalahan ).
Berikut ini adalah ekstensi dari Jawaban untuk pertanyaan "perbedaan antara waktu proses dan waktu kompilasi?" - Perbedaan overhead yang terkait dengan run-time dan compile-time?
Kinerja run-time dari produk berkontribusi pada kualitasnya dengan memberikan hasil lebih cepat. Kinerja waktu kompilasi dari produk berkontribusi pada ketepatan waktunya dengan memperpendek siklus edit-kompilasi-debug. Namun, baik kinerja run-time dan kinerja compile-time adalah faktor sekunder dalam mencapai kualitas tepat waktu. Oleh karena itu, seseorang harus mempertimbangkan peningkatan kinerja run-time dan compile-time hanya ketika dibenarkan oleh peningkatan kualitas produk secara keseluruhan dan ketepatan waktu.
Sumber yang bagus untuk dibaca lebih lanjut di sini :
Saya selalu memikirkannya relatif terhadap overhead pemrosesan program dan bagaimana hal itu mempengaruhi kinerja seperti yang dinyatakan sebelumnya. Contoh sederhananya adalah, apakah mendefinisikan memori absolut yang diperlukan untuk objek saya dalam kode atau tidak.
Boolean yang didefinisikan membutuhkan x memori. Ini kemudian dalam program yang dikompilasi dan tidak dapat diubah. Ketika program dijalankan, ia tahu persis berapa banyak memori yang dialokasikan untuk x.
Di sisi lain jika saya hanya mendefinisikan jenis objek generik (yaitu jenis tempat tempat yang tidak ditentukan atau mungkin pointer ke beberapa gumpalan raksasa) memori yang sebenarnya diperlukan untuk objek saya tidak diketahui sampai program dijalankan dan saya menetapkan sesuatu untuk itu , dengan demikian maka harus dievaluasi dan alokasi memori, dll. akan kemudian ditangani secara dinamis pada saat run (lebih banyak run time overhead).
Cara penanganannya secara dinamis akan bergantung pada bahasa, kompiler, OS, kode Anda, dll.
Pada catatan itu namun itu akan sangat tergantung pada konteks di mana Anda menggunakan run time vs waktu kompilasi.
kita dapat mengklasifikasikan ini di bawah dua kelompok besar yang mengikat statis dan mengikat dinamis. Ini didasarkan pada ketika pengikatan dilakukan dengan nilai-nilai yang sesuai. Jika referensi diselesaikan pada waktu kompilasi, maka itu adalah pengikatan statis dan jika referensi diselesaikan pada saat runtime maka itu adalah pengikatan dinamis. Penjilidan statis dan penjilidan dinamis disebut juga jilid awal dan jilid akhir. Kadang-kadang mereka juga disebut sebagai polimorfisme statis dan polimorfisme dinamis.
Joseph Kulandai.
Perbedaan utama antara waktu proses dan waktu kompilasi adalah:
int a = 1
int b = a/0;
di sini baris pertama tidak memiliki titik koma di akhir ---> kompilasi kesalahan waktu setelah menjalankan program saat melakukan operasi b, hasilnya tidak terbatas ---> run-time error.
inilah jawaban yang sangat sederhana:
Waktu runtime dan waktu kompilasi adalah istilah pemrograman yang merujuk pada berbagai tahap pengembangan program perangkat lunak. Untuk membuat program, pengembang terlebih dahulu menulis kode sumber, yang menentukan bagaimana program akan berfungsi. Program kecil mungkin hanya berisi beberapa ratus baris kode sumber, sedangkan program besar mungkin berisi ratusan ribu baris kode sumber. Kode sumber harus dikompilasi ke dalam kode mesin agar menjadi dan program yang dapat dieksekusi. Proses kompilasi ini disebut sebagai waktu kompilasi (anggap kompiler sebagai penerjemah)
Program yang dikompilasi dapat dibuka dan dijalankan oleh pengguna. Ketika aplikasi sedang berjalan, itu disebut runtime.
Istilah "runtime" dan "waktu kompilasi" sering digunakan oleh programmer untuk merujuk pada berbagai jenis kesalahan. Kesalahan waktu kompilasi adalah masalah seperti kesalahan sintaks atau referensi file yang hilang yang mencegah program berhasil dikompilasi. Kompiler menghasilkan kesalahan waktu kompilasi dan biasanya menunjukkan baris kode sumber apa yang menyebabkan masalah.
Jika kode sumber program telah dikompilasi menjadi program yang dapat dieksekusi, mungkin masih ada bug yang terjadi saat program sedang berjalan. Contohnya termasuk fitur yang tidak berfungsi, perilaku program yang tidak terduga, atau crash program. Jenis masalah ini disebut kesalahan runtime karena terjadi pada saat runtime.
IMHO Anda perlu membaca banyak tautan, sumber daya untuk membuat ide tentang perbedaan antara waktu Runtime vs Kompilasi karena ini adalah subjek yang sangat kompleks. Saya memiliki daftar di bawah ini beberapa gambar / tautan yang saya rekomendasikan.
Terlepas dari apa yang dikatakan di atas, saya ingin menambahkan bahwa kadang-kadang gambar bernilai 1000 kata:
CLR_diag mengkompilasi waktu dan kemudian runtime2
from Wiki
https://en.wikipedia.org/wiki/Run_time https://en.wikipedia.org/wiki/Run_time_(program_lifecycle_phase)
Run time, run-time, atau runtime dapat merujuk ke:
Komputasi
Jalankan waktu (fase siklus hidup program) , periode di mana program komputer dieksekusi
Pustaka Runtime , pustaka program yang dirancang untuk mengimplementasikan fungsi yang dibangun ke dalam bahasa pemrograman
Sistem Runtime , perangkat lunak yang dirancang untuk mendukung pelaksanaan program komputer
Eksekusi perangkat lunak, proses melakukan instruksi satu per satu selama fase run time
Daftar kompiler https://en.wikipedia.org/wiki/List_of_compiler
;
3,2 perbedaan antara 3 hal ini: kompilasi vs build vs runtime
https://www.quora.com/What-is-the-difference-between-build-run-and-compile Fernando Padoan, Pengembang yang sedikit penasaran dengan desain bahasa Dijawab 23 Februari Saya akan mundur dalam kaitannya untuk jawaban lain:
menjalankan membuat beberapa biner dapat dieksekusi (atau sebuah skrip, untuk bahasa yang ditafsirkan), dijalankan dengan baik ... sebagai proses baru di komputer; kompilasi adalah proses penguraian program yang ditulis dalam beberapa bahasa tingkat tinggi (lebih tinggi jika dibandingkan dengan kode mesin), memeriksa sintaksnya, semantik, menghubungkan perpustakaan, mungkin melakukan beberapa optimasi, kemudian membuat program biner yang dapat dieksekusi sebagai output. Eksekusi ini dapat dalam bentuk kode mesin, atau semacam kode byte - yaitu, instruksi yang menargetkan beberapa jenis mesin virtual; membangun biasanya melibatkan memeriksa dan menyediakan dependensi, memeriksa kode, mengkompilasi kode ke dalam biner, menjalankan tes otomatis dan mengemas [bin] biner yang dihasilkan dan aset lainnya (gambar, file konfigurasi, perpustakaan, dll.) ke dalam beberapa format spesifik file yang dapat digunakan. Perhatikan bahwa sebagian besar proses bersifat opsional dan beberapa bergantung pada platform target yang Anda bangun. Sebagai contoh, mengemas aplikasi Java untuk Tomcat akan menghasilkan file .war. Membangun sebuah Win32 yang dapat dieksekusi dari kode C ++ hanya bisa menampilkan program .exe, atau bisa juga mengemasnya di dalam installer .msi.
Lihatlah contoh ini:
public class Test {
public static void main(String[] args) {
int[] x=new int[-5];//compile time no error
System.out.println(x.length);
}}
Kode di atas berhasil dikompilasi, tidak ada kesalahan sintaksis, sangat valid. Tetapi pada saat dijalankan, ia melakukan kesalahan berikut.
Exception in thread "main" java.lang.NegativeArraySizeException
at Test.main(Test.java:5)
Seperti ketika dalam waktu kompilasi kasus-kasus tertentu telah diperiksa, setelah waktu berjalan itu kasus-kasus tertentu telah diperiksa setelah program memenuhi semua kondisi Anda akan mendapatkan output. Jika tidak, Anda akan mendapatkan waktu kompilasi atau menjalankan kesalahan waktu.
kelas publik RuntimeVsCompileTime {
public static void main(String[] args) {
//test(new D()); COMPILETIME ERROR
/**
* Compiler knows that B is not an instance of A
*/
test(new B());
}
/**
* compiler has no hint whether the actual type is A, B or C
* C c = (C)a; will be checked during runtime
* @param a
*/
public static void test(A a) {
C c = (C)a;//RUNTIME ERROR
}
}
class A{
}
class B extends A{
}
class C extends A{
}
class D{
}
Ini bukan pertanyaan yang bagus untuk SO (ini bukan pertanyaan pemrograman khusus), tapi itu bukan pertanyaan yang buruk secara umum.
Jika menurut Anda itu sepele: bagaimana dengan waktu-baca vs waktu-kompilasi, dan kapan perbedaan yang berguna ini dibuat? Bagaimana dengan bahasa di mana kompiler tersedia saat runtime? Guy Steele (bukan boneka, dia) menulis 7 halaman di CLTL2 tentang EVAL-WHEN, yang dapat digunakan oleh programmer CL untuk mengendalikan ini. 2 kalimat hampir tidak cukup untuk definisi , yang itu sendiri jauh dari penjelasan .
Secara umum, ini adalah masalah sulit yang tampaknya dihindari oleh perancang bahasa. Mereka sering hanya mengatakan "inilah kompiler, ia melakukan kompilasi waktu; semuanya setelah itu dijalankan, bersenang-senang". C dirancang agar mudah diimplementasikan, bukan lingkungan yang paling fleksibel untuk komputasi. Saat Anda tidak memiliki kompiler yang tersedia saat runtime, atau kemampuan untuk dengan mudah mengontrol ketika ekspresi dievaluasi, Anda cenderung berakhir dengan peretasan dalam bahasa tersebut untuk penggunaan makro umum yang palsu, atau pengguna datang dengan Pola Desain untuk disimulasikan memiliki konstruksi yang lebih kuat. Bahasa yang sederhana untuk diimplementasikan jelas dapat menjadi tujuan yang bermanfaat, tetapi itu tidak berarti itu adalah akhir dari semua desain bahasa pemrograman. (Saya tidak menggunakan EVAL-KETIKA banyak, tapi saya tidak bisa membayangkan hidup tanpa itu.)
Dan masalah di sekitar waktu kompilasi dan run-time sangat besar dan sebagian besar masih belum dijelajahi. Itu bukan untuk mengatakan SO adalah tempat yang tepat untuk berdiskusi, tetapi saya mendorong orang untuk menjelajahi wilayah ini lebih jauh, terutama mereka yang tidak memiliki praduga tentang apa yang seharusnya. Pertanyaannya tidak sederhana atau konyol, dan setidaknya kita bisa mengarahkan inkuisitor ke arah yang benar.
Sayangnya, saya tidak tahu referensi bagus tentang ini. CLTL2 membicarakannya sedikit, tetapi tidak bagus untuk mempelajarinya.