Apa bahasa pemrograman yang paling ortogonal? [Tutup]

46

Saya menemukan diri saya berulang kali kesal dengan harus mengajar mahasiswa baru tentang aturan bahasa khusus (seperti peluruhan array-to-pointer) yang sama sekali tidak ada hubungannya dengan pemrograman itu sendiri. Jadi saya bertanya-tanya:

Apa bahasa pemrograman dengan jumlah terkecil dari aturan bahasa khusus, di mana semuanya kelas satu dan dapat disusun tanpa batasan teknis yang mengganggu? Bukankah bahasa seperti itu akan menjadi bahasa pengajaran yang sempurna?

Catatan Moderator

Kami mencari jawaban panjang yang memberikan penjelasan dan konteks. Jangan hanya daftar bahasa: tolong jelaskan mengapa menurut Anda bahasa menjawab pertanyaan. Jawaban yang tidak menjelaskan apa pun akan dihapus. Lihat Subjektif Bagus, Subjektif Buruk untuk informasi lebih lanjut.

fredoverflow
sumber
1
Coba gunakan Unlambda - ada hampir sekecil mungkin blok bangunan bahasa. Jawaban yang sedikit lebih serius: Skema (R5RS khusus).
SK-logic
@ SK-logika, Unlambda bukan ortogonal karena I=SKK. Yang paling utama dalam bahasa ortogonal adalah bahasa instruksi tunggal seperti Jot dan RSSB.
Peter Taylor
11
@ Peter - Saya tidak berpikir dia benar-benar berarti minimal. Bahasa minimal hanya berakhir dengan semua definisi tambahan di perpustakaan, sehingga siswa harus mempelajarinya. Cara saya membaca pertanyaan ini adalah "bahasa apa yang paling baik mengikuti prinsip paling tidak mengejutkan?".
Steve314
1
@ Peter Taylor: dapatkah Anda memberikan contoh di mana Timtowtdi bertentangan dengan ortogonalitas?
keppla
1
Saya pikir "orthogonality" adalah pilihan kata yang buruk di sini. Seperti yang telah ditetapkan Peter dan Steve, yang Anda maksud sebenarnya adalah "prinsip kejutan paling tidak", atau kualitas yang berkaitan erat.
Konrad Rudolph

Jawaban:

53

Ketika datang ke 'sangat sedikit aturan', saya berpendapat, Lisp atau Smalltalk akan menang. Sintaksisnya dapat ditulis pada satu tab bir.

Tetapi dalam pengalaman saya, kesederhanaan Lisp dan Smalltalk tidak berarti mereka mudah dimengerti dan mudah untuk diajar. Meskipun bukan cara yang 'murni', dalam pengalaman saya, gaya bahasa yang harus dikerjakan adalah yang paling mudah dipahami oleh pemula.

Oleh karena itu, saya akan menyarankan Python, Ruby atau sesuatu yang mirip abstraksi : Anda menemukan (hampir) setiap konsep dasar di dalamnya (OK, tidak ada petunjuk), tetapi Anda tidak perlu memahaminya dari awal untuk membuat sesuatu berfungsi.

keppla
sumber
33
pekerjaan yang mengesankan mengukur sintaks dalam satuan tab bir.
psr
3
Dan jangan lupa Perl. Lebih banyak Perl di luar sana daripada yang dipikirkan kebanyakan orang, dan komunitas pengguna sangat besar .
Randal Schwartz
20
Perl mungkin sangat kuat, tetapi seorang pria yang menemukannya sebagai jalan termudah untuk pemrograman harus memiliki yang setara dengan terowongan kuil Indiana Jones sebagai koridor utama dari kamar tidurnya ke kamar
mandinya
9
Sintaks Perl dapat ditampung di tab bir, asalkan Anda minum bir yang cukup.
Dave Sherohman
4
@ Randal, pertanyaannya meminta bahasa orthogonal . Filosofi Perl adalah menjadi non-ortogonal - "ada lebih dari satu cara untuk melakukannya".
Peter Taylor
41

