Ketika semua yang Anda miliki adalah sepasang pemotong baut dan sebotol vodka, semuanya tampak seperti kunci di pintu gudang perahu Wolf Blitzer. (Ganti dengan palu dan paku jika Anda tidak membaca xkcd)
Saat ini saya memprogram Clojure, Python, Java dan PHP, jadi saya akrab dengan sintaks C dan LISP serta hal spasi putih. Saya tahu imperatif, fungsional, tidak berubah, OOP dan beberapa jenis sistem dan hal lainnya. Sekarang saya ingin lebih!
Bahasa apa yang mengambil pendekatan yang berbeda dan akan berguna untuk pemilihan alat praktis atau pemahaman teoretis?
Saya tidak ingin belajar bahasa fungsional lain (Haskell) atau bahasa OOP imperatif lainnya (Ruby), saya juga tidak ingin mempraktikkan bahasa menyenangkan yang tidak praktis seperti Brainfuck.
Satu hal yang sangat menarik yang saya temukan adalah bahasa berbasis tumpukan monoikonik seperti Factor.
Hanya ketika saya merasa saya mengerti sebagian besar konsep dan memiliki jawaban untuk semua pertanyaan saya, saya ingin mulai berpikir tentang bahasa mainan saya sendiri untuk memuat semua preferensi pribadi saya.
Jawaban:
Masalah kepraktisan sangat subjektif, jadi saya hanya akan mengatakan bahwa mempelajari paradigma bahasa yang berbeda hanya akan membuat Anda menjadi programmer yang lebih baik. Apa yang lebih praktis dari itu?
Fungsional, Haskell - Saya tahu Anda mengatakan bahwa Anda tidak mau, tetapi Anda harus benar-benar mempertimbangkan kembali. Anda telah mendapatkan beberapa paparan fungsional dengan Clojure dan bahkan Python, tetapi Anda belum mengalaminya secara maksimal tanpa Haskell. Jika Anda benar-benar menentang Haskell maka kompromi yang baik adalah ML atau OCaml.
Deklaratif, Datalog - Banyak orang akan merekomendasikan Prolog di slot ini, tapi saya pikir Datalog adalah contoh yang lebih bersih dari bahasa deklaratif.
Array, J - Saya baru saja menemukan J, tapi saya merasa itu bahasa yang menakjubkan. Ini akan memutar pikiran Anda menjadi pretzel. Anda akan berterima kasih pada J untuk itu.
Stack, Factor / Forth - Factor sangat kuat dan saya berencana untuk menggali ASAP. Forth adalah kakek buyut dari bahasa Stack, dan sebagai bonus tambahan itu mudah untuk diterapkan sendiri. Ada sesuatu yang bisa dikatakan tentang belajar melalui implementasi.
Dataflow, Oz - Saya pikir pengaruh Oz sedang naik dan hanya akan terus tumbuh di masa depan.
Berbasis prototipe, JavaScript / Io / Self - Self adalah grand-daddy dan sangat berpengaruh pada setiap bahasa berbasis prototipe. Ini tidak sama dengan OOP berbasis kelas dan tidak boleh diperlakukan seperti itu. Banyak orang datang ke bahasa prototipe dan membuat sistem kelas ad-hoc, tetapi jika tujuan Anda adalah untuk memperluas pikiran Anda, maka saya pikir itu adalah kesalahan. Gunakan bahasa untuk kapasitas penuhnya. Baca Program Pengorganisasian tanpa Kelas untuk ide.
Sistem Pakar, KLIP - Saya selalu merekomendasikan ini. Jika Anda tahu Prolog maka kemungkinan Anda akan unggul dalam kecepatan, tetapi bahasa yang sangat berbeda.
Frink - Frink adalah bahasa tujuan umum, tetapi terkenal dengan sistem konversi unitnya. Saya menemukan bahasa ini sangat menginspirasi dalam dorongan tanpa henti untuk menjadi yang terbaik dalam fungsinya. Plus ... itu sangat menyenangkan!
Tipe Fungsional + Opsional, Qi - Anda mengatakan Anda memiliki pengalaman dengan beberapa sistem tipe, tetapi apakah Anda memiliki pengalaman dengan "sistem tipe skinnable *? Tidak ada yang ... tetapi mereka seharusnya. Qi seperti Lisp dalam banyak hal, tetapi sistem ketik akan meniup pikiran Anda.
Aktor + Toleransi kesalahan, Erlang - Model proses Erlang mendapat banyak perhatian, tetapi mekanisme toleransi kesalahan dan hot-code-swapping-nya mengubah permainan. Anda tidak akan belajar banyak tentang FP yang tidak akan Anda pelajari dengan Clojure, tetapi fitur FT-nya akan membuat Anda bertanya-tanya mengapa lebih banyak bahasa sepertinya tidak bisa melakukan ini dengan benar.
Nikmati!
sumber
Bagaimana dengan Prolog (untuk unifikasi / backtracking dll), Smalltalk (untuk "semuanya pesan"), Keempat (reverse polish, interpreter ulir dll), Skema (lanjutan)?
Bukan bahasa, tetapi Seni Protokol Metaobject adalah hal yang membekas
sumber
Aku yang kedua Haskell. Jangan berpikir "Saya tahu Lisp, jadi saya tahu pemrograman fungsional". Pernah mendengar tentang kelas tipe? Tipe data aljabar? Monad? Bahasa-bahasa fungsional "modern" (kurang lebih - setidaknya tidak berusia 50 tahun;)), khususnya Haskell, telah mengeksplorasi sejumlah besar konsep baru yang sangat kuat dan bermanfaat. Kelas jenis menambahkan polimorfisme ad-hoc, tetapi ketikkan inferensi (hal lain yang tidak dimiliki bahasa yang sudah Anda miliki) berfungsi seperti pesona. Tipe data aljabar sangat mengagumkan, terutama untuk memodelkan struktur data seperti pohon, tetapi berfungsi dengan baik untuk enum atau catatan sederhana juga. Dan monads ... well, katakan saja orang menggunakannya untuk membuat pengecualian, I / O, parser, daftar pemahaman dan banyak lagi - dengan cara yang murni fungsional!
Juga, seluruh topik cukup dalam untuk membuat orang sibuk selama bertahun-tahun;)
sumber
C
Ada banyak kode C tergeletak di sekitar --- itu pasti praktis. Jika Anda belajar C ++ juga, ada banyak kode lebih banyak di sekitar (dan lompatan singkat setelah Anda tahu C dan Java).
Ini juga memberi Anda (atau memaksa Anda untuk memiliki) pemahaman yang bagus tentang beberapa masalah teoritis; misalnya, setiap program yang berjalan hidup dalam array 4 GB byte, dalam arti tertentu. Pointer di C benar-benar hanya indeks ke dalam array ini --- mereka hanya jenis integer yang berbeda. Tidak berbeda di Java, Python, PHP, kecuali disembunyikan di bawah lapisan permukaan.
Juga, Anda dapat menulis kode berorientasi objek dalam C, Anda hanya perlu sedikit manual tentang vtables dan semacamnya. Koleksi Teka-teki Portabel Simon Tatham adalah contoh yang bagus dari kode C berorientasi objek yang dapat diakses; itu juga dirancang dengan cukup baik dan layak dibaca untuk pemula / programmer C menengah. Inilah yang terjadi di Haskell juga --- kelas tipe dalam beberapa hal "hanyalah vtable lain".
Hal hebat lainnya tentang C: terlibat dalam Q&A dengan programmer C yang terampil akan memberi Anda banyak jawaban yang menjelaskan C dalam hal konstruksi tingkat rendah, yang membangun basis pengetahuan Anda yang lebih dekat.
Saya mungkin kehilangan poin OP --- saya pikir saya, menilai dengan jawaban lain --- tapi saya pikir itu mungkin jawaban yang berguna untuk orang lain yang memiliki pertanyaan serupa dan membaca utas ini.
sumber
Dari situs Peter Norvig:
"Pelajari setidaknya setengah lusin bahasa pemrograman. Sertakan satu bahasa yang mendukung abstraksi kelas (seperti Java atau C ++), yang mendukung abstraksi fungsional (seperti Lisp atau ML), yang mendukung abstraksi sintaksis (seperti Lisp), yang mendukung deklaratif spesifikasi (seperti templat Prolog atau C ++), yang mendukung coroutine (seperti Ikon atau Skema), dan yang mendukung paralelisme (seperti Sisal). "
http://norvig.com/21-days.html
sumber
Saya kagum bahwa setelah 6 bulan dan ratusan suara, tidak ada yang menyebutkan SQL ...
sumber
Dalam tipe sebagai teorema / sistem tipe lanjutan: Coq (saya pikir Agda juga termasuk dalam kategori ini).
Coq adalah asisten bukti yang dibenamkan ke dalam bahasa pemrograman fungsional.
Anda dapat menulis bukti matematika dan Coq membantu membangun solusi. Anda dapat menulis fungsi dan membuktikan properti tentang itu.
Itu memiliki tipe-tipe dependen, itu saja yang menghancurkan pikiranku. Contoh sederhana:
adalah tanda tangan dari fungsi yang menggabungkan dua array ukuran n dan m elemen A dan mengembalikan array ukuran (n + m). Itu tidak akan dikompilasi jika fungsi tidak mengembalikan itu!
Didasarkan pada kalkulus konstruksi induktif, dan ia memiliki teori yang kuat di belakangnya. Saya tidak cukup pintar untuk memahami semuanya, tetapi saya pikir layak untuk dilihat, khususnya jika Anda cenderung ke arah teori tipe.
EDIT: Saya perlu menyebutkan: Anda menulis fungsi dalam Coq dan kemudian Anda dapat MEMBUKTIKAN itu benar untuk setiap input, itu luar biasa!
sumber
Salah satu bahasa yang saya tertarik untuk memiliki titik yang sangat berbeda pandang (termasuk kosa kata baru untuk menentukan unsur-unsur bahasa dan sintaks diff radikal) adalah J . Haskell akan menjadi pilihan yang jelas bagi saya, meskipun merupakan bahasa fungsional, karena sistem tipenya dan fitur unik lainnya membuka pikiran Anda dan membuat Anda memikirkan kembali pengetahuan Anda sebelumnya dalam pemrograman (fungsional).
sumber
Sama seperti fogus telah menyarankannya kepada Anda dalam daftar, saya juga menyarankan Anda untuk melihat bahasa OzML / Mozart Banyak paradigma, terutama ditargetkan pada pemrograman concurrency / multi-agen.
Mengenai konkurensi, dan kalkulus terdistribusi, setara dengan kalkulus Lambda (yang berada di belakang pemrograman functionnal) disebut Pi Calculus.
Saya baru mulai melihat beberapa implementasi kalkulus Pi. Tapi mereka sudah memperbesar konsepsi saya tentang komputasi.
sumber
Pemrograman dataflow, alias pemrograman berbasis aliran adalah langkah maju di depan. Beberapa kata kunci: pemrosesan paralell, prototyping cepat, pemrograman visual (tidak seburuk suara pertama).
Artikel Wikipedia bagus:
Baca buku JPM: http://jpaulmorrison.com/fbp/
(Kami telah menulis implementasi sederhana dalam C ++ untuk keperluan otomatisasi rumah, dan kami sangat senang dengannya. Dokumentasi sedang dalam pembuatan.)
sumber
Anda telah belajar banyak bahasa. Sekarang adalah waktunya untuk fokus pada satu bahasa, dan menguasainya.
sumber
mungkin Anda mungkin ingin mencoba LabView untuk pemrograman visualnya, meskipun ini untuk tujuan rekayasa.
Namun, Anda tampaknya cukup tertarik dengan semua yang ada di luar sana, maka saran itu
juga, Anda bisa mencoba appinventor android untuk membuat benda secara visual
sumber
Bruce A. Tate, mengambil satu halaman dari The Pragmatic Programmer menulis buku tentang hal itu: Tujuh Bahasa dalam Tujuh Minggu: Panduan Pragmatis untuk Belajar Bahasa Pemrograman
Dalam buku itu, ia meliput Clojure, Haskell, Io, Prolog, Scala, Erlang, dan Ruby.
sumber
Merkuri : http://www.mercury.csse.unimelb.edu.au/
Ini adalah Prolog yang diketik, dengan jenis dan mode keunikan (yaitu menentukan predikat itu
append(X,Y,Z)
makna X ditambahkan ke Y adalah Z menghasilkan satu Z yang diberi X dan Y, tetapi dapat menghasilkan beberapa X / Y untuk Z yang diberikan). Juga, tidak ada cut atau predikat ekstra-logis lainnya.Jika Anda mau, itu ke Prolog karena Haskell adalah untuk Lisp.
sumber
Sistem database pertama adalah dBaseIII untuk saya, saya menghabiskan sekitar satu bulan untuk menulis contoh kecil (dBase / FoxPro / Clipper adalah db berbasis tabel dengan indeks). Kemudian, di tempat kerja pertama saya, saya bertemu MUMPS, dan saya sakit kepala. Saya masih muda dan berotak segar, tetapi butuh 2 minggu untuk memahami model database MUMPS. Ada momen, seperti di komik: setelah 2 minggu, sebuah tombol telah dihidupkan, dan bola lampu baru saja menyala di pikiran saya. MUMPS alami, level rendah, dan sangat-sangat cepat. (Ini btree tidak seimbang, tidak diformalkan tanpa jenis.) Tren hari ini menunjukkan jalan kembali ke sana: NoSQL, db nilai kunci, db multidimensi - jadi hanya ada beberapa langkah yang tersisa, dan kami mencapai gondongan.
Berikut adalah presentasi tentang keuntungan MUMPS: http://www.slideshare.net/george.james/mumps-the-internet-scale-database-presentation
Dokumen pendek tentang hierarki db: http://www.cs.pitt.edu/~chang/156/14hier.html
Pengantar MUMPS global (dalam MUMPS, variabel lokal, pendek: lokal adalah variabel memori, dan variabel global, pendek: global adalah "variabel db", pengaturan variabel global langsung menuju ke disk): http: // gradvs1.mgateway.com/download/extreme1.pdf (PDF)
sumber
Katakanlah Anda ingin menulis puisi cinta ...
Alih-alih menggunakan palu hanya karena sudah ada di tangan Anda, pelajari alat yang tepat untuk tugas ini: belajar berbicara bahasa Prancis.
Setelah Anda mencapai tingkat berbicara yang hampir asli, Anda siap untuk memulai puisi Anda.
sumber
Meskipun mempelajari bahasa baru di tingkat akademis adalah hobi yang menarik, IMHO Anda tidak bisa benar-benar belajar menggunakannya sampai Anda mencoba menerapkannya pada masalah dunia nyata. Jadi, alih-alih mencari bahasa baru untuk dipelajari, saya akan menggantikan Anda terlebih dahulu mencari hal-hal baru untuk dibangun, dan hanya kemudian saya akan mencari bahasa yang tepat untuk digunakan untuk satu proyek tertentu. Pertama-tama pilih masalahnya, lalu alatnya, bukan sebaliknya ..
sumber
Bagi siapa pun yang belum ada sejak pertengahan 80-an, saya sarankan belajar BASIC 8-bit. Tingkatnya sangat rendah, sangat primitif dan merupakan latihan yang menarik untuk diprogram di sekitar lubangnya.
Pada baris yang sama, saya akan memilih kalkulator seri HP-41C (atau emulator, meskipun tidak ada yang mengalahkan perangkat keras nyata). Sulit untuk membungkus otak Anda di sekitarnya, tetapi sangat berharga. TI-57 akan melakukannya, tetapi akan menjadi pengalaman yang sama sekali berbeda. Jika Anda berhasil menyelesaikan persamaan derajat kedua pada TI-55, Anda akan dianggap sebagai master (tidak memiliki persyaratan dan tidak ada cabang kecuali RST, yang melompati program kembali ke langkah 0).
Dan terakhir, saya akan memilih FORTH (disebutkan sebelumnya). Ini memiliki hal Lisp-ish "bangun bahasa" yang bagus, tetapi jauh lebih sederhana. Ini akan mengajarkan Anda mengapa Rails menarik dan ketika DSL masuk akal dan Anda akan melihat sekilas apa yang dipikirkan kalkulator non-RPN saat Anda mengetik.
sumber
Nota bene. Ini adalah bahasa yang agak menarik karena berbasis tumpukan, dan cukup praktis setelah Anda ingin meletakkan sesuatu di atas kertas dan Anda ingin menyelesaikannya atau memecahkan masalah mengapa itu tidak dilakukan.
Erlang. Paralelisme intrinsik memberikannya perasaan yang agak tidak biasa dan Anda dapat lagi belajar hal-hal yang bermanfaat dari itu. Saya tidak begitu yakin tentang kepraktisan, tetapi dapat berguna untuk beberapa tugas prototyping cepat dan sistem yang sangat berlebihan.
Coba pemrograman GPU - CUDA atau OpenCL. Ini hanya ekstensi C / C ++, tetapi model mental dari arsitektur sekali lagi sangat berbeda dari pendekatan klasik, dan itu pasti menjadi praktis setelah Anda perlu menyelesaikan bilangan real angka.
sumber
Erlang, Keempat dan beberapa pekerjaan tertanam dengan bahasa assembly. Betulkah; membeli kit Arduino atau yang serupa, dan membuat bip polifonik di perakitan. Anda akan benar-benar mempelajari sesuatu.
sumber
Ada juga anic :
https://code.google.com/p/anic/
Dari situsnya:
Tampaknya tidak sedang dalam pengembangan aktif lagi, tetapi tampaknya memiliki beberapa konsep yang menarik (dan, setelah semua, adalah apa yang Anda cari).
sumber
Meskipun tidak memenuhi persyaratan Anda "berbeda" - Saya bertaruh Fantom itu adalah bahasa yang harus dilihat oleh programmer profesional. Menurut pengakuan mereka sendiri, penulis fantom menyebutnya sebagai bahasa yang membosankan. Ini hanya menopang kasus penggunaan paling umum Jawa dan C #, dengan beberapa sintaks penutupan pinjaman dari ruby dan bahasa-bahasa baru yang serupa.
Namun ia berhasil memiliki compiler bootstrapped sendiri, menyediakan platform yang memiliki drop in install tanpa dependensi eksternal, mendapatkan paket yang benar - dan berfungsi di Java, C # dan sekarang Web (via js).
Ini mungkin tidak memperluas wawasan Anda dalam hal cara pemrograman baru, tetapi tentu saja akan menunjukkan kepada Anda cara pemrograman yang lebih baik.
sumber
Satu hal yang saya lihat hilang dari jawaban lain: bahasa berdasarkan penulisan ulang istilah.
Anda dapat melihat Pure - http://code.google.com/p/pure-lang/ .
Mathematica juga berbasis penulisan ulang, meskipun tidak mudah untuk mengetahui apa yang terjadi, karena agak tertutup.
sumber
APL, Forth and Assembly.
Selamat bersenang-senang. Ambil kit robot Lego Mindstorm dan RobotC CMU dan tulis beberapa kode robotika. Hal-hal terjadi ketika Anda menulis kode yang harus "menjadi kotor" dan berinteraksi dengan dunia nyata yang tidak mungkin Anda pelajari dengan cara lain. Ya, bahasa yang sama, tetapi perspektif yang sangat berbeda.
sumber