Czy są jakieś języki programowania zgodne z minimalistycznym podejściem programistycznym?

26

Uważam, że kiedy języki są traktowane tak samo jak oprogramowanie komercyjne, zawsze istnieje potrzeba dodawania nowych funkcji w celu uzasadnienia nowych wydań.

Czy istnieją lub są języki, w których wersja 1.0 jest wersją ostateczną? Oczywiście poprawki błędów są z tego wyłączone, ale zestaw funkcji zawsze pozostaje taki sam?

W ten sposób każda funkcja w tym języku ładnie do siebie pasuje i nie wydaje się, że są one włączone po fakcie z przestarzałymi funkcjami, które nadal istnieją ze względu na kompatybilność wsteczną.

Zakładam, że niektóre języki akademickie są takie? Ale czy istnieją komercyjne języki zgodne z tym pomysłem? Towarzysząca biblioteka jest również darmowa, aby uzyskać nowe funkcje, ale język zawsze pozostaje niezmienny.

Jednym z przykładów, który mogę podać, jest jeden z moich ulubionych języków C #, którego używam dość często, w każdym wydaniu dodaje się coraz więcej funkcji. Aby z nich skorzystać, muszę rzucić rzeczywiste zadania na ręce i spędzić sporo czasu na ich nauce, zamiast być w stanie wyłapać trywialne koncepcje i połączyć je samodzielnie, aby z łatwością rozwiązać bardziej złożone problemy.

Myślę więc, że szukam minimalistycznego podejścia, w którym wszystko jest spójne, ma sens i jest możliwie jak najbardziej ortogonalne.

Joan Venge
źródło
7
Praca większości programistów polega na skutecznym rozwiązywaniu problemów. Skuteczność wymaga ciągłego uczenia się nowych rzeczy. Nowe funkcje językowe, nowe frameworki, nowe narzędzia zostały opracowane, aby były bardziej skuteczne. Ucząc się ich, koncentrujesz się na swojej pracy.
Arseni Mourzenko
4
Cóż, nie każdy, kto programuje, musi być programistą pełnoetatowym. To po prostu kolejne narzędzie dla wielu innych zawodów.
Joan Venge,
4
Z drugiej strony nikt cię nie zmusza do nauki. Jeśli C # 1.0 spełnia twoje wymagania, nie marnuj czasu na naukę czegoś, czego nie potrzebujesz.
Arseni Mourzenko
11
Myślę, że pytanie jest uzasadnione: dlaczego powinniśmy stosować zasady KISS i YAGNI do artefaktów oprogramowania, a nie do języków programowania? Gdy język ma wystarczającą liczbę podstawowych funkcji, dalszy rozwój jest (IMHO) głównie ze względu na marketing (konkurencja z innymi językami, która zmusza firmy do wypychania języków z funkcjami, aby zatrzymać swoich klientów).
Giorgio
2
@MainMa: „Skuteczność wymaga ciągłego uczenia się nowych rzeczy.”: Złożony język programowania, wyposażony w zbyt wiele funkcji, może zmniejszyć skuteczność zamiast ją zwiększać. Np. W zespole może to prowadzić do sytuacji, w której różni programiści używają różnych podzbiorów języka, co sprawia, że ​​przeglądy kodu, naprawianie błędów i konserwacja są mniej wydajne.
Giorgio

Odpowiedzi:

32

Lisp, Smalltalk. Nawiasem mówiąc, są to również najlepsze języki w całej grupie.

Zarówno Lisp, jak i Smalltalk są językami zbudowanymi na silnej metaforze jednoczącej. Metafora Lispa brzmi: „wszystko jest listą; ta lista reprezentuje zarówno dane, jak i kod (jako funkcje)”. Metafora Smalltalk brzmi: „wszystko jest przedmiotem; jedynym sposobem na wywołanie zachowania jest przekazanie wiadomości do obiektu”. Te metafory pozwalają na stabilne, minimalne i mocne języki. Reszta jest w bibliotece.

Rzeczy, które są nazywane „strukturami kontrolnymi” we wszystkich nie-minimalnych (chciałem napisać „rozdętych”) językach, są tutaj częścią biblioteki (na przykład: condfunkcja w lisp; ifTrue:/ ifFalse:rodzina wiadomości w Smalltalk, zarówno implementacja warunkowa, gdzie inne języki mają ifsłowo kluczowe).

Można zauważyć, że Lisp / Smalltalk to prawie minimalne przykłady ich paradygmatu i nic więcej (Lisp: programowanie funkcjonalne; Smalltalk: programowanie obiektowe).

