Celem tego pytania nie jest zebranie listy prania funkcji języka programowania, bez których nie można żyć, lub które nie byłyby dostępne w głównym wybranym języku. To pytanie ma na celu ukazanie kącików obłędnego projektowania, o których większość projektantów języków może nie myśleć. Zamiast więc myśleć o funkcji języka X, pomyśl trochę bardziej filozoficznie.
Jednym z moich uprzedzeń, i być może może być kontrowersyjnym, jest to, że bardziej miękka strona inżynierii - po co i dlaczego - jest wiele razy ważniejsza niż strona bardziej konkretna. Na przykład Ruby został zaprojektowany z myślą o poprawie szczęścia programistów. Chociaż twoje opinie mogą być różne w zależności od tego, czy zostały dostarczone, czy nie, fakt, że był to cel, oznacza, że na niektóre z wyborów w projektowaniu języka wpłynęła ta filozofia.
Nie publikuj:
- Składniowe wojny płomieniowe. Spójrzmy prawdzie w oczy, mamy swoje preferencje, a składnia jest ważna, ponieważ dotyczy projektowania języka. Chcę tylko uniknąć epickich bitew o naturę emacs vs. VI (o których ogromna liczba ludzi w dzisiejszych czasach nic nie wie).
- „Jakikolwiek język, który nie ma funkcji X, nie zasługuje na istnienie”, wpisz komentarze. Istnieje co najmniej jeden powód istnienia wszystkich języków programowania - dobry lub zły.
Proszę zrobić wpis:
- Filozoficzne pomysły, za którymi wydają się tęsknić projektanci języków.
- Koncepcje techniczne, które wydają się być źle wdrażane częściej niż nie. Podaj przykład bólu, który powoduje, a jeśli masz jakieś wyobrażenie o tym, jak wolałby on działać.
- Rzeczy, które chciałbyś mieć we wspólnej bibliotece platformy, ale rzadko są. Ten sam token, rzeczy, które zwykle znajdują się we wspólnej bibliotece, których nie chcesz.
- Funkcje koncepcyjne, takie jak wbudowana obsługa testów / asercji / kontraktów / błędów, które mają być poprawnie wdrażane i definiowane we wszystkich językach programowania.
Mam nadzieję, że będzie to zabawny i stymulujący temat.
Edycja: Wyjaśnienie, co mam na myśli, przez Syntax Flame Wars. Nie staram się unikać wszelkiej dyskusji na temat składni, zwłaszcza że składnia jest podstawową częścią projektowania języka programu.
źródło
Odpowiedzi:
Obsługa Unicode domyślnie
W dzisiejszych czasach opracowywane są programy do użytku międzynarodowego lub przy założeniu, że mogą być one używane na arenie międzynarodowej. Oni muszą zapewnić wsparcie dla swoich zestawów znaków lub czynią programów napisanych w tym języku bezużyteczne.
źródło
string
ibyte[]
. Podobnie jak Python 3.x zstr
ibytes
. C (++)char
robi to okropnie źle.u'My Unicode Štring'
. Chciałbym, żebyś mógł po prostu zapomnieć, z jakim typem łańcucha masz do czynienia, i cholernie napisz kod.Mam parę:
Ogólne / szablony. Na przykład, generyczne Java są potężne, ale niekoniecznie elastyczne. Ponadto, ponieważ używają usuwania typu, widziałem problemy z ich abstrakcyjną implementacją, szczególnie w interfejsach. A kompilator nie powinien ostrzegać, gdy używany jest nieokreślony rodzajowy (jak
Hashmap
zamiastHashmap<String, int>
). Myślę, że można je znacznie poprawić. Dobre szablony są bardzo przydatne, ale często zaniedbywane.Obsługa Good Date w standardowej bibliotece. Mam na myśli to, że mogę dodawać i odejmować daty, godziny i minuty i nie muszę radzić sobie z liczbą milisekund od 1 stycznia 1970 roku.
źródło
java.util.Date
ma prawie wszystkie możliwe problemy i problemy. Znam tylko część nowegojava.time.*
pakietu, ale jest czysty, łatwy w użyciu i wolny od błędów AFAICT. Bardziej zaawansowani użytkownicy mogą znaleźć problemy, ale to ogromna poprawa. +++ Problem wydaje się polegać na tym, że jest to skomplikowany problem, a pierwsza wersja jest popędzona i zepsuta.Udostępnij swój język do analizy / audytu dla osób zajmujących się bezpieczeństwem komputerowym.
Pracownicy ochrony muszą być w stanie znaleźć luki w zabezpieczeniach programu przed jego wysłaniem. Najlepiej, gdy jesteśmy wzywani wcześnie i możemy komentować bazę kodu w miarę jej rozwoju, ale często nie.
Gdy pojawi się nowa wersja języka lub bibliotek podstawowych, rzeczy, które wcześniej były bezpieczne, mogą już nie być:
javascript:
eval
biblioteki deserializacjiKażda z tych zmian może zwiększyć liczbę uprawnień nadużycia, jakie ma program, ale ponieważ ilość uprawnień, z których korzysta program (w kontaktach z nie-złośliwymi klientami), nie uległa zmianie, pracownicy ochrony są zmuszeni dowiedzieć się o tym bez intensywnego ponowny audyt.
Proszę więc pomyśleć o nas przy projektowaniu i wersjonowaniu języka. Poniżej znajduje się kilka wskazówek:
Zdefiniuj kilka prymitywów, na które program może zostać rozłożony.
HTML5 jest szczególnie zły w ten sposób. Oczywiście poświęcili wiele uwagi bezpieczeństwu i mają bardzo inteligentnych ludzi, ale zamiast określać nowe elementy programu, takie jak
<video>
stare, lub tworzyć wspólną abstrakcję, którą można określić zarówno nowe, jak<video>
i stare<img>
,<video>
to jeszcze kolejny jednorazowy element programu z własnymi konsekwencjami bezpieczeństwa.Uczyń swój język podatnym na analizę statyczną (nawet jeśli nie jest statycznie wpisany).
Specjaliści od bezpieczeństwa często używają analizy statycznej, aby znaleźć wzorce i spróbować wykluczyć części programu, aby mogli skupić się na naprawdę trudnych bitach.
Powinno być oczywiste, które identyfikatory są zmiennymi lokalnymi, a które nie.
Np. Nie popełniaj tego samego błędu co w starych wersjach JavaScript, które uniemożliwiały stwierdzenie, czy
x
poniżej znajduje się odwołanie do zmiennej lokalnej (zgodnie z dosłownym odczytem starej wersji specyfikacji):Pozwól na bezpieczeństwo rozkładalne
Wiele bezpiecznych systemów zostało zaprojektowanych wokół bezpiecznego jądra, które zachowuje właściwości bezpieczeństwa, dzięki czemu osoby zajmujące się bezpieczeństwem mogą skoncentrować swoje wysiłki na analizie niewielkiej ilości kodu i uwolnić większość programistów od konieczności radzenia sobie z osobami zajmującymi się bezpieczeństwem {irytujące, pedantyczne, paranoiczne} .
Powinno być możliwe napisanie takiego jądra w twoim języku. Jeśli jedną z właściwości bezpieczeństwa twojego języka jest to, że kiedykolwiek zostanie pobrany tylko pewien podzbiór adresów URL, czy pisarze jądra mogą zrobić coś, by skierować wszystkie pobieranie adresów URL przez swój kod? Lub może statyczne kontrole kompilacji (np. Patrząc na import) pełnią tę samą funkcję.
Niektóre języki, takie jak Newspeak, używają modelu możliwości obiektu. To niesamowity i świetny sposób na uzyskanie bezpieczeństwa rozkładalnego.
Ale jeśli nie możesz tego zrobić, uczynienie z wykresu modułu artefaktu, który można analizować statystycznie, może przynieść ci wiele korzyści. Jeśli mogę udowodnić, że moduł nie może dotrzeć do modułu we / wy pliku (z wyjątkiem wywoływania kodu w module w TCB), to mogę wykluczyć całe klasy problemów z tego modułu.
Ogranicz uprawnienia wbudowanych języków skryptowych
Wiele przydatnych systemów jest zorganizowanych jako statyczny rdzeń, który odpycha dużo kodu napisanego w dynamicznych (nawet funkcjonalnych) językach.
Osadzanie języków skryptowych może znacznie rozszerzyć system.
Ale język skryptowy nie powinien mieć pełnych uprawnień maszyny wirtualnej.
Jeśli zdecydujesz się zezwolić na wbudowane języki skryptowe, ułatw inwokatorowi ograniczenie tego, co mogą zrobić. Model właściwości obiektowych (patrz komentarz do Newspeak powyżej) jest tutaj bardzo odpowiedni; dlatego podczas oceny kodu w języku skryptowym wywołujący powinien przekazać kod do wykonania i wszystkie zmienne globalne dla tego kodu.
Traktuj
eval
jako język osadzający się jako język skryptowyJeśli Twój język może wywoływać własny kompilator w celu przekształcenia łańcucha w kod, pozwól, aby został on piaskowiony tak samo, jak każdy osadzony język skryptowy.
Użyj prostego modelu współbieżności
My, ochroniarze, nie chcemy martwić się warunkami wyścigowymi, próbując dowiedzieć się, czy własność bezpieczeństwa jest utrzymywana.
Zanim zdecydujesz się na wątki, rozważ alternatywę dla wątków jako prawie niemożliwą do zabezpieczenia domyślną opcję.
Jednym prostym jest współbieżność pętli zdarzeń, taka jak w E, Verilog i JavaScript.
Nie zachęcaj do pomieszania cytatów
Niektóre języki są językami kleju i kończą się na napisach w wielu różnych językach.
Na przykład JavaScript często składa się z ciągów HTML, CSS, XML, JSON, a nawet JavaScript. Bardzo trudno jest programistom pamiętać o prawidłowym kodowaniu ciągów tekstowych podczas ich łączenia w celu tworzenia ciągów w innych językach, więc programy JS, jak można się było spodziewać, mają wszelkiego rodzaju problemy z pomijaniem cytatów: XSS jest najgorszy.
Jeśli chcesz uwzględnić funkcje kompozycji ciągów, spróbuj zmniejszyć obciążenie programisty. DSL, higieniczne makra i osadzone języki szablonów mogą być świetnym sposobem na to, przenosząc ciężar prawidłowego ucieczki do twórców bibliotek lub języków z dala od programisty końcowego.
źródło
Niektóre z najlepszych języków zostały zaprojektowane przez ludzi, którzy chcieli stworzyć język dla siebie.
Myślę więc, że projektanci języków powinni mniej zwracać uwagę na swoich użytkowników. Nie możesz zadowolić wszystkich, podobnie jak nie powinieneś.
źródło
Tylko 5-10% czasu spędza na pisaniu kodu. Projektanci języków powinni zwracać uwagę na trudności z faktycznym uruchomieniem oprogramowania, co oznacza naprawianie błędów i błędów.
Oznacza to, że od samego początku powinien istnieć dobry debugger. Żadne narzędzie z tajemną składnią i klawiszami, które jest tylko nieznacznie lepsze niż tony instrukcji print.
źródło
Myślę, że powinni zwrócić uwagę na Pythona, który robi więcej rzeczy właściwie niż jakikolwiek inny język, z którym się spotkałem (i to nawet jeśli nie lubisz niektórych funkcji). Nie oznacza to, że powinni emulować Python, ale ważne jest, aby wiedzieć, co Python zrobił dobrze, nawet jeśli w ogóle nie chcesz tworzyć języka takiego jak Python.
Jeśli chodzi o istotne tam filozoficzne pomysły, są to najważniejsze z Zen Pythona:
Myślę, że język zgodny z tymi regułami musi być całkiem OK, ale znam tylko jeden, który to robi, a to jest Python. Pomimo wszystkich podobieństw do implementacji np. Ruby, Ruby omija takie rzeczy jak czytelność i zaprasza do gry w golfa z kodem, co jest zabawne, ale nie przydatne w profesjonalnym otoczeniu.
Jedyną funkcją techniczną, za którą tęsknię w Pythonie, jest instrukcja „do” (jak podczas, ale nie testowanie wyrażenia za pierwszym razem). Istnieje wiele rzeczy w standardowych bibliotekach Pythona i innych językach, które można ulepszyć, ale nie są to wyłącznie języki , więc to inne pytanie. :-)
źródło
Możliwość dostosowania języka do własnych potrzeb jest dla mnie duża. Dla Lisp, który jest wykonywany z makrami, dla Tcl z wyższym poziomem. W mniejszym stopniu Ruby używa lambd i tym podobnych. Chcę po prostu dodać nowe struktury kontrolne, które pasują do problemu, zamiast formować moje problemy wokół dostępnych struktur kontrolnych. Jako prosty przykład, konstrukcja „do .. do”, która istnieje w niektórych językach, ale nie w innych, jest czystszym sposobem obsługi niektórych przypadków niż „while”, możliwość dodania nowych struktur w celu spełnienia innych przypadków jest niezwykle przydatna.
W bardziej ogólnym sensie jest to metaprogramowanie ... ale używam go głównie do budowy nowych struktur kontrolnych.
źródło
Najważniejsze jest to, że Twój język musi mieć „styl”. Na przykład nazwałbym C językiem programowania systemów opartych na wskaźnikach. Nazwałbym Erlang wysoce funkcjonalnym językiem programowania. Niektóre inne języki (takie jak C ++ i prawdopodobnie Java) są tym, co Allan Kay nazwał językami „aglutynacyjnymi”: języki Frankensteina składały się z wielu połączonych ze sobą funkcji.
Następnie najważniejsze jest, aby zmiany w samym języku były ostatecznością. Nawet najbardziej łagodne brzmienie może stać się skomplikowane w połączeniu z innymi funkcjami języka. Powiedziałbym, że aby wprowadzić nową funkcję w języku, musisz:
źródło
Dzięki za świetne pytanie. Otrzymujesz całkiem dobre odpowiedzi.
Nie glazurować na twoich oczach, ale patrzę na programistę jako kanał informacyjny. Pomysły / koncepcje / wymagania idą z jednej strony, a kod wychodzi z drugiej.
Jeśli weźmiesz zestaw wymagań (bez względu na to, jak są one określone) i zestaw kodu na ogromnej tablicy i narysujesz linie odwzorowujące każde wymaganie na kod, który go implementuje, złożoność tego wykresu będzie zależeć od tego, jak dobrze kod wyraża wymagania. Idealnie byłoby, gdyby był bezpośredni i jeden do jednego, ale trudno jest go wdrożyć w praktyce.
Zmierzam specyficzność domenową języka jako stopień, w jakim upraszcza on ten wykres. Jest to niezwykle pożądana właściwość i można do niej podchodzić na wiele sposobów, od zdefiniowania odpowiednich klas / procedur (rzeczowników / czasowników), poprzez makra, po napisanie własnego parsera i interpretera / kompilatora.
Podam tylko przykład tego, co mam na myśli. W przypadku problemu tworzenia elastycznych interfejsów dialogowych użytkownika technika ta eliminuje konieczność pisania procedur obsługi zdarzeń, przenoszenia danych i większości rzeczy zwykle wykonywanych w interfejsach użytkownika. Powoduje również zmniejszenie kodu źródłowego o około rząd wielkości. Metajęzyk to tak naprawdę tylko kilka procedur i makr w C / C ++ / Lisp, a także zrobiłem to w językach bez makr.
Jeśli zaimplementowanie wymagania można wykonać za pomocą 5-punktowej edycji kodu lub za pomocą 10, zrobienie tego za pomocą 5 oznacza nie tylko mniej kodu, ale także mniejsze szanse na pominięcie kroku i popełnienie błędu. Zatem im bardziej język jest specyficzny dla domeny, tym mniejszy, łatwiejszy w utrzymaniu i pozbawiony błędów kod. Myślę, że musimy wiedzieć, jak do tego dążyć. To nie nie znaczy, że kod jest bardziej czytelny, chyba że czytelnik zainwestował w krzywej uczenia się zrozumieć technikę.
źródło
Ograniczone i różne typy liczb całkowitych, takie jak w Pascal i Adzie. Szczerze mówiąc: jak często potrzebujesz pełnego zakresu dowolnej liczby całkowitej? Myślę, że w prymitywnych typach jest wiele do poprawienia, aby lepiej reprezentowały rzeczywisty świat.
źródło
type Date_Of_Month is 1 .. 31;
i zostawić decyzje takie jak 16 lub 32 bity optymalizatorowi. Ale co ważniejsze, przypisanie 32 lub 0 lub -5 do zmiennej tego typu daje ciRANGE_ERROR
.Date_Of_Month
(lubMonth_Of_Year
), w których istnieje oczywisty zakres do użycia, ale wiele - prawdopodobnie większość - przypadków jest rozmytych.type Persons_Age is 0..120
? Co jeśli ktoś pobije rekord długowieczności?type Year is 0..9999
? Co jeśli jesteś egiptologiem?type Egyptian_Year is -9999 .. 300;
. Z mojego doświadczenia wynika, że przez większość czasu można znaleźć przydatne granice liczb całkowitych. W związku z tym powinieneś rozważyćtype Scrolls_Found is array Egyptian_Year of Natural;
Nie możesz / nie powinieneś mieć nieograniczonego typu jako indeksu tablicy. Jest to po prostu wektor ataku dla hakera. BTW: Ada pozwala na obliczanie granic zasięgu w czasie wykonywania.Istnieją funkcje, które sprawiają, że języki programowania są łatwe w użyciu, gdy się ich nauczysz, i są funkcje, które ułatwiają ich naukę. Ponieważ użytkownicy języka mają idealną długoterminową relację z nim, optymalizacja pod kątem łatwości użytkowania jest lepsza niż optymalizacja pod kątem łatwości nauki. Nie rób rzeczy trudniejszych niż to konieczne, ale nie poświęcaj ekspresji (będąc w stanie napisać mały kod, który dużo robi) dla czytelności dla tych, którzy nie znają języka. Z drugiej strony, język nie powinien czytać jak szum linii dla ludzi, którzy pracowali z nim od lat; nie byłby łatwy w użyciu ani do nauki.
źródło
Konwencje nazewnictwa (patrzę na ciebie PHP)
źródło
Pierwszorzędna integracja ze środowiskiem programistycznym.
Obecnie kodowanie odbywa się w bogatym środowisku. W przypadku HTML / CSS / JS mamy Firebug i inne interaktywne narzędzia. Dla Java, Eclipse i IDEA oraz innych prawdziwych IDE. I tak dalej. Istnieje ekologia narzędzi, zaczynająca się od edytora, ale nie kończąca się na:
Języki powinny być budowane w celu zapewnienia wsparcia dla tych działań. Poczyniono pewne postępy - na przykład adnotacje w Javie, aby pomóc innym programistom zrozumieć cel kodu.
Ale głównie są to zhakowane rzeczy, takie jak użycie $ Id $ w komentarzu, aby źródło sterowane CVS mogło zawierać numer wersji. Dlaczego nie mogę zrobić czegoś takiego z samego języka?
źródło
Obliczenia rozproszone
Bezpłatny obiad się skończył. Dzisiaj potrzebne są programy działające na wielu rdzeniach / wielu procesorach (aw szczególnych okolicznościach na wielu komputerach).
Niestety pisanie wielowątkowego kodu jest trudne koncepcyjnie, więc naprawdę nie ma potrzeby dodawania języka jako bariery.
Wykorzystanie przyszłości w C ++ 0x jest z pewnością interesujące, ponieważ zostało wprowadzone jako biblioteka i nie uwalnia cię od faktycznych problemów z synchronizacją (wiesz, te, które są tak łatwe do rozwiązania ...)
Naprawdę podoba mi się podejście Go do problemu: wielowątkowość jest wbudowana, a przyjęte podejście (kanały i goroutynki) pozwala na znacznie łatwiejsze podejście niż tradycyjne podejście semaforowe / muteksowe / blokujące. Nadal łatwo jest jednocześnie uzyskać dostęp do niezsynchronizowanej struktury (Go ma wskaźniki) lub do impasu (cykl oczekiwania na kanałach ...)
Myślę, że języki sprzyjające niezmienności danych, takie jak języki funkcjonalne, mogą mieć do tego prawo (choć lubię tam doświadczenie).
Ponadto, aktor model może być nasz następny cel. Był przeznaczony również do przetwarzania rozproszonego.
źródło
Nazywaj mnie szalonym, ale jedną z najważniejszych cech językowych jest dostępność dobrych referencji online wraz z przykładami. Wiem, że mogę znaleźć dobre wyniki wyszukiwania dla dowolnego języka, ale naprawdę podoba mi się strona API MSDN i Java. Ułatwiają programowanie osobom, które nie mają dużego doświadczenia w danym języku.
źródło
Większa możliwość pomocy kompilatorowi w sprawdzaniu kodu.
Jako programista systemów wbudowanych zawsze używam C. Ale zawsze chciałbym mieć więcej / lepsze sposoby, aby powiedzieć kompilatorowi, czego oczekuję od mojego kodu, aby mógł go zweryfikować.
EG Mogę mieć funkcję
ale wolałbym
EG Chciałbym móc pisać twierdzenia o funkcjach, używając jakiegoś języka funkcjonalnego wyższego poziomu, takiego jak Lisp lub Haskell. Nie byłyby one skompilowane w kodzie, ale mogłyby być użyte do analizy statycznej lub dynamicznej.
źródło
Mała składnia z jak najmniejszą liczbą słów kluczowych, ponieważ pełna składnia jest trudna do nauczenia i nie poprawia czytelności.
Najgorszym przykładem jest Ada:
Wypełniające słowa, takie jak, ponieważ ... nie mają sensu w przypadku języków programowania.
źródło
public static void
.IS
służy, to nie rozumiesz Ady (czy programowałeś kiedyś Aę?):IS
Oddziela deklarację procedury od deklaracji zmiennych lokalnych, a także odróżnia specyfikację od implementacji. Oczywiście można zauważyć tylko przy porównywaniu specyfikacji i implementacji funkcji, aby zobaczyć, żeIS
ma to sens i nie jest wcale wypełniaczem.if x then …
sięif (x) …
. Wymieniliśmy parę nawiasów na kontekstowe słowo kluczowe. Ma to sens, ponieważ warunekx
może być złożonym wyrażeniem z własnymi nawiasami. Wyeliminowanie najbardziej zewnętrznej pary może drastycznie zwiększyć czytelność. Alternatywą jest oczywiście użycie dwukropka tutaj, jak w Pythonie. W rzeczywistości uważam, że większość takich jednoznacznych wypełniaczy można zastąpić dwukropkami. Nie jestem pewien, którą metodę preferuję.is
Jest wypełniacz, ponieważ Ada może pozwoliłyprocedure Hello begin ... end
bez niejednoznaczności.Chciałbym zobaczyć więcej języków do nauki . Nie tylko języki dla początkujących z ograniczeniami bardziej świętymi niż wymóg między każdym tokenem , ale języki dla osób, które już znają programowanie i chcą nauczyć się nowych pojęć lub ogólnie lepiej programować.
Dla mnie Haskell jest doskonałym przykładem tego, co rozumiem przez „język uczenia się” (choć z biegiem lat zyskał również na popularności i ogólnej użyteczności). Porzucając znaną składnię C i mając operatory kompozycji funkcji wstecz (np.
(+2) . (*3)
Jest to funkcja, która mnoży się przez 3, a następnie dodaje 2), Haskell nauczył mnie pisać krótsze funkcje. Bezwzględny moduł sprawdzania typów pomógł mi szybciej nauczyć się języka i poprawił moją zdolność logicznego myślenia o kodzie. Obie te korzyści zostały rozszerzone na inne języki, nawet na montaż.Cele uczenia się języków i języków ogólnego przeznaczenia są często sprzeczne. Nauka języka powinna być trudnym i satysfakcjonującym sposobem nauki, a także egzekwować określony styl, nawet jeśli ten styl nie jest najlepszy dla wielu aplikacji. Język ogólnego przeznaczenia powinien nadawać się do robienia rzeczy, a stosowanie abstrakcji powinno być starannie mierzone i „mieć sens”. Na przykład przy naprawianiu strony internetowej nauka o monadach byłaby ostatnią rzeczą, o której programiści myślą. Z drugiej strony, gdy ktoś uczy się programować, nie powinien przebrnąć przez nonsens „publicznej statycznej pustki”, jeśli jeszcze się nie nauczył o funkcjach.
Jeśli jesteś projektantem języka, zastanów się, czy Twój język jest językiem nauki, czy językiem stosowanym. To określi, w jakim stopniu będziesz chciał zastosować czystość w swoim projekcie.
źródło
(f ∘ g)(x) = f(g(x))
.g
najpierw stosuje się argument, a następnief
. Jeśli chcesz posortować listę, pogrupować ją i uzyskać pierwszą pozycję z tych list, napisz(map head . group . sort) list
lubmap head $ group $ sort list
lubmap head (group (sort list))
. We wszystkich przypadkach kończy się pisanie operacji wstecz. Nawiasem mówiąc, importowanieControl.Arrow
pozwala powiedzieć(sort >>> group >>> map head) list
, ale>>>
operator wydaje mi się dość niezręczny i gadatliwy.(map head . group . sort) list
czyta się jako „pierwszy element każdej grupy w rodzajulist
”, co jest całkiem naturalne - i, moim zdaniem, bardziej funkcjonalne niż(sort >>> group >>> map head) list
, co brzmi raczej imperatywnie i wstecz jako „sortuj, a następnie grupę, a następnie weź pierwszy element z każdej grupy. ..list
”.>>>
spojrzenia operator raczej niewygodne i gadatliwy - Kilka nowszych języków funkcyjnych zaczęła używać|>
jako lewy-prawy operatora łańcuchowym, który jest być może trochę łatwiej na oczy ...Ponieważ jesteśmy w 2011 roku,
obsługa wielowątkowości; nie tylko funkcje synchronizacji (blokady), ale także funkcje językowe, które sprawiają, że wielowątkowość jest tak łatwa jak pisanie pętli:
all (o w myCollection) {o.someMethod ()}
wieloparadygmat; pozwól mi, programiście, zdecydować, czy chcę zapewnić bezpieczeństwo w czasie kompilacji języka statycznego lub zwięzłość języka dynamicznego, na podstawie poszczególnych przypadków; daj mi funkcje obiektowe, funkcje funkcjonalne itp.
spójność (wiem, że wymaga trochę zarówno spójności, jak i paradygmatu ...)
źródło
uint16_t
wartościami za podpisane, a inne uznawały różnicę za niepodpisaną; nie pozwala programiście określić, które zachowanie jest pożądane.Lekkie procesy
Chciałbym mieć lekkie procesy jak w Erlang. Jest to głównie problem dla środowiska wykonawczego. Tego brakuje w JVM i .NET CLR. LWP pomaga w tworzeniu masowo współbieżnego oprogramowania. Idealnie byłoby, gdyby proces nie był droższy, ponieważ polega on na stworzeniu obiektu w języku. Chciałbym stworzyć miliony procesów w moich aplikacjach.
Jest zaimplementowany jako pula wątków z harmonogramem preemtive, więc jedno zadanie nie blokuje drugiego zadania, a zadania można zaplanować na dowolnym dostępnym rdzeniu procesora.
Wsparcie dla rekurencji ogona
Chciałbym poprzeć rekursję ogona. Może to również stanowić problem dla środowiska wykonawczego. Np. JVM nie obsługuje rekursji ogona.
Łatwe programowanie rozproszone
Chciałbym mieć wsparcie dla send ( ! ) I odbierać prymitywy do części aplikacji działających na innych komputerach na tym samym netword jak w Erlangu. Ułatwia to tworzenie skalowalnych aplikacji, np. Rozproszonych magazynów danych. Dodanie do tej serii wbudowanej w język jest również bardzo pomocne, jak w erlang. I nie tak jak w Javie, muszę to zrobić ręcznie.
źródło
Ułatwienie metaprogramowania.
ogranicz formy specjalne
W Pythonie nie ma dobrego powodu, aby drukować go nie jako wbudowaną funkcję. Wygląda i działa jak funkcja, z wyjątkiem tego, że nie chce mieć nic wspólnego z parens.
Czy naprawdę potrzebujemy
for
,foreach
,while
a jak każdy jako własnej specjalnym formularzu. Co powiesz na jeden konstrukt zapętlający i kilka domyślnych makr, aby zapewnić cukier składniowy wariantów postaci zapętlonych.metaprogramowanie formularzy specjalnych
form['if'](test-fn, body-fn)
źródło
each
która przyjmuje blok kodu jako argument. (Ruby ma równieżfor
iwhile
pętle, ale żaden szanujący się programista Ruby faktycznie korzysta z nich.)do..while
wyglądałaby pętla, gdyby istniał jeden typ pętli, który miał ocenę na górze? To nie wyglądałoby jak pętla do… podczas.Możliwości sieciowe
Język, który jest dostarczany bez wsparcia sieci, jest dość kiepski w dzisiejszym świecie.
Większość aplikacji w świecie rzeczywistym musi komunikować się przez sieć:
Oczywiście jest to także podstawa obsługi przetwarzania rozproszonego / w chmurze.
źródło
Lubię język programowania, który jest łatwy do nauczenia i łatwy do łączenia w celu tworzenia nowych rzeczy.
Na przykład, chociaż atrakcyjne jest posiadanie wielu sposobów na napisanie czegoś, myślę, że lepiej jest mieć tylko jeden lub dwa sposoby na napisanie tego. W ten sposób program jest łatwiejszy w utrzymaniu.
Język, którego koncepcje mogą dotyczyć wszystkich elementów, jest bardzo pomocny (myślę, że nazywa się to ortogonalnością). Więc następnym razem, gdy napotkasz nową funkcję językową, możesz wydedukować, jak z niej korzystać.
Rozumiem, że czasami składnia języka musi przeszkadzać w osiągnięciu lepszych wyników w fazie kompilacji / interpretacji, ale czasami wydaje mi się, że projektant języka przekazuje tę pracę programistom. Na przykład ciągi wielowierszowe w Javie lub JavaScript.
Wreszcie, składnia języka jest interfejsem użytkownika i jako taka powinna być przejrzysta, zwięzła, intuicyjna, łatwa w użyciu i szanować twoje nawyki.
źródło
źródło
Dodanie funkcji do istniejącego języka programowania. Tak więc nowy język B jest starą wersją językową A i cechą X.
Istniejące przykłady:
źródło
Jeśli chodzi o technologię / platformę / język / bazę danych itp., W większości przypadków chodzi o wydajność. W przyszłości wiele dzisiejszych programów może być projektowanych w języku graficznym, ponieważ mamy moc obliczeniową.
Mam nadzieję na dzień, w którym będziemy mieli moc obliczeniową i język, w którym projektujesz swoją aplikację i nie musisz się martwić o szczegóły językowe .
Aktualizacja: wysyłam link do takiego języka LabView
Aktualizacja: powinienem bardziej wyjaśnić, co rozumiem przez „moc obliczeniową”. Wydajność skompilowanego oprogramowania może nie być tak duża, jak skompilowane oprogramowanie oparte na języku składni. Myślę o programowaniu graficznym jako o wyższym poziomie programowania i może być więcej kosztów ogólnych. Dzisiejsze komputery mogą i łatwo uruchamiają graficzne języki programowania.
źródło