Tampak logis bagi saya bahwa seseorang dapat mendefinisikan konteks untuk analisis kode sumber statis yang menyertakan aturan untuk menghasilkan nilai relatif kompleksitas. Saya tahu ini tidak seperti dalam pengertian fisik karena kode sumber tidak memiliki "Energi" tetapi saya bertaruh ada upaya, di leat akademik, untuk menggambar secara paralel. Adakah yang tahu tentang hal ini dan jika demikian, sampai sejauh mana hal itu menghasilkan hasil yang bermanfaat?
code-quality
static-analysis
Aaron Anodide
sumber
sumber
Jawaban:
Sudah ada sejumlah ukuran kompleksitas kode:
Pekerjaan telah dilakukan untuk menghubungkan ini dengan cacat kepadatan, upaya untuk mempertahankan, dan kemudahan pemahaman. Beberapa lebih bermakna daripada yang lain, tergantung pada apa yang Anda coba pelajari dari analisis Anda. Saya tidak begitu akrab dengan konsep entropi dari ilmu fisika, tetapi saya bertanya-tanya apakah melacak pengukuran dan metrik seperti yang saya sebutkan dari waktu ke waktu, dan menghubungkannya dengan cacat dari waktu ke waktu, akan sama dengan apa yang Anda cari.
Anda mungkin juga tertarik dengan definisi perangkat lunak dan pembusukan perangkat lunak Ivar Jacobson . Gagasan umum dari topik ini adalah bahwa seiring waktu, seiring dengan perubahan kode dan lingkungan eksekusi, sistem perangkat lunak mulai menurun. Refactoring dipandang sebagai metode meminimalkan entropi atau pembusukan, dan, setidaknya dalam pengalaman saya, metrik dan pengukuran yang saya sebutkan di atas akan menjadi indikator bahwa refactoring mungkin diperlukan dalam suatu sistem atau subsistem.
sumber
Saya pikir Anda mencoba untuk menggambar paralel antara entropi termodinamika dan "kompleksitas." Masalahnya, entropi adalah ukuran gangguan, bukan kompleksitas . Saya tidak percaya bahwa keduanya setara dan dapat dipertukarkan.
Analog terdekat dengan entropi termodinamika adalah entropi Shannon yang mengukur jumlah gangguan pada variabel acak. Gagasan ini terutama berkaitan dengan jumlah "informasi" dalam sebuah pesan.
Dalam hal itu, sepotong kode dapat memiliki banyak informasi (entropi tinggi) tetapi kompleksitasnya sangat rendah. Pikirkan sebuah program yang hanya mencetak string karakter sewenang-wenang yang sangat panjang. Ini memiliki banyak informasi, tetapi kompleksitasnya rendah.
sumber
Entropi adalah "ukuran gangguan [atau] ketidakpastian." Rentang yang lebih luas dari pola unik dalam informasi (yaitu kira-kira "lebih banyak makna") menunjukkan tingkat entropi yang lebih tinggi.
Diterapkan pada kode sumber komputer, saya pikir prinsip ini bisa bermanfaat. Namun, akan diperlukan untuk merancang model probabilistik untuk kode sumber yang digunakan untuk menghitung entropi. (Struktur data yang mudah diingat adalah grafik dengan tipe tepi yang berbeda: panggilan, pewarisan kelas, dll.)
Setelah model dirancang dan kemudian diisi dengan kode sumber aplikasi perangkat lunak (yaitu frekuensi untuk node / tepi), entropi dapat dihitung.
Saya tidak tahu ada penelitian tentang ini, tetapi intuisi saya adalah bahwa tingkat entropi yang rendah akan berarti bahwa kode sumber menggunakan kembali pola umum di seluruh aplikasi (yaitu KERING ). Sebaliknya, tingkat entropi yang tinggi akan berarti bahwa kode sumber memiliki kompleksitas yang tinggi dan belum difaktorkan dengan baik.
sumber
Salah satu cara untuk memikirkan entropi adalah "informasi rata-rata yang akan diperoleh", jadi saya pikir lebih baik kembali ke pemodelan informasi. Saya tahu dua pendekatan dasar untuk informasi pemodelan matematis. (Maafkan saya karena memberikan referensi Wikipedia, tapi IMHO itu tidak buruk.)
Informasi Shannon , yang melihat pada set simbol, distribusi probabilitas pada mereka, kode yang dapat mentransfer informasi antara set simbol, dan panjang kode-kode itu. Konsep umum efisiensi kode, noise, deteksi kesalahan dan koreksi melalui redundansi, dll. Ditulis dalam kerangka teori informasi Shannon. Salah satu cara untuk mengungkapkan informasi adalah dengan mengatakan bahwa itu adalah panjang kode biner terpendek yang dapat mewakili simbol. Ini didasarkan pada probabilitas, yang merupakan nilai numerik yang diberikan pada simbol atau peristiwa oleh beberapa pengamat.
Informasi Solomonoff (atau Kolmogorov ). Ini penjelasan lain. Dalam formulasi ini, konten informasi dari simbol atau peristiwa diwakili oleh panjang program terpendek yang dapat menghitungnya. Sekali lagi, ini relatif, bukan untuk pengamat yang menetapkan probabilitas, tetapi untuk mesin universal yang dapat menjalankan program. Karena setiap mesin universal dapat disimulasikan oleh mesin Turing universal, itu berarti, dalam arti tertentu, bahwa konten informasi dari simbol atau peristiwa tidak relatif, tetapi absolut.
Jika saya bisa mengambil kebebasan untuk mengatakan apa yang saya pikir artinya dalam istilah sehari-hari, tentang yang saya tulis buku , itu berarti kompleksitas sebuah program adalah panjangnya, ketika hal-hal seperti spesifikasi fungsional dan bahasa dipertahankan konstan, dengan tepat tunjangan untuk hal-hal seperti komentar dan panjang nama. Tapi ada masalah dengan ini - "APL tarpit", di mana keringkasan sama dengan tidak bisa dimengerti.
Jauh lebih baik untuk mempertimbangkan (seperti yang saya lakukan ketika mempelajari AI) bahwa spesifikasi fungsional dari program ini terdiri dari model mental, yang tidak hanya nyata, tetapi disandikan secara efisien, yaitu, dengan redundansi yang cukup kecil yang mengubah pikiran seseorang tentang persyaratan. dapat dilakukan tanpa terlalu banyak bahaya membuatnya tidak konsisten secara internal - yaitu memiliki "bug". Maka proses pemrograman adalah saluran informasi yang mengambil sebagai input model mental, dan outputnya adalah kode sumber yang berfungsi. Kemudian ketika perubahan dibuat dalam model mental, delta itu harus dimasukkan melalui proses pemrograman dan berubah menjadi delta yang sesuai dalam kode sumber. Delta itu mudah diukur. Bedakan sumber antara sebelum menerapkan delta itu, dan setelah menerapkannya (sepenuhnya, dengan semua bug berhasil), dan hitung jumlah blok kode yang dimasukkan, dihapus, dan diganti. Semakin kecil artinya, semakin baik bahasa kode sumber mewakili bahasa yang diwakili oleh model mental (dalam hal kata benda, kata kerja, dan struktur). Jika ukuran itu entah bagaimana dirata-ratakan atas ruang kemungkinan perubahan fungsional, itu adalah konsep entropi bahasa sumber, dan lebih sedikit lebih baik. Ada istilah untuk ini -Bahasa Khusus Domain (DSL)
Saya minta maaf jika referensi lemah / pribadi, tapi saya pikir pertanyaan keseluruhan ini adalah yang sangat penting.
sumber
Jon Jagger dan Olve Maudal memiliki pandangan yang sedikit berbeda tentang Entropi Kode, seperti yang dapat dilihat pada sesi konferensi Accu 2011 mereka, Entropi Kode dan Fisika Perangkat Lunak .
Mereka berbicara tentang stabilitas kode yang terkait dengan apakah pengembang / pengelola masa depan cenderung mengubah kode itu.
Untuk menunjukkan ini, mereka melakukan survei dengan sejumlah potongan kode dan hasilnya cukup menarik.
ditambah 16 lainnya.
Tren umum tampaknya mengarah ke membuat kode lebih mudah untuk dipahami, dan lebih sulit untuk salah dipahami.
Mereka juga melihat beberapa perubahan yang dibuat pada basis kode besar selama bertahun-tahun.
Meskipun slide sendiri tidak memiliki transkrip sesi, masih ada beberapa poin menarik di sana.
sumber
Saya belajar di bawah seorang profesor yang menggunakan entropi sebagai ukuran kompleksitas program (buku teks kami adalah edisi yang lebih tua dari ini , beberapa pub-nya ada di sini ). Ada sejumlah disertasi di FAU di mana ini adalah salah satu langkah utama, tetapi situs web sekolah telah berubah sejak saya terakhir melihat, dan saya tidak dapat menemukan di mana tesis / disertasi siswa sekarang berada.
Salah satu disertasi tersebut adalah Teori Informasi dan Pengukuran Perangkat Lunak .
sumber
Jika Anda menginginkan definisi yang "matematika" dalam cara entropi, Anda mungkin ingin melihat kompleksitas Kolmogorov, yang mengukur kompleksitas dengan jumlah minimum dari sesuatu yang bisa dilakukan. Namun, ini bukan kompleksitas kode, tetapi apa yang Anda coba lakukan dengan kode. Tetapi Anda mungkin berpikir itu relevan karena Anda secara teoritis dapat membandingkan potongan kode tertentu dengan kode minimal. Namun, ini bukan teknik yang berguna saat ini untuk mengukur kompleksitas kode dunia nyata.
sumber
Saya pikir ini tidak layak, orang bisa berpendapat bahwa basis kode yang ditulis dengan baik harus memiliki entropi yang lebih tinggi (gangguan). Pikirkan basis kode tempat potongan kode berulang-ulang, dapat dikompres dengan rasio kompresi tinggi karena bagian berulang (entropi / ukuran file lebih rendah), namun jika Anda memindahkan kode ke fungsi terpisah rasio kompresi akan lebih rendah (ukuran file / entropi lebih tinggi).
Jadi orang mungkin berpikir, maka saya dapat menghitung sesuatu seperti Entropy / CodeLines menggunakan rasio kompresi sebagai koefisien, untuk mengukur kualitas kode, namun ini memiliki masalah bahwa total input acak akan terlihat seperti kode terbaik di dunia yang jelas tidak.
Memang rasio kompresi adalah meteran yang baik untuk mengukur entropi kode, namun keduanya bukan meter yang baik untuk kualitas kode.
sumber
Nah, istilah entropi tidak hanya muncul dalam termodinamika dan teori informasi, tetapi juga muncul di dunia nyata kompresi data. Dalam konteks itu, entropi yang dilihat kompresor sama dengan jumlah bit yang dihasilkannya. (Perhatikan bahwa saya mengatakan "entropi yang dilihat kompresor ", karena apa yang dianggap entropi tergantung pada model yang digunakan kompresor untuk menggambarkan data input. Inilah alasan mengapa kompresor berbeda menghasilkan file dengan ukuran berbeda: Apa entropi pada satu adalah struktur yang dapat dieksploitasi untuk yang lain.)
Pada prinsipnya, ini dapat diterapkan dengan indah pada kompleksitas kode sumber: "Hanya" tulis kompresor yang hanya bekerja pada kode sumber yang sepenuhnya memenuhi standar, dan yang memampatkannya benar-benar menguraikannya seperti kompiler, menghasilkan pohon sintaksis yang sesuai. Kemudian dapat berjalan pohon sintaksis ini, dan memutuskan pada setiap node node mana yang mungkin terjadi pada setiap titik, mengkodekan simpul itu dengan pengetahuan itu.
Jadi, misalnya, jika bahasa memungkinkan pengidentifikasi yang ada, atau sesuatu yang tertutup dalam tanda kurung, atau produk pada titik tertentu, kompresor akan menghitung kemungkinan pengidentifikasi yang ada, dengan memasukkan informasi jenis ke dalam akun (misalkan Anda memiliki 3 pengidentifikasi seperti itu) ), dan tambahkan 2 untuk dua kemungkinan subekspresi, berikan 5 kemungkinan. Jadi node akan dikodekan dengan
lb 5 = 2.32
bit. Dalam kasus dua kemungkinan subekspresi, dibutuhkan lebih banyak bit untuk menyandikan kontennya.Ini memang akan memberikan ukuran yang sangat akurat untuk kompleksitas kode apa adanya. Namun, langkah ini masih sia-sia! Tidak ada gunanya karena alasan yang sama bahwa semua pengukuran kompleksitas kode tidak berguna: Mereka gagal menarik hubungan antara kompleksitas kode yang diukur (apa pun itu) dan kompleksitas masalah yang dipecahkan oleh kode. Anda selalu dapat menemukan solusi yang sangat rumit untuk masalah pemrograman Anda untuk mengesankan majikan Anda dengan jumlah LOC Anda, tetapi tidak ada ukuran kompleksitas kode yang akan memberi tahu Anda bahwa tugas tersebut dapat diselesaikan dengan sedikit usaha.
sumber
Kode memiliki entropi persis sama dengan angka π.
Pemeliharaan dan perubahan kode dapat memperkenalkan entropi (karena ada kemungkinan perubahan status yang terlibat).
Tetapi kode hanyalah angka yang besar. Dengan representasi biner.
sumber