Dlaczego jest tyle języków programowania?

130

Jestem dość biegły w C / C ++ i potrafię poruszać się po różnych językach skryptowych (awk / sed / perl). Zacząłem używać Pythona o wiele więcej, ponieważ łączy on kilka fajnych aspektów C ++ z możliwościami skryptowymi awk / sed / perl.

Ale dlaczego jest tak wiele różnych języków programowania? Domyślam się, że wszystkie te języki potrafią robić to samo, więc dlaczego nie trzymać się jednego języka i używać go do programowania komputerów? W szczególności, czy jest jakiś powód, dla którego powinienem znać język funkcjonalny jako programista?

Niektóre powiązane lektury:

Suresh
źródło
2
istnieje również różnica między OO a innymi niż OO. Ponadto niektóre języki są dostarczane z ładnymi pakietami: R, Maple, Matlab, Mathematica, których często brakuje w innych językach.
Artem Kaznatcheev,
4
Już zapytać dla programistów programmers.stackexchange.com/q/7551/45322
alain.janinm
2
W przypadku implementacji algorytmów równoległych lepsze jest programowanie funkcjonalne, ogólnie rzecz biorąc, gdy masz zmienne obiekty, lepiej zastosować paradygmat OO, w przeciwnym razie (jeśli chcesz radzić sobie z obiektami niezmiennymi ) lepiej zmień go na model funkcjonalny. Ten scenariusz powszechnie występuje w przetwarzaniu równoległym. Również niektóre doskonałe wzorce OO, takie jak płynny interfejs i łączenie metod, działają jak paradygmat funkcjonalny.
4
Dlaczego jest tyle samochodów? Dlaczego jest tyle samolotów? A co z ŁODZI! Mam na myśli naprawdę! Schodzisz do oceanu i tam są wszystkie rodzaje Dang! Jaki jest sens tych różnych rzeczy?!?!? To nieefektywne! To marnotrawstwo !! A jaki jest cholerny sens tych wszystkich różnych wyborów?!?!? Rany - mądrzy ludzie! Nikt nie mógłby potrzebować niczego oprócz Yugo, F-150 i liniowca oceanicznego! Och, tak, samoloty - MD-80 będą dobrze działać na prawie wszystko. Tam. Teraz, że to wszystko rozliczane ... :-)
Bob Jarvis

Odpowiedzi:

116

Języki programowania ewoluują i są ulepszane z czasem (innowacje).

Ludzie biorą pomysły z różnych języków i łączą je w nowe języki. Niektóre funkcje są ulepszone (mechanizmy dziedziczenia, systemy typów), niektóre są dodawane (wyrzucanie elementów bezużytecznych, obsługa wyjątków), niektóre są usuwane ( gotoinstrukcje, manipulacje wskaźnikami niskiego poziomu).

Programiści zaczynają używać języka w określony sposób, który nie jest obsługiwany przez żadną konstrukcję języka. Projektanci języków identyfikują takie wzorce użytkowania i wprowadzają nowe abstrakcje / konstrukcje językowe, aby wspierać takie wzorce użytkowania. W języku asemblera nie było żadnych procedur. Brak klas w C. Brak obsługi wyjątków w (wczesnym) C ++. Brak bezpiecznego sposobu ładowania nowych modułów we wczesnych językach (łatwe w Javie). Brak wbudowanych wątków (łatwa w Javie).

Naukowcy zastanawiają się nad alternatywnymi sposobami wyrażania obliczeń. Doprowadziło to do powstania Lisp i funkcjonalnej gałęzi językowej drzewa językowego, Prolog i gałęzi programowania logiki, Erlanga i innych modeli programowania opartych na aktorach.

Z biegiem czasu projektanci / badacze języków zaczęli lepiej rozumieć wszystkie te konstrukcje i ich interakcje, a także projektować języki tak, aby zawierały wiele popularnych konstrukcji, wszystkie zaprojektowane tak, aby ze sobą współpracowały. W rezultacie powstają wspaniałe języki, takie jak Scala, który ma obiekty i klasy (wyrażone za pomocą cech zamiast pojedynczego lub wielokrotnego dziedziczenia), funkcjonalne funkcje programowania, algebraiczne typy danych ładnie zintegrowane z systemem klas i dopasowaniem wzorców oraz współbieżność oparta na aktorach.

Badacze, którzy wierzą w systemy typu statycznego, starają się poprawić swoją ekspresję, dopuszczając takie rzeczy, jak typowe klasy ogólne w Javie (i wszystkie cudowne rzeczy w Haskell), aby programista uzyskał więcej gwarancji przed uruchomieniem programu, że rzeczy nie będą poszło źle. Systemy typu statycznego często nakładają na programistę duże obciążenie (wpisywanie typów), więc badania poświęcono na zmniejszenie tego obciążenia. Języki takie jak Haskell i ML pozwalają programiście pomijać wszystkie adnotacje typu (chyba że robią coś trudnego). Scala pozwala programiście pomijać typy w obrębie całego zestawu metod, aby uprościć pracę programisty. Kompilator wyszukuje wszystkie brakujące typy i informuje programistę o możliwych błędach.

Wreszcie, niektóre języki są zaprojektowane do obsługi określonych domen. Przykłady obejmują SQL, R, Makefiles, język wprowadzania Graphviz, Mathmatica, LaTeX. Włączenie funkcjonalności tych języków do języków ogólnego przeznaczenia (bezpośrednio) byłoby dość kłopotliwe. Te języki oparte są na abstrakcjach specyficznych dla ich konkretnej dziedziny.