herby
źródło
4
Dobre implementacje Lisp mogą konkurować z C, dobre implementacje Smalltalk mogą konkurować z C ++. Heck, Oracle HotSopt JVM, najszybsza maszyna wirtualna na świecie, jest maszyną wirtualną Smalltalk, do optymalizacji nie wykorzystuje nawet informacji o typie statycznym.
Jörg W Mittag,
9
Ta odpowiedź jest zbyt mała, aby była konstruktywna. Brak szczegółów lub dowodów potwierdzających.
Jimmy Hoffa
2
-1 Lisp? LISP ? Poważnie? Po wojnach LISP w latach 70. powtórzono próby Jedności LISP, a wreszcie Common Lisp? Nie, nawet LISP nie dał rady „zrobić” w wersji 1.0.
Ross Patterson
1
Myślę, że wskazałeś na bardzo ważną ideę: język powinien być zbudowany wokół jednej (lub kilku) silnych, jednoczących metafor (y), tj. Język programowania powinien oferować ci sposób na uporządkowanie myśli. Myślę, że złożoność niektórych języków jest częściowo spowodowana brakiem takiej metafory: języki te stale rosną dzięki wprowadzaniu nowych funkcji, ponieważ nie mają ujednoliconego widoku.
Giorgio
6

TeX , system składu tekstu, jest bardzo stabilny od wersji 3.

Od wersji 3 TeX stosuje idiosynkratyczny system numeracji wersji, w którym wskazano aktualizacje poprzez dodanie dodatkowej cyfry na końcu dziesiętnej, aby numer wersji zbliżył się asymptotycznie do π. Jest to odzwierciedleniem faktu, że TeX jest teraz bardzo stabilny i oczekuje się jedynie niewielkich aktualizacji. Obecna wersja TeX to 3.1415926; ostatnia aktualizacja miała miejsce w marcu 2008 r. Projekt został zamrożony po wersji 3.0 i nie zostanie dodana żadna nowa funkcja ani fundamentalna zmiana, więc wszystkie nowsze wersje będą zawierały tylko poprawki błędów. Chociaż sam Donald Knuth zasugerował kilka obszarów, w których TeX mógłby zostać ulepszony, wskazał, że głęboko wierzy, że posiadanie niezmienionego systemu, który będzie generował tę samą wydajność teraz i w przyszłości, jest ważniejsze niż wprowadzanie nowych funkcji. Z tego powodu stwierdził, że „

Nie twierdzę, że spełnia twoje „Więc myślę, że szukam minimalistycznego podejścia, w którym wszystko jest spójne, ma sens i jest możliwie jak najbardziej ortogonalne”. oświadczenie, ale spełnia większość pozostałych kryteriów.

Steven Schlansker
źródło
6

C i Fortran to języki, które przychodzą mi do głowy. Są bardzo stabilne, a ich składnia jest łatwo zapamiętywana. Poza samodzielnym pisaniem złego kodu, jest bardzo mało niespodzianek podczas używania tych języków. Ale nie utrzymałbym ich jako wspaniałych języków do szybkiego tworzenia aplikacji.

Wolę szybki rozwój języków z funkcjami, które po spędzeniu nad nimi trochę czasu znacznie ułatwiają moją pracę, a kod jest mniej skomplikowany przy zachowaniu ekspresji.

Peter Smith
źródło
1
Zgadzam się z minimalistycznym wyglądem C. Nawet jeśli język był aktualizowany przez lata, podstawowy model projektowania i programowania języka jest nadal rozpoznawalny (inne języki przechodzą rewolucję co 5 do 10 lat). Oczywiście C nie jest językiem ogólnego przeznaczenia, jak kiedyś, ponieważ został zastąpiony innymi językami w określonych domenach aplikacji (aplikacje komputerowe, aplikacje internetowe itp.).
Giorgio
@Giorgio: Nie wszystkie. Te minimalne (jak te, o których wspomniałem) nie. Nie zmieniła się składnia Smalltalk od momentu jej powstania, z wyjątkiem jednej, wprowadzonej przez Squeaka: kędzierzawe tablice obliczeniowe. Biblioteka jest również bardzo stabilna w rdzeniu ( Behaviori Collectionhierarchiach). Wydaje mi się, że C jest znacznie mniej stabilny z tymi wszystkimi C89, C99 i tym podobne.
herby
1
@herby: Prawdopodobnie masz rację, że inne języki, takie jak Smalltalk, są bardziej stabilne niż C. Jednak podstawowy model programowania C jest taki sam, jak, powiedzmy, 20 lat temu. Inne języki uległy głębokim zmianom. Ponownie nie twierdzę, że C jest najbardziej stabilnym językiem na świecie, jednak IMO jest znacznie bardziej stabilny niż wiele innych języków głównego nurtu.
Giorgio
6

