Jaki jest najbardziej ortogonalny język programowania? [Zamknięte]

46

Wielokrotnie denerwuje mnie nauczanie studentów nowych zasad języka (takich jak rozkład z tablicy na wskaźnik), które nie mają absolutnie nic wspólnego z samym programowaniem. Zastanawiałem się więc:

Czym jest język programowania z najmniejszą liczbą specjalnych reguł językowych, w których wszystko jest najwyższej klasy i można je komponować bez uciążliwych ograniczeń technicznych? Czy taki język nie byłby idealnym językiem nauczania?

Uwaga moderatora

Szukamy długich odpowiedzi, które zawierają wyjaśnienia i kontekst. Nie wymieniaj tylko języka: wyjaśnij, dlaczego według niego język odpowiada na pytanie. Odpowiedzi, które niczego nie wyjaśniają, zostaną usunięte. Aby uzyskać więcej informacji, zobacz Dobry subiektywny, zły subiektywny .

fredoverflow
źródło
1
Spróbuj użyć Unlambda - istnieje prawie jak najmniejsza liczba bloków językowych. Trochę poważniejsza odpowiedź: schemat (konkretnie R5RS).
SK-logic
@ SK-logic, Unlambda nie jest ortogonalny, ponieważ I=SKK. Ostatecznym językiem ortogonalnym są języki z jedną instrukcją, takie jak Jot i RSSB.
Peter Taylor,
11
@Peter - nie sądzę, że on ma na myśli minimum. Minimalny język po prostu kończy się wszystkimi dodatkowymi definicjami w bibliotece, więc uczniowie muszą się ich nauczyć. Sposób, w jaki czytam to pytanie, brzmi „w jakim języku najlepiej przestrzegać zasady najmniejszego zaskoczenia?”.
Steve314,
1
@Peter Taylor: czy możesz podać przykład konfliktu Timtowtdi z ortogonalnością?
keppla
1
Myślę, że „ortogonalność” jest tutaj złym wyborem słów. Jak ustalili Peter i Steve, tak naprawdę chodzi ci o „zasadę najmniejszego zaskoczenia” lub jakąś ściśle powiązaną jakość.
Konrad Rudolph

Odpowiedzi:

53

Jeśli chodzi o „bardzo niewiele zasad”, twierdzę, że wygrałby Lisp lub Smalltalk. Gołą składnię można zapisać na jednej karcie piwa.

Jednak z mojego doświadczenia wynika, że ​​prostota Lisp i Smalltalk nie oznacza, że ​​są one łatwe do zrozumienia i nauczenia. Chociaż nie jest to „czysty” sposób, z mojego doświadczenia wynika, że ​​imperatywny styl listy rzeczy do zrobienia jest najłatwiejszy do zrozumienia dla początkujących.

Dlatego sugerowałbym Python, Ruby lub coś o podobnej abstrakcji : Znajdziesz (prawie) każdą podstawową koncepcję w nich (OK, żadnych wskaźników), ale nie musisz tego rozumieć od samego początku, aby coś działało.

keppla
źródło
33
imponująca praca mierząca składnię w jednostkach zakładki piwa.
psr
3
I nie zapomnij o Perlu. O wiele więcej Perla niż większość ludzi myśli, a społeczność użytkowników jest ogromna .
Randal Schwartz,
20
Perl może być bardzo potężny, ale facet, który uważa, że ​​jest to najłatwiejsza droga do programowania, musi mieć odpowiednik tuneli świątyń Indiany Jonesa jako główny korytarz z sypialni do pryszniców ...
Kheldar
9
Składnia Perla może pasować do zakładki piwa, pod warunkiem, że wypijesz wystarczającą ilość piwa.
Dave Sherohman
4
@Randal, pytanie dotyczy języka ortogonalnego . Filozofią Perla jest bycie nieortogonalnym - „jest na to więcej niż jeden sposób”.
Peter Taylor
41

Powiedziałbym, że LISP, schemat lub język z tej rodziny byłby najbardziej ortogonalny. Z let, lambda, define, if, cons, list, i ( )można nauczyć prawie wszystko, że chcesz zostać w intro oczywiście. Nie ma również potrzeby stosowania dyrektyw dotyczących wstępnego przetwarzania lub int main()takich rzeczy, które uczniowie po prostu uwzględniają, ale nie widzą powodu.

Podczas moich kursów wprowadzających CS zrobiliśmy wiele naprawdę fajnych rzeczy ze Scheme: zaimplementuj maszynę Turinga, zaimplementuj komputer TC-201, napisz gramatykę bezkontekstową, użyj rekurencji, napisz sortowanie i wstawianie, zaimplementuj dodatki i mnóstwo inne rzeczy.

