Ile jest rodzajów języków programowania? [Zamknięte]

30

Zasadniczo chcę nauczyć się wielu języków programowania, aby zostać doskonałym programistą. Wiem tylko garstkę dogłębnych i miałem nadzieję, że ktoś może opracować liczbę klas lub rodzajów języków programowania . Jak to, jak byś je zebrał, gdybyś musiał uczyć się ich w grupach.

Pochodzę ze środowiska Java, znam się na pisaniu statycznym, ale wiem, że oprócz pisania dynamicznego musi istnieć taka różnorodność w dostępnych językach, że chciałbym zobaczyć kategoryczny podział, jeśli to możliwe.

sova
źródło
2
Czy nie lepiej byłoby powiedzieć „Jaki typ…” zamiast ilu?
Amir Rezaei,
Cóż, nauczyłem się, że coś takiego jak Prolog i C są zasadniczo różne, więc pomyślałem, że każdy z nich odpowiada innemu rodzajowi języka programowania i miałem nadzieję, że zrozumiem, ile rodzajów.
sova
7
2: typ, który robi to, co chcesz, i typ, który nie robi
Matt Ellen
1
Nauka różnych rodzajów języków programowania jest absolutnie konstruktywna ! Możesz potencjalnie argumentować, że należy to zamknąć jako duplikat tego, ale myślę, że są wystarczająco różne pytania, aby pozostać osobne.
Peter Boughton,
1
@Sova, polecam wybór pierwszego języka, aby wypróbować coś, co nie korzysta ze składni opartej na c. To sprawi, że Twoja głowa skoncentruje się bardziej na tym, jak to działa, niż na tym, co różni się od tego, który znasz najlepiej.
Erik Reppen

Odpowiedzi:

73

To zależy od tego, jak chcesz klasyfikować języki. Zasadniczo języki można podzielić na dwa typy: języki imperatywne , w których instruuje się komputer, jak wykonać zadanie, oraz języki deklaratywne , w których mówi się komputerowi, co ma robić. Języki deklaratywne można dalej podzielić na języki funkcjonalne , w których program jest konstruowany przez komponowanie funkcji i logikijęzyki programowania, w których program jest konstruowany za pomocą zestawu połączeń logicznych. Języki rozkazujące czytają bardziej jak listę kroków do rozwiązania problemu, coś w rodzaju przepisu. Języki imperatywne obejmują C, C ++ i Java; języki funkcjonalne obejmują Haskell; logiczne języki programowania obejmują Prolog.

Języki imperatywne są czasami dzielone na dwie podgrupy: języki proceduralne , takie jak C, i języki obiektowe . Języki zorientowane obiektowo są jednak nieco ortogonalne w stosunku do grupowania, ponieważ istnieją zorientowane obiektowo języki funkcjonalne (na przykład OCaml i Scala).

Możesz także grupować języki, wpisując: statyczny i dynamiczny . Języki o typie statycznym to te, w których pisanie jest sprawdzane (i zwykle wymuszane) przed uruchomieniem programu (zazwyczaj podczas fazy kompilacji); dynamicznie wpisywane języki odraczają sprawdzanie typu do środowiska wykonawczego. C, C ++ i Java to języki o typie statycznym; Python, Ruby, JavaScript i Objective-C to języki o dynamicznym pisaniu. Istnieją również języki bez typów , w tym język programowania Forth.

Możesz także grupować języki według dyscypliny pisania : słabe pisanie, które obsługuje konwersje typu niejawnego, oraz silne pisanie, które zabrania konwersji typu niejawnego. Linie między nimi są nieco rozmyte: według niektórych definicji C jest językiem słabo typowanym, podczas gdy inni uważają go za silnie typowany. W każdym razie dyscyplina pisania nie jest tak naprawdę przydatnym sposobem grupowania języków.

