En ortogonal programlama dili nedir? [kapalı]


46

Yeni başlayanlara özel dil kuralları hakkında (dizi-işaretçi çürümesi gibi) kendi içinde programlama ile hiçbir ilgisi olmayan şeyleri öğretmek zorunda kaldığım için kendimi sürekli rahatsız ediyordum. Bu yüzden merak ettim:

En az sayıda özel dil kuralına sahip, her şeyin birinci sınıf olduğu ve can sıkıcı teknik kısıtlamalar olmadan oluşturulabildiği programlama dili nedir? Böyle bir dil mükemmel bir öğretim dili olmaz mıydı?

Moderatör Notu

Bazı açıklamalar ve bağlamlar sağlayan uzun cevaplar arıyoruz. Sadece bir dil listelemeyin: lütfen dilin soruyu neden cevapladığını düşündüğünüzü açıklayın . Hiçbir şeyi açıklamayan cevaplar silinecek. Daha fazla bilgi için bkz. İyi Öznel, Kötü Öznel .


1
Unlambda'yı kullanmayı deneyin - mümkün olan en az sayıda dil yapı taşına yakındır. Biraz daha ciddi bir cevap: Şema (özellikle R5RS).
SK-mantığı

@ SK-mantık, Unlambda ortogonal değil çünkü I=SKK. Ortogonal dillerin en iyisi, Jot ve RSSB gibi tek komutlu dillerdir.
Peter Taylor

11
@Peter - Onun kesinlikle minimal olduğunu sanmıyorum. Minimal bir dil sadece kütüphanedeki tüm ekstra tanımlarla sona erer, böylece öğrenciler de onları iki şekilde öğrenmelidir. Bu soruyu okuduğum yol "En az sürpriz ilkesini en iyi hangi dil izliyor?".
Steve314

1
@Peter Taylor: Timtowtdi'nin ortogonallıkla çakıştığı bir örnek verebilir misiniz?
keppla

1
“Dikeyliğin” burada kötü bir sözcük seçimi olduğunu düşünüyorum. Peter ve Steve'in belirttiği gibi, gerçekten demek istediğin "en az sürpriz ilkesi" ya da yakından ilgili kalitedir.
Konrad Rudolph

Yanıtlar:


53

'Çok az kural' söz konusu olduğunda, tartışacağım, Lisp veya Smalltalk kazanacaktı. Çıplak Sözdizimi bir bira sekmesine yazılabilir.

Ancak benim tecrübeme göre, Lisp ve Smalltalk'ın basitliği, anlaşılmaları basit ve öğretmeleri kolay olduğu anlamına gelmez. 'Saf' yol olmasa da, deneyimlerime göre zorunlu dillerin yapılacaklar listesi tarzı yeniler için en kolay anlaşılır yöntemdir.

Bu nedenle, Python, Ruby veya benzer bir soyutlama önerebilirim : İçlerinde bulunan her temel konsepti (hemen hemen hiç işaretçi yok) buluyorsunuz.


33
bira sekmesinin birimlerinde sözdizimini ölçen etkileyici iş.
psr

3
Ve Perl'i de unutma. Orada çoğu insanın düşündüğünden daha fazla Perl var ve kullanıcı topluluğu çok büyük .
Randal Schwartz

20
Perl çok güçlü olabilir, ancak programlamanın en kolay yolunu bulan bir adam, yatak odasından duşlarına kadar ana koridor olarak Indiana Jones tapınaklarının tünellerine eşdeğerde olmalı ...
Kheldar

9
Perl'in sözdizimi, yeterince bira içmeniz koşuluyla bir bira sekmesine sığabilir.
Dave Sherohman

4
@Randal, soru ortogonal bir dil için sorar . Perl'in felsefesi ortogonal olmamaktır - "yapmanın birden fazla yolu var".
Peter Taylor

41

LISP veya Scheme veya o aileden bir dilin en dikgen olduğunu söyleyebilirim. İle let, lambda, define, if, cons, list, ve ( )size bir intro kursuna istemezsiniz hemen hemen her şeyi öğretebilir. Ayrıca, ön işleme yönelik direktiflere veya int main()öğrencilerin sadece içerdiği, ancak bunun için bir sebep görmeyen şeylere de ihtiyaç yoktur .

Intro CS kurslarımda, Scheme ile gerçekten harika şeyler yaptık: bir Turing makinesi uygulayın, bir TC-201 bilgisayarı uygulayın, bağlamsız bir dilbilgisi yazın, özyineleme kullanın, birleştirme ve ekleme sıralama yazın, ekleyiciler uygulayın ve tonlarca diğer şey.

