2 poin oleh GN⁺ 2024-01-15 | 1 komentar | Bagikan ke WhatsApp

Berpikir dalam bahasa K

  • Pemrograman K sebagian besar dilakukan melalui REPL.
  • rlwrap milik ngn/k memungkinkan penelusuran riwayat dengan tombol panah, sehingga berguna untuk mengembangkan program yang besar.
  • Fungsi diuji di REPL lalu dipindahkan ke kode sebenarnya.
  • Pretty-printing di ngn/k selalu mengembalikan data K yang valid, dan dapat dihitung lebih dulu untuk meningkatkan kecepatan program.
  • Skrip K dijalankan seolah-olah dimasukkan ke REPL, dan nilai kembalian setiap baris akan dicetak kecuali diakhiri dengan titik koma.
  • Skrip memungkinkan definisi multi-baris, yang membantu keterbacaan.
  • Untuk menyimpan pekerjaan ke skrip dan memakainya di REPL, gunakan \lfile.k untuk menjalankan file dan memuat data.
  • File dapat dimuat berkali-kali di REPL untuk menimpa data sebelumnya.
  • Bantuan REPL yang diakses dengan \ memiliki berbagai perintah berguna.

Penyederhanaan pemrograman array

  • Pemrograman array adalah proses berkelanjutan untuk menyederhanakan pola yang kompleks menjadi pola yang lebih kecil, deklaratif, dan mudah dibaca.
  • Cara menyederhanakan pola kompleks dibahas secara rinci dalam "Patterns and Antipatterns in APL: Avoiding the Beginner's Plateau - Aaron Hsu - Dyalog '17".

Transformasi perkalian matriks ke K

  • Algoritma iteratif perkalian matriks yang diambil dari artikel Wikipedia dapat langsung ditransformasikan ke K.
  • Contoh kode terburuk yang ditransformasikan ke K memerlukan banyak assignment variabel global, loop bertingkat, dan banyak modifikasi.
  • Kode dapat disederhanakan dengan menyelesaikan masalah-masalah ini satu per satu.

Penyederhanaan loop bagian dalam

  • Pada loop bagian dalam, sum dapat disederhanakan menggunakan fold (/).
  • Karena ' (each) mengembalikan array, variabel global C dapat dihapus.
  • Loop dapat disederhanakan dengan menghilangkan variabel i, j, dan k.

Menghapus loop dan meminimalkan variabel global

  • Loop tengah dapat dihapus dengan mencocokkan baris dan kolom secara langsung tanpa k.
  • Untuk menghapus j, setiap kolom B dapat dipasangkan dengan A[i].
  • Untuk menghapus i, gunakan eachleft agar setiap baris A dipasangkan dengan setiap kolom B.
  • Variabel global tidak lagi diperlukan.

Bentuk akhir fungsi perkalian matriks

  • + (transpose) mahal biayanya sehingga dapat dihapus.
  • Alih-alih mengalikan setiap baris x dengan setiap kolom y, pekerjaan yang sama dapat dilakukan secara implisit dengan mencocokkan setiap baris B terhadap seluruh A.
  • Pada akhirnya diperoleh fungsi perkalian matriks yang ringkas dan eksplisit.
  • Proses penyederhanaan kode pada awalnya melewati banyak tahap, tetapi akan menjadi lebih mudah dan intuitif seiring meningkatnya kemahiran dalam K.
  • Perkalian matriks adalah prosedur sederhana yang sangat cocok dengan dukungan array di K.
  • Bab-bab mendatang akan membahas lebih banyak algoritma yang kurang cocok dengan K dan cara menanganinya.

Pendapat GN⁺

  • Artikel ini menunjukkan bagaimana algoritma seperti perkalian matriks dapat disederhanakan dan dioptimalkan dengan menggunakan bahasa K.
  • Umpan balik instan melalui REPL dan perbaikan kode secara iteratif adalah ciri inti pemrograman K, serta merupakan metode belajar yang berguna bahkan bagi insinyur perangkat lunak pemula.
  • Proses penyederhanaan kode penting untuk meningkatkan kemampuan pemrograman, dan artikel ini menjelaskannya dengan mudah dipahami melalui contoh yang konkret.