mipadi
źródło
1
Zamierzałam stworzyć coś podobnego, ale zamiast tego da +1 i doda komentarze. Każda kategoria lub kombinacja ma również wiele efektów ubocznych utworzonych przez skupienie się na poszczególnych elementach. Na przykład OOP zaczyna się od: OOP opartego na prototypach, programowania zorientowanego na aspekty, programowania opartego na komponentach i tak dalej. Funkcjonalne paradygmaty mają również skutki uboczne, takie jak języki, w których proces asynchroniczny lub wątek jest jednostką podstawową, a programujesz poprzez składanie równoległych procesów razem.
CodexArcanum
Jak pasowałyby do tego języki skryptowe, np. VBScript? Może to być trochę proceduralne i trochę OO, ponieważ można tworzyć różne typy, więc czy to uczyniłoby go hybrydowym?
JB King,
Właśnie tego szukałem. Dziękuję Ci bardzo.
sova,
3
Języki @JB King OOP zwykle mają charakter proceduralny, przynajmniej w ramach metod. Ponadto powszechnym błędnym przekonaniem jest, że OOP oznacza „obiekty”. Wiele języków ma typy danych i obiekty. Toczy się wiele dyskusji na temat dokładnej definicji OOP, ale zwykle obejmuje ona dziedziczenie i / lub enkapsulację (państwo prywatne) jako główne tematy. Język bez żadnej z tych form byłby trudny do zaklasyfikowania jako język OOP.
CodexArcanum
2
@sova Mogę myśleć tylko o dwóch takich językach. Erlang opiera się w dużej mierze na przetwarzaniu równoległym, ale jeśli chcesz czegoś bardziej podobnego do tego, o czym dokładnie mówiłem, powinieneś przyjrzeć się polifonicznemu C #. Jest to język badawczy (teraz złożony do C-omegi) oparty na Pi-Calculus (podobnie jak FP oparty na lambda calc) Pi-calc opiera się na jednostce procesu, a deklarujesz procesy i połączenie synchroniczne i asych wzywa do nich. Zobacz także strzały w FP, szczególnie Haskell. Strzały są bardzo podobne.
CodexArcanum
12
  • montaż
  • Proceduralny
    • Podstawowy
    • do
  • Obiektowy
    • DO#
    • Jawa
  • Deklaracyjny
    • Prolog
    • SQL
  • Funkcjonalny
    • Seplenienie
    • Haskell

Są to główne, ale istnieje wiele innych paradygmatów i wiele z nich się nakłada.


źródło
Co powiesz na deklaratywny (np. Prolog, SQL)?
Bruce Alderman,
@Bruce, mam je teraz.
Tak, to był ogólny pomysł, którego nauczyłem się gdzieś po drodze.
sevenseacat
6
Czy zgromadzenia nie należy uważać za procesowe?
MattDavey,
2
Co powiesz na konkatenatywne (oparte na stosie) języki programowania, takie jak Forth i Factor? Można uznać to za programowanie funkcjonalne, ale prawdopodobnie jest wystarczająco wyraźne, aby zasługiwać na wzmiankę. en.wikipedia.org/wiki/Concatenative_programming_language
KChaloux
11

Aby zapoznać się z typami języków programowania (Paradygmaty), spójrz tutaj:
http://en.wikipedia.org/wiki/Programming_paradigm

Aby poznać inne cechy języków programowania (np. Type Systems), spójrz tutaj: http://en.wikipedia.org/wiki/Programming_language

Robert Harvey
źródło
ah! „paradygmat”, co za dobre słowo! dziękuję
sova
@sova Zaakceptowałbym to jako najlepszą odpowiedź, ponieważ jest po prostu zbyt wiele paradygmatów, aby wymienić je w odpowiedzi na P.SE, a tym bardziej opisać niuanse każdego z nich.
Rei Miyasaka,
9

Kliknij obraz, aby zobaczyć PDF. Plakat z paradygmatami programowania

Powinieneś spojrzeć na paradygmaty programowania dla manekinów: co każdy programista powinien wiedzieć autorstwa Petera Van Roya. To da ci przegląd tego, jak się dzieje na zewnątrz.

Jeśli chcesz pójść dalej, możesz zapoznać się z koncepcjami, technikami i modelami programowania komputerowego . W ten sposób nie nauczysz się wielu języków, ale nauczysz się paradygmatów leżących u podstaw różnych rodzajów języków. Nauka nowego języka będzie dla Ciebie łatwiejsza.

mmdemirbas
źródło
6
  • Proceduralne: Montaż, Java, C #, F #, Lisp, Fortran.

  • Oparty na zestawie: SQL.

  • Oparte na wzorach: Perl, Regex, Snobol.

  • Na bazie drzewa: XSLT.

  • Oparty na tablicy: APL.