Java'yı üniversiteden önce AP compci'de yapmıştım, ancak Scheme harikaydı çünkü karmaşayı azaltabiliyor ve programımdaki gerçek kavramlara odaklanabiliyordum. Harika bir sınıftı ve dersiniz için denemenizi şiddetle tavsiye ederim.


5
Anlaşmak. Raket (eski adıyla PLT Programı), okulumuzun giriş sınıflarında büyük bir başarı ile kullandığı, biraz daha arkadaşça bir Şema çeşididir.
NickAldwin

3
Peki ya Haskell? Çok Haskell bilmiyorum, ama ortogonal bir dil olmasını bekliyorum.
Giorgio

4
@ Giorgio: Haskell sözdizimi oldukça karmaşık, ancak sadece bir alt küme ortaya çıkmış olabilir. Herhangi bir ilginç program elde etmek için GÇ monadları ile etkileşime girmeniz gerektiği gerçeği, OP hedefi göz önüne alındığında biraz can sıkıcıdır.
Matthieu M.

4
"Ortogonal" için, özellikle Raket Uygulaması olmak üzere Şemaya oy veririm . Raket ortamı, öğrencinin yolunu ham Common Lisp gibi bir şeyden daha kolay hale getirmek için tasarlanmıştır. Dil temiz, birkaç kuralla gerçekten. Uzun zaman önce, MIT, SICP kitabını kullanarak birinci sınıf öğrencilerine ders vermek için Scheme'i kullanmaya karar verdi . Hayatta kalan öğrenciler pazarda oldukça iyi performans gösteriyorlar. Ancak, bu yaklaşım öğrencilere en yaygın kullanılan dillerde ticari sınıf kod yazmayı doğrudan öğretmeyecektir.
John Tobler

2
Evet! Scheme'in “gerçek” dillerden kökten farklı olması gerçeği , API'lara değil programlamaya odaklanmanıza izin verir . Öğrenme Şeması kodlamanın " balmumu açık, balmumu kapalı " gibidir; Bilgisayarı daha önce olduğundan daha derin bir şekilde anladığınızı fark edene kadar zaman kaybı gibi görünüyor.
benzado

17

Pascal, programlama öğretmek için özel olarak tasarlanmıştır. Öğrenmesi kolay (öğrendiğim ilk programlama dillerinden biriydi).


3
Pascal'ı kullanarak programlamayı da öğrendim ve çok temiz bir dil olduğunu düşünüyorum. Aklıma gelen tek ortogonal özellik, değişken sayıdaki argümanlara sahip ve biçimlendirme belirtmesine izin veren writeln () ve readln () işlemlerinin sözdizimidir.
Giorgio

Çok sinir bozucu bir dil buldum. Ama çok ama çok kötü bir hocaya sahip olduğum için projeksiyon yapıyor olabilirim.
greyfade

14

Logo: Hala yaşıyor ve tekmeliyor !

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

Bir programlama dilinden sonra bir oyuncak gibi görünebilir, ancak birçok insan için kötü bir ilk adım olmaz. Sözdizimi çok basittir, ancak kaplumbağa çoğu dilden / ortamdan daha somut bir geri bildirim sağlar. Belirli bir şekil oluşturmaya çalışmak, bir sorunu çözmek için ileriye dönük düşünme sürecini öğrenmenin harika bir yoludur.

Kaplumbağalara karşı bir isteksizliğin varsa, gerçekten, Scheme'in gitmenin yolu olduğunu düşünüyorum.


1
İster inanın ister inanmayın, Logo bir Lisp, tıpkı Scheme gibi. Çoğu kullanıcı bunu öğrenmek için basit döngü ve kaplumbağa grafiklerinin ötesine geçemez.
Sean McSomething

@SeanMcSomething Bu, ifadelerin değerlendirilmesinden ziyade, yan etkilere (kaplumbağayı hareket ettirmeye) odaklanarak, ilginçtir.
benzado

10

Hem SML hem de Haskell'i öneririm. Ortogonallik, her ikisi için de temel tasarım noktası olmuştur. Özellikle, SML'nin çekirdeği (dilin modülerlikle ilgisi olmayan kısmı) hemen hemen bir tür yazılı lambda hesabıdır. Sonuç olarak, çoğu dil özelliği türlere göre belirlenir ve ardından türler, değerler için giriş ve eleme formlarını yönlendirir. Bu hemen hemen ideal.

Her iki dilde de birkaç tip teorik olmayan siğil var (SML'de eksi, Haskell'de seq)) ama yine de ilgisiz dil özelliklerinin tuhaf etkileşimleri açısından hala başka bir şeyin pantolonunu yendi.


7