Zrobiłem Javę w AP comp sci przed studiami, ale Scheme był świetny, ponieważ mogłem ograniczyć bałagan i skupić się na rzeczywistych koncepcjach w moim programie. To była świetna klasa i gorąco polecam wypróbowanie jej w nauczaniu.

Maczuga
źródło
5
Zgodzić się. Rakieta (wcześniej Schemat PLT) jest nieco bardziej przyjaznym wariantem Schematu, z którego nasza szkoła z dużym powodzeniem korzysta w klasach wprowadzających.
NickAldwin
3
Co z Haskellem? Nie znam dużo języka Haskell, ale spodziewałbym się, że będzie to język ortogonalny.
Giorgio
4
@Giorgio: Składnia Haskella jest znacznie bardziej skomplikowana, choć chyba tylko podzbiór może zostać ujawniony. Sam fakt, że musisz wchodzić w interakcje z monadami IO od samego początku, aby uzyskać jakikolwiek interesujący program, jest nieco irytujący, biorąc pod uwagę cel PO.
Matthieu M.,
4
Za „ortogonalnym” głosuję za Schematem, szczególnie za implementacją Racket . Środowisko rakiet ma na celu ułatwienie ścieżki ucznia niż coś w rodzaju surowego Common Lisp. Język jest czysty, z kilkoma regułami. Dawno temu MIT postanowił wykorzystać program do nauczania studentów pierwszego roku, korzystając z książki SICP . Ci uczniowie, którzy przeżyli, wydają się radzić sobie całkiem dobrze na rynku. Jednak to podejście nie nauczy bezpośrednio studentów pisania kodu komercyjnego w najczęściej używanych językach.
John Tobler,
2
Tak! Fakt, że schemat różni się radykalnie od większości „prawdziwych” języków, pozwala skupić się na programowaniu, a nie na interfejsach API. Program uczenia się jest jak „ woskowanie, woskowanie ” kodowania; wydaje się stratą czasu, zanim zdasz sobie sprawę, że lepiej rozumiesz komputer niż wcześniej.
benzado
17

Pascal został specjalnie zaprojektowany do nauczania programowania. Łatwo się go nauczyć (był to jeden z pierwszych języków programowania, których się nauczyłem).

Henrik
źródło
3
Nauczyłem się również programować przy użyciu Pascala i uważam, że jest to bardzo czysty język. Jedyną nieortogonalną funkcją, o której mogę myśleć, jest składnia procedur writeln () i readln (), które mają zmienną liczbę argumentów i pozwalają określić formatowanie.
Giorgio,
Uważam to za bardzo frustrujący język. Ale mogę projektować, ponieważ miałem bardzo, bardzo złego instruktora.
greyfade,
14

Logo: wciąż żyje i kopie !

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

Może wydawać się bardziej zabawką niż językiem programowania, ale dla wielu osób nie byłby to zły pierwszy krok. Składnia jest bardzo prosta, ale żółw zapewnia bardziej konkretną formę informacji zwrotnej niż większość języków / środowisk. Próba stworzenia określonego kształtu to świetny sposób na poznanie procesu myślenia o przyszłości w celu rozwiązania problemu.

Jeśli jednak masz awersję do żółwi, naprawdę uważam, że Scheme jest właściwą drogą.

benzado
źródło
1
Wierzcie lub nie, Logo to Lisp, podobnie jak Scheme. Większość użytkowników nie ma wystarczająco daleko poza zwykłą grafiką zapętloną i żółwiem, aby się tego nauczyć.
Sean McSomething
@SeanMcSomething To ciekawe, biorąc pod uwagę skupienie się na efektach ubocznych (poruszanie żółwia), a nie na ocenie wyrażeń.
benzado
10

Zaproponowałbym zarówno SML, jak i Haskell. Ortogonalność była głównym punktem konstrukcyjnym obu. W szczególności rdzeń SML (czyli część języka, której nie dotyczy modułowość), jest w zasadzie typowym rachunkiem lambda. W rezultacie większość funkcji językowych zależy od typów, a typy z kolei sterują formularzami wprowadzania i eliminacji wartości. To jest prawie idealne.

W obu językach istnieje kilka nie-teoretycznych brodawek (eqtyps w SML, seq w Haskell), ale nadal biją na nogach wszystko inne pod względem dziwnych interakcji niepowiązanych cech językowych.

Lambdageek
źródło
7