Bez ewolucji w projektowaniu języka programowania wszyscy nadal używalibyśmy języka asemblerowego lub C ++.

Jeśli chodzi o znajomość funkcjonalnego języka programowania : języki funkcjonalne pozwalają na różne obliczenia, często bardziej zwięzłe niż przy użyciu innych języków programowania. Zastanów się nad różnicą między C ++ a Pythonem i pomnóż ją przez 4. Mówiąc poważniej, jak już wspomniano w innej odpowiedzi, programowanie funkcjonalne daje inny sposób myślenia o problemach. Dotyczy to wszystkich innych paradygmatów; niektóre lepiej nadają się do niektórych problemów, a niektóre nie. Właśnie dlatego języki z wieloma paradygmatami stają się coraz bardziej popularne: możesz używać konstrukcji z innego paradygmatu, jeśli potrzebujesz, bez zmiany języka i, co trudniejsze, możesz łączyć paradygmaty w ramach jednego oprogramowania.

Dave Clarke
źródło
1
W pełni zgadzam się. Interesuje mnie, gdzie języki paradygmatu (np. Scala) będą za kilka lat. Jeśli umożliwią łatwą integrację DSL, możemy faktycznie zaobserwować stopniowy spadek liczby języków.
Raphael
2
Bardzo szczegółowa odpowiedź! Możemy uznać, że większość języków programowania może być odpowiednikiem Turinga, ale to nie znaczy, że obsługiwana przez nie abstrakcja jest odpowiednia dla każdej problematycznej dziedziny.
CyberFonic
Umieszczenie asemblera i C ++ w tym samym pudełku boli moje serce. C ++ bardzo ewoluował !! Zwłaszcza od wersji C ++ 11 i nowszych.
Peregring-lk
66

tldr: Nie ma języka srebrnej kuli.

Mam nadzieję, że mnie nie wytoczą, ale oto zdjęcie z jednej z prezentacji Stanforda.

wprowadź opis zdjęcia tutaj

Decydując się na wybór języka, możesz wybrać tylko 2 z tych 3 funkcji .

I dlatego ludzie są smutni i chcą wynaleźć superjęzyk, który obejmie wszystkie 3 z nich.

W rzeczywistości istnieje ogromna lista wymagań (niektóre z nich można zobaczyć w innych odpowiedziach), ale po prostu dodają one szczegóły do ​​podstawowych funkcji. Ponadto istnieją powody historyczne i polityczne, aby preferować jeden język nad drugim.

Kombinacje takich czynników dają nowy język.

( I słyszałem, że każdy dobry programista powinien stworzyć swój własny język;) )

mniam mniam mniam
źródło
11
Z biegiem czasu trójkąt kurczy się w tym sensie, że rogi zbliżają się do siebie ... Mam nadzieję / marzę.
Dave Clarke
1
Wydajność i ogólność, można mniej więcej porównać, ale dodam, że doświadczenie w języku daje większą produktywność niż w danym języku, nie jest sprawiedliwe porównywanie samej „produktywności języków”, ponieważ potrzebujesz przypuszczenia, że ​​masz wiedzę i doświadczenie wszystkie, bardzo mało prawdopodobna hipoteza.
Hernan_eche
To interesujące stwierdzenie i rodzaj przypomina mi twierdzenie CAP. Czy to tylko nieformalna argumentacja, czy można udowodnić trójkąt?
evnu,
1
@evnu, oto quasiformal argument jednej części: zakładając, że ogólność oznacza, że ​​prawidłowe programy o dowolnej długości n w języku L obejmują większą przestrzeń problemów, każda podprzestrzeń problemów jest objęta tylko ułamkami długości n programów. Gdyby programy o długości n poza określoną podprzestrzenią znajdowały się w podprzestrzeni, miałbyś większe szanse na znalezienie krótszego programu, który rozwiązałby twój problem (więc prawdopodobnie byłbyś bardziej produktywny), ale język byłby mniej ogólny - - gorzej rozwiązuje problemy w innych podprzestrzeniach (tj. przy dłuższych programach).
Jonas Kölker
Jest to dobry argument, że potrzebujesz co najmniej dwóch języków programowania, a także dużej liczby języków specyficznych dla domeny, obejmując w ten sposób wszystkie trzy boki trójkąta. Mamy wiele, wiele, wiele więcej. (I umieściłbym c na najwyższym wierzchołku trójkąta, ale to dość mały kłopot).
Peter Shor,
25

Świat jest pełen rzeczy, które mają wiele różnych odmian: edytory tekstu, samochody, projekty domów, napoje, cukierki, długopisy, łopaty itp. Przyczyny, dla których mamy tak wiele, można sprowadzić do kilku zasad:

  • Ktoś uważa, że ​​mogą ulepszyć istniejące produkty
  • Inne względy wymagają innego projektu (pomyśl: domy na palach vs. domy na betonowych płytach)
  • Nowa kategoria produktu zaspokaja potrzebę tam, gdzie wcześniej nie istniała