Tangurena
źródło
2
+1 za użycie innego rodzaju klasyfikacji, a także za uznanie, że „proceduralny” w rzeczywistości zawiera większość klasyfikacji innych osób. (oczywiście oznacza to tylko, że słowo ma bardzo małe znaczenie, a mięso jest w takich poddziałach)
Javier,
4

Istnieją różne sposoby odpowiedzi na to pytanie, ale pod względem można je sklasyfikować jako:

Język maszynowy: Język maszynowy jest językiem programowania niskiego poziomu. Jest łatwo zrozumiały dla komputerów, ale trudny do odczytania przez ludzi. Dlatego ludzie używają języków programowania wyższego poziomu. Programy napisane w językach wysokiego poziomu są również kompilowane i / lub tłumaczone na język maszynowy, aby komputery mogły je wykonać.

Język asemblera: język asemblera to przedstawienie języka maszynowego. Innymi słowy, każda instrukcja języka asemblera przekłada się na instrukcję języka maszynowego. Mimo że instrukcje języka asemblera są czytelne, nadal są na niskim poziomie. Wadą języka asemblera jest to, że nie jest przenośny, ponieważ każda platforma ma określony język asemblera.

Język wysokiego poziomu: Języki wysokiego poziomu są obecnie używane przez większość programistów. Języki takie jak C, C ++ i Java są językami wysokiego poziomu. Zaletą języków wysokiego poziomu jest to, że są one bardzo czytelne i przenośne. Wadą języków wysokiego poziomu jest to, że są one mniej wydajne niż języki asemblacyjne. Ponieważ pojedyncza instrukcja w języku wysokiego poziomu jest tłumaczona na wiele instrukcji języka maszynowego.

Języki wysokiego poziomu można dalej klasyfikować jako:

  1. Języki funkcjonalne: W języku funkcjonalnym program jest podzielony na definicje funkcji. Języki funkcjonalne są rodzajem języka deklaratywnego. Opierają się one głównie na typowym rachunku lambda ze stałymi. Niektóre ze znanych języków funkcyjnych to Scala, F #, Clojure i Lisp.

  2. Języki proceduralne: w językach proceduralnych program jest pisany w sekwencji kroków, które należy wykonać, aby uzyskać wynik. COBOL, FORTRAN i C to niektóre języki proceduralne.

  3. Języki programowania obiektowego: W językach OOP program jest podzielony na obiekty zawierające dane, a także metody działające na danych. Java, C # i C ++ są językami OOP.

  4. Logiczne Języki programowania: Języki logiczne są używane do tworzenia programów, które umożliwiają komputerowi logiczne rozumowanie. np .: język logiczny

Do dogłębnych badań sprawdź:

Badar
źródło
3

Zwykle myślę w kategoriach funkcji:

Składnia:

Oparte na C lub co masz. Java ma składnię opartą na C. Gorąco polecam wypróbowanie czegoś takiego jak Python lub Ruby, aby oderwać się od składni i zastanowić się bardziej nad podstawami działania danego języka. Uważam, że żadna składnia nie musi być bardziej obszerna niż oparta na C i nie ma żadnych problemów z budową wokół białych znaków.

Skompilowane vs. interpretowane w. Build-Process vs. Interpreted / Console:

Mam bardzo małą wiedzę na temat problemów związanych z czasem kompilacji a środowiskiem wykonawczym, ale rozumiem, że jest tam cała masa problemów, o których rzadko myślę.

Podobnie istnieje wiele interpretowanych języków, które wciąż mają proces kompilacji do działania na maszynie wirtualnej, tak jak Java. Nadal musisz odbudować, aby zobaczyć zmiany.

Jest też JavaScript i Python, które można uruchamiać w locie, polecenie za pomocą polecenia w konsoli w środowisku na żywo. Wszystkie trzy mogą prowadzić do bardzo różnych sposobów pisania kodu.

Pisanie dynamiczne a ścisłe:

Uważam te dwa za kompromisy w projektowaniu. Gdy jesteś na znacznie niższym poziomie, a wydajność ma krytyczne znaczenie, pisanie statyczne ma sens. Nigdy nie rozumiałem pojęcia, że ​​jeden jest „bezpieczniejszy” niż inny, ale wymyśliłem bardzo plastyczny / dynamiczny język, w którym po prostu dowiadujesz się, jak działa system pisania i czego właściwie można się spodziewać. Czcionki typu shenanigans rzadko są dla mnie przedmiotem zainteresowania w JS. Pod pewnymi względami elastyczność może sprawić, że wszystko stanie się bardziej niezawodne, chociaż wprawdzie nieco bardziej tajemne dla twórcy poziomu Jr., jeśli nie wiesz o niektórych dziurach w języku.