Niezależnie od wyboru zdecydowanie zachęcam do nauczania „prawdziwego” języka . Nauczanie języków zabawek działa dla niektórych osób, ale dla innych jest bardzo, bardzo frustrujące z powodu braku połączenia z prawdziwym światem. Niektórzy ludzie potrzebują prawdziwej przydatności jako motywacji do nauki i nie jest naszym miejscem ocenianie tej strategii uczenia się (w rzeczywistości jest to powszechne nieporozumienie).

To dyskwalifikuje języki takie jak Logo, ale także języki specyficzne dla domeny, takie jak Przetwarzanie . Podczas gdy ten ostatni jest niezwykle przydatny do niektórych rzeczy (np. Do tworzenia grafiki informacyjnej), użycie jest zbyt ograniczone dla większości zastosowań (a więc i większości użytkowników). Wyklucza to także Gofer , bezużyteczny podzbiór Haskell. To również wyłącza Pascal bo chociaż ten ostatni jest stosowany w rzeczywistych projektach, to po prostu nie ma znaczenia dłużej i po prostu brakuje istotne cechy (np wbudowaną strun).

Spośród praktycznych języków zgodziłbym się z tymi, które już wspomniano: nowoczesne dialekty Lisp lub Scheme, Haskell, Python lub Ruby. Osobiście prawdopodobnie użyłbym Pythona, ale wszystkie te opcje mają swoje zalety i wady.

Konrad Rudolph
źródło
2
Błędem jest twierdzenie, że nauczanie „prawdziwego” języka jest sposobem na zapewnienie przydatności w świecie rzeczywistym. Zadaniem nauczyciela jest pokazanie, w jaki sposób język „zabawki” odnosi się do umiejętności w świecie rzeczywistym. Nauka żonglowania, zaczynając od noży, nie oznacza, że ​​uczysz się bardziej odpowiednich umiejętności żonglerki.
benzado
3
@benzado Źle zrozumiałeś mój punkt widzenia. Jeśli uczysz się języka zabawek, musisz przenieść swoje umiejętności, aby były odpowiednie do rzeczywistych problemów. Chodzi mi o to, że ten transfer jest dodatkową pośrednią aktywnością, która aktywnie uniemożliwia niektórym ludziom naukę . Różni ludzie uczą się na różne sposoby, a niektórzy naprawdę potrzebują tej natychmiastowości. Nauka żonglowania nożami to nie to samo. Prawdziwą analogią byłoby nauczenie się programowania, pisząc system prowadzenia rakiet na żywo jako pierwszy projekt, i nigdy tego nie sugerowałem.
Konrad Rudolph
3
Wiem o co ci chodzi. Po prostu się nie zgadzamy. Myślę, że przeniesienie jest ważne, wymaga głębszego zrozumienia przez ucznia niż tego, który ma skuteczną strategię zgadywania (np. Tego, kto „rozwiązuje” problemy słowne poprzez wybieranie liczb i podłączanie ich do formuł na początku rozdziału ). Innymi słowy, jeśli nie mogą przenieść tego, czego się nauczyli, nigdy się tego nie nauczyli. Aby utrzymać motywację uczniów, wystarczy wybrać właściwe problemy, co jest ważne niezależnie od języka, „prawdziwego” lub „zabawki”.
benzado
@Benzado Transfer jest ważny, bez argumentów. Ale to cała inna dyscyplina, której należy nauczyć, a niektórzy uczniowie jej nie posiadają. Poza tym część „głębszego zrozumienia” jest również prawdą, ale poza tym: jest to już zaawansowany stan, który należy osiągnąć . Gdy uczniowie nauczą się „tego”, mogą go przenieść. Ale najpierw muszą się nauczyć, a aby to zrobić, niektórzy studenci potrzebują znaczenia. Transfer nastąpi później.
Konrad Rudolph
W matematyce EDU (gdzie mam niewielką ilość doświadczenia), „Nauka bez zrozumienia” jest duży problem: skupić się na jak to zrobić bez dlaczego . Twierdzę, że jeśli uczą koncepcji programowania, język zabawka zrobi dobrze, a jeśli się uda , przeniesienie do „prawdziwego” języka nie będzie trudne. (Jeśli transfer jest trudny, nauczyłeś się procedur, a nie pojęć.) Środowisko zabawek nie przeszkadza w nauce, ale wymaga dobrego planowania lekcji. (Podoba mi się ten wątek, ale myślę, że przeszliśmy na obszar dyskusji, a moderatorzy będą niezadowoleni.)
benzado
6

Tcl ma 12 reguł rządzących całym językiem.

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

Istnieje bardzo niewiele specjalnych przypadków lub zastrzeżonych słów lub znaków.

