Dlaczego naukowe języki programowania są tak dziwne? [Zamknięte]

9

Wydaje mi się, że języki programowania przeznaczone do wykorzystania w nauce i inżynierii są konsekwentnie dziwne w porównaniu do języków ogólnego przeznaczenia. Kilka przykładów z mojej głowy:

  • W Matlabie każda funkcja musi być umieszczona w osobnym pliku
  • W R <- jest operatorem przypisania, w przeciwieństwie do = w prawie każdym innym języku
  • Matlab, R, Julia i inni mają indeks 1
  • Matlab używa% do komentarzy, a nie standardowego # lub //

Oczywiście wszystkie te języki mają kilka cech projektowych, które w rzeczywistości ułatwiają ich wykorzystanie w zastosowaniach naukowych, takich jak bardziej naturalna notacja matrycowa. Mimo to wszystkie w niewytłumaczalny sposób dokonują wszystkich tych dziwacznych wyborów, które nie ułatwiają niczego i można by ich łatwo uniknąć, gdyby projektanci języków postanowili zrobić to, co robi 99% innych języków. Czy przyczyną jest blokada dostawcy? Brak kontaktu z szerszą społecznością programistów? Coś innego?

Przeczytałem ten wątek i nie uznałem wyjaśnień za zadowalające. To, że R zostały zaprojektowane jako język naukowy, nie oznacza, że musiał całkowicie ignorować konwencje i używać <- zamiast =.

haroba
źródło
6
Krótka odpowiedź: ponieważ zostały stworzone dla naukowców, a nie dla programistów.
Bart van Ingen Schenau
19
Krótka odpowiedź: Ponieważ na każdy język, który uważasz za normalny, miał wpływ wspólny przodek, C.
Ross Patterson
3
Myślę, że będziesz walczyć, aby znaleźć wszelkie konwencje w różnych językach. To zależy od ich dziedzictwa.
Robbie Dee
6
Nic z tego nie jest dziwne. Po prostu jest inaczej . Ponieważ nie ma konkretnego powodu, aby wybierać jedną składnię zamiast drugiej, z wyjątkiem tego, do czego przyzwyczajony jest konkretny autor określonego języka.
Jan Hudec
8
Twoje 99% jest błędne. Jeśli znasz tylko C i jego pochodne, możesz tak myśleć, ale ponad 50% języków innych niż C używa czegoś innego do przypisywania, indeksowania i / lub komentarzy.
david.pfx

Odpowiedzi:

21
  • Istnieją różne konwencje. Konwencje w matematyce, logice i naukach stosowanych oraz konwencje w IT. Pierwsze są znacznie starsze.
  • Języki naukowe zostały stworzone, aby ułatwić życie ICH użytkownikom. Użytkownik jest postrzegany jako naukowiec, który może od czasu do czasu zrealizować jakiś algorytm lub sprawdzić teorię, bez potrzeby uczenia się czegoś naprawdę nowego. Tak więc języki dla naukowców MUSZĄ być dostosowane do standardów innych niż IT. Ponieważ nie są przeznaczone do użytku przez informatyków. Są one zgodne z INNYMI standardami i jest to dobre ze względu na docelowy słuch. Ponieważ dobry interfejs użytkownika SW, a językiem jest interfejs użytkownika SW, należy wykonać w oparciu o potrzeby użytkownika, a nie kodera.
  • Nasze standardy IT są standardami branżowymi. IT to przemysł. Nauka to nie przemysł. Naukowcy są z tego dumni. I niechętnie wezmą wszystko z naszej praktyki do swojej. I wcale nie lubią standardów. I nikt nie lubi zagranicznych standardów. Tak więc, jeśli ktoś stworzy naukowy język, który będzie wyglądał zgodnie ze standardami IT, nie będzie dobrze się sprzedawał, z powodu niechęci do słuchu docelowego, nawet gdyby był obiektywnie wygodniejszy.

A nawet jeśli będziemy oceniać tylko według standardów IT ... Przepraszam, jakie masz na myśli standardy? Czy próbowałeś napisać program w APL lub SNOBOL? Te dwa języki są, IMHO, NAJBARDZIEJ potężne w odpowiednich polach (liczenie i ciągi znaków). Ale składnia jest BARDZO dziwna (i skuteczna). Czytanie wiersza kodu APL może zająć kilka dni. Z drugiej strony taka linia jest poważnym kawałkiem SW. Wrócisz do Mathlaba ze łzami ulgi.

Jeśli chodzi o „=”, wiele osób ma problemy z przyzwyczajeniem się, że nie jest to równość, ale przydział. BTW, w Pascalu jest to równość, a przypisanie to „: =”.

I naprawdę uważasz, że == dla równości jest bardziej naturalne? Przeciwnie, mieszanie = i == jest NAJBARDZIEJ powszechnym błędem w programowaniu C, zdarza się bardzo często nawet we współczesnych IDE, z ich automatycznym sterowaniem.