Wejdź do dowolnego sklepu z artykułami biurowymi i spójrz na sekcję „przybory do pisania” - istnieją setki odmian długopisów. Wszystkie robią mniej więcej to samo: dostarczają atrament na powierzchnię do pisania. Ale każde pióro, które widzisz na wystawie, jest dostępne, ponieważ jest to jeden z trzech powyższych powodów.

  • Pióra wieczne na naboje są ulepszeniem piór wiecznych zamaczanych, które same w sobie są ulepszeniem piór piórowych.
  • NASA potrzebowała długopisu, który mógłby pisać przy braku grawitacji, więc wynaleziono pióro kulkowe pod ciśnieniem.
  • Sam pierwszy długopis mógł być równie ostrym kijem zanurzonym w smole lub krwi; wcześniej ludzie skrobali razem skały lub rozmazywali pigmenty na ścianach futrem. (Tylko zgadnij.)

Ewolucja piór będzie kontynuowana, ponieważ żaden produkt nie spełnia potrzeb każdego użytkownika. Niektóre długopisy są tanie i jednorazowe, inne są drogie i wykonane z materiałów wysokiej jakości; niektórzy używają żeli, niektórzy używają tuszu, niektórzy używają pigmentów; niektóre mają zakręcane czapki, niektóre wcale nie mają czapek; szerokie beczki, wąskie beczki, okrągłe beczki, kwadratowe beczki; krótki długi; czerwony, biały, czarny, niebieski. Itd itd.

Ale wystarczy o długopisach.

Nasze obecne niezliczone języki programowania sięgają pierwszych: numerycznych kodów maszyn dla wczesnych komputerów w latach 40. Prymitywne, trudne w użyciu i pracochłonne, aby wejść do komputera, ale zrobiły to. Niedługo potem programiści przypisali do kodów maszynowych słowa mnemoniczne (takie jak ADD, CALL, LOAD), co dało początek klasie języków zwanych „asemblerami”.

Różne architektury procesorów wymagały różnych kodów mnemonicznych, w zależności od specyficznych funkcji bazowych maszyn. Uwzględnienie tych różnic oznaczało wymyślenie różnych języków asemblera.

(Być może już teraz widzisz, dokąd to zmierza ...)

Programiści przyjrzeli się programom języków asemblera i zobaczyli wzorce: te same sekwencje instrukcji zostaną wykorzystane do utworzenia pętli, warunków, przypisania zmiennych, wywołań funkcji i tak dalej. Tak narodziły się proceduralne języki programowania. Języki te zawierały grupy instrukcji pod parasolem, takie jak „if”, „while”, „let” itp.

Z matematycznej analizy programowania komputerowego powstały języki funkcjonalne - zupełnie nowy sposób patrzenia na obliczenia. Nie lepiej, nie gorzej, po prostu inaczej.

A potem jest zorientowane obiektowo, statycznie, dynamicznie, późne wiązanie, wczesne wiązanie, niskie zużycie pamięci, wysokie użycie pamięci, możliwość równoległego, języki dla określonych zastosowań i tak dalej.

Ostatecznie mamy różne języki programowania, ponieważ chcemy różnych języków programowania. Każdy projektant języka ma własne pomysły na to, jak będzie wyglądał i działał ich język „marzeń”. Różnorodność to dobra rzecz.

Barry Brown
źródło
Nie widzę tutaj żadnego ważnego powodu, dla którego powinniśmy mieć wiele języków poza tym, że ludzie chcą z jakichkolwiek powodów.
Raphael
To jest dokładnie to. Programiści z natury rozwiązują problemy. Aby rozwiązać problemy, potrzebują narzędzi, które często przybierają formę języków programowania. Jeśli narzędzia nie pomogą im rozwiązać problemu tak, jak chcą, wymyślają nowe narzędzia. Pomyśl o tym w ten sposób: ponieważ narzędzia są oprogramowaniem, a nowe oprogramowanie jest pisane w celu rozwiązywania nowych problemów, same narzędzia mogą być problemami do rozwiązania. Problemy te rozwiązuje się, tworząc nowe narzędzia.
Barry Brown
Tylko jedna nitka: funkcjonalna gałąź języków jest rezultatem matematycznych pomysłów, jak wyrazić to, co dziś nazywamy „informatyką”, które zaczęto rozważać około 50 lat przed pierwszymi komputerami. Nie bez powodu LISP (w jakiejś formie) jest drugim najstarszym językiem w okolicy, pierwszym z nich jest FORTRAN.
vonbrand,
20

Funkcjonalne języki programowania są zwykle oparte na innym (ale równoważnym pod względem mocy) modelu obliczeń: rachunek lambda . Istnieje kilka nietypowych (z użyciem języka Python) języków, takich jak LISP, Schemat (używany w powszechnie rozpoznawalnej książce / kursie o strukturze i interpretacji programów komputerowych ) oraz języki o typie statycznym, takie jak Haskell, ML, F #.

SICP jest tym, co skłoniło mnie do programowania funkcjonalnego, ale inni ludzie polecają ten artykuł Johna Hughesa i ten wywiad z nim.

Na przykład Microsoft wprowadza teraz programowanie funkcjonalne, które umieściło F # (ich język funkcjonalny dla .NET) w VS2010 i 11; zatrudniają również niektórych programistów Haskell w MSR, IIRC.

Zauważ, że istnieją również funkcjonalne języki programowania inne niż rachunek lambda, takie jak Refal , który opiera się na dopasowywaniu wzorców i przepisywaniu.

Ponieważ poziom abstrakcji w językach funkcjonalnych jest inny, Twoje podejście do rozwiązywania problemów zmienia się, gdy używasz funkcjonalnych technik programowania. Niektórzy twierdzą, że może to ogólnie uczynić cię lepszym programistą.

