Zamknięte . To pytanie musi być bardziej
skoncentrowane . Obecnie nie przyjmuje odpowiedzi.
Komentarze
Odpowiedź
To zależy od tego, jak chcesz sklasyfikować języki. Zasadniczo języki można podzielić na dwa typy: imperatywny języki, w których użytkownik poinstruuje komputer jak do wykonania zadania i deklaratywne języki, w których mówisz komputerowi, co ma robić. Języki deklaratywne można dalej podzielić na funkcjonalne języki, w których program jest konstruowany przez tworzenie funkcji, i logika języki programowania, w których program jest konstruowany za pomocą zestawu połączeń logicznych. Języki imperatywne to raczej lista kroków do rozwiązania problemu, coś w rodzaju przepisu. Języki imperatywne obejmują C, C ++ i Java; języki funkcjonalne obejmują Haskell; języki programowania logiki obejmują Prolog.
Języki imperatywne są czasami dzielone na dwie podgrupy: proceduralne języki, takie jak C i języki obiektowe . Języki zorientowane obiektowo są jednak nieco ortogonalne w stosunku do grup, ponieważ istnieją zorientowane obiektowo języki funkcyjne (na przykład OCaml i Scala).
Możesz również grupować języki, wpisując: statyczny i dynamiczny . Języki z typami statycznymi to te, w których typowanie jest sprawdzane (i zwykle wymuszane) przed uruchomieniem programu (zazwyczaj w fazie kompilacji); języki dynamicznie typowane odraczają sprawdzanie typów do czasu wykonania. C, C ++ i Java to języki z typami statycznymi; Python, Ruby, JavaScript i Objective-C to języki z dynamicznym typowaniem. Istnieją również języki nietypowe , które obejmują język programowania Forth.
Możesz również pogrupować języki według ich pisanie dyscyplina : słabe pisanie, które obsługuje niejawne konwersje i silne wpisywanie, które zabrania niejawnych konwersji typów. Linie między nimi są nieco rozmyte: według niektórych definicji C jest językiem słabo typizowanym, podczas gdy inni uważają go za silnie wpisany na maszynie. Dyscyplina pisania i tak nie jest naprawdę użytecznym sposobem na grupowanie języków.
Komentarze
Odpowiedź
- Zespół
- Proceduralne
- Zorientowany obiektowo
- Deklaratywne
- Funkcjonalne
To są główne z nich, ale istnieje wiele innych paradygmatów i wiele się między nimi pokrywa.
Komentarze
Odpowiedź
Odpowiedź
Odpowiedź
-
Procedura: Zgromadzenie, Java, C #, F #, Lisp, Fortran.
-
Na podstawie zestawu: SQL.
-
Oparty na wzorcach: Perl, Regex, Snobol.
-
W oparciu o drzewo: XSLT.
-
W oparciu o tablicę: APL.
Komentarze
Odpowiedź
Można odpowiedzieć na to pytanie na różne sposoby, ale można je podzielić na następujące kategorie:
Język maszynowy: Język maszynowy to język 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 interpretowane na język maszynowy, aby komputery mogły je wykonywać.
Język asemblera: Język asemblera jest reprezentacją języka maszynowego. Innymi słowy, każda instrukcja języka asemblera jest tłumaczona na instrukcję języka maszynowego. Chociaż instrukcje języka asemblera są czytelne, instrukcje są nadal niskiego poziomu. Wadą języka asemblera jest to, że nie jest przenośny, ponieważ każda platforma zawiera określony język asemblera.
Język wysokiego poziomu: Obecnie większość programistów używa języków wysokiego poziomu. Języki, takie jak C, C ++ i Java, to języki 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ą mniej wydajne niż języki asemblera. Ponieważ pojedyncza instrukcja w języku wysokiego poziomu jest tłumaczona na wiele instrukcji języka maszynowego.
Języki wysokiego poziomu można dalej sklasyfikować jako:
-
Języki funkcjonalne: W języku funkcjonalnym program jest podzielony na definicje funkcji. Języki funkcyjne są rodzajem języka deklaratywnego. Opierają się one głównie na typowym rachunku lambda ze stałymi. Niektóre ze słynnych języków funkcyjnych to Scala, F #, Clojure i Lisp.
-
Języki proceduralne: W językach proceduralnych program jest napisany w sekwencje 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 podzielone na Object, które zawierają dane, a także metody operujące na danych. Java, C # i C ++ to języki OOP.
-
Języki programowania logiki: Języki logiki służą do tworzenia programów, umożliwia komputerowi logiczne rozumowanie. np .: Język logiki
Aby uzyskać dogłębne badanie, sprawdź:
Odpowiedź
Zwykle myślę w kategoriach funkcji:
Składnia:
Oparta na języku C lub co-masz. Java ma składnię opartą na języku C. Gorąco polecam wypróbowanie czegoś takiego jak Python lub Ruby, aby wydostać się ze składni i zastanowić się bardziej w kategoriach podstaw działania danego języka. Uważam, że żadna składnia nie musi być bardziej obszerna niż oparta na języku C i nie ma problemu z budowaniem bloków wokół białych znaków.
Skompilowane vs. zinterpretowane w. Proces kompilacji a interpretacja / Konsola:
Mam bardzo małą wiedzę na temat czasu kompilacji w porównaniu ze środowiskiem wykonawczym, ale rozumiem to jest tam cały worek problemów, o których rzadko się zastanawiam.
Podobnie jest wiele języków interpretowanych, które wciąż mają coś w rodzaju procesu kompilacji do uruchamiania wewnątrz maszyny wirtualnej, tak jak robi to Java. Nadal musisz przebudować, aby zobaczyć zmiany.
A potem jest JavaScript i Python, które możesz wykonywać w locie, polecenie po poleceniu w konsoli w środowisku na żywo. Wszystkie trzy mogą prowadzić do bardzo różne sposoby pisania kodu.
Wpisywanie dynamiczne a ścisłe:
Zwykle postrzegam te dwa jako kompromisy projektowe. Kiedy jesteś na znacznie niższym poziomie i wydajność jest krytyczna, statyczne pisanie ma dużo sensu. Nigdy nie rozumiałem pojęcia, że jeden jest „bezpieczniejszy” od drugiego, ale ja pojawił się w bardzo plastycznym / dynamicznym języku, w którym po prostu uczysz się, jak działa system pisania i czego w zasadzie się spodziewać. W JS rzadko przejmuję się oszustwami typu. W pewnym sensie elastyczność może uczynić rzeczy bardziej solidnymi, chociaż przyznaję odrobinę bardziej tajemniczą dla programistów na bardziej Jr. poziomie, jeśli nie wiesz o niektórych dziurach w języku.
Zakres na poziomie bloku a zakres funkcji a?:
Najbardziej powszechny jest poziom bloku (wszystko między {} w większości języków składni opartych na języku c). Zakres JavaScript jest zbudowany wokół funkcji (które są również używane do budowania obiektów tak efektywnie również obiektów). Istnieje również duża różnica w rodzaju dostępu, jaki masz z zakresu wewnętrznego do zakresu zewnętrznego. Nie znam innych schematów określania zakresu, ale jestem pewien, że istnieją.
Klasyczne OOP vs. prototypowe OOP vs. prawie-OOP (struktury w C ?) vs Non-OOP:
Nawet w klasowych OOP jest dużo miejsca na zmiany. Czy możesz dziedziczyć wielokrotne (ew, dużo w nadmiarze, ew), definiować interfejsy itp.
W JavaScript mamy coś w rodzaju skarłowaciałego 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 wykonać, a które są zasadniczo zorientowane na OOP, ale technicznie nie są OOP. Oczywiście są puryści, ale w końcu wzorce projektowe mają na celu osiągnięcie pewnych abstrakcji, które sprawdzają się w określonych sytuacjach. Nie zakładaj zbyt szybko, ż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. Nie jest on wcale ograniczony głupią wersją paradygmatu OOP opartego na prototypie.
Funkcje pierwszej klasy :
Trudno mi zrezygnować z braku tego w języku. Możesz przekazywać funkcje tak, jakby były danymi do użycia w innych kontekstach. To sprawia, że szczególnie schematy obsługi zdarzeń są bardzo łatwe do zaimplementowania, ale także bardzo ułatwia dostosowanie języka tak, aby działał tak, jak chcesz. Jest to, bardziej niż cokolwiek podejrzewam, rzeczą, która sprawiła, że JavaScript odniósł sukces że ostatecznie powstał pomimo tego, że został zaprojektowany w ciągu dwóch tygodni i wykorzystano w nim składnię zbliżoną do języka Java jako schemat marketingowy.
Zamknięcia:
Nie jestem pewien, gdzie toczy się debata o Javie, ale wiem, że wielu programistów Javy domagało się tej funkcji rok lub dwa lata temu. W języku niezamykającym, gdy funkcja zamyka się, wszystko, co w jakiś sposób jest w stanie odwołać się do rzeczy z wnętrza tej funkcji, nie będzie miało do niej dostępu, ponieważ zostało zebrane jako śmieci. W zamknięciu kontekst wykonania jest ograniczony w taki sposób, że jeśli „w stanie odwołać się do rzeczy wewnątrz tej zamkniętej funkcji z innego zakresu, na przykład w zwróconym obiekcie lub funkcji, w zasadzie otrzymujesz te zmienne tak, jak były, gdy funkcja została zamknięta. To jest jak wbijanie stopy w drzwi do zbierania śmieci, chociaż podejrzewam, że jest to zaimplementowane bardziej jak kopie tych zmiennych przekształcone w lokalne vars obiektu odsyłającego.
Sztywne / Ścisłe / Bezpieczne a dające Ci wszystko, czego chcesz:
Twórcy oprogramowania JS i Java zwykle nie rozumieją każdego z nich inne w ogóle i myślę, że ma to wiele wspólnego z dwoma językami leżącymi po niemal przeciwnych stronach tego konkretnego spektrum projektowania. Nie chcę, żebyś chronił mnie przed sobą lub innymi programistami w moim zespole. Chcę zrobić o wiele więcej w dużo mniejszym kodzie i robić to wszystko na bardzo różne (ale spójne dla danej domeny) sposoby w zależności od w tej sytuacji. Są absolutnie kompromisy dla obu i wiele języków ma tendencję do umieszczania bardziej pośrodku.
Komentarze
Odpowiedź
Myślę, że skrótem do tego wszystkiego jest nauczenie się języka Lisp na tyle, aby robić kilka na wpół przydatnych rzeczy. Większość tych paradygmatów zaczęła się od sposobów używania Lispa, więc jest to prosty sposób próbować różnych rzeczy.
Istnieje wiele „rodzajów” języków, ale zawsze mogą się pojawić nowe. Zasadniczo celem języka jest umożliwienie kodowania idei, koncepcji lub wymagań tak bezpośrednio, jak to tylko możliwe. W tym celu mogą zaistnieć sytuacje, w których istniejące paradygmaty zabraknie, a nowy może być potrzebny.
Jednym ze sposobów spojrzenia jest struktura powierzchni. W jaki sposób bezpośrednio pozwala ci to zwięźle zakodować pomysły, tak że 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.
Inny sposób spójrz na to, jeśli chodzi o strukturę kontroli. Kiedy język jest wykonywany (jeśli jest), jaka jest kolejność, w jakiej rzeczy się dzieją, aby osiągnąć to, czego chcesz? Przykłady: proste wykonanie bezpośrednie, rekurencja, powrót, równoległość. Jednym z odkrytych przeze mnie (skromny kaszel) było wykonanie różnicowe .
Innym przydatnym punktem widzenia jest to, że za każdym razem, gdy projektowana jest struktura danych, język jest urodzony. Dane są „wykonywane” przez aplikacje, które przeczesują je i wykonują różne czynności, tak jak program to po prostu zbiór danych (takich jak kody bajtów), które są używane przez interpreter do wykonywania różnych czynności.
Komentarze
Odpowiedź
Muszę dodaj, ż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.
Komentarze