Zakres na poziomie bloku vs. zakres funkcji vs.?:

Poziom bloku jest najbardziej powszechny (wszystko pomiędzy {} w większości języków składni opartych na c). Zakres JavaScript jest zbudowany wokół funkcji (które są również używane do budowania obiektów tak skutecznie obiektów). Istnieje również duża różnorodność w tym, jaki rodzaj dostępu masz od zakresu wewnętrznego do zakresu zewnętrznego. Nie znam innych schematów określania zakresu, ale jestem pewien, że istnieją.

Klasyczny OOP vs. prototypowy OOP vs Almost-OOP (struktury w C?) Vs Non-OOP:

Nawet w klasowym OOP istnieje wiele możliwości zmiany. Czy możesz dokonać wielokrotnego dziedziczenia (ew, znacznie w nadmiarze, ew), zdefiniować interfejsy itp.

W JavaScript mamy rodzaj hybrydowego prototypowego OOP, w którym obiekty są znacznie prostsze, wysoce zmienne, ale nadal mamy możliwość oddzielenia interfejsu od wewnętrznych problemów, które IMO jest ważnym aspektem enkapsulacji.

Rzecz w OOP polega na tym, że naprawdę jest wiele rzeczy, które można pobrać, które są zasadniczo zorientowane na OOP, ale technicznie nie są OOP. Oczywiście są puriści, ale pod koniec dnia Wzorce projektowe polegają na osiągnięciu pewnych abstrakcji, które sprawdzają się w określonych sytuacjach. Nie bądź zbyt szybki, aby zakładać, że pomysły z języka opartego na OOP nie mają zastosowania w czymś, co jest bardziej zorientowane proceduralnie. I nie mówię o JavaScript. To wcale nie jest ograniczone przez głupią wersję prototypowego paradygmatu OOP.

Funkcje pierwszej klasy:

Nie mając ich w języku, trudno mi się poddać. Możesz przekazywać funkcje tak, jakby były danymi do wykorzystania w innych kontekstach. To sprawia, że ​​schematy obsługi zdarzeń są szczególnie łatwe do wdrożenia, ale także bardzo łatwo dostosowują język do swoich potrzeb. Jest to, ponad wszystko, co podejrzewam, rzecz, która sprawiła, że ​​JavaScript był sukcesem, pomimo że został zaprojektowany w ciągu dwóch tygodni i otrzymał składnię zbliżoną do Javy jako plan marketingowy.

Zamknięcia:

Nie jestem pewien, gdzie jest debata na temat Javy, ale wiem, że wielu deweloperów Java domagało się tej funkcji rok lub dwa lata temu. W języku, w którym funkcja się nie zamyka, kiedy funkcja się zamyka, wszystko, co jest w stanie w jakiś sposób odwoływać się do rzeczy z wnętrza tej funkcji, nie będzie miało do niej dostępu, ponieważ zostało wyrzucone. W zamknięciu kontekst wykonania jest związany w taki sposób, że jeśli jesteś w stanie odwoływać się do elementów wewnątrz tej zamkniętej funkcji z innego zakresu, np. W zwróconym obiekcie lub funkcji, zasadniczo otrzymujesz te zmienne, jakie były, gdy funkcja była zamknięta. To tak, jakby wcisnąć stopę w drzwi kosza na śmieci, ale podejrzewam, że zaimplementowano ją bardziej jak kopie tych zmienników przekształconych w lokalne zmienne podmiotu odsyłającego.

Sztywne / surowe / bezpieczne vs. daje całą linę, którą chcesz:

Deweloperzy JS i Java nie rozumieją się wcale i myślę, że ma to wiele wspólnego z tymi dwoma językami, które znajdują się po przeciwnych stronach tego konkretnego spektrum projektowego. Nie chcę, żebyś mnie chronił przed sobą lub przed innymi deweloperami z mojego zespołu. Chcę zrobić o wiele więcej przy znacznie mniejszym kodzie i zrobić to wszystko na bardzo różne (ale spójne dla danej domeny) sposoby, w zależności od sytuacji. Oba są absolutnie kompromisowe, a wiele języków ma tendencję do spadania w środku.

