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.
Odpowiedzi:
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.
źródło
Są to główne, ale istnieje wiele innych paradygmatów i wiele z nich się nakłada.
źródło
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
źródło
Kliknij obraz, aby zobaczyć PDF.
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.
źródło
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.
źródło
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:
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.
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.
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.
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ź:
źródło
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.
źródło
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.
źródło
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.
źródło