Saya akan mengatakan LISP, atau Skema atau bahasa dari keluarga itu akan menjadi yang paling ortogonal. Dengan let, lambda, define, if, cons, list, dan ( )Anda bisa mengajarkan cukup banyak apa pun yang Anda ingin dalam kursus intro. Juga tidak perlu arahan preprocessing atau int main()dan hal-hal seperti itu yang hanya dimasukkan siswa tetapi tidak melihat alasannya.

Dalam kursus CS intro saya, kami melakukan banyak hal yang sangat keren dengan Skema: menerapkan mesin Turing, menerapkan komputer TC-201, menulis tata bahasa bebas konteks, menggunakan rekursi, menulis penggabungan dan penyisipan, penerapan adders, dan berton-ton hal-hal lain.

Saya telah melakukan Java di AP comp sci sebelum kuliah, tetapi Skema hebat karena saya dapat memotong kekacauan dan fokus pada konsep aktual dalam program saya. Itu kelas yang hebat dan saya sangat menyarankan Anda mencobanya untuk pengajaran Anda.

Selikuran
sumber
5
Setuju. Racket (sebelumnya PLT Scheme) adalah varian Skema yang sedikit lebih ramah yang digunakan sekolah kami dengan sangat sukses di kelas pengantar.
NickAldwin
3
Bagaimana dengan Haskell? Saya tidak tahu banyak tentang Haskell, tetapi saya berharap itu menjadi bahasa ortogonal.
Giorgio
4
@Iorgio: Sintaks Haskell cukup rumit, meskipun hanya sebagian yang bisa saya tebak. Kenyataan bahwa Anda harus berinteraksi dengan IO monads dari awal untuk mendapatkan program yang menarik adalah hal yang sedikit mengesalkan mengingat tujuan OP.
Matthieu M.
4
Untuk "orthogonal," saya memilih Skema, khususnya implementasi Racket . Lingkungan raket dirancang untuk membuat jalur pelajar lebih mudah daripada sesuatu seperti Common Lisp. Bahasanya bersih, dengan sedikit aturan, memang. Dahulu, MIT memutuskan untuk menggunakan Skema untuk mengajar siswa baru, menggunakan buku, SICP . Para siswa yang selamat tampaknya memiliki kinerja yang cukup baik di pasar. Namun, pendekatan ini tidak akan secara langsung mengajarkan siswa bagaimana menulis kode kelas komersial dalam bahasa yang paling umum digunakan.
John Tobler
2
Iya! Fakta bahwa Skema secara radikal berbeda dari kebanyakan bahasa "nyata" memungkinkan Anda fokus pada pemrograman dan bukan pada API. Skema Belajar adalah seperti " wax on, wax off " dari coding; Sepertinya buang-buang waktu sampai Anda menyadari Anda memiliki pemahaman yang lebih dalam tentang komputer daripada sebelumnya.
benzado
17

Pascal dirancang khusus untuk mengajarkan pemrograman. Mudah dipelajari (itu adalah salah satu bahasa pemrograman pertama yang saya pelajari).

Henrik
sumber
3
Saya juga belajar memprogram menggunakan Pascal dan saya menemukan itu adalah bahasa yang sangat bersih. Satu-satunya fitur non ortogonal yang dapat saya pikirkan adalah sintaks prosedur writeln () dan readln (), yang memiliki sejumlah variabel argumen dan memungkinkan untuk menentukan pemformatan.
Giorgio
Saya merasa bahasa ini sangat mengecewakan. Tapi saya mungkin memproyeksikan, karena saya memiliki instruktur yang sangat, sangat buruk.
greyfade
14

Logo: masih hidup dan menendang !

; draws a triangle
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120