Erik Reppen
źródło
Ojej dzięki. Naprawdę miło jest przejść głosowanie w dół bez żadnego wyjaśnienia.
Erik Reppen
2

Myślę, że skrótem do wszystkich tych rzeczy jest nauczenie się wystarczającej ilości Lisp, aby zrobić kilka na wpół użytecznych rzeczy. Większość z tych paradygmatów zaczęła się jako sposób użycia Lisp, więc jest to prosty sposób na wypróbowanie różnych rzeczy.

Wokół istnieje wiele „rodzajów” języków, ale zawsze mogą pojawiać się nowe. Zasadniczo celem języka jest umożliwienie kodowania pomysłów, pojęć lub wymagań, tak bezpośrednio, jak to możliwe. W tym celu mogą zaistnieć sytuacje, w których istniejące paradygmaty są potrzebne i może być potrzebny nowy.

Jednym ze sposobów patrzenia jest struktura powierzchni. Jak bezpośrednio pozwala ci to na zwięzłe kodowanie pomysłów, więc jeśli zmienisz zdanie na temat tego, czego chcesz, odpowiednia zmiana w kodzie jest również łatwa, z niewielką szansą na wprowadzenie błędów.

Innym sposobem spojrzenia na to jest struktura kontroli. Kiedy język jest wykonywany (jeśli jest), w jakiej kolejności rzeczy się dzieją, aby osiągnąć to, czego chcesz? Przykładami są: proste wykonanie bezpośrednie, rekurencja, powrót, równoległość. Jednym, który odkryłem (skromny kaszel), było wykonanie różnicowe .

Innym użytecznym punktem widzenia jest to, że za każdym razem, gdy projektowana jest struktura danych, rodzi się język. Dane są „wykonywane” przez aplikacje, które je przeczesują i wykonują różne czynności, podobnie jak program jest tylko zbiorem danych (takich jak kody bajtów), które są używane przez tłumacza do wykonywania różnych czynności.

Mike Dunlavey
źródło
Fajne. Nauczę się LISP i będę oświecony. Ekscytujące: D
sova
Jeśli jednak powiesz, że czynność użycia struktury danych tworzy nowy język pośredni, możesz również argumentować, że w każdym algorytmie rodzi się nowy język (wszystkie operacje są koniecznie wykonywane na strukturze danych), a z redukcją - nowy język rodzi się w każdym wierszu kodu. Myślę, że masz na myśli coś innego, ale nie jestem pewien, czy jeszcze to rozumiem?
sova
@sova: Dla mnie teoria informacji była świetnym odkryciem (zarówno Shannon, jak i Kołmogorow). Chodzi o to, w jaki sposób znaczenia są kodowane i przekazywane przez kanały, z pojęciami przepustowości, wykrywania błędów, minimalnego kodowania, losowości itp. Tak więc informacje kodują dane, a algorytmy są kanałami. Programy kodują informacje, a programowanie jest kanałem. Jakie informacje są kodowane? skąd i kiedy pochodzi? dokąd to zmierza jakie są źródła błędów (hałasu)? jak są one poprawiane? Uznałem to za przydatną perspektywę.
Mike Dunlavey,
@sova: (ciąg dalszy) Nie musisz opanowywać całej odpychającej matematyki. Dla mnie liczył się schemat, który dał mi do myślenia o rzeczach.
Mike Dunlavey,
1

Muszę dodać, że istnieją języki programowania dla określonych aplikacji. Przychodzi mi na myśl APT (Automatic Programmed Tool), język używany w produkcji obrabiarek.

Dave
źródło
Pamiętam to. Mogłem nawet z niego skorzystać. Chłopcze, to było najnowocześniejsze. Nie trzeba było ręcznie prowadzić frezarki, wystarczy nacisnąć przycisk Start. A jeśli byłby błąd, rozpętałoby się piekło.
Mike Dunlavey,
Pracowałem nad programami, które generują gcode dla frezarek. Dosłownie trzymałem i widziałem wyniki błędów programistycznych, często moje.
David Thornley,
Spędziłem 20 lat instalując postprocesory na ogromach systemów.
Dave