Daniil
źródło
1
Kolejną interesującą klasą języków są logiczne języki programowania, takie jak Prolog. Miałem bardzo ograniczone doświadczenie z DataLog, więc może ktoś inny mógłby napisać o tym odpowiedź?
Daniil
2
Zgadzam się, że potrzebujemy języka programowania dla każdego paradygmatu programowania: imperatywny, OO, deklaratywny, funkcjonalny itp. Ale to nie wyjaśnia, dlaczego mamy tak wiele, powiedzmy, języków OO.
Dai,
@Dai, cóż, naprawdę? Podstawa teoretyczna nie jest jedyną cechą języka. Na przykład, można powiedzieć, że kluczową cechą Java lub C # jest (w porównaniu do C ++) maszyna wirtualna, co znacznie różni Javę.
Daniil
Ale jeśli zarówno C #, jak i Java korzystają z koncepcji maszyny wirtualnej, dlaczego nie używamy identycznej składni dla obu języków? Myślę, że każdy projektant ma swoje mocne pomysły na to, jak powinien wyglądać jego język i ma tendencję do tworzenia własnego standardu.
Dai,
@Dai, w końcu istnieje wiele drobnych różnic między C # a Javą. Plus, myślę, że był jakiś spór prawny o maszynę wirtualną Java dla Windows lub coś w tym rodzaju.
Daniil
19

W szczególności, czy jest jakiś powód, dla którego powinienem znać język funkcjonalny jako programista?

Tak. Ponieważ haskell zmienił mój sposób myślenia. To może zmienić sposób myślenia.

Historia: Kiedyś myślałem, że mogę nauczyć się dowolnego języka programowania w ciągu jednego dnia. Pewnego dnia założyłem Haskell. Za pół dnia skończyłem wszystko, co było przed monadami. Teraz minął rok od tamtego dnia i wciąż beznadziejnie utknąłem w Monadach.

Czytać:

  1. Wiki o językach i myślach

  2. Notacja jako narzędzie do przemyślenia Kennetha E. Iversion, wykład Turinga

Ale dlaczego jest tak wiele różnych języków programowania?

Notacja jest narzędziem do myślenia. Potrzebujemy różnych dostosowanych do potrzeb notacji, aby wygodnie radzić sobie z różnymi myślami. Tworzymy więc nowe języki.

Również przeczytać . ;-)

Pratik Deoghare
źródło
5
Nawrót jest boski!
Pratik Deoghare
4
iterować jest człowiek?
Suresh
1
Nie jestem pewien, czy to była dobra reklama dla Haskella. ;)
Barry Brown
@Pratik Deoghare. Nauka Haskell w ciągu dnia prawdopodobnie nie była dobrym pomysłem. Powiedziałbym, że przeczytałem dobrą książkę o programowaniu funkcjonalnym, takim jak Bird i Wadler, i nie spiesz się, robiąc to. Wtedy monady mogą nie być takie trudne.
Uday Reddy
„Skończyłem wszystko, co było przed monadami, w ciągu pół dnia.” Naprawdę? Nauczyłeś się typek, funktorów, ADT, rodzajów itp. W pół dnia? To niemożliwe. LYAH ma monady w rozdziale 12 z 14. RWH nie ma monad do rozdziału 6, i są wprowadzane bardzo stopniowo - pełna definicja znajduje się w rozdziale 14.
sdcvvc
13

Trudno znaleźć programistę, który w pewnym momencie nie byłby sfrustrowany ograniczeniami używanego języka i postanowił podrapać się. W ten sposób rodzi się nowy język - lub dialekt istniejącego.

Abadi i Cardelli w „A Theory of Objects” rozwijają całą rodzinę języków programowania od podstaw zorientowanych obiektowo. Dowodzą, że programowanie funkcjonalne jest szczególnym przypadkiem OO, ale nie odwrotnie.

Wymyślanie czegoś nowego jest zabawne, dlatego ludzie mają większe szanse na stworzenie innego języka niż na ulepszenie istniejącego. Oczywiście są opiekunowie języków, którzy nie przyjmują zmian w swojej wizji. Najlepszym przykładem jest przepaść między zwolennikami Common Lisp i Scheme.

CyberFonic
źródło
3
Teoria obiektów nie przedstawia całej rodziny użytecznych języków programowania. Stanowi podstawę dla obiektowych języków programowania, a także dziwny, ponieważ nie jest oparty na klasach. Nie widzę związku między „teorią obiektów” a programowaniem funkcjonalnym. Rachunki obiektowe nie mają na przykład pojęcia lenistwa. Prowadzone są również badania kodujące koncepcje OO pod względem funkcji i zapisów, na przykład praca Pierce'a pod koniec lat 90.
Dave Clarke
11

Dlaczego na świecie jest tyle krajów? Czy nie byłoby łatwiej, gdybyśmy mieli 5 lub 6 supermocarstw, a nawet jedno uniwersalne królestwo Ziemi? Łatwo jest argumentować, dlaczego nie byłoby lepiej --- na początek konkurencja różnych krajów może prowadzić do postępu, a z punktu widzenia demokracji, praw człowieka itp. Wiele krajów może być lepszych niż jeden - - ale to nie wyjaśnia, dlaczego mamy wiele krajów. To wyjaśnia tylko, dlaczego wiele krajów byłoby lepszych .