Ini mungkin tampak lebih seperti mainan daripada bahasa pemrograman, tetapi itu bukan langkah pertama yang buruk bagi banyak orang. Sintaksnya sangat sederhana, tetapi kura-kura memberikan bentuk umpan balik yang lebih konkret daripada kebanyakan bahasa / lingkungan. Mencoba membuat bentuk tertentu adalah cara yang bagus untuk mempelajari proses berpikir ke depan untuk menyelesaikan masalah.

Jika Anda tidak menyukai kura-kura, saya pikir Skema adalah jalan yang harus ditempuh.

benzado
sumber
1
Percaya atau tidak, Logo adalah Lisp, seperti Skema. Sebagian besar pengguna tidak mendapatkan cukup jauh dari perulangan sederhana & grafik penyu untuk mempelajari ini.
Sean McSomething
@SeanMcSomething Itu menarik, mengingat fokus pada efek samping (menggerakkan penyu) daripada evaluasi ekspresi.
benzado
10

Saya akan mengusulkan SML dan Haskell. Orthogonality telah menjadi titik desain utama bagi keduanya. Secara khusus, inti dari SML (yaitu, bagian dari bahasa yang tidak berkaitan dengan modularitas) cukup banyak merupakan kalkulus lambda yang diketik. Akibatnya, sebagian besar fitur bahasa didorong oleh jenis dan jenis pada gilirannya mendorong formulir pengantar dan penghapusan untuk nilai-nilai. Ini cukup ideal.

Ada beberapa kutil non-type-theoretic dalam kedua bahasa (eqtypes di SML, seq di Haskell) tetapi mereka masih mengalahkan hal-hal lain di luar sana dalam hal interaksi aneh fitur bahasa yang tidak terkait.

Lambdageek
sumber
7

Apa pun pilihannya, saya akan sangat mendesak mengajarkan bahasa "nyata" . Mengajar bahasa mainan bekerja untuk sebagian orang, tetapi bagi yang lain itu sangat, sangat menyebalkan karena terputusnya hubungan dengan dunia nyata. Beberapa orang memerlukan relevansi dunia nyata sebagai motivasi untuk belajar, dan itu bukan tempat kami untuk menilai strategi pembelajaran ini (pada kenyataannya, itu adalah kesalahpahaman umum).

Ini mendiskualifikasi bahasa seperti Logo, tetapi juga bahasa khusus domain seperti Pemrosesan . Sementara yang terakhir ini sangat berguna untuk hal-hal tertentu (misalnya menghasilkan grafik info), penggunaannya terlalu terbatas untuk sebagian besar penggunaan (dan dengan demikian sebagian besar pengguna). Ini juga mengecualikan Gofer , subset Haskell yang tidak berguna. Ini juga mengecualikan Pascal karena meskipun yang terakhir telah digunakan dalam proyek nyata, itu tidak relevan lagi dan hanya tidak memiliki fitur-fitur penting (misalnya string bawaan).

Dari bahasa praktis, saya setuju dengan yang sudah disebutkan: dialek Lisp atau Skema modern, Haskell, Python atau Ruby. Secara pribadi, saya mungkin menggunakan Python tetapi semua pilihan itu memiliki kelebihan dan kekurangan.