1 komentar

 
GN⁺ 2024-01-15
Opini Hacker News
  • Banyak orang mempertanyakan kegunaan dan kemudahan dipahaminya bahasa array.

    • Bahasa array tidak cocok untuk semua masalah.
    • Untuk banyak jenis masalah, bahasa ini ternyata sangat mumpuni.
    • Pengguna bahasa array umumnya sangat cerdas.
    • Mempelajari cara kerja bahasa array merupakan tantangan besar.
    • Menulis kode "prosedural" dalam bahasa array adalah hal yang sangat buruk.
    • Memahami tacit programming adalah pengalaman luar biasa yang membuka cara berpikir.
    • Pengalaman saat menginternalisasi verb trains.
    • Memahami cara bahasa berbasis array menangani array di semua dimensi.
    • Memahami cara kerja "under".
    • Memahami cara kerja function exponents.
  • Ada banyak aspek menakjubkan dari bahasa array, dan daftar di atas hanya sebagian kecilnya.

    • Menyaksikan Aaron Hsu mengembangkan kompiler APL paralel membuat orang yakin akan potensi nyata bahasa array.
    • Ada pembahasan tentang "semantic density" dari kode APL.
  • Jika belum pernah mendengar tentang array programming dan ingin pengantar, "The Array Cast" direkomendasikan.

  • Seseorang menemukan APL/APL2 pada tahun 70-an dan langsung jatuh hati, tetapi merasa lebih tertarik pada kemampuan untuk menyusun fungsi.

    • Haskell bersifat murni dan bertipe, sehingga terasa lebih menyenangkan dan lebih kuat daripada APL.
    • "Notation as a tool of thought" pada APL terlihat seperti logika untuk membenarkan keringkasan yang berlebihan.
  • Pencerahan paling penting dari penggunaan bahasa array:

    • Verba adalah algoritme.
    • Rangkaian verba (atau adverbia) adalah cara komposisi paling langsung yang pernah digunakan.
    • Program adalah komposisi algoritme, bukan kumpulan kalimat dan ekspresi.
    • Konsep untuk menangani domain dan range secara konsisten di seluruh array, map, dan fungsi.
    • Evaluasi dari kiri ke kanan tanpa perlu mata "meloncat-loncat" saat membaca kode.
    • Mengirim kode ke data itu mungkin dilakukan dan lebih disukai.
    • Keuntungan tambahan bahasa K: view (yakni dependency) dapat diimplementasikan secara langsung, dan hot code loading dimungkinkan lewat interpreter.
  • Pertanyaan tentang bahasa array: bagaimana melakukan tugas seperti "mencari semua angka yang lebih kecil dari N yang memenuhi kondisi P"?

    • Dalam bahasa array, biasanya dibuat array dari 1 sampai N, lalu kondisi diuji terhadap array tersebut, kemudian mask diterapkan untuk memperoleh hanya elemen yang memenuhi kondisi.
    • Jika N besar dan kondisi jarang terpenuhi, membuat terlalu banyak array sementara tampak seperti pemborosan memori dan sumber daya.
    • Implementasi bahasa array dapat mengoptimalkan masalah ini, atau menyelesaikannya dengan teknik seperti lazy evaluation.
  • Pengalaman dengan bahasa J: paradigma bahasa array terasa bias, dan tidak yakin apakah memikirkan semua masalah sebagai susunan array bersarang itu membantu.

    • Bisa secara bebas membuat struktur data yang menyederhanakan masalah dapat sangat menyederhanakan bagian algoritmenya.
    • Untuk menggunakan APL/J/K, orang perlu lebih cerdas karena bias ini.
  • Kesan setelah menyelesaikan masalah dalam bahasa K: bahasa K sengaja dibuat sulit dipahami.

    • Ini bahasa yang cocok untuk teka-teki dan solusi cerdik, tetapi bekerja dengan array numpy di Python juga mengajarkan bahasa array dan cara berpikir dengan array.
  • Contoh dalam bahasa array J: menggunakan dot =: +/ . * untuk menghitung dot product dari P dan Q.

  • Sintaks bahasa K memang lebih pendek, tetapi kita harus terus menyimpan banyak konteks bawaan tentang cara kerja bahasa K di dalam kepala.