Podobnie możesz zapytać, dlaczego tak wiele różnych ludzkich języków? Polski, arabski, mandaryński ... Czy nie byłoby łatwiej, gdyby istniał tylko jeden język? Można by się kłócić w obie strony, ale byłyby to powody, dla których byłoby lepiej, gdyby życie było w taki czy inny sposób. Nie tłumaczyłoby przyczyn tak wielu różnych języków ludzkich.

Chodzi o to, że na świecie jest wielu ludzi i wszyscy robimy wszystko, wszyscy mamy swoje opinie, wszyscy chcemy rządzić i mieć własny kraj lub język programowania, i często myślimy, że wiemy lepiej niż inni, a przynajmniej nie zawracaj sobie głowy zrozumieniem, co mają do zaoferowania inni.

Przeczytaj ten bardzo pouczający post na blogu: Dlaczego tak wiele frameworków sieciowych w języku Python? Najwyraźniej w Pythonie jest około 50 frameworków internetowych. To jest po prostu śmieszne; nie ma absolutnie żadnego rozsądnego uzasadnionego powodu. Ale autor postu odpowiada: istnieje wiele frameworków internetowych Python, ponieważ tak łatwo jest je stworzyć . Nie potrzebujesz racjonalnego powodu, że jest więcej frameworków Python lub więcej języków programowania. Ludzie będą tworzyć nowe, ponieważ nie wiedzą, co jest już dostępne, lub dlatego, że mają nadzieję, że mogą zarabiać pieniądze, lub po prostu dlatego, że tworzenie nowych rzeczy jest zabawne!

Pozwól mi opisać osobisty przykład. Około 10 lat temu pisałem trochę kodu C ++ dla fińskiej firmy. Wiesz, w Finlandii mają te ogromne ciężarówki, które, cóż, podróżują na duże odległości i dostarczają wiele rzeczy z jednego miejsca do drugiego. Jestem pewien, że w Ameryce są takie ciężarówki. Typowym problemem jest więc upewnienie się, że wszystkie 24 opony są w porządku. Oczywiście istnieje sprawdzona technologia: można monitorować ciśnienie i temperaturę, a drastyczne zmiany wskazują, że coś poszło nie tak. Oczywiście cała ta technologia jest zastrzeżona, opatentowana i ma wszystkie implikacje. (Pamiętaj: patenty mają promować innowację!) Ta fińska firma chciała wykryć stan opon po ... dźwięku. Pomysł polegał na zainstalowaniu mikrofonów w celu odsłuchu dźwięku dochodzącego ze wszystkich opon i wykonania jakiejś magii przetwarzania sygnałów na tych dźwiękach, aby sprawdzić, czy jedna z opon ma jakiś problem, a ja robiłem prototyp tego szaleństwa. (Mieli nawet dedykowane laboratorium do nagrywania dźwięków próbnych; kiedy przysłali mi imponujący zapis wideo z konkretnej okazji, kiedy udało im się eksplodować próbną oponę po poddaniu jej ciśnieniu 5 lub 10 ton i podgrzaniu jej do absurdalnej temperatury .) Oczywiście, znowu, nie było żadnego konkretnego racjonalnego powodu tego rozwoju, z wyjątkiem tego, że była fajna i niektórzy ludzie chcieli zarabiać pieniądze. Zrozum także, że istnieje wiele powodów, dla których ktoś zacząłby rozwijać nowy język programowania. Nie ma potrzeby ani nawet możliwości uczenia się ich wszystkich. (Mieli nawet dedykowane laboratorium do nagrywania dźwięków próbnych; kiedy przysłali mi imponujący zapis wideo z konkretnej okazji, kiedy udało im się eksplodować próbną oponę po poddaniu jej ciśnieniu 5 lub 10 ton i podgrzaniu jej do absurdalnej temperatury .) Oczywiście, znowu, nie było żadnego konkretnego racjonalnego powodu tego rozwoju, z wyjątkiem tego, że była fajna i niektórzy ludzie chcieli zarabiać pieniądze. Zrozum także, że istnieje wiele powodów, dla których ktoś zacząłby rozwijać nowy język programowania. Nie ma potrzeby ani nawet możliwości uczenia się ich wszystkich. (Mieli nawet dedykowane laboratorium do nagrywania dźwięków próbnych; kiedy przysłali mi imponujący zapis wideo z konkretnej okazji, kiedy udało im się eksplodować próbną oponę po poddaniu jej ciśnieniu 5 lub 10 ton i podgrzaniu jej do absurdalnej temperatury .) Oczywiście, znowu, nie było żadnego konkretnego racjonalnego powodu tego rozwoju, z wyjątkiem tego, że była fajna i niektórzy ludzie chcieli zarabiać pieniądze. Zrozum także, że istnieje wiele powodów, dla których ktoś zacząłby rozwijać nowy język programowania. Nie ma potrzeby ani nawet możliwości uczenia się ich wszystkich. kiedy przysłali mi imponujący zapis wideo z konkretnej okazji, kiedy udało im się eksplodować próbną oponę po poddaniu jej ciśnieniu 5 lub 10 ton i podgrzaniu jej do absurdalnej temperatury.) Oczywiście, znowu, nie było żadnej szczególnej racjonalności powód tego rozwoju, z wyjątkiem tego, że było fajnie i niektórzy ludzie chcieli zarabiać pieniądze. Zrozum także, że istnieje wiele powodów, dla których ktoś zacząłby rozwijać nowy język programowania. Nie ma potrzeby ani nawet możliwości uczenia się ich wszystkich. kiedy przysłali mi imponujący zapis wideo z konkretnej okazji, kiedy udało im się eksplodować próbną oponę po poddaniu jej ciśnieniu 5 lub 10 ton i podgrzaniu jej do absurdalnej temperatury.) Oczywiście, znowu, nie było żadnej szczególnej racjonalności powód tego rozwoju, z wyjątkiem tego, że było fajnie i niektórzy ludzie chcieli zarabiać pieniądze. Zrozum także, że istnieje wiele powodów, dla których ktoś zacząłby rozwijać nowy język programowania. Nie ma potrzeby ani nawet możliwości uczenia się ich wszystkich.