Konrad Rudolph
sumber
2
Adalah keliru untuk mengklaim bahwa mengajar bahasa "nyata" adalah cara untuk memberikan relevansi dunia nyata. Adalah tugas guru untuk menunjukkan bagaimana bahasa "mainan" berhubungan dengan keterampilan dunia nyata. Belajar juggle dengan memulai dengan pisau tidak berarti Anda mempelajari keterampilan juggling yang lebih relevan.
benzado
3
@ Benzado Anda salah paham maksud saya. Jika Anda belajar bahasa mainan, Anda harus mentransfer keterampilan Anda agar relevan dengan masalah dunia nyata. Inti saya adalah bahwa transfer ini adalah tipuan tambahan yang aktif mencegah beberapa orang dari pembelajaran . Orang yang berbeda belajar dengan cara yang sangat berbeda, dan beberapa orang sangat membutuhkan kedekatan ini. Belajar juggle dengan pisau bukanlah hal yang sama. Analogi sebenarnya adalah dengan belajar memprogram dengan menulis sistem pemandu rudal hidup sebagai proyek pertama, dan saya tidak pernah menyarankan itu.
Konrad Rudolph
3
Saya mengerti maksud Anda. Kami hanya tidak setuju. Saya pikir transfer itu penting, itu mensyaratkan bahwa siswa memiliki pemahaman yang lebih dalam daripada yang memiliki strategi menebak yang sukses (misalnya, orang yang "memecahkan" masalah kata dengan memilih angka dan memasukkannya ke dalam formula di awal bab ini. ). Dengan kata lain, jika mereka tidak dapat mentransfer apa yang mereka pelajari, mereka tidak pernah mempelajarinya sejak awal. Agar siswa tetap termotivasi, Anda hanya perlu memilih masalah yang tepat, yang penting terlepas dari bahasa, "nyata" atau "mainan".
benzado
@benzado Transfer itu penting, tidak ada argumen di sana. Tapi itu adalah disiplin ilmu lain yang perlu diajarkan, dan beberapa siswa tidak memilikinya. Selain itu, bagian "pemahaman yang lebih dalam" juga benar, tetapi juga di samping intinya: ini sudah merupakan negara maju yang perlu dicapai . Setelah siswa mempelajarinya, mereka dapat mentransfernya. Tetapi pertama - tama mereka perlu belajar, dan untuk melakukan itu, beberapa siswa perlu relevansi. Transfer datang nanti.
Konrad Rudolph
Dalam matematika edu (di mana saya memiliki sejumlah kecil pengalaman), "Belajar tanpa Memahami" adalah masalah besar: fokus pada bagaimana melakukannya tanpa alasan . Klaim saya adalah bahwa jika Anda mengajarkan konsep pemrograman, bahasa mainan akan baik-baik saja, dan jika Anda berhasil , transfer ke bahasa "nyata" tidak akan sulit. (Jika transfer sulit, Anda mengajarkan prosedur, bukan konsep.) Lingkungan mainan tidak menghalangi orang untuk belajar, tetapi itu membutuhkan perencanaan pembelajaran yang baik untuk melibatkan. (Saya suka utas ini tapi saya pikir kami sudah menyeberang ke wilayah diskusi dan moderator akan tidak senang.)
benzado
6

Tcl memiliki 12 aturan yang mengatur seluruh bahasa.

[1] Commands. 
[2] Evaluation. 
[3] Words. 
[4] Double quotes. 
[5] Argument expansion. 
[6] Braces. 
[7] Command substitution. 
[8] Variable substitution.
[9] Backslash substitution.
[10] Comments. 
[11] Order of substitution. 
[12] Substitution and word boundaries.

Ada sangat sedikit kasus khusus atau kata-kata atau karakter yang dicadangkan.

Bryan Oakley
sumber
4

Apa bahasa pemrograman dengan jumlah terkecil dari aturan bahasa khusus, di mana semuanya kelas satu dan dapat disusun tanpa batasan teknis yang mengganggu? Bukankah bahasa seperti itu akan menjadi bahasa pengajaran yang sempurna?

Untuk memperluas komentar saya, di Jot semuanya adalah kelas satu (karena itu adalah kalkulus lambda) dan dapat disusun. Hanya ada satu instruksi. Ini adalah bahasa pengajaran yang benar-benar mengerikan.

Secara umum, turing turing memiliki sangat sedikit aturan khusus dan mengharuskan Anda untuk memahami dasar-dasar perhitungan dengan sangat baik sebelum Anda dapat melakukan apa pun. Bahasa pengajaran yang sempurna memungkinkan siswa untuk bereksperimen tanpa mencabut semua rambut mereka, jadi abstraksi tingkat yang lebih tinggi sebenarnya adalah hal yang baik.

