Saat ini saya terutama seorang programmer D dan sedang mencari untuk menambahkan bahasa lain ke kotak peralatan saya, lebih disukai yang mendukung peretasan metaprogramming yang tidak dapat dilakukan dalam bahasa yang dikompilasi secara statis seperti D.
Saya telah membaca sedikit tentang Lisp dan saya ingin menemukan bahasa yang memungkinkan beberapa hal keren yang dilakukan Lisp, tetapi tanpa sintaks yang aneh, dll. Dari Lisp. Saya tidak ingin memulai perang api bahasa, dan saya yakin Ruby dan Python memiliki kompromi, jadi saya akan membuat daftar apa yang penting bagi saya secara pribadi. Tolong beri tahu saya apakah Ruby, Python, atau bahasa lain adalah yang terbaik untuk saya.
Penting:
- Metaprogramming yang bagus. Kemampuan untuk membuat kelas, metode, fungsi, dll. Pada waktu proses. Lebih disukai, perbedaan minimal antara kode dan data, gaya Lisp.
- Sintaks yang bagus, bersih, waras, dan semantik yang konsisten dan intuitif. Pada dasarnya bahasa modern yang dipikirkan dengan matang, menyenangkan untuk digunakan.
- Banyak paradigma. Tidak ada satu paradigma yang tepat untuk setiap proyek, atau bahkan setiap subproblem kecil dalam sebuah proyek.
- Bahasa menarik yang benar-benar memengaruhi cara berpikir seseorang tentang pemrograman.
Agak penting:
- Performa. Alangkah baiknya jika kinerjanya bagus, tetapi ketika kinerja adalah prioritas nyata, saya akan menggunakan D.
- Didokumentasikan dengan baik.
Tidak penting:
- Ukuran komunitas, ketersediaan perpustakaan, dll. Tidak satu pun dari ini yang merupakan karakteristik bahasa itu sendiri, dan semuanya dapat berubah dengan sangat cepat.
- Ketersediaan pekerjaan. Saya bukan programmer profesional penuh waktu. Saya seorang mahasiswa pascasarjana dan pemrograman sangat relevan dengan penelitian saya.
- Fitur apa pun yang pada dasarnya dirancang dengan proyek sangat besar yang dikerjakan oleh jutaan kera kode.
python
ruby
lisp
metaprogramming
dsimcha
sumber
sumber
Jawaban:
Sebenarnya tidak ada perbedaan besar antara python dan ruby setidaknya di tingkat ideologis. Untuk sebagian besar, mereka hanya memiliki rasa yang berbeda dari hal yang sama. Jadi, saya akan merekomendasikan untuk melihat mana yang lebih cocok dengan gaya pemrograman Anda.
sumber
Bukankah kita semua.
Sayangnya, perbedaan minimal antara kode dan data serta sintaks "aneh" adalah konsekuensi satu sama lain.
Jika Anda ingin sintaks yang mudah dibaca, Anda memiliki Python. Namun, kode tidak direpresentasikan dalam salah satu struktur data bawaan yang umum digunakan. Gagal — seperti kebanyakan bahasa — di item # 1 dari daftar 'penting' Anda. Itu membuatnya sulit untuk memberikan bantuan yang berguna.
Anda tidak bisa memiliki semuanya. Ingat, Anda bukanlah orang pertama yang memiliki pikiran ini. Jika sesuatu seperti bahasa ideal Anda ada, kami semua akan menggunakannya. Karena dunia nyata tidak memenuhi cita-cita Anda, Anda harus memprioritaskan kembali daftar keinginan Anda. Bagian "penting" harus diatur ulang untuk mengidentifikasi apa yang benar - benar penting bagi Anda.
sumber
Sejujurnya, sejauh fasilitas metaprogramming berjalan, Ruby dan Python jauh lebih mirip daripada yang diakui oleh beberapa penganutnya. Ulasan kedua bahasa ini menawarkan perbandingan / ulasan yang cukup bagus:
Jadi, pilih saja satu berdasarkan beberapa kriteria. Mungkin Anda menyukai Rails dan ingin mempelajari kode itu. Mungkin SciPy adalah kesukaan Anda. Lihatlah ekosistem perpustakaan, komunitas, dll, dan pilih salah satu. Anda pasti tidak akan kehilangan beberapa metaprogramming nirwana berdasarkan pilihan Anda juga.
sumber
Penafian: Saya hanya mencoba-coba dalam salah satu bahasa, tetapi saya setidaknya memiliki program kerja kecil (tidak hanya skrip cepat, yang saya gunakan Perl, bash atau GNU make) di keduanya.
Ruby bisa sangat bagus untuk "multi paradigma" poin 3, karena Ruby bekerja keras untuk memudahkan pembuatan bahasa khusus domain. Misalnya, telusuri online dan lihat beberapa bit kode Ruby on Rails, dan beberapa bit kode Rake. Keduanya adalah Ruby, dan Anda dapat melihat kesamaannya, tetapi keduanya tidak terlihat seperti yang biasanya Anda anggap sebagai bahasa yang sama.
Bagi saya Python sedikit lebih dapat diprediksi (mungkin berkorelasi dengan poin 'bersih' dan 'waras' 2), tetapi saya tidak begitu tahu apakah itu karena bahasanya itu sendiri atau hanya itu biasanya digunakan oleh orang-orang dengan nilai yang berbeda . Saya belum pernah mencoba sihir mendalam dengan Python. Saya pasti akan mengatakan bahwa kedua bahasa dipikirkan dengan baik.
Keduanya mendapat skor baik dalam 1 dan 4. [Sunting: sebenarnya 1 cukup diperdebatkan - ada "eval" di keduanya, seperti yang umum dalam bahasa yang ditafsirkan, tetapi mereka hampir tidak murni secara konseptual. Anda dapat mendefinisikan closure, menetapkan metode ke objek, dan lainnya. Tidak yakin apakah ini berjalan sejauh yang Anda inginkan.]
Secara pribadi saya menganggap Ruby lebih menyenangkan, tetapi sebagian karena lebih mudah untuk mengalihkan pikiran tentang cara-cara keren untuk melakukan sesuatu. Saya sebenarnya lebih sering menggunakan Python. Terkadang Anda tidak ingin keren, Anda ingin melanjutkannya sehingga selesai sebelum tidur ...
Tak satu pun dari mereka sulit untuk dikerjakan, jadi Anda bisa memutuskan untuk melakukan tugas kecil Anda berikutnya di satu, dan satu setelah itu di yang lain. Atau ambil buku pengantar tentang masing-masing dari perpustakaan, baca sepintas keduanya dan lihat apa yang menarik bagi Anda.
sumber
Pernahkah Anda mempertimbangkan Smalltalk? Ini menawarkan sintaks yang sangat sederhana, jelas dan dapat diperluas dengan kemampuan reflektifitas dan introspeksi dan lingkungan pengembangan terintegrasi penuh yang memanfaatkan kemampuan tersebut. Lihatlah beberapa pekerjaan yang dilakukan di Squeak Smalltalk misalnya. Banyak peneliti yang menggunakan Squeak nongkrong di milis Squeak dan #squeak di freenode, jadi Anda bisa mendapatkan bantuan tentang masalah yang kompleks dengan sangat mudah.
Indikator lain dari relevansinya saat ini: ia berjalan pada platform apa pun yang ingin Anda beri nama (termasuk iPhone ); Gilad Bracha mendasarkan karyanya dalam bahasa Newspeak pada Squeak; tim V8 bekerja keras pada VM Smalltalk ; dan Dan Ingalls serta Randal Schwartz baru-baru ini kembali ke pekerjaan Smalltalk setelah bertahun-tahun di alam liar.
Semoga berhasil dengan pencarian Anda - beri tahu kami keputusan Anda pada akhirnya.
sumber
Lisp memenuhi semua kriteria Anda, termasuk kinerja, dan ini adalah satu-satunya bahasa yang tidak memiliki sintaks (aneh). Jika Anda menghindarinya atas dasar informasi yang sangat tidak benar / salah kepala dan akibatnya melewatkan pengalaman menggunakan misalnya Emacs + SLIME + CL, Anda akan melakukan tindakan merugikan yang besar bagi diri Anda sendiri.
sumber
4 poin "penting" Anda mengarah ke Ruby dengan tepat, sedangkan 2 poin "agak penting" diatur oleh Python. Jadilah itu.
sumber
Anda sedang mendeskripsikan Ruby.
Sangat mudah untuk memperluas dan memodifikasi primitif yang ada saat runtime. Di ruby semuanya adalah objek, string, integer, bahkan fungsi.
Anda juga dapat membuat pintasan untuk gula sintaksis, misalnya dengan class_eval .
Ruby mengikuti prinsip tidak terlalu mengejutkan , dan ketika membandingkan kode Ruby vs kode yang setara dalam bahasa lain, banyak orang menganggapnya lebih "indah".
Anda dapat mengikuti imperatif, berorientasi objek, fungsional, dan reflektif.
Itu sangat subyektif, tetapi dari sudut pandang saya kemampuan untuk menggunakan banyak paradigma pada saat yang sama memungkinkan munculnya ide-ide yang sangat menarik.
Saya sudah mencoba Python dan itu tidak sesuai dengan poin penting Anda.
sumber
lambda
/Proc.new
mess telah disebut "perilaku mengejutkan" dan "sangat berlawanan dengan intuisi" di SO. :-) Bahasa apapun sebesar dan serumit Ruby pasti memiliki area yang membingungkan.String
di Ruby untuk tujuan metaprogramming: coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/… . Subclassing tidak akan berhasil; namun, fungsi dua argumen sederhana akan.Bandingkan contoh kode yang melakukan hal yang sama (gabung dengan deskripsi item tidak kosong baris baru dari
myList
daftar) dalam berbagai bahasa (bahasa disusun dalam urutan abjad terbalik):Ruby :
myList.collect { |f| f.description }.select { |d| d != "" }.join("\n")
Atau
myList.map(&:description).reject(&:empty?).join("\n")
Python :
descriptions = (f.description() for f in mylist) "\n".join(filter(len, descriptions))
Atau
"\n".join(f.description() for f in mylist if f.description())
Perl :
join "\n", grep { $_ } map { $_->description } @myList;
Atau
join "\n", grep /./, map { $_->description } @myList;
Javascript :
myList.map(function(e) e.description()) .filter(function(e) e).join("\n")
Io :
myList collect(description) select(!="") join("\n")
Berikut panduan Io .
sumber
Ruby akan lebih baik daripada Lisp dalam hal menjadi "mainstream" (apa pun yang benar-benar berarti, tapi salah satu perhatian realistis adalah bagaimana mudahnya akan menemukan jawaban atas pertanyaan Anda pada pemrograman Lisp jika Anda pergi dengan itu.) Dalam hal apapun , Menurut saya Ruby sangat mudah diambil. Dalam jumlah waktu yang sama yang saya habiskan untuk pertama kali belajar Python (atau bahasa lain dalam hal ini), saya segera menulis kode yang lebih baik dengan jauh lebih efisien daripada yang pernah saya miliki sebelumnya. Itu hanya pendapat satu orang; ambillah dengan sebutir garam, kurasa. Saya tahu lebih banyak tentang Ruby pada saat ini daripada yang saya lakukan Python atau Lisp, tetapi Anda harus tahu bahwa saya adalah orang Python cukup lama sebelum saya beralih.
Lisp jelas cukup keren dan layak untuk dilihat; seperti yang Anda katakan, ukuran komunitas, dll. dapat berubah cukup cepat. Meski begitu, ukuran itu sendiri tidak sepenting kualitas komunitas. Misalnya,
#ruby-lang
saluran tersebut masih diisi oleh beberapa orang yang sangat pintar. Lisp tampaknya juga menarik beberapa orang yang sangat pintar. Saya tidak dapat berbicara banyak tentang komunitas Python karena saya tidak memiliki banyak pengalaman langsung, tetapi terkadang tampaknya "terlalu besar". (Saya ingat orang-orang bersikap cukup kasar pada saluran IRC mereka, dan dari apa yang saya dengar dari teman-teman yang benar-benar menyukai Python, itu tampaknya menjadi aturan daripada pengecualian.)Bagaimanapun, beberapa sumber daya yang mungkin berguna bagi Anda adalah:
1) Seri Pemrograman Ruby Pragmatic Programmer Ruby ( http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming ) - tidak gratis, tetapi episode-episode selanjutnya cukup menarik. (Kode ini gratis, jika Anda ingin mengunduhnya dan melihat apa yang akan Anda pelajari.)
2) Tentang Lisp oleh Paul Graham ( http://www.paulgraham.com/onlisp.html ). Ini agak tua, tapi ini klasik (dan dapat diunduh secara gratis).
sumber
Saya menggunakan Python untuk banyak proyek dan menurut saya Python menyediakan semua fitur yang Anda minta.
penting:
Agak penting:
Sebagai mahasiswa pascasarjana, Anda mungkin ingin membaca makalah ini yang mengklaim bahwa Python adalah semua yang dibutuhkan ilmuwan . Sayangnya saya tidak bisa membandingkan Python dengan Ruby, karena saya tidak pernah menggunakan bahasa itu.
Salam, Dennis
sumber
@Jason I masing-masing tidak setuju. Ada perbedaan yang membuat Ruby lebih unggul dari Python untuk metaprogramming - filosofis dan pragmatis. Sebagai permulaan, Ruby mendapatkan hak warisan dengan Single Inheritance dan Mixins . Dan ketika datang ke metaprogramming Anda hanya perlu memahami bahwa itu semua tentang diri . Perbedaan kanonik di sini adalah bahwa di Ruby Anda memiliki akses ke objek diri saat runtime - dengan Python Anda tidak memilikinya!
Tidak seperti Python, di Ruby tidak ada fase kompilasi atau runtime yang terpisah. Di Ruby, setiap baris kode dieksekusi terhadap objek diri tertentu . Di Ruby, setiap kelas mewarisi dari objek dan metaclass tersembunyi. Ini menghasilkan beberapa dinamika yang menarik:
class Ninja def rank puts "Orange Clan" end self.name #=> "Ninja" end
Menggunakan self.name mengakses metode nama metaclass kelas Ninja untuk mengembalikan nama kelas Ninja. Apakah bunga metaprogramming begitu indah dengan Python? Saya sangat meragukannya!
sumber
Nah, jika Anda tidak menyukai sintaks cadel, mungkin assembler adalah cara yang tepat. :-)
Ini pasti memiliki perbedaan minimal antara kode dan data, multi-paradigma (atau mungkin itu bukan-paradigma) dan itu adalah pengalaman yang memperluas pikiran (jika membosankan) baik dalam hal pembelajaran dan trik yang dapat Anda lakukan.
sumber
Io memenuhi semua poin "Penting" Anda. Saya tidak berpikir ada bahasa yang lebih baik di luar sana untuk melakukan peretasan meta gila.
sumber
Lisp dapat dikompilasi.
sumber
Apakah Anda mencoba Rebol?
sumber
Jawaban saya bukanlah keduanya. Saya tahu kedua bahasa tersebut, mengambil kelas di Ruby dan telah memprogram dengan python selama beberapa tahun. Lisp pandai metaprogramming karena fakta bahwa satu-satunya tujuan adalah untuk mengubah daftar, kode sumbernya sendiri hanyalah daftar token sehingga metaprogramming itu alami. Tiga bahasa yang paling saya suka untuk jenis hal ini adalah Rebol, Forth, dan Factor. Rebol adalah bahasa dialek yang sangat kuat yang mengambil kode dari aliran inputnya, menjalankan ekspresi terhadapnya dan mengubahnya menggunakan aturan yang ditulis dalam bahasa tersebut. Sangat ekspresif dan sangat pandai dalam bahasa. Factor dan Forth kurang lebih sepenuhnya terpisah dari sintaksis dan Anda memprogramnya dengan mendefinisikan dan memanggil kata-kata. Mereka umumnya kebanyakan ditulis dalam bahasa mereka sendiri. Anda tidak menulis lamaran dalam pengertian tradisional, Anda memperluas bahasa dengan menulis kata-kata Anda sendiri untuk mendefinisikan aplikasi khusus Anda. Factor bisa sangat bagus karena memiliki banyak fitur yang hanya saya lihat di smalltalk untuk mengevaluasi dan bekerja dengan kode sumber. Ruang kerja yang sangat bagus, dokumen interaktif, dll.
sumber
Tidak banyak yang memisahkan Python dan Ruby. Menurut saya komunitas Python lebih besar dan lebih dewasa daripada komunitas Ruby, dan itu sangat penting bagi saya. Ruby adalah bahasa yang lebih fleksibel, yang berdampak positif dan negatif. Namun, saya yakin akan ada banyak orang yang membahas kedua bahasa ini secara mendetail, jadi saya akan memberikan opsi ketiga ke dalam ring. Bagaimana dengan JavaScript?
JavaScript pada awalnya dirancang untuk menjadi Skema untuk web, dan berbasis prototipe, yang merupakan keunggulan dari Python dan Ruby dalam hal multi-paradigma dan metaprogramming. Sintaksnya tidak sebaik dua lainnya, tetapi ini mungkin bahasa yang paling banyak digunakan, dan kinerjanya semakin baik setiap hari.
sumber
Jika Anda menyukai konsep kode-is-data gaya cadel, tetapi tidak menyukai sintaksis Lispy, mungkin Prolog akan menjadi pilihan yang baik.
Apakah itu memenuhi syarat sebagai "menyenangkan untuk digunakan, bahasa modern", saya akan menyerahkan kepada orang lain untuk menilai. ;-)
sumber
Ruby adalah pilihan saya setelah menjelajahi Python, Smalltalk, dan Ruby.
sumber
Bagaimana dengan OCaml?
Fitur OCaml: sistem tipe statis, inferensi tipe, polimorfisme parametrik, rekursi ekor, pencocokan pola, penutupan leksikal kelas satu, functor (modul parametrik), penanganan pengecualian, dan pengumpulan sampah otomatis generasi inkremental.
Saya pikir itu memenuhi yang berikut:
sumber
Saya telah menggunakan Python sedikit sekali, tetapi lebih banyak Ruby. Namun saya berpendapat mereka berdua memberikan apa yang Anda minta.
Jika saya melihat keempat poin Anda, maka Anda setidaknya dapat memeriksa: http://www.iolanguage.com/
Dan Mozart / Oz mungkin menarik juga untuk Anda: http://mozart.github.io/
Salam Friedrich
sumber
Untuk sintaks gaya python dan makro mirip cadel (makro yang merupakan kode nyata) dan DSL yang baik, lihat konvergen .
sumber
Saya tidak yakin bahwa Python akan memenuhi semua hal yang Anda inginkan (terutama poin tentang perbedaan minimal antara kode dan data), tetapi ada satu argumen yang mendukung python. Ada sebuah proyek di luar sana yang memudahkan Anda memprogram ekstensi untuk python di D, sehingga Anda bisa mendapatkan yang terbaik dari kedua dunia tersebut. http://pyd.dsource.org/celerid.html
sumber
Jika Anda menyukai mawar, Anda harus belajar hidup dengan duri :)
sumber
Saya akan merekomendasikan Anda menggunakan Ruby.
Ketika saya pertama kali mempelajarinya, saya merasa sangat mudah untuk memahaminya.
sumber
Jangan mencampurkan Bahasa Pemrograman Ruby dengan Implementasi Ruby, karena berpikir bahwa utas POSIX tidak dimungkinkan di ruby.
Anda dapat dengan mudah mengkompilasi dengan dukungan pthread, dan ini sudah mungkin pada saat utas ini dibuat , jika Anda mengampuni permainan kata-kata tersebut.
Jawaban atas pertanyaan ini sederhana. Jika Anda suka cadel, Anda mungkin lebih suka ruby. Atau, apapun yang Anda suka.
sumber
Saya menyarankan agar Anda mencoba kedua bahasa dan memilih salah satu yang menarik bagi Anda. Python dan Ruby dapat melakukan apa yang Anda inginkan.
Baca juga utas ini .
sumber
Gunakan JS, cukup periksa AJS (Sintaks JavaScript Alternatif) di github saya http://github.com/visionmedia, ini akan memberi Anda beberapa penutupan yang tampak lebih bersih dll: D
sumber
Mengenai poin utama Anda (meta-pemrograman): Groovy versi 1.6 memiliki pemrograman AST (Abstract Syntax Tree) bawaan sebagai fitur standar dan terintegrasi. Ruby memiliki RubyParser, tetapi ini adalah add-on.
sumber