Bryan Oakley
źródło
4

Czym jest język programowania z najmniejszą liczbą specjalnych reguł językowych, w których wszystko jest najwyższej klasy i można je komponować bez uciążliwych ograniczeń technicznych? Czy taki język nie byłby idealnym językiem nauczania?

Aby rozwinąć mój komentarz, w Jot wszystko jest pierwszej klasy (ponieważ jest to rachunek lambda) i można je skomponować. Jest tylko jedna instrukcja. To absolutnie okropny język nauczania.

Ogólnie rzecz biorąc, plandeki Turinga mają bardzo niewiele specjalnych zasad i wymagają bardzo dobrego zrozumienia podstaw obliczeń, zanim będzie można cokolwiek zrobić. Idealny język nauczania pozwala uczniom eksperymentować bez wyciągania włosów, więc abstrakcje na wyższym poziomie są w rzeczywistości dobrą rzeczą.

Peter Taylor
źródło
Dziękuję za zapoznanie się z terminem „Turing Tarpit”, zawsze potrzebowałem terminu dla tego rodzaju prostoty.
keppla
Zgadzam się, że uczniowie powinni mieć możliwość eksperymentowania, ale wymaganie zrozumienia, zanim będzie można „zrobić cokolwiek”, wydaje się być celem nauczania.
benzado
@benzado, zgadzam się, że celem nauczania jest przekazywanie zrozumienia. Ale w przypadku większości ludzi musisz zacząć od podstawowych pojęć, pozwól im się tym zająć, a następnie naucz ich pośrednich pojęć. Chcesz więc języka, w którym ktoś, kto trochę rozumie, może pisać programy, które trochę sobie radzą. Istnieje powód, dla którego większość kursów programistycznych nie zaczyna się od nauki maszyn Turinga lub maszyn rejestrujących Minsky'ego.
Peter Taylor
1
Racja, myślę, że różnimy się od tego, co oznacza „trochę”. Jeśli chcesz (na przykład) uspokoić „pokaż mi, jak tworzyć gry wideo”, możesz zrobić kilka rzeczy, ale dojdą one do punktu, ponieważ nie mogą robić postępów i być sfrustrowani, a następnie musisz wróć do „nudnych części”, aby mogli zrozumieć, jak iść naprzód. W tym momencie są już sfrustrowani w zły sposób i mogą po prostu się poddać; z drugiej strony robienie „nudnych części” i budowanie w górę oznacza ciągły postęp. Ale oczywiście nie zaczynasz od paska częściowo nieskończonej taśmy.
benzado
2

Najważniejsze cechy języka, którego się uczysz to:

  • zasada najmniejszego zaskoczenia (PASCAL)

  • czytelność (Ada)

Moim zdaniem drugi przebija pierwszy, ponieważ czytanie kodu jest nawet ważniejsze niż jego pisanie.

Teraz znowu piszę w języku C #, Java, Objective-C i JavaScript, z których wszystkie mają okropne dziwactwa: D

Mimo to, gdybym musiał wybrać jeden język na początek, wybrałbym C #. Jest stosunkowo łatwy do odczytania, sam w sobie ma kilka poważnych niespodzianek (najczęściej są one ukryte w narzędziach / frameworkach MS ...) oraz ogromną ilość kodu do odczytu i dokumentacji, które są niezbędne do dobrego uczenia się.

Kheldar
źródło
Jeśli chodzi tylko o czytelność, a nie o statyczne pisanie i bezpieczeństwo ada, Python i Visual Basic (tak, wiem, nie fajny sposób dla dzieci) mają podobną składnię bez bałaganu, imho.
keppla
Tak, zgadzam się z tobą, ale „jeśli kompiluje się w Adzie, powinien działać”. Nie zapobiega jednak błędom logicznym, jak Ariane V może powiedzieć: D
Kheldar
Zastanawiałem się, czy pisanie statyczne jest przydatne dla początkujących, czy nie. Daje więcej wsparcia (jak koła treningowe), ale można to postrzegać zarówno jako dobrą, jak i złą rzecz. Odsuwa część odpowiedzialności od ucznia na system pisania.
Aivar,
@Kheldar, żaden język programowania nie może zapobiec awariom zarządzania takim jak ten, który był odpowiedzialny za awarię Ariane V. Powinieneś odrobić pracę domową na tym.
John R. Strohm
@ JohnR.Strohm o to właśnie mi chodziło: czasami to nie język, to błąd w inżynierii (np. Zarządzanie). Moim zdaniem mógłbyś sformułować swój komentarz mniej agresywnie.
Kheldar