Inni już powiedzieli Lisp, więc muszę wychować Fortha . Jest bardzo łatwy do wdrożenia, a zasady języka są proste do przestrzegania.

Jest to język oparty na stosie ze słownikiem „słów”. Możesz łatwo rozszerzyć język, używając niektórych funkcji dziedziczenia.

BARDZO zwięzły przykład grafiki żółwia:

\ 8.8 fixed point sine table lookup
-2 var n F9F2 , E9DD , CEBD , AA95 , 7F67 , 4E34 , 1A c,
: s abs 3C mod dup 1D > if 3C swap - then dup E > if
  -1 1E rot - else 1 swap then n + c@ 1+ * ;

0 var x 0 var y 0 var a
0 var q 0 var w 
: c 9380 C80 0 fill ; \ clear screen
: k >r 50 + 8 << r> ! ;
: m dup q @ * x +! w @ * y +! ; \ move n-pixels (without drawing)
: g y k x k ; \ go to x,y coord
: h dup a ! dup s w ! 2D + s q ! ; \ heading
: f >r q @ x @ y @ w @ r 0 do >r r + >r over + \ forward n-pixels
  dup 8 >> r 8 >> plot r> r> loop o y ! x ! o r> o ;
: e key 0 vmode cls ; \ end
: b 1 vmode 1 pen c 0 0 g 0 h ; \ begin
: t a @ + h ; \ turn n-degrees

Uruchomienie go za pomocą : squiral -50 50 g 20 0 do 100 f 21 t loop ;daje:

spirala

Kredyt na blogu tego pracownika Microsoft .

Austin Henley
źródło
1
Jak to zostało ponownie ocenione? Dalej może być dobrym kandydatem, ale podany przykład nie jest dużo lepszy niż wykonywalny szum linii; doskonały przykład tego, dlaczego obsesja PLT na punkcie zwięzłości jest sprzeczna z tym, czego tak naprawdę potrzebują profesjonaliści.
Telastyn
4
@Telastyn To nie było jego pytanie.
Austin Henley,
4

Chociaż wspomniano o Lispie, najbardziej minimalistycznym językiem, jaki znam, jest schemat . Trudno mi było to zrozumieć na kursach uniwersyteckich, gdzie musiałem. Ale zmieniło to mój sposób myślenia o programowaniu i jest bardzo minimalne. Tak minimalna jak cała składnia to nawiasy ()i spacje.

Jedyną zmianą w języku była decyzja o konwersji jak prymitywów +, define(i kilka innych) do wbudowanych ins. Oznacza to, że są dostępne podczas uruchamiania, ale można je ponownie zdefiniować w czasie wykonywania.

Ramzi Kahil
źródło
2

Tcl, który przede wszystkim miał być minimalistyczny

Stamtąd o stronie http://www.tcl.tk/about/features.html , jedną z funkcji jest to, że jest bardzo łatwy do nauczenia się i gdzie mogą go używać zwykli programiści, a nawet nie-programiści.

Egryan
źródło
3
Brzmi to dla mnie dokładnie, ale odpowiedzi w jednym wierszu bez informacji pomocniczych lub szczegółów są zbyt niskiej jakości, aby były pomocne dla kogokolwiek. Proszę podać kilka dobrych szczegółów (a nie tylko link bez streszczenia), a dostaniesz ode mnie głos
Jimmy Hoffa
ok, zrobię to z powodu zamkniętego pytania nie wiem, ile wysiłku warto
Egryan
1
Przy odrobinie szczęścia zostanie ponownie otwarty z głosowania. To dobre pytanie. Mogę napisać na Meta, aby spróbować otworzyć go ponownie, jeśli społeczność nie otworzy go wkrótce.
Jimmy Hoffa,
Zgadzam się i planuję dodać więcej do posta, kiedy wyjdę z pracy, nie mam szybkiego szczęścia ze znalezieniem odpowiednich linków
Egryan,
Wyszukaj w Google „A Case Study on TCL Language”, „Tcl: Embeddable Command Language” i tcl.tk/about/history.html - podają kilka kluczowych punktów. Nie jestem jednak pewien, czy potwierdzają chęć OP - wygląda na to, że TCL zostało rozszerzone z pierwotnej wersji 1.0 (patrz wiki.tcl.tk/1721 )
2