Oczywiście wszystko to obowiązuje tylko wtedy, gdy wierzysz w ewolucję. Jeśli wierzysz w jakąś formę inteligentnego projektu, że Bóg stworzył również wszystkie języki programowania, to musiałbyś znaleźć cel za tym tłumem. Być może Bóg chciał promować konkurencję między różnymi językami programowania, aby sztuka tworzenia oprogramowania osiągnęła najwyższy możliwy poziom.

Podsumowując, jest wiele osób, wiele krajów, wiele języków programowania. Taka jest natura życia! Bądźmy za to wdzięczni: oznacza to po prostu, że dziedzina programowania / informatyki jest bardzo żywa i kwitnie.


źródło
bardzo idealna odpowiedź, nie wiem, dlaczego nie została zaakceptowana!
Am_I_Helpful
8

Dlaczego jest tyle różnych języków programowania?

Ponieważ trzeba dokonać wyboru:

  • Tryb specyfikacji: Tryb rozkazujący vs. funkcjonalny
  • Wpisywanie: Pisanie statyczne a pisanie dynamiczne
  • Kolejność oceny: call-by-value vs. call-by-name
  • Modułowość: oparty na klasie vs. abstrakcyjny typ danych
  • Model wykonania: sekwencyjny vs. współbieżny

Na szczęście dwie ostatnie są nieistotnymi dychotomiami, tzn. Obie opcje można umieścić w jednym języku programowania. Ale pierwsze trzy dychotomie dają 8 kombinacji. Nawet w idealnym świecie istniałoby co najmniej 8 języków programowania. Podczas drążenia w dół, w ramach poszczególnych paradygmatów pojawiałyby się dalsze, bardziej zróżnicowane opcje projektowania. Na przykład, jeśli ktoś zdecyduje się na oparty na klasach język o typie statycznym, istnieją różne sposoby projektowania systemu typów. Nie ma jeszcze kanonicznego sposobu na zrobienie tego. Jeśli zdecydujemy się na współbieżny język programowania, istnieją różne sposoby reprezentowania współbieżności: semafory, warunkowe regiony krytyczne, monitory, przekazywanie komunikatów (synchroniczne vs. asynchroniczne). W ramach synchronicznego przekazywania wiadomości

Część badań, które wykonujemy w teorii języków programowania, poświęcona jest rozwiązaniu tych dychotomii. Na przykład pracowałem nad rozwiązaniem dychotomii między programowaniem imperatywnym i funkcyjnym w artykule zatytułowanym „ Zadania dla języków aplikacji ”, a nasza metoda została teraz przyjęta przez Haskell, dzięki czemu jest to zarówno język funkcjonalny, jak i imperatywny. To nie znaczy, że dychotomia jest w pełni rozwiązana. Programista Haskell wciąż stoi przed wyborem, czy rozwiązać swój problem funkcjonalnie, czy koniecznie. Luca Cardelli pracował nad rozwiązaniem dychotomii pisania statycznego vs. dynamicznego. Paul Levy pracował nad rozwiązaniem dychotomii call-by-name vs. call-by-name . Nie wszystkie z tych wyników zostały jeszcze zaimplementowane w prawdziwych językach programowania.


Jeśli wszystkie te języki potrafią robić to samo, dlaczego nie trzymać się jednego języka i używać go do programowania komputerów?

Ponieważ dla programisty w prawdziwym świecie nie wystarczy po prostu coś zrobić. Ma również znaczenie, jak to się robi. Po prawidłowym wykonaniu domena problemu jest wiernie reprezentowana w programie, modułowość problemu zostaje zachowana, a programy stają się łatwe do zrozumienia, modyfikacji i utrzymania. Wszystkie te rzeczy wpływają na koszty opracowania i utrzymania programu. Wpływają również na niezawodność i bezpieczeństwo oprogramowania.

Na przykład wiele osób korzysta z programu o nazwie „ Quicken ” dla kont finansowych. Oryginalny program został opracowany w wewnętrznej wersji Visual Basic i był całkiem niezły. Trudno było jednak go przedłużyć i utrzymać. Z biegiem lat, gdy firma próbowała rozszerzyć go o nowe funkcje, program stawał się coraz bardziej niespokojny z milionami niezadowolonych klientów na całym świecie. Prawdopodobnie skorzystają na przeprojektowaniu oprogramowania w silnie typowym obiektowym języku programowania.


W szczególności, czy jest jakiś powód, dla którego powinienem znać język funkcjonalny jako programista?