O indeksowaniu od 1 - jest to jedyny naturalny. Kiedy byłeś dzieckiem, nauczyłeś się wierszy i piosenek, w których się liczyłeś: jeden, dwa, trzy ... I nie 0,1,2 ... W matematyce szkolnej badaliśmy, że liczenie zaczyna się od 1, a to 0 nie należy do liczb naturalnych / zliczających. Tylko z definicją funkcji pojawiają się wskaźniki nienaturalne. W końcu 0 zostało wymyślone wiele tysięcy lat po tym, jak nasz przodek podniósł palec.

0-start był łatwiejszy do zrealizowania i natychmiast pojawił się w praktyce IT po pojawieniu się C. Ale w Fortran, pierwszym języku, stosuje się indeksowanie 1. To samo z innymi językami epoki przedindustrialnej.

I tak, przeczytałem artykuł Dyjkstry na temat naturalności liczenia opartego na 0. I całkowicie nie zgadzam się z jego argumentacją. Jest to naturalne dla wszystkich muzyków. I nawet 0 entuzjastów tworzących kompilatory C i Java, zlicza wiersze kodu Zaczynając od 1!

Gangnus
źródło
1
„: =” dla przypisania i indeksowania opartego na 1 są również używane w Smalltalk.
Rory Hunter
1
Nie kupuję tego, że indeksowanie oparte na 0 wynika z łatwości implementacji (FORTRAN prawie to odrzuca). cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html podaje kilka powodów, dla których można preferować indeksowanie oparte na 0, ale należy pamiętać, że wybór jest dość arbitralny.
jk.
2
FORTRAN miał indeksowanie 1. PASCAL zezwalał na dowolne indeksowanie: możesz zadeklarować tablicę, której indeks wahał się, na przykład od -42 do +57. (Zobacz en.wikipedia.org/wiki/…, gdzie znajduje się przykład, w którym jest to przydatne.)
John R. Strohm
1
@Gangnus Myślę, że porównywanie współczesnych języków z językiem C jest błędem i uważam je za celowo trudne do odczytania. Został zaprojektowany jako wysokopoziomowa alternatywa dla języków niższego poziomu.
Robbie Dee
1
FORTH jest językiem stosowym. Pomyśl o kalkulatorze HP. Był bardzo kompaktowy i szybki, ale trudno było napisać kod, który nie był nieprzenikniony. W FORTH rzadko używasz zmiennych, ale raczej wypychasz rzeczy na stos i używasz operatorów działających na stosie.
Gort the Robot
16

Indeksowanie od 1 nie jest dziwne, jest całkowicie normalne i oczekiwane, z wyjątkiem programistów , ponieważ zostali oni uwarunkowani, aby oczekiwać zliczania w oparciu o 0 przez C (co było uwarunkowane właściwościami architektury procesora).

Komentarze są oznaczone na wiele, wiele różnych sposobów w różnych językach; nie ma standardowego sposobu, każdy język wybiera symbol lub digraf, który nie został jeszcze pobrany.

Przydział jest również dziwną i niezrozumiałą koncepcją, z wyjątkiem programistów ; większość ludzi nie dba o to, czy to jest, =czy :=też <-, oni starają się zrozumieć znaczenie (i dla nich, w rzeczywistości lepiej nie używać =, ponieważ podkreśla to, że przypisanie nie jest równością - najczęstszą przeszkodą dla nie-programistów zrozumieć kod).

Krótko mówiąc, języki programowania przeznaczone dla osób innych niż profesjonalni programiści wyglądają inaczej, ponieważ ludzie, którzy ich używają najbardziej tego chcą.

Kilian Foth
źródło
4
Nie zgadzam się, że indeksowanie od 1 nie jest dziwne. Indeksowanie 0 jest co najmniej tak powszechne jak indeksowanie 1 w matematyce i oczywiście było to normą w programowaniu przez lata przed pojawieniem się Matlaba lub S / R.
haroba
9
@Aqwis O tak, już widzę dziecko liczące zero, jeden, dwa ... Najbardziej naturalny sposób, naprawdę.
Gangnus
4
Dzieci nie piszą kodu. Istnieją dobre powody, aby używać indeksowania zerowego (patrz: Dijkstra), a gdy indeksowanie zerowe jest również powszechne w matematyce, nie widzę wielu powodów, aby używać indeksowania 1.
haroba
1
@Aqwis Odpowiedz na własne słowa. Co jest dziwne, a nie. Rzecz, która jest ustalana od dzieciństwa i przez matematykę (liczby naturalne nie zawierają zera), nie może być dziwna z żadnej strony. A co z tym jest sprzeczne, jest dziwne. I że przyzwyczaiłeś się do czegoś innego, nie ma to znaczenia. Te języki po prostu nie są stworzone dla ciebie ani dla mnie.
Gangnus
1
@phresnel Parafrazując odpowiedź: Indeksowanie od 1 jest normalne. Z wyjątkiem programistów, ponieważ zostali uwarunkowani, aby się tego spodziewać [indeksowanie od 0] z C
Robbie Dee
5

