Memprogram * ke * bahasa vs. menulis kode C di Ruby

10

Kode Lengkap menyatakan bahwa Anda harus mengubah kode ke dalam bahasa sebagai lawan dari kode di dalamnya. Maksud mereka

Jangan membatasi pemikiran pemrograman Anda hanya pada konsep-konsep yang didukung secara otomatis oleh bahasa Anda. Pemrogram terbaik memikirkan apa yang ingin mereka lakukan, dan kemudian mereka menilai bagaimana mencapai tujuan mereka dengan alat pemrograman yang mereka miliki. (bab 34.4)

Tidakkah ini mengarah pada penggunaan satu gaya pemrograman dalam setiap bahasa di luar sana, terlepas dari kekuatan dan kelemahan tertentu dari bahasa yang ada?

Atau, untuk menempatkan pertanyaan dalam format yang lebih dapat dijawab:

Apakah Anda akan mengusulkan bahwa seseorang harus mencoba untuk menyandikan masalah seseorang serapi mungkin dengan rincian bahasa seseorang, atau jika Anda lebih suka mencari solusi yang paling elegan secara keseluruhan, bahkan jika itu berarti Anda perlu menerapkan konstruksi yang mungkin canggung yang tidak ada secara asli dalam bahasa seseorang?

bastibe
sumber
5
+1 pertanyaan bagus. Saya dapat menulis dalam Perl dalam setengah lusin bahasa yang berbeda, pada titik ini.
Dan Ray
@Dan Ray - aneh! Saya selalu menulis C dalam Perl.
James Anderson

Jawaban:

7

Ada pendekatan yang lebih baik lagi: lupakan bahasa pemrograman tetap Anda yang menyedihkan. Menyandikan masalah Anda dalam bahasa yang baru saja Anda temukan, berasal dari istilah yang sangat relevan dengan domain masalah, menyandikannya sealami mungkin, dan baru kemudian memikirkan menerapkan bahasa pemrograman baru ini atau mengurangi kode Anda hingga batas keterbatasannya. bahasa yang ada.

Pendekatan ini disebut pemrograman berorientasi bahasa . Ada banyak teknik penerapan bahasa khusus domain secara efisien, dan ini merupakan topik yang hangat untuk komunitas Ruby.

Logika SK
sumber
1
Komunitas Haskell juga merangkul bahasa-bahasa khusus domain, dan bahasa pemrograman Haskell sangat cocok untuk mengimplementasikannya.
tdammers
Apakah menerapkan sistem skrip yang dibuat khusus berdasarkan bahasa yang disematkan seperti Lua atau Tkl dianggap sebagai penulisan DSL? Jika demikian, bagaimana Anda mengatasi kekurangan misalnya Lua?
bastibe
@Paperflyer, dalam beberapa kasus masuk akal menerapkan bahasa di atas sesuatu seperti Lua (terutama jika itu Metalua), tetapi lebih mudah untuk menulis kompiler yang tepat untuk sebagian besar DSL khas.
SK-logic
@tdammers, ya, Haskell dan Scala semuanya tentang DSL. Tapi saya dari sisi gelap the Force: pendekatan yang saya sukai adalah metaprogramming. Saya percaya bahwa penerjemah ad hoc hampir selalu lebih rendah daripada kompiler.
SK-logic
2
@tdammers, DSL yang diimplementasikan di atas fungsi-fungsi tingkat tinggi, praktis, adalah penerjemah ad hoc. Anda tidak dapat memperluas sintaksis Haskell dengan cara yang sama Anda akan memperluas, katakanlah, Lisp. Bahkan dengan Template Haskell. Ini cara yang sama sekali berbeda (dan, saya katakan, terbatas) dalam mengimplementasikan DSL. Tidak apa-apa dalam banyak kasus, tetapi untuk hal yang sangat kompleks itu mengarah pada implementasi yang sama sekali tidak dapat dibaca, sedangkan metaprogramming multi-tahap hanya sepele, tidak peduli seberapa besar dan asing DSL Anda.
SK-logic
2

Saya percaya jawaban yang benar, dan yang dimaksud oleh buku itu adalah:

seseorang harus mencoba untuk menyandikan masalah seseorang serapi mungkin dengan rincian bahasa seseorang

Dengan memprogram ke dalam suatu bahasa, saya selalu berasumsi bahwa itu menggunakan teknik-teknik di luar gaya bahasa yang normal di mana itu akan membawa manfaat . Ini adalah perbedaan utama untuk menulis dalam satu gaya dalam semua bahasa.

Misalnya, belajar Haskell sangat meningkatkan keterampilan saya dalam menggunakan fungsi tingkat tinggi. Sekarang ketika pemrograman dalam c #, saya menggunakan berbagai IEnumerablemetode seperti Selectlebih sering, karena menggunakan metode ini mengarah ke kode yang lebih bersih daripada menulis untuk loop. Saya juga cenderung menggunakan pass dan menggunakan fungsi (yaitu Func<int, int>) lebih sering karena pengalaman haskell saya. Penggunaan warisan saya telah menurun karena hal ini, dan sebagian besar waktu hasilnya adalah kode yang lebih sederhana.

Namun, saya tidak menggunakan konsep seperti monad, atau tipe data aljabar di c #. Ini karena tidak ada yang jelas mewakili dalam c #, dan mengarah pada sedikit manfaat dengan imbalan banyak ketidakjelasan.

Jadi saya menggunakan alat-alat bahasa untuk menggunakan keterampilan yang saya miliki untuk efek terbaik. Saya percaya itu adalah pemrograman ke dalam bahasa.

David Miani
sumber
0

Apakah Anda akan mengusulkan bahwa seseorang harus mencoba untuk menyandikan masalah seseorang serapi mungkin dengan rincian bahasa seseorang, atau jika Anda lebih suka mencari solusi yang paling elegan secara keseluruhan, bahkan jika itu berarti Anda perlu menerapkan konstruksi yang mungkin canggung yang tidak ada secara asli dalam bahasa seseorang?

Intinya adalah bahwa programmer yang baik tidak memiliki sebuah bahasa. Kutipan dari buku ini berbicara tentang "alat pemrograman yang mereka miliki" - itu berarti jika Anda tahu perl dan Java, maka mungkin Anda harus menggunakan perl untuk manipulasi string cepat. Bahasa pemrograman bukan kotak untuk membatasi kami, tetapi alat yang kami gunakan untuk menyelesaikan masalah. Inilah (imo) maksud dari Kode Lengkap ini. Jangan kode dalam kotak bahasa / lingkungan pemrograman, masukkan solusi terbaik ke bahasa / lingkungan pemrograman terbaik untuk Anda, masalah Anda, dan solusi Anda.

Telastyn
sumber