Bisakah konsep Entropy digunakan untuk menganalisis kode sumber dengan cara yang bermanfaat?


19

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?


Saya tidak memiliki pengetahuan khusus tentang itu. Tetapi sebagai seorang insinyur saya percaya bahwa Anda dapat menerapkan konsep ini untuk apa pun yang Anda inginkan di alam semesta. "Segalanya" adalah energi. Kode Anda dapat dimodelkan sebagai entitas, yang memiliki energi.
wleao

3
Sudah ada ukuran kompleksitas kode - kompleksitas siklomatik, panjang kelas (LOC), panjang metode (LOC), jumlah bidang, jumlah parameter metode, kompleksitas n-path, kipas masuk / keluar kipas, dan analisis aliran data (DU / Rantai DD). Pekerjaan telah dilakukan untuk menghubungkan ini dengan cacat kepadatan, upaya untuk mempertahankan, dan kemudahan pemahaman. Bagaimana apa yang Anda cari dibandingkan dengan ini?
Thomas Owens

@ Thomas Owens: Saya pikir inilah yang diminta OP, kirimkan sebagai jawaban!
blubb

@Simon, ok, jika Anda berpikir begitu. Saya tidak 100% yakin.
Thomas Owens

1
Untuk pendekatan yang agak tidak konvensional, Anda bisa langsung menghitung rasio kompresi data untuk kode sumber, atau menghitung rasio kompresi data setelah beberapa jenis normalisasi. (mis. c2.com/doc/SignatureSurvey ) - Saya tidak tahu seberapa berartinya atau berguna hal ini, tetapi mungkin memberikan beberapa wawasan ketika dikombinasikan dengan metrik yang lebih tradisional.
William Payne

Jawaban:


22

Sudah ada sejumlah ukuran kompleksitas kode:

  • Kompleksitas siklus
  • Panjang kelas
  • Panjang metode
  • Jumlah bidang
  • Jumlah parameter metode
  • Kompleksitas jalur-N
  • Kipas dan kipas
  • Analisis aliran data (rantai DU / DD)

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.


13

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.


1
Entropi untuk kode sumber tidak akan dihitung dari model yang sama dengan yang untuk teks tidak terstruktur. Dengan model yang cocok untuk kode sumber , itu harus bermakna untuk menghitung entropi yang tidak akan sangat bervariasi untuk situasi sewenang-wenang, seperti string panjang karakter yang Anda jelaskan.
Matius Rodatus

Jadi, bagaimana Anda menilai entropi dan kompleksitas dalam program yang diberikan? Saya berpendapat bahwa itu berisi banyak informasi tidak peduli model apa yang Anda gunakan. Padahal definisi kompleksitasnya kurang jelas.
tskuzzy

1
Sama seperti itu tidak akan masuk akal untuk menghitung termodinamika entropi untuk teks bahasa alami, tidak masuk akal untuk menggunakan Shannon entropi untuk kode sumber komputer, karena arti dari sebuah program terstruktur dalam berbagai seperangkat aturan dan pola (yaitu sintaksis). Bahasa alami memiliki sintaksisnya sendiri. Model harus sesuai dengan sintaks domain. Entropi termodinamika diukur dalam joule per kelvin. Entropi Shannon diukur dalam bit. Entropi kode sumber akan diukur dalam ... dimensi yang berbeda seluruhnya. Saya menikam seperti apa model itu dalam jawaban saya.
Matius Rodatus

Saya suka jawaban Anda - saya berpikir, misalnya, ketika kode "buruk" diperkenalkan, entropi dari seluruh lingkungan yang ada dalam peningkatan, yaitu termasuk coders yang harus bekerja lebih keras - dengan cara itu mungkin ada yang praktis, jika bukan tautan ilmiah ke termodinamika?
Aaron Anodide

2

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.


2

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.


+1 untuk Shannon dan Kolmogorov, keduanya relevan ...
Alex Feinman

@Alex: Saya pikir Shannon berlaku pada saat run-time. Jadi misalnya, Anda dapat memahami kinerja algoritma dalam hal entropi poin keputusan, dan Anda dapat memahami normalisasi struktur data dalam hal kode minimal. Informasi algoritmik tampak jauh lebih linguistik, berlaku pada kesesuaian bahasa untuk tujuan ekspresifnya, dan algoritma yang Anda coba efisienkan adalah yang misterius yang engkol di kepala Anda ketika Anda memprogram.
Mike Dunlavey

2

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.

  • Tampaknya ada bias yang kuat terhadap gaya one-true-brace .
  • Tetapi bias kuat untuk merangkul pernyataan tunggal jika itu.
  • Ada bias yang kuat terhadap penggunaan variabel sementara.
  • Ada bias kuat untuk menambahkan tanda kurung untuk membuat operator diutamakan.

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.


1

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 .


0

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.


0

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.


0

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.32bit. 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.


-2

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.


berpikir seperti itu tidak bisakah Anda mengatakan semua kode memiliki entropi yang sama ketika gzip?
Aaron Anodide

@ Gabriel: Itu hal yang berbeda. Entropi itu adalah jumlah noise di antara bit ketika melihat angka itu sebagai urutan bit. Tidak melihat sebagai satu, nomor statis. Kode sumber adalah angka statis tunggal, seperti 42. Hanya dengan bit lebih banyak.
S.Lott

hanya ingin tahu, dalam pandangan ini apakah desimal 42 dan biner 42 memiliki entropi yang sama atau apakah komentar itu mengatakan bahwa angka tidak memiliki entropi, dan itulah intinya?
Aaron Anodide

"Angka tidak memiliki entropi". Mereka memang begitu. Representasi, dipandang sebagai aliran simbol mungkin memiliki entropi, tetapi angka secara keseluruhan hanya angka.
S.Lott
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.