Istnieją trzy problemy:

  1. Nie jesteś świadomy pewnych tradycji i dobrych powodów dla pewnych wyborów.
  2. Kładzie się zbyt duży nacisk na składnię, a zbyt mało na semantykę.
  3. Inżynierowie i naukowcy nie mają doświadczenia w projektowaniu języka, co prowadzi do wątpliwej składni.

Teraz do twoich konkretnych punktów:

  • Nie znam Matlaba, więc nie mogę komentować wymagań dotyczących organizacji plików. Pamiętaj, że Java chce, abyś używał jednego pliku na klasę publiczną.

  • W R =może być również używany jako operator przypisania. Zauważ, że potrzebuje wielu operatorów przypisania <-i <<-radzenia sobie z koncepcją określania zakresu ( <<-przypisuje symbol do zakresu zewnętrznego zamiast tworzyć nowy symbol wewnątrz funkcji). Strzałki można stosować w drugim kierunku za potencjalnie tworzenia kodu filtra: complex_calculation() -> x.

  • Indeksowanie na podstawie 1 jest standardem w matematyce, z czym użytkownicy Matlaba i R. czują się lepiej niż C. Julia podąża za Matlabem, aby uzyskać lepszą krzywą uczenia się.

  • %dla komentarzy jest również używany w TeX / LaTeX. Jest #to tylko konwencja z języków skryptowych Unix i ich potomków.

Ignorujesz również to, że „prawdziwe” języki programowania mają wiele dziwnych części. Dlaczego program nie używa =? Zamiast:

(define foo 5)

Dlaczego C używa *dereferencji, skoro oczywiście ^xw innych tradycjach karetka jest bardziej powszechna?

amon
źródło
„Nie znam Matlaba, więc nie mogę komentować wymagań dotyczących organizacji plików. Pamiętaj, że Java chce, abyś używał jednego pliku na klasę publiczną”. Myślę, że jest całkowicie rozsądne, aby język spodziewał się, że podzielisz swój projekt na kilka plików. Jednak klasa to zwykle stosunkowo duża ilość kodu. Funkcje nie muszą być. Wymuszając osobny plik dla każdej funkcji, Matlab zniechęca cię do tworzenia małych funkcji, a zamiast tego promuje duże, monolityczne funkcje.
haroba
1
Zgadzam się prawie ze wszystkim, z wyjątkiem s. 3. Naukowcy nie tworzą swoich języków, ZAMÓWIĄ je. Są klientami, użytkownikami, ale nie ich twórcami. Jeśli ktoś jest, jest on już maniakiem IT. A składnia dowolnego języka jest wątpliwa, nikt nie jest idealny do wszystkich zadań.
Gangnus
Matlab kompiluje funkcje / pliki dokładnie na czas, zgodnie z wymaganiami. Nie ma prawdziwej koncepcji programu, tylko kilka funkcji. Jeśli uruchamiam funkcję wywołującą foo (), wówczas przeszuka ona ścieżkę do pliku o nazwie foo.m, skompiluje ją i uruchomi. Nie trzeba z góry informować Matlaba, jakiego zestawu plików zamierzam użyć.
Simon B
1

Myślę, że to zależy od twojego kontaktu z innymi językami. Z czubka mojej głowy:

  • C / C ++ mają osobne pliki źródłowe (.c / .cpp i .h)
  • Znaki -> są używane w języku C # dla wyrażeń lambda
  • Stare wersje VB używały 1 jako domyślnego indeksu (chociaż można to zmienić za pomocą Opcji podstawowej)
Robbie Dee
źródło
1
W C i C ++ możesz zdefiniować tyle funkcji, ile chcesz w jednym pliku.
haroba
Po prostu zwracam uwagę na to, że moduły dzielą się na wiele plików. Jeśli chciał was mógłby umieścić wszystkie swoje funkcje w osobnych plikach za pomocą języków .NET z częściowym klasy konstrukcji.
Robbie Dee
1
Oczywiście nie jest niczym niezwykłym dzielenie modułów na kilka plików, a w wielu przypadkach jest to pożądane. Ale w Matlabie musisz umieścić każdą funkcję we własnym pliku, co oznacza, że ​​jeśli masz tysiąc funkcji, potrzebujesz tysiąca plików .
haroba
3
Wyglądają komentarze w HTML <!-- ... -->. Znak procentu jest używany do kodowania adresu URL: http://example.com/()staje się http://example.com/%28%29.
amon
Przepraszam, mój błąd.
Robbie Dee