Historycznie „programowanie funkcjonalne” zostało wymyślone przez Godela, Kleene i Churcha zgodnie ze standardową praktyką matematyczną, a „programowanie imperatywne” zostało wymyślone przez Turinga, aby uściślić pojęcie obliczeń mechanicznych. Przed Turingiem nie ma dowodów, że matematyka kiedykolwiek analizowała idee programowania imperatywnego. (Chociaż wszystkie tradycyjne algorytmy matematyczne zostały wyrażone w „imperatywnym stylu”, ich podstawowa treść była nadal funkcjonalna.) Zatem programowanie imperatywne jest bardzo nowe dla ludzkiej cywilizacji, a jego matematyka wciąż nie jest zbyt dobrze rozumiana. Najważniejszym powodem, dla którego każdy powinien znać programowanie funkcjonalne, jest zrozumienie, w jaki sposób programowanie może być matematyczne. (Nie przyznam, że programowanie imperatywne jest niematematyczne, w co chcielibyście uwierzyć funkcjonalni programiści. Zgadzam się jednak, że przy obecnym stanie wiedzy nie wiemy jeszcze, jak matematycznie programować imperatywnie. Wielu z nas pracuje właśnie nad tym problemem).

Uday Reddy
źródło
1

Możesz patrzeć na to jak na ewolucję.

Na początku komputery były programowane wyłącznie za pomocą kodów binarnych. Następnie wprowadzono mnemoniki i języki asemblera, w dużej mierze zależne od użytego procesora.

Po wprowadzeniu języków wyższego poziomu (poziom 3) (Pascal, C, ADA, Cobol), niektóre bardzo ogólne (jak C), niektóre bardziej odpowiednie do obsługi danych (Cobol), niektóre do obliczeń (Fortran).

Potem powstały języki 4. poziomu, takie jak języki logiczne (jak Prolog). Najbardziej ogólne języki to następcy języków trzeciego poziomu; niektóre z nich to Java, C #.

Widzimy także języki specyficzne dla Internetu / sieci, takie jak ASP.NET, PHP.

I języki dla konkretnej domeny (DSL), które w większości działają razem z ogólnym językiem.

Są też języki dla dzieci do nauki programowania, takie jak LOGO.

Również języki do szybkiego pisania kodu, takie jak Python, Ruby itp., Języki do obsługi XML (XSLT).

I prawdopodobnie zapomniałem wiele języków, a nawet kategorii języków.

Michel Keijzers
źródło
1
Twoja chronologia jest zagmatwana. Prolog pochodzi z 1972 roku, który jest młodszy od Ady (1983). Nie wiem, co rozumiesz przez „następców języków trzeciego poziomu”; kilka języków nie jest potomkami Fortranu, w tym C i Pascal (którzy zrodzili Adę).
prosfilaes,
1
@prosfilaes, sposób pomylić. FORTRAN był pierwszym nadal używanym językiem, potem LISP, a potem COBOL. Algol został zdefiniowany do publikowania algorytmów, nie do użytku maszynowego (ale i tak powstały pewnego rodzaju kompilatory), z ofshots Pascal i później C. PL / 1 był dziwną mieszanką FORTRAN i COBOL ze strukturami kontrolnymi Algolu.
vonbrand,
1

inne odpowiedzi są dobre, dodają kilka nowych punktów widzenia. jak pisze DC, języki ewoluują tak jak prawdziwe ludzkie języki! i zapożyczają od siebie koncepcje i składnię jak prawdziwe ludzkie języki. innymi słowy, istnieje także dość realne studium etymologii języków komputerowych.

oznacza to również, że była to długa historia i harmonogram, który zaczął się około lat 30. XX wieku od rachunku lambda .

istnieje silna wzajemna zależność / synergia / symbioza między teorią a aplikacją z językami programowania. wymyślono nowe aplikacje, co prowadzi do nowych teorii i odwrotnie. język programowania jest pod wieloma względami pomostem między teorią a aplikacją .

ciekawym studium przypadku z historii jest Fortran. nie jest to dobrze znane, ale wcześniejsze wersje Fortran (głównie przed Fortran77) miały niejednoznaczną gramatykę . oznacza to, że to samo polecenie może być legalnie „interpretowane” / kompilowane na różne sposoby przez kompilator, ponieważ istniało wiele poprawnych „interpretacji” (to nie jest to samo techniczne pojęcie „interpretowanych” języków).

więc teoria gramatyki formalnej była rozwijana w czasie, gdy wynaleziono Fortran, i był to mały kryzys, gdy odkryto kwestię niejednoznaczności językowej. Składnia Fortana została przeformułowana, aby uniknąć tej dwuznaczności, a późniejsze języki miały większą wrażliwość na dwuznaczność gramatyczną w swoim projekcie. OOP jest również bardzo ważnym / najważniejszym przykładem koncepcji teoretycznej / postępu w językach programowania, który „wpływa” lub „faluje” na wiele istniejących języków, przekształcając je.

inne studia przypadków to wynalezienie nowych technologii. na przykład wynalazek relacyjnej bazy danych miał ogromny wpływ na języki komputerowe, np. z SQL i interfejsami języka komputerowego (np. java, „JDBC”). podobnie sieć WWW o jeszcze większym zasięgu. zdawało się, że wokół boomu dotcomów wybuchła języki , które w dużej mierze pokrywały się z wczesnym rozwojem WWW i można je porównać z eksplozjami ewolucyjnymi .