Seçim ne olursa olsun, “gerçek” bir dil öğretmeyi şiddetle tavsiye ederim . Oyuncak dillerini öğretmek bazı insanlar için işe yarar, ancak bazıları için gerçek dünyayla olan bağlantının kopması çok çok sinir bozucudur. Bazı insanlar , öğrenme için bir motivasyon olarak gerçek dünyanın uygunluğuna ihtiyaç duyarlar ve bu öğrenme stratejisini değerlendirmek için bizim yerimiz değil (aslında, bu yaygın bir yanılgıdır).

Bu, Logo gibi dilleri değil, İşleme gibi etki alanına özgü dilleri diskalifiye eder . Sonuncusu bazı şeyler için son derece faydalı olsa da (örneğin bilgi grafiği üretmek), kullanım çoğu kullanım için (ve dolayısıyla çoğu kullanıcı için) çok sınırlıdır. Bu da işe yaramaz bir Haskell altkümesi olan Gofer'ı dışlar . Aynı zamanda dışlayan Pascal her ne kadar ikinci nedeni olan gerçek projelerde kullanılmış, sadece artık alakalı değildir ve sadece temel özelliklerden yoksun (örneğin dahili dizeleri).

Pratik dillerden, daha önce belirtilenlere katılıyorum: Modern Lisp veya Şema lehçeleri, Haskell, Python veya Ruby. Şahsen, muhtemelen Python'u kullanırdım ancak tüm bu seçeneklerin avantaj ve dezavantajları vardır.


2
“Gerçek” bir dil öğretmenin gerçek dünyayla ilişki sağlamanın bir yolu olduğunu iddia etmek yanlıştır. “Oyuncak” dilinin gerçek dünya becerileri ile nasıl ilişkili olduğunu göstermek öğretmenin işidir. Bıçaklarla başlayarak hokkabazlık yapmayı öğrenmek, daha alakalı hokkabazlık becerilerini öğrendiğiniz anlamına gelmez.
benzado

3
@benzado Amacımı yanlış anladınız. Bir oyuncak dili öğrenirseniz , becerilerinizi gerçek dünya problemleriyle ilişkilendirmek için aktarmanız gerekir. Amacım, bu aktarımın, bazı kişilerin öğrenmelerini aktif olarak engelleyen ek bir dolaysızlık olduğuydu . Farklı insanlar çılgınca farklı şekillerde öğrenirler ve bazı insanlar bu acilliğe gerçekten ihtiyaç duyarlar. Bıçaklarla hokkabazlık yapmayı öğrenmek aynı şey değil. Asıl analoji, ilk proje olarak canlı bir füze rehberlik sistemi yazarak programlamayı öğrenmekle olur ve bunu asla önermedim.
Konrad Rudolph

3
Amacını anlıyorum. Sadece aynı fikirde değiliz. Aktarımın önemli olduğunu düşünüyorum; öğrencinin, başarılı bir tahmin stratejisine sahip olandan daha derin bir anlayışa sahip olmasını gerektirir (örneğin, sözcükleri sayılarını seçerek ve bunları bölümlerin başındaki formüllere takarak "çözen"). ). Başka bir deyişle, öğrendiklerini transfer edemezlerse, ilk etapta asla öğrenmediler. Öğrencileri motive etmek için, dil, "gerçek" veya "oyuncak" ne olursa olsun önemli olan doğru problemleri seçmelisiniz.
benzado

@benzado Transferi olduğu önemli, sorun yoktur. Ama öğretilmesi gereken bir disiplin değil, bazı öğrenciler de buna sahip değil. Ayrıca, “daha ​​derin bir anlayış” kısmı da doğrudur, ama aynı zamanda konunun yanı sıra: bu zaten ulaşılması gereken gelişmiş bir durumdur . Öğrenciler “onu” öğrendikten sonra, aktarabilirler. Ancak ilk önce öğrenmeleri gerekir ve bunu yapabilmek için bazı öğrencilerin alaka düzeyine ihtiyaçları vardır. Transfer daha sonra gelir.
Konrad Rudolph

Matematik eğitiminde (az miktarda deneyime sahip olduğum yerde), "Anlamadan Öğrenme" büyük bir sorundur: neden olmadan bunu nasıl yapacağınıza odaklanmak . Benim iddiam, programlama kavramlarını öğretirseniz , bir oyuncak dilin iyi olacağını ve başarılı olursanız "gerçek" bir dile geçişin zor olmayacağıdır. (Aktarım zorsa, kavramlar öğrettiniz, prosedürler öğrettiniz.) Oyuncak ortamı insanların öğrenmesini engellemez, ancak iyi bir ders planlaması yapılmasını gerektirir. (Bu konuyu beğendim ancak tartışma bölgesine geçtiğimizi düşünüyorum ve moderatörler memnun olmayacak.)
benzado

6

Tcl, tüm dili yöneten 12 kurala sahiptir.