Jest kilka języków, które pozostały względnie niezmienione od czasu ich powstania poza ezoterycznymi, jednorazowymi językami, które raczej nie są pożądane (nie chciałbym pisać czegoś znaczącego w Befunge (chociaż został on również zmodyfikowany od wersji 1.0) wydanie)).

Językami, które najprawdopodobniej zaspokoją pragnienie nieuczenia się niczego nowego, są języki specjalizujące się w „klejeniu” między innymi programami. Języki takie jak jcl , bash i tym podobne. Proste języki skryptowe również mogą do tego należeć - awk jest jednym z liderów.

Po opuszczeniu tego królestwa następuje rozwój. Zarówno język, jak i ramy. W niektórych sytuacjach kodowanie języka jest „trudne” bez uzyskania części frameworka, który szybko się rozwija.

Wiele języków ma pewien stopień kompatybilności wstecznej. Nadal można dziś napisać Java 1.4, choć prawdopodobnie nie jest to zalecane - frameworki, które ludzie piszą dla niej, zmieniają się szybciej niż język. Nadal można znaleźć kompilatory f77 i f90 dla specyfikacji języka, która nie zmieniła się przez 20 lub 40 lat. C, Objective C, C ++ można nadal kodować do starszych specyfikacji języka - nie trzeba ciągle aktualizować własnego kodu, ponieważ nowa specyfikacja została wydana lub pojawiła się nowa platforma.

Niektóre języki mają dość długą, niezmienioną historię, ponieważ sam język jest wystarczająco silny, aby robić, co tylko chce. Lisp jest głównym kandydatem w tej dziedzinie. Forth należy również do królestwa „niewiele się zmieniło”.

Przechodząc do bardziej tradycyjnych języków skryptowych, spójrz na TCL, Perl i Python. Unikaj rzeczy, które są obecnie w sferze „mody”, które z jakiegoś powodu cieszą się popularnością (ruby i javascript, patrzę na ciebie). TCL zmieniło się na przestrzeni lat , choć jednym z jego celów jest próba zachowania spójności projektowania. Zarówno nowoczesny Perl, jak i Python mają pewną spójność w projektowaniu, choć wprawdzie nowe funkcje mogą się przydać (choć nie trzeba ich używać).


źródło
2

Myślę, że Python jest rozsądnym kandydatem na język z minimalizmem jako jednym z jego celów projektowych. Opiera się na stosunkowo niewielkiej liczbie podstawowych pojęć, a wersja 3 próbowała między innymi nieco uprościć język , usuwając niektóre funkcje.

(To prawda, że ​​to nie to samo, co zestaw funkcji, który pozostał taki sam od wersji 1, ale myślę, że to dość arbitralny sposób oceny języków, biorąc pod uwagę, że autorzy języków mogą nazywać go wersją 1, kiedy tylko chcą.)

Paul D. Waite
źródło
Data odpowiedzi z grudnia 2012 r. Daje darmowe przejście, ponieważ od tego czasu mamy potworność znaną jako Python 3, która rywalizuje z C ++, chcąc dodać kupę śmieci, jednocześnie usuwając prostotę. Jest to obecnie jeden z najbardziej obcych języków zainfekowanych dodatkami w informatyce.
Thomas Browne
-1

Myślę, że „minimalistyczne” podejście do projektowania byłoby zilustrowane przez Tcl. Jako przykład możesz użyć polecenia {catch} z wartościami {return -code n}, aby zaimplementować dowolną strukturę sterowania, jaką wyobraźnia może sobie wyobrazić, Perl musiał czekać dekadę (oficjalnie) na {switch} - (nie że Perl kiedykolwiek tego potrzebowałem). Przekonasz się również, że Dodekalogue http://wiki.tcl.tk/10259 całkowicie obejmuje gramatykę Tcl - resztę, bez względu na paradygmat programowania, z którym chcesz pracować, można wyrazić w tej gramatyce.

użytkownik132043
źródło
to tylko powtarza punkt przedstawiony i wyjaśniony w odpowiedzi opublikowanej dwa lata temu
komara
Odnosząc się do oryginalnego postu, mogę jedynie powiedzieć, że ortogonalność = historia (rodzina języków C) i niedawna asymilacja międzyjęzykowa; Widziałem w różnych językach podejście wszystkich języków do uogólnionych ram internetowych MVC, coroutines i innych. Poza tym trendem zauważam niezwykłe dodanie zamknięć do C11 i nadchodzącej Java lambda (które odzwierciedlają rozwój w języku „skryptowym” systemu operacyjnego).
user132043