Wydaje się również, że istnieje tendencja do wzrostu liczby nowych języków programowania w połączeniu z ogromną wykładniczo rosnącą mocą przetwarzania prawa Mooresa, co niektórzy sądzą, że może zwalniać.

wydaje się, że obecne dalekosiężne trendy w językach programowania zmierzają w kierunku Big Data i Parallelization, np. z MapReduce . istnieje również aktualne zainteresowanie zamknięciami .

innym kluczowym aspektem języków jest to, że reprezentują one coraz wyższy poziom abstrakcji . bazują na abstrakcjach niższego poziomu, aby tworzyć abstrakcje wyższego poziomu (podobne do piramidy). w ten sposób postęp ewolucji języka komputerowego jest prawdopodobnie nieskończony i możemy być względnie pewni, że nowe ważne będą nadal wymyślane długo w przyszłości. jest to prawdopodobnie analogiczne do podobnej koncepcji w psychologii zwanej chunkingiem - ogólnie mówiąc, budując koncepcje mentalne wyższego poziomu z bloków niższego poziomu.

każdy, kto studiował wiele języków komputerowych, musi przyznać, że można zaobserwować mentalność stada, dzięki czemu niektóre ich aspekty okazują się przesadną modą, tj. nie są tak krytyczne, jak zalecane, a nawet wymierają z czasem (w użyciu)! niektóre z podstawowych pomysłów / zmian pozostają, ale (nadmierny) szum zanika. w tym sensie języki programowania również wchodzą i wychodzą z mody . moim zdaniem dwa przypadki z ostatniej dekady, które są rzeczywiście przydatne, ale zostały przesadzone:

w wielu głównych językach można zaobserwować coraz większe podobieństwo do siebie, tak że wszystkie mają tendencję do konwergencji w kierunku wdrażania wielu podobnych funkcji na swój własny sposób, tj. jak w przypadku wykresów porównawczych produktów, które „sprawdzają” wiele funkcji w siatce.

vzn
źródło
zobacz także wzorce projektowe, które często krzyżują się między językami i są realizowane w językach. innym kluczowym aspektem nauki / funkcjonalności języka są funkcje zaimplementowane w bibliotekach
2013
FORTRAN nigdy nie miał formalnego opisu, a tym bardziej złożoności wypowiedzi, która mogłaby prowadzić do dwuznaczności gramatycznej (tak, zacząłem programować w obrzydliwości zwanej PDQ FORTRAN, a później FORTRAN IV) w języku, w którym (bardzo zawstydzająca) dwuznaczność w gramatyka wyszła na jaw ma Algol, pierwszy język zdefiniowany za pomocą gramatyki.
vonbrand,
punkt wzięty z pierwotnej / wczesnej wersji FORTRAN, ale późniejsze wersje były bardziej sformalizowane przy użyciu bardziej rygorystycznych definicji gramatycznych. jest to studium przypadku pokazujące ewolucję języka wraz z teorią języka.
vzn
FORTRAN dostarczył gramatykę na siłę, ale nigdy nie został zaprojektowany wokół niej. Algol zapoczątkował ten trend, który kontynuowali Pascal, rodzina Modula, Oberon, C i jego ofpring, PL / 1, Ada i tym podobne. Biorąc pod uwagę bezkontekstową technologię gramatyki i zrozumienie analizy składniowej, dziś zdefiniowanie gramatyki i przetłumaczenie jej na bezbłędny parser jest prawie trywialne, żaden nowszy język nie jest bez.
vonbrand,
addendum, studium przypadku w nowszych / wschodzących językach: Google go , node.js , Apple swift
od
-3

Nie były, to tylko chwyt marketingowy - jeśli sprawisz, że język będzie wyglądał jak „C”, to obniży to widoczną barierę wejścia.

Niektóre, które nie mają żadnego wpływu na C: SQL, Pascal, Delphi, FORTRAN, COBOL, Ada, PowerBuilder, HyperTalk, Lisp, Simula, FOCAL, BASIC, PL / I, Algol, Algol-68, SNOBOL, Modula, Visual BASIC, Opiekun, logo, Forth, DIBOL, Helix, AppleScript, Python, Erlang, Ruby, Pick, angielski, RPG, PL / SQL, ASP, Prolog, SmallTalk, Perl, bash, Wand BASIC, REXX, język wsadowy DOS.

Ci, którzy NAPRAWDĘ lubią C, ale mają z tym bardzo mało wspólnego: JavaScript, Java, C #, (prawdopodobnie) Objective-C.

To wszystko marketing, Java, C ++ i JavaScript wygląda trochę jak C, ale pod przykryciem trudno byłoby inaczej.

charan choudhary
źródło
5
„Nie byli” - co nie było czym? W każdym razie nie widzę, jak to odpowiada na pytanie. Jest to po prostu lista języków wraz z całkowicie bezpodstawnym twierdzeniem, że marketing jest w jakiś sposób zaangażowany.
David Richerby,
2
„Niektóre, które w ogóle nie mają wpływu na C: ... Algol, Algol-68, ...” - Zabawne, że tak mówisz, biorąc pod uwagę, że C powstał z Algolu. „jeśli sprawisz, że język będzie wyglądał jak„ C ”, to obniży to widoczną barierę wejścia” - iirc, to okazało się, że jest to błąd. Studenci bez wcześniejszego kontaktu z programowaniem uczą się szybciej w innych językach (myślę, że w tym badaniu użyli Haskell).
Raphael