[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.

Çok az özel durum veya ayrılmış sözcük veya karakter var.


4

En az sayıda özel dil kuralına sahip, her şeyin birinci sınıf olduğu ve can sıkıcı teknik kısıtlamalar olmadan oluşturulabildiği programlama dili nedir? Böyle bir dil mükemmel bir öğretim dili olmaz mıydı?

Benim yorumuma genişletmek için, Jot'ta her şey birinci sınıftır (çünkü bir lambda hesabıdır) ve oluşturulabilir. Sadece bir talimat var. Bu kesinlikle korkunç bir öğretim dili.

Genel olarak, Turing tarpitlerinin çok az özel kuralı vardır ve herhangi bir şey yapmadan önce hesaplamanın temellerini çok iyi anlamanızı gerektirir. Mükemmel bir öğretim dili, öğrencilerin tüm saçlarını çekmeden deney yapmalarına olanak tanır, bu nedenle daha yüksek seviyedeki soyutlamalar aslında iyi bir şeydir.


Beni 'turing tarpit' terimiyle tanıştırdığınız için teşekkür ederim, bu tür basitlik için her zaman bir terime ihtiyacım vardı.
keppla

Öğrencilerin deney yapabilmeleri gerektiğine katılıyorum, ancak “bir şey yapmadan önce anlayış gerektirmesi” öğretimin tüm noktası gibi görünüyor.
benzado

@benzado, öğretimin amacının anlayış kazandırmak olduğuna katılıyorum. Ancak çoğu insanla birlikte temel kavramlarla başlamanız, kafalarını bu konuya sokmalarına izin verin ve sonra onlara ara kavramları öğretin. Bu yüzden, biraz anlayan birinin biraz yapan programlar yazabileceği bir dil istiyorsunuz. Programlama kurslarının çoğunun Turing makineleri veya Minsky register makineleri öğreterek başlamamasının bir nedeni vardır.
Peter Taylor

1
Doğru, bence "biraz yapmak" ne demekle farklıyız. Eğer (örneğin) "video oyunlarını nasıl yapacağımı göster" ibaresine hükmetmek istiyorsan, bazı şeyleri yapabilirsin, ama bir noktaya gelecekler çünkü ilerleme kaydedip hayal kırıklığına uğrayacaklar ve sonra “sıkıcı parçalara” geri dönün böylece ileriye doğru hareket etme anlayışını kazanabilirler. Bu noktada, zaten kötü bir şekilde hayal kırıklığına uğradılar ve sadece pes edebilirler; Öte yandan, ilk önce "sıkıcı parçaları" yapmak ve yukarı doğru inşa etmek sürekli ilerleme anlamına gelir. Ama belli ki yarı sonsuz bir bant şeridiyle başlamıyorsunuz.
benzado

2

Öğrendiğiniz bir kordondaki en önemli özellikler şunlardır:

  • en az sürpriz ilkesi (PASCAL)

  • okunabilirlik (Ada)

Benim düşünceme göre, ikincisi ilk adım atıyor, çünkü okuma kodu yazmaktan daha önemli.

Şimdi yine, hepsi korkunç tuhaflıkları olan bir yaşam için C #, Java, Objective-C ve Javascript'i yazıyorum: D

Yine de başlamak için bir kordon seçmek zorunda olsaydım, C # için giderdim. Okuması nispeten kolaydır, kendi içinde çok az ciddi sürprizler vardır (bunlar genellikle MS araçlarında / çerçevelerinde saklanırlar ...) ve her ikisi de iyi öğrenmek için gerekli olan okunacak ve belgelenecek muazzam miktarda kod içerir.


Sadece okunabilirlik için ve ada'nın statik yazması ve güvenliği için değilse, Python ve Visual basic (evet, iyi çocuklar değil yolu biliyorum) benzer bir dağınıklık sözdizimine sahip, imho.
keppla

Evet, sana katılıyorum, ancak "Ada'da derlenirse, çalışması gerekir". Ancak Ariane V'in söyleyebileceği gibi mantık hatalarını
önlemiyor

Statik yazmanın yeni başlayanlar için yararlı olup olmadığını düşünüyorum. Daha fazla destek verir (eğitim çarkları gibi) ancak bu hem iyi hem de kötü bir şey olarak görülebilir. Sistemi yazmak için öğrenciden biraz sorumluluk alır.
Aivar

@ Kheldar, hiçbir programlama dili, Ariane V'nin başarısızlığından sorumlu olanların yönetimini engelleyemez. Bu konuda ev ödevini yapmalısın.
John R. Strohm

Tam olarak benim açımdan @ JohnR.Strohm: bazen dil değil, kusurlu mühendislik akışı (örneğin, yönetim). Bence yorumunuzu daha az agresif bir şekilde ifade etmiş olabilirsiniz.
Kheldar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.