Peter Taylor
sumber
Terima kasih telah memperkenalkan saya pada istilah 'turing tarpit', saya selalu membutuhkan istilah untuk kesederhanaan semacam ini.
keppla
Saya setuju bahwa siswa harus dapat bereksperimen, tetapi membutuhkan pemahaman sebelum Anda dapat "melakukan apa saja" sepertinya inti dari pengajaran.
benzado
@Benzado, saya setuju bahwa poin pengajarannya adalah untuk memberikan pemahaman. Tetapi dengan kebanyakan orang, Anda harus mulai dengan konsep-konsep dasar, biarkan mereka mengatasinya, dan kemudian ajarkan mereka konsep-konsep perantara. Jadi, Anda menginginkan bahasa tempat seseorang yang sedikit mengerti dapat menulis program yang sedikit. Ada alasan mengapa sebagian besar kursus pemrograman tidak dimulai dengan mengajarkan mesin Turing atau mesin register Minsky.
Peter Taylor
1
Benar, saya pikir kita berbeda tentang apa artinya "melakukan sedikit". Jika Anda ingin (misalnya) meredakan kontingen "tunjukkan padaku cara membuat video game", Anda dapat melakukan beberapa hal, tetapi mereka akan sampai pada suatu titik karena mereka tidak dapat membuat kemajuan dan menjadi frustrasi, dan kemudian Anda harus kembali ke "bagian yang membosankan" sehingga mereka dapat memperoleh pemahaman untuk bergerak maju. Pada titik ini, mereka sudah frustrasi dengan cara yang buruk dan mungkin menyerah; di sisi lain, melakukan "bagian yang membosankan" terlebih dahulu dan membangun ke atas berarti kemajuan yang berkelanjutan. Tapi jelas Anda tidak memulai dengan selotip semi tak terbatas.
benzado
2

Fitur terpenting dalam bahasa yang Anda pelajari adalah:

  • prinsip paling tidak mengejutkan (PASCAL)

  • keterbacaan (Ada)

Menurut pendapat saya, yang kedua mengalahkan yang pertama, karena membaca kode bahkan lebih penting daripada menulisnya.

Sekarang lagi, saya menulis C #, Java, Objective-C dan Javascript untuk mencari nafkah, yang semuanya memiliki kebiasaan yang mengerikan: D

Namun jika saya harus memilih satu bahasa untuk memulai, saya akan memilih C #. Ini relatif mudah dibaca, memiliki beberapa kejutan serius dalam dirinya sendiri (mereka paling sering tersembunyi dalam alat / kerangka kerja MS ...) dan sejumlah besar kode untuk dibaca dan dokumentasi, yang keduanya penting untuk belajar dengan baik.

Kheldar
sumber
Jika itu hanya untuk keterbacaan, dan bukan untuk pengetikan statis dan keamanan ada, Python dan Visual basic (yeah, saya tahu, bukan cara anak-anak keren) memiliki sintaks bebas kekacauan serupa, imho.
keppla
Ya saya setuju dengan Anda, tetapi "jika dikompilasi di Ada, itu harus dijalankan". Namun tidak mencegah kesalahan logika, seperti yang dapat diketahui Ariane V : D
Kheldar
Saya sudah berpikir apakah pengetikan statis bermanfaat untuk pemula atau tidak. Ini memberikan lebih banyak dukungan (seperti roda pelatihan) tetapi ini dapat dilihat sebagai hal yang baik dan yang buruk. Ini mendorong beberapa tanggung jawab menjauh dari siswa untuk mengetik sistem.
Aivar
@Kheldar, tidak ada bahasa pemrograman yang dapat mencegah kesalahan manajemen seperti yang bertanggung jawab atas kegagalan Ariane V. Anda harus melakukan pekerjaan rumah Anda untuk yang satu ini.
John R. Strohm
@ JohnR.Strohm yang persis maksud saya: kadang-kadang bukan bahasa, itu aliran rekayasa (misalnya, manajemen) yang cacat. Anda bisa saja mengatakan komentar Anda kurang agresif, menurut pendapat saya.
Kheldar