Językiem, w którym pisane są programy, jest język programowania. Lista języków programowania

Kiedy próbujesz dowiedzieć się, jakiego języka programowania zacząć się uczyć, prawdopodobnie natkniesz się na terminy „wysoki poziom” i „niski poziom”. Ludzie cały czas mówią o językach programowania wysokiego poziomu. niski poziom. Ale co to dokładnie oznacza? A co to znaczy nauczyć się pisać kod? Zacznijmy od definicji każdego z nich.


Języki programowania „wysokiego” i „niskiego poziomu”.

W tym artykule omówię języki „wysokiego” i „niskiego poziomu”. Ale nie ma specjalnych kryteriów pozwalających to ustalić. Pamiętaj tylko, że to w dużej mierze zależy od Twojego punktu widzenia. Jeśli jesteś programistą C, Java może wydawać się dość zaawansowany. Jeśli jesteś przyzwyczajony do Ruby, Java może wydawać się językiem niskiego poziomu.

Kod maszynowy i języki niskiego poziomu

Niezależnie od tego, czy język jest uważany za wysoki, czy niski (lub gdzieś pomiędzy), chodzi o abstrakcję. Kod maszynowy nie ma abstrakcji - zawiera oddzielne instrukcje, przesłane do komputera. A ponieważ maszyny zajmują się tylko liczbami, są one reprezentowane w dwójkowy(chociaż czasami są zapisywane w notacji dziesiętnej lub szesnastkowej).

Oto przykład kodu maszynowego:

W kodzie maszynowym operacje muszą być dokładnie określone. Na przykład, jeśli trzeba pobrać informację z pamięci, kod maszynowy będzie musiał powiedzieć komputerowi, gdzie w pamięci ma ją znaleźć.

Zapis bezpośrednio do kodu maszynowego jest możliwy, ale bardzo trudny.

Języki programowania niskiego poziomu dodają odrobinę abstrakcji do kodów maszynowych. Ta abstrakcja ukrywa określone instrukcje kodu maszynowego za deklaracjami, które są bardziej czytelne dla człowieka. Języki asemblera to języki najniższego poziomu obok kodu maszynowego.

W kodzie maszynowym możesz napisać coś w rodzaju „10110000 01100001”, ale język asemblera może to uprościć jako „MOV AL, 61h”. Nadal istnieje niemalże zbieżność pomiędzy tym, co jest napisane w języku asemblera, a instrukcjami przekazanymi maszynie.

Przechodząc do bardziej popularnych języków programowania, otrzymujemy coś w rodzaju C. Chociaż ten język nie jest tak niski jak język asemblera, nadal istnieje silna zgodność pomiędzy tym, co jest napisane w C, a kodem maszynowym. Większość operacji napisanych w C można wykonać bez duża ilość instrukcje kodu maszynowego.

Języki programowania wysokiego poziomu

Podobnie jak języki niższego poziomu, wyższe poziomy obejmują szeroki zakres abstrakcji. Niektóre języki, takie jak Java (wielu uważa ją za średnio zaawansowany język programowania), nadal dają dużą kontrolę nad sposobem, w jaki komputer zarządza pamięcią i danymi.

Inne, jak Ruby i Python, są bardzo abstrakcyjne. Dają mniejszy dostęp do funkcji niższego poziomu, ale składnia jest znacznie łatwiejsza do odczytu i zapisu. Możesz grupować rzeczy w klasy, które dziedziczą cechy, więc wystarczy je zadeklarować tylko raz.

Zmienne, obiekty, podprogramy i pętle są ważnymi częściami języków wysoki poziom. Te i inne koncepcje pomogą Ci przekazać maszynie wiele rzeczy za pomocą krótkich, zwięzłych stwierdzeń.

Podczas gdy język asemblera ma prawie jednolite odwzorowanie instrukcji i instrukcji kodu maszynowego, język wyższego poziomu może wysłać dziesiątki poleceń w jednym wierszu kodu.

Należy zauważyć, że „języki programowania wysokiego poziomu” mogą obejmować wszystko, co jest bardziej abstrakcyjne niż język asemblera.

Jakiego języka się uczyć: niski czy wysoki poziom?

To jest zdecydowanie pytanie ogólne wśród nowych i aspirujących programistów. Których języków programowania lepiej się uczyć: wysokiego czy niskiego poziomu? Podobnie jak w przypadku wielu pytań programistycznych, kwestia języków programowania wysokiego i niskiego poziomu nie jest taka prosta.

Oba typy języków mają ważne zalety. Języki niskiego poziomu, ponieważ wymagają niewielkiej interpretacji przez komputer, są zwykle bardzo szybkie. Dają programistom dużą kontrolę nad przechowywaniem, pamięcią i wyszukiwaniem danych.

Jednak języki wysokiego poziomu są intuicyjne i pozwalają programistom na znacznie efektywniejsze pisanie kodu. Języki te są również uważane za „bezpieczniejsze”, ponieważ istnieje więcej zabezpieczeń, które uniemożliwiają koderowi wydawanie źle napisanych poleceń, które mogłyby spowodować szkody. Ale nie dają programistom takiej samej kontroli nad procesami niskiego poziomu.

Mając to na uwadze, oto lista popularnych języków w skali od najniższej do najwyższej:

  • JavaScript
  • Pyton

Oczywiście jest to częściowo subiektywne. I obejmuje tylko niewielki ułamek dostępnych języków.

Ale to powinno dać ci pewne wyobrażenie o tym, na jakim poziomie są języki, którymi jesteś zainteresowany.

Co chcesz robić?

Podejmując decyzję, jakiego języka będziesz się uczyć, pierwsze pytanie powinno brzmieć: co chcesz programować?

Jeśli chcesz programować systemy operacyjne, jądra lub cokolwiek, co musi działać maksymalna prędkość, może to być język niższego poziomu dobry wybór. Duży część Windowsa, OS X i Linux są napisane w językach C i pochodnych C, takich jak C++ i Objective-C.

Wiele nowoczesne aplikacje napisane w językach wyższego poziomu lub nawet językach specyficznych dla domeny. Python i Ruby są szczególnie popularne w aplikacjach internetowych, chociaż HTML5 staje się coraz potężniejszy. Języki takie jak Swift, C#, JavaScript i SQL mają swoje mocne i słabe strony.

Niedawno czytałem wątek na forum programistycznym i natknąłem się na ciekawą sugestię: studiuj oba poziomy jednocześnie. Zyskasz głębsze zrozumienie typów abstrakcji, które czynią język wyższego poziomu bardziej wydajnym.

Oczywiście nauka dwóch języków jednocześnie nie jest łatwa, dlatego warto trochę rozłożyć naukę. Pomocny może być wybór dwóch języków, które są najbardziej podobne.

Ponownie wrócimy do tego, co powiedziałem wcześniej: wybierz język w oparciu o to, co chcesz robić. Przeprowadź badania, aby dowiedzieć się, jakich języków używają ludzie w swojej dziedzinie. Następnie wykorzystaj te informacje, aby wybrać język wysokiego i niskiego poziomu i rozpocząć ich naukę.

Wkrótce dostrzeżesz podobieństwa i zyskasz znacznie głębsze zrozumienie działania programowania.

Skup się na celu, a nie środkach.

Istnieje wiele kryteriów, według których można wybrać język programowania. Jednym z kryteriów jest wysoki i niski poziom. Ale prawie w każdym przypadku kryteria, których powinieneś użyć, dotyczą tego, co chcesz zaprogramować.

Twój projekt może zyskać na języku niskiego poziomu. Lub może być znacznie bardziej skuteczny na wysokim poziomie. Wybór odpowiedniego narzędzia do danego zadania zależy od Ciebie. Skoncentruj się na swoim celu i za każdym razem wybieraj odpowiedni język.

Czy masz doświadczenie z językami wysokiego i niskiego poziomu? Czy wolisz jedno od drugiego? Podziel się swoimi przemyśleniami w komentarzach poniżej!

Programy komputerowe są często opisywane jako „zestawy instrukcji”, a języki komputerowe są przez wielu postrzegane jedynie jako słownictwo i składniowy sposób przekazywania tych instrukcji.

Z tego punktu widzenia, różne języki programowanie może mieć inną gramatykę lub inne słownictwo. Każdy język może inaczej traktować średniki lub wymagać tego wielkie litery na piśmie, chociaż w zasadzie wszystkie języki opierają się na tej samej zasadzie.

Ale rzeczywistość programowania jest znacznie bardziej złożona.

Programowanie dzisiaj

To dziwne, ale większość prawdziwie „globalnych” pomysłów w programowaniu komputerowym powstała w latach pięćdziesiątych i sześćdziesiątych XX wieku. Od tego czasu pojawiło się wiele nowych języków, ale żaden z nich nie implementuje naprawdę nowego podejścia do logiki i obliczeń.

Rozwój nowych języków programowania na przestrzeni ostatnich kilkudziesięciu lat opierał się na doświadczeniach programistów. Oznacza to, że istnieje kod, który jest łatwiejszy do napisania ( siła napędowa Ruby) i łatwiejszy do odczytania (Python) i wykonaj określone typy struktury logiczne oraz sposoby bardziej intuicyjnego rozwiązywania problemów.

Niektóre języki zostały opracowane w celu rozwiązywania określonych problemów programistycznych (takich jak PHP i SASS), zarządzania określonymi typami systemów () lub pracy w określonym środowisku lub platformie (Java i JavaScript). Niektóre języki zostały zaprojektowane specjalnie, aby pomóc początkującym w nauce programowania ( klasyczne przykłady są BASIC i Scratch).

Ponieważ teorie i praktyki dotyczące projektowania języka przekształciły się w (w większości) powszechnie akceptowaną ortodoksję, wiele nowych i Ciekawa praca Rozwój praktyki programistycznej koncentruje się obecnie wokół architektury systemów.

Stosunkowo niedawnym osiągnięciem jest koncepcja SOA (architektura zorientowana na usługi). architektura zorientowana na usługi) i MVC (Model-View-Controller), a także frameworki takie jak , które pozwalają programistom łatwo pracować w ramach tych paradygmatów.

Lista języków programowania

Rosnąca lista popularnych języków programowania, znaczników i protokołów. Linki do opisów każdego z nich:

Kodowanie ASCII

  • Kodowanie znaków jest jednym z podstawowych aspektów komputerów i Internetu. ASCII jest pierwszym szeroko stosowanym systemem kodowania znaków. Został on zastąpiony przez UTF-8, ale ASCII nadal stanowi podstawę dla zdecydowanej większości znaków w dzisiejszym Internecie. Zrozumienie tego jest bardzo ważne dla programistów. Przeczytaj więcej tutaj (po angielsku):

ASP/ASP.NET

  • ASP to skrót od Active Server Pages. Jest to pierwszy język skryptowy po stronie serwera dla serwera WWW Microsoft IIS. ASP został zastąpiony frameworkiem open source po stronie serwera - ASP.NET. Więcej szczegółów (w języku angielskim):

AutoLISP

ok

  • Awk to niezwykle potężny język programowania do edycji tekstu, który pozwala wyodrębnić dane z pliku lub innego źródła i wyprowadzić je w dowolnym formacie. Jest to starsze narzędzie, ale wciąż przydatne jak zawsze. Dowiedz się więcej (w języku angielskim): .

GRZMOTNĄĆ

  • Bash jest najczęściej używanym interfejsem wiersz poleceń w świecie Uniksa. Jest to domyślny interfejs tekstowy zarówno dla systemu Linux, jak i Mac OS X. Przeczytaj więcej:

Wspólny Lisp

  • Lisp jest dość wyjątkowym językiem programowania, być może najstarszym językiem, który nadal jest w użyciu. Jest to szczególnie ważne w okolicy sztuczna inteligencja. Więcej szczegółów (w języku angielskim):

C

  • Jeśli uwzględnimy tutaj dwie pochodne tego języka, to śmiało możemy powiedzieć, że żaden język nie był bardziej użyteczny i wpływowy niż C. Jest to szczególnie ważne w przypadku rozwoju systemów operacyjnych i innego oprogramowania. Wiele kompilatorów i interpreterów dla innych języków jest napisanych w C. Przeczytaj więcej:

C++

  • Pierwotnie nazywany „C z klasami”, C++ jest pod wieloma względami po prostu bardziej zaawansowanym następcą C (choć ogólna sytuacja jest bardziej złożona). C++ został zaprojektowany, aby dodać wysoki poziom do paradygmatu programowania C, zachowując jednocześnie możliwości manipulacji sprzętem na niskim poziomie. Wiele z tych dodatków zostało dodanych do C na przestrzeni lat, a języki bardziej przypominają dwa dialekty tego samego języka. Więcej szczegółów (w języku angielskim):

C#

  • Używany jako podstawowy język programowania .NET, podobny do C++, rozszerzenie języka programowania C, ale z ważny dodatek w postaci możliwości obiektowych. Więcej szczegółów (w języku angielskim):

CSS/CSS3

  • CSS, czyli kaskadowe arkusze stylów, również nie jest językiem programowania, ale językiem stylu strony - językiem, który zapewnia reguły dotyczące stylu i układu dokumentów i aplikacji. Jest to główny język stylu używany w Internecie. Więcej szczegółów:

Lisp Emacsa

  • Emacs od dawna jest znany jako popularny i potężny Edytor tekstu. Ale dodanie do niego Emacsa Lispa zamienia go w zintegrowane środowisko programistyczne dla prawie każdego języka programowania. Więcej szczegółów (w języku angielskim): .

F#

  • F# – język programowania ogólny cel. Zaprojektowany tak, aby był niezwykle skuteczny. Będąc pierwotnie tylko Język Microsoftu, jest teraz językiem typu open source i jest używany na wszystkich platformach. Więcej szczegółów (w języku angielskim): .

FORTAN

  • Fortran pojawił się po raz pierwszy w 1957 roku i nadal jest używany do rozwiązywania większości z nich złożone problemy nowoczesna nauka i technologia. Więcej szczegółów (w języku angielskim):

NAPRZÓD

  • Prace nad Forth rozpoczęły się w 1968 roku, a język ten jest zwykle używany na sprzęcie, który nie ma tradycyjnego systemu operacyjnego. Jest również szeroko stosowany do sterowania obrabiarkami. Więcej szczegółów (w języku angielskim):

Haskell

  • Haskell to jeden z najpopularniejszych funkcjonalnych języków programowania, a także będący prototypem kilkunastu innych języków. Jest szeroko stosowany w biznesie i środowisku akademickim i jest doskonałym językiem do rozpoczęcia nauki. programowanie funkcjonalne. Więcej szczegółów (w języku angielskim):

HTML

  • HTML nie jest językiem programowania. Jest to język znaczników – język służący do dodawania do treści adnotacji semantycznych i stylistycznych. Jest to podstawowy język treści internetowych. Znajomość tego jest konieczna i obowiązkowa dla wszystkich projektantów i twórców stron internetowych, a także wszystkich (pisarzy, redaktorów), którzy tworzą treści internetowe. Więcej szczegółów (w języku angielskim): i

IDL

  • IDL, czyli Interactive Data Language, to język programowania używany głównie do analizy i wizualizacji danych. Jest nadal szeroko stosowany w lotnictwie i astronomii. Więcej szczegółów (w języku angielskim):

INTERKAL

  • INTERCAL to parodia języka komputerowego opracowana na początku lat 70. Powstał jako żart, aby pokazać, jak języki są złożone technicznie i trudne do odczytania. To prawdziwy język, który możesz pobrać i za pomocą którego możesz nawet coś zrobić. Zakłada się, że aby to zrobić, trzeba się z tym bardzo dobrze zapoznać - ale znowu nie za dobrze, ponieważ sam INTERCAL też tego nie polubi. Więcej szczegółów (w języku angielskim):

Jawa

  • Java to język wysokiego poziomu przeznaczony do użytku na wirtualnej maszynie Java. Ma bardzo niewiele zależności zewnętrznych i został zaprojektowany do pracy na dowolnym maszyna fizyczna. Dużo używany architektura sieci, a także w urządzeniach wbudowanych i innych aplikacjach komputerowych. Więcej szczegółów (w języku angielskim): .

JavaScript

  • JavaScript (właściwie nie związany z Javą) jest język skryptowy, pierwotnie zaprojektowany do użytku w przeglądarkach internetowych. Dlatego ma wbudowaną możliwość pracy z obiektowym modelem dokumentu (DOM), reprezentacją zawartości strony internetowej w pamięci. Jest to główny język programowania do tworzenia stron internetowych front-end. Głównie sterowany zdarzeniami, a dzięki Node.JS, Ostatnio zyskał uznanie jako język po stronie serwera. Więcej szczegółów (w języku angielskim): i. I tu:

Ksz

  • Korn Shell (ksh) to interfejs wiersza poleceń używany w systemie Unix. Była to wczesna powłoka, kompatybilna ze standardową powłoką Bourne'a, ale ze wszystkimi fajnymi interaktywnymi funkcjami powłoki C. Więcej szczegółów:

Programowanie w Linuksie

  • Programowanie w systemie Linux obejmuje wszystko, od skryptów powłoki, przez tworzenie aplikacji, aż po rozwój jądra. Więcej szczegółów (w języku angielskim):

Logo

  • Logo jest jednym z najwcześniejszych języków do nauczania programowania i nadal jest prawdopodobnie najbardziej znanym. Słynie ze swojego żółwia, którym dzieci poruszają się za pomocą poleceń komputerowych. Ciekawy sposób na naukę programowania. Więcej szczegółów (w języku angielskim):

M.L.

  • ML został pierwotnie zaprojektowany jako język metaprogramowania: język do tworzenia innych języków. Z biegiem czasu stał się jednak językiem ogólnego przeznaczenia, szeroko stosowanym w edukacji, matematyce, naukach ścisłych, a nawet finansach. Więcej szczegółów (w języku angielskim): .

MPI

  • Message Passing Interface to standardowy protokół służący do wysyłania komunikatów pomiędzy procesami lub programami. Został zaimplementowany w wielu językach programowania, w tym C, C++, Java i Python. Dzięki MPI stało się to możliwe Równoległe obliczenia. Więcej szczegółów (w języku angielskim):

Programowanie sieciowe z gniazdami internetowymi

Cel C

  • Inna wersja języka C, stworzona w latach 80. XX wieku w celu zapewnienia w pełni obiektowej implementacji języka C. Obecnie głównym zastosowaniem tego języka jest Mac OS X i sale operacyjne Systemy iOS. Do niedawna aplikacje na iOS powinien zostać napisany w Objective-C, ale teraz możesz także pisać w Swift. Więcej szczegółów (w języku angielskim):

OCaml

  • OCaml to obiektowy, funkcjonalny język komputerowy. W tradycji ML często używa się go do pisania innych języków programowania i frameworków. Więcej szczegółów (w języku angielskim): .

Rozwój systemu operacyjnego

  • Everest wśród zawodów programistycznych uważany jest za rozwój systemu operacyjnego. Jeśli chcesz udowodnić sobie, że możesz napisać wszystko, nie ma nic lepszego niż napisanie własnego jądra systemu operacyjnego i powiązanych z nim narzędzi. Ale bądź ostrożny: to podróż tylko dla odważnych i prawdziwych programistów! Więcej szczegółów (w języku angielskim): .

Perł

  • Bardzo użyteczne narzędzie prawie każdy programista. Jako język interpretowany nie wymaga kompilacji, czasami nazywany jest „szwajcarskim scyzorykiem” języków skryptowych. Więcej szczegółów (w języku angielskim):

PROLOG

  • Prolog to język programowania logicznego przeznaczony do przetwarzania język naturalny. Więcej szczegółów (w języku angielskim):

Czyste dane

  • Pure Data to unikalny wizualny język programowania. Został stworzony specjalnie, aby umożliwić użytkownikom tworzenie wideo, audio i prace graficzne. Więcej szczegółów (w języku angielskim): .

Pyton

  • Python jest językiem programowania wysokiego poziomu. Język interpretowany (nieskompilowany), znany również jako „język skryptowy”. Wykorzystywany przede wszystkim jako narzędzie do wykonywania specjalistycznych zadań programistycznych, takich jak zadania automatyzacji i analizy danych. Posiada mocny zestaw narzędzi matematycznych i obliczenia naukowe, jest często używany przez badaczy. Więcej szczegółów (w języku angielskim):

Rubin na szynach

  • Ruby on Rails to framework do tworzenia stron internetowych dla języka programowania Ruby. Zapewnia architekturę MVC ( Widok modelu Controller), warstwę abstrakcji bazy danych oraz wiele narzędzi przyspieszających proces programowania aplikacji webowych. Bardzo popularne szybki rozwój Aplikacje internetowe. Więcej szczegółów (w języku angielskim):

SAS

  • SAS to specjalistyczny język przeznaczony do analizy danych statystycznych. Szeroko stosowane w rządzie, środowisku akademickim i biznesie. Dla osób dysponujących dużą ilością danych SAS jest oczywistym wyborem. Więcej szczegółów (w języku angielskim): .

Scala

  • Scala jest językiem stosunkowo nowym - mniej więcej nowym i najlepsza Jawa. Jest to świetny język dla programistów Java, którzy chcą być bardziej wydajni, lub dla osób, które dopiero zaczynają uczyć się programowania i chcą nauczyć się potężnego języka, który nie będzie ich ograniczał w przyszłości. Więcej szczegółów (w języku angielskim): .

Schemat

  • Schemat stary język, ale nadal jest używany do nauczania programowania i bardziej zaawansowanych przedmiotów z informatyki. Oparty głównie na Lisp, a częściowo na ALGOL. Więcej szczegółów (w języku angielskim): .

Zadrapanie

  • Język programowania Scratch został stworzony specjalnie do nauczania programowania dzieci w wieku od 8 do 16 lat. Scratch jest łatwy i pozwala dzieciom w zabawny sposób nauczyć się podstaw logiki programowania. forma gry. Więcej szczegółów (w języku angielskim):

Symula

  • Simula jest językiem o znaczeniu historycznym, ponieważ jako pierwszy wprowadził koncepcje, które stały się podstawą programowania obiektowego. Więcej szczegółów (w języku angielskim): .

UŚMIECH

  • SMIL (Synchronized Multimedia Integration Language) to narzędzie dla osób chcących tworzyć i rozpowszechniać prezentacje. Szczególnie przydatne, jeśli chcesz tworzyć prezentacje, które wymagają okresowej aktualizacji. Więcej szczegółów (w języku angielskim):

SQL-a

  • SQL (Structured Query Language) – język używany do komunikacji z Relacyjną Bazą Danych Systemy zarządzania(RDBMS). SQL pozwala programiście tworzyć struktury danych, wstawiać i edytować dane oraz wysyłać do nich zapytania. Więcej szczegółów (w języku angielskim):

Stat

  • Stata to środowisko programistyczne i język programowania służące do rozwiązywania poważnych problemów statystycznych. I chociaż powstał dość dawno temu, nadal jest szeroko stosowany. Jeśli jesteś połączony z praca statystyczna, Stata to świetne narzędzie. Więcej szczegółów (w języku angielskim):

Szybki

  • Swift to nowy język programowania opracowany przez firmę przez Apple, dla systemów iOS, OS X, watchOS, tvOS i Linux. To jest język przyszłości dla twórców programów i aplikacji dla Urządzenia Apple. Więcej szczegółów (w języku angielskim):

S-PLUS

  • S-PLUS to komercyjna wersja potężnego języka programowania S przeznaczonego do przeprowadzania analiz statystycznych. Projekt GNU ma własną wersję S, zwaną R. Wszystkie niezbędne zasoby na temat S, z naciskiem na S-PLUS:

Programowanie UNIX-owe

  • Szerokość programowania w systemie Unix jest ogromna. Obejmuje zakres od skryptów administracyjnych, przez kod tekstowy, aż po rozwój X Window. Więcej szczegółów (w języku angielskim):

XML-a

  • XML jest dobry język strukturalny do znakowania, przeznaczone do odczytu zarówno przez człowieka, jak i maszynę. Więcej szczegółów (w języku angielskim):

Lekcja przygotowana przez: Akulov Ivan

Użytkownicy Recoursia często zastanawiają się, jakiego języka programowania warto się uczyć. Przygotowaliśmy krótki przewodnik dla tych, którzy decydują się na swój pierwszy język programowania. Chcielibyśmy zaznaczyć, że nie ma to charakteru kompleksowego – jest to po prostu bardzo szybkie spojrzenie na to, czym obecnie zajmują się programiści i który język programowania może być pierwszy, a który nie.

Jeden z dość popularnych języków programowania WWW, który jednak na białoruskim rynku pracy nie zawsze jest w stanie zapewnić swojemu native speakerowi najlepiej płatną pracę. Kursy Ruby nie są warte studiowania, aby opanować pierwszy język programowania, ponieważ z dużym prawdopodobieństwem poszukiwanie pracodawcy będzie opóźnione, ponieważ oferty pracy dla juniorów w Ruby pojawiają się dość rzadko.

Zaledwie pięć do siedmiu lat temu Delphi był standardowym pierwszym językiem programowania – oczywiście dlatego, że język Pascal, który jest poprzednikiem Delphi, został wynaleziony, aby uczyć programowania dzieci w wieku szkolnym i studentów. Ale dla prawdziwe życie Delphi jest już bardzo odpowiedni, ponieważ programowanie na nim kosztuje zauważalnie poniżej średniej i jest nowe główne projekty W tym języku tego nie znajdziesz. Dlatego polecam

JĘZYK PROGRAMOWANIA I JEGO RODZAJE

Język programowania to formalny system znaków przeznaczony do pisania programów komputerowych. Język programowania definiuje zbiór reguł leksykalnych, syntaktycznych i semantycznych, które definiują wygląd programy i działania, które wykonawca (komputer) wykona pod jego kontrolą.

Język programowania wysokiego poziomu to język programowania zaprojektowany tak, aby był szybki i łatwy w użyciu przez programistę. Główną cechą języków wysokiego poziomu jest abstrakcja, czyli wprowadzenie konstrukcji semantycznych, które w skrócie opisują takie struktury danych i operacje na nich, których opisy w kodzie maszynowym (lub innym języku programowania niskiego poziomu) są bardzo długie i trudne do zrozumienia.

Język programowania niskiego poziomu (język programowania niskiego poziomu) to język programowania zbliżony do programowania bezpośrednio w kodach maszynowych używanego procesora rzeczywistego lub wirtualnego (np. Java, Microsoft .NET). Do oznaczenia instrukcji maszynowych zwykle używa się notacji mnemonicznej. Dzięki temu polecenia można zapamiętać nie jako ciąg zer i jedynek binarnych, ale jako znaczące skróty słów w języku ludzkim (zwykle angielskim).

JĘZYKI PROGRAMOWANIA NISKIEGO POZIOMU

Wczesne komputery musiały być programowane przy użyciu binarnych kodów maszynowych. Jednak programowanie w ten sposób jest dość pracochłonne i trudne zadanie. Aby uprościć to zadanie, zaczęły pojawiać się języki programowania niskiego poziomu, które umożliwiły określanie poleceń maszyny w formie bardziej zrozumiałej dla człowieka. Aby je przekonwertować na kod binarny zostały stworzone specjalne programy- tłumacze.

Ryc.1. Przykład kodu maszynowego i jego reprezentacji w asemblerze

Tłumacze dzielą się na:

    kompilatory - konwertują tekst programu na kod maszynowy, który można zapisać i następnie wykorzystać bez kompilatora (przykładem są pliki wykonywalne z rozszerzeniem *.exe);

    interpretery - zamień część programu na kod maszynowy, wykonaj go i przejdź do następnej części. W tym przypadku przy każdym uruchomieniu programu używany jest interpreter.

Przykładem języka niskiego poziomu jest język asemblera. Języki niskiego poziomu skupiają się na konkretnym typie procesora i uwzględniają jego możliwości, dlatego aby przenieść program w języku asemblera na inną platformę sprzętową, trzeba go niemal całkowicie przepisać. Istnieją również pewne różnice w składni programów dla różnych kompilatorów. To prawda, że ​​​​centralne procesory do komputerów AMD i Intel są praktycznie kompatybilne i różnią się tylko niektórymi konkretnymi poleceniami. Ale wyspecjalizowane procesory dla innych urządzeń, na przykład kart graficznych i telefonów, zawierają znaczne różnice.

Zalety

Języki niskiego poziomu tworzą wydajne i kompaktowe programy, ponieważ programista ma dostęp do wszystkich możliwości procesora.

Wady

    Programista pracujący z językami niskiego poziomu musi posiadać wysokie kwalifikacje i dobrą znajomość struktury układu mikroprocesorowego, dla którego tworzony jest program. Jeśli więc tworzony jest program dla komputera, musisz znać urządzenie komputera, a zwłaszcza urządzenie i funkcje operacyjne jego procesora;

    powstałego programu nie można przenieść na komputer lub urządzenie z innym typem procesora;

    znaczny czas opracowywania dużych i złożonych programów.

Języki niskiego poziomu wykorzystywane są najczęściej do pisania małych programów systemowych, sterowników urządzeń, modułów interfejsów z niestandardowym wyposażeniem, programowania wyspecjalizowanych mikroprocesorów, gdy najważniejszymi wymaganiami są zwartość, szybkość i możliwość bezpośredniego dostępu do zasobów sprzętowych.

Asembler jest językiem niskiego poziomu, który jest nadal szeroko używany.

JĘZYKI PROGRAMOWANIA WYSOKIEGO POZIOMU

Rozważany jest pierwszy język programowania wysokiego poziomu język komputerowy Plankalkül, opracowany przez niemieckiego inżyniera Konrada Zuse w latach 1942-1946. Jednak tłumacz na niego istniał dopiero w 2000 roku. Pierwszym na świecie tłumaczem języka wysokiego poziomu jest PP (Program Programming Program), znany również jako PP-1, pomyślnie przetestowany w 1954 roku. Tłumacz PP-2 (1955, 4. na świecie tłumacz) był już optymalizowany i zawierał własny moduł ładujący i debuger, bibliotekę standardowych procedur, a tłumacz PP dla komputera Strela-4 zawierał już linker modułów. Jednak powszechne użycie języków wysokiego poziomu rozpoczęło się wraz z pojawieniem się Fortranu i stworzeniem kompilatora dla tego języka (1957).

Języki wysokiego poziomu dążą nie tylko do ułatwienia rozwiązywania złożonych zadania programu, ale także w celu uproszczenia przenoszenia oprogramowania. Korzystanie z różnych tłumaczy pisemnych i ustnych zapewnia połączenie programów napisanych przy użyciu języków wysokiego poziomu z różnymi system operacyjny i sprzętu, podczas gdy ich kod źródłowy pozostaje, w idealnym przypadku, niezmieniony.

Ten rodzaj izolacji języków wysokiego poziomu od sprzętowej implementacji komputera, oprócz wielu zalet, ma również wady. W szczególności nie pozwala na tworzenie prostych i precyzyjnych instrukcji dla używanego sprzętu. Programy napisane w językach wysokiego poziomu są łatwiejsze do zrozumienia dla programisty, ale są mniej wydajne niż ich odpowiedniki tworzone przy użyciu języków niskiego poziomu. Jedną z konsekwencji tego było dodanie obsługi tego lub innego języka niskiego poziomu (języka asemblera) do wielu nowoczesnych profesjonalnych języków programowania wysokiego poziomu.

Przykłady: C, C++, C#, Java, Python, PHP, Ruby, Perl, Pascal, Delphi, Lisp. Języki wysokiego poziomu charakteryzują się możliwością pracy ze złożonymi strukturami danych. Większość z nich posiada zintegrowaną obsługę typów stringów, obiektów i operacji plik we/wy itp. Wadą języków wysokiego poziomu jest większy rozmiar programów w porównaniu z programami w języku niskiego poziomu. Dlatego też języki wysokiego poziomu wykorzystywane są głównie do tworzenia oprogramowania dla komputerów i urządzeń posiadających dużą ilość pamięci. Różne podtypy asemblera są używane do programowania innych urządzeń, w których rozmiar programu jest krytyczny.

Języki imperatywne opierają się na kilku ważnych ideach, w tym na reprezentacji działań w postaci wzorów matematycznych, koncepcji typu danych i twierdzeniu o transformacji strukturalnej.

Program w języku imperatywnym zbudowany jest z funkcji (podprogramów). Programy w języku asemblera również mogą składać się z podprogramów i nie jest to żadna nowość, ale języki wysokiego poziomu pozwalają nie myśleć o takich kwestiach jak organizowanie wywołań, przesyłanie danych źródłowych i zwracanie wyników. Opis funkcji składa się z nazwy, listy parametrów (danych początkowych), rodzaju wyniku oraz działań prowadzących do uzyskania tego wyniku. Jedna z funkcji programu jest główna, jej wykonanie jest pracą programu.

Prostym przykładem jest funkcja obliczająca sinus liczby. Można to nazwać grzechem, jego dane początkowe składają się z jednej liczby rzeczywistej, wynik jest również liczbą rzeczywistą, otrzymaną przez zsumowanie odcinka znanego nieskończonego szeregu (lub wykonanie polecenia fsin koprocesora matematycznego).

Zestaw akcji, które można wykonać wewnątrz funkcji, jest bardzo ograniczony. Polega na ocenie wyrażeń formułowych, wywołaniu innych funkcji (co nie jest odrębną akcją - często wywołanie funkcji jest zawarte w wyrażeniu), przypisaniach, rozgałęzieniach (grupa akcji, które są wykonywane tylko wtedy, gdy jakiś warunek jest spełniony) oraz pętlach ( grupa czynności, które są wykonywane wielokrotnie, liczba powtórzeń zależy od jakiegoś warunku). Akcje mogą być zagnieżdżane jedna w drugiej. Może się wydawać, że zestaw odgałęzień i pętli jest za mały, ale tak nie jest. Udowodniono, że dowolny algorytm złożony z bloków funkcjonalnych (na niskim poziomie - poleceń arytmetycznych i poleceń przesyłania danych), przejść warunkowych i bezwarunkowych można przekształcić w równoważny algorytm złożony wyłącznie z bloków strukturalnych - bloków funkcjonalnych, gałęzi i pętli z warunkiem sprawdzenie w końcu. Stwierdzenie to zostało sformułowane w artykule Corrado Bohma i Giuseppe Jacopiniego „Diagramy przepływu, maszyny Turinga i języki z tylko dwiema regułami formowania” (Komunikacje ACM, tom 9 / numer 5 / maj 1965).

Jeśli w celu wykonania niezbędnych działań konieczne jest gdzieś przechowanie wyników pośrednich, wewnątrz funkcji umieszczane są specjalne deklaracje zawierające nazwy zmiennych i ewentualnie inne informacje. Adresy komórek RAM zostaną im przypisane automatycznie. W niektórych językach funkcje mogą zawierać także definicje stałych i typów. W językach pascalowych funkcja przypomina program i może zawierać definicje nie tylko stałych, typów i zmiennych, ale także innych funkcji.

Deklaracja danych to lista nazwanych obiektów. Obiekty te nazywane są zmiennymi. W wielu językach należy określić typ zmiennej, który określa ilość pamięci potrzebnej do jej umieszczenia oraz zestaw operacji, w których może ona uczestniczyć. Ale niekoniecznie tak jest; istnieją języki, w których typ zmiennej nie jest określony i może się zmienić podczas wykonywania programu.

Zazwyczaj języki programowania zapewniają dość ograniczony zestaw predefiniowanych typów zmiennych i narzędzi do tworzenia nowych typów. Niektóre z następujących typów są predefiniowane:

    liczby naturalne i całkowite o różnych rozmiarach;

    liczby rzeczywiste;

    symbole - litery, cyfry, znaki arytmetyczne itp.;

    ciągi znaków;

    wartości logiczne;

    wskazówki

Działania na danych można wykonywać za pomocą funkcji i operatorów.

Na przykład w języku C symbole, ciągi znaków i wartości logiczne nie są zdefiniowane. Jego typ char jest w rzeczywistości krótką liczbą całkowitą i umożliwia wykonywanie operacji arytmetycznych.

Nowe typy powstają poprzez połączenie w jedną całość kilku elementów tego samego typu (tablica, każdy jej element ma numer seryjny) lub elementów różnych typów (struktura, każdy jej element ma nadane imię). Na przykład w większości języków liczby zespolone nie są zdefiniowane, ale można je zdefiniować:

W niektórych językach (np. C++) dla tworzonych typów można definiować także operatory, co pozwala na używanie zmiennych tych typów w taki sam sposób, jak zmiennych typów predefiniowanych.

Istnieją inne sposoby tworzenia nowych typów. Przykładowo w Pascalu możliwe jest utworzenie:

    typy zakresów (poprzez określenie zakresu wartości);

    typy wyliczeniowe (poprzez wyliczenie możliwych wartości);

    ustawić typy

Zmienne typów zestawów mogą służyć do przechowywania informacji o zestawie właściwości dowolnych obiektów. Coś podobnego można zrobić za pomocą zmiennych typu całkowitego, zestaw bitów które wskazują na obecność odpowiednich właściwości. Podobno używanie zestawów jest bardziej odporne na błędy programisty.

Programista William W. Vold opowiada tę historię

Przez ostatnie sześć miesięcy pracowałem nad stworzeniem języka programowania (PL) o nazwie Pinecone. Nie odważyłbym się nazwać go kompletnym, ale już można z niego korzystać - zawiera wystarczającą ilość elementów, takich jak zmienne, funkcje i niestandardowe struktury danych. Jeśli chcesz to sprawdzić przed przeczytaniem, sugeruję odwiedzenie oficjalnej strony i repozytorium na GitHubie.

Wstęp

Nie jestem ekspertem. Kiedy zaczynałem pracę nad tym projektem, nie miałem pojęcia, co robię i nadal nie mam. Nigdy celowo nie studiowałem zasad tworzenia języka - czytałem tylko niektóre materiały w Internecie i nawet w nich nie znalazłem prawie nic przydatnego dla siebie.

Napisałem jednak absolutnie nowy język. I to działa. Pewnie robię coś dobrze.

W tym artykule postaram się pokazać, jak Pinecone (i inne języki programowania) zamieniają kod źródłowy w coś, co wielu uważa za magiczne. Skupię się także na sytuacjach, w których musiałem iść na kompromis i wyjaśnię, dlaczego podjąłem takie decyzje.

Tekst z pewnością nie pretenduje do miana pełnoprawnego przewodnika po tworzeniu języka programowania, ale dla ciekawskich będzie dobrym punktem wyjścia.

Pierwsze kroki

„Od czego w ogóle mam zacząć?” to pytanie, które często zadają inni programiści, gdy dowiadują się, że piszę w swoim własnym języku. W tej części postaram się odpowiedzieć szczegółowo.

Skompilowane czy zinterpretowane?

Kompilator analizuje cały program, przekształca go w kod maszynowy i przechowuje do późniejszego wykonania. Interpreter analizuje i wykonuje program linia po linii w czasie rzeczywistym.

Technicznie rzecz biorąc, każdy język może być zarówno kompilowany, jak i interpretowany. Ale dla każdego języka jedna z metod jest bardziej odpowiednia niż druga, a wybór paradygmatu zależy od wczesne stadia determinuje dalszy projekt. Ogólnie rzecz biorąc, interpretacja jest elastyczna, a kompilacja zapewnia wysoką wydajność, ale to tylko wierzchołek bardzo złożonego tematu.

Chciałem stworzyć prosty, ale potężny język, co jest rzadkością, więc zdecydowałem się na kompilację Pinecone od samego początku. Jednak Pinecone ma również tłumacza - początkowo uruchomienie było możliwe tylko za jego pomocą, później wyjaśnię dlaczego.

Notatka tłumaczenie Swoją drogą, mamy krótka recenzja

to świetne ćwiczenie dla osób uczących się języka Python.

Wybór języka Rodzaj metaetapu: sam język programowania jest programem, który trzeba napisać w jakimś języku. Wybrałem C++ ze względu na wydajność, duży zestaw funkcjonalność

i tylko dlatego, że go lubię.

  • Ale ogólnie można udzielić następujących rad: zrozumiały językwysoce polecany pisać
  • w języku skompilowanym (C, C++, Swift). W przeciwnym razie narzut wydajności będzie rósł, podczas gdy metainterpreter będzie interpretował twój interpreter; język skompilowany w języku interpretowanym (Python, JS). Wydłuży się czas kompilacji, ale nie czas wykonania programu.

Projekt architektury

Struktura języka programowania składa się z kilku etapów, od kodu źródłowego do Plik wykonywalny, z których każdy w określony sposób formatuje dane, a także funkcje umożliwiające przechodzenie pomiędzy tymi etapami. Porozmawiajmy o tym bardziej szczegółowo.

Analizator leksykalny/leksyk

Linia kodu źródłowego przechodzi przez lekser i przekształcana w listę tokenów.

Pierwszym krokiem w większości języków jest analiza leksykalna. W uproszczeniu reprezentuje podział tekstu na tokeny, czyli jednostki językowe: zmienne, nazwy funkcji (identyfikatory), operatory, liczby. Zatem podając lekserowi ciąg znaków zawierający kod źródłowy jako dane wejściowe, otrzymamy jako wynik listę wszystkich zawartych w nim tokenów.

Apeluje do kod źródłowy nie będą już występowały w kolejnych etapach, dlatego leksyk musi podać wszystkie niezbędne im informacje.

Przewód

Tworząc język, pierwszą rzeczą, którą zrobiłem, było napisanie leksykonu. Później zbadałem narzędzia, które mogłyby ułatwić analizę leksykalną i zmniejszyć liczbę pojawiających się błędów.

Jednym z głównych takich narzędzi jest Flex - generator analizatorów leksykalnych. Jako dane wejściowe pobiera plik opisujący gramatykę języka, a następnie tworzy program w języku C, który z kolei analizuje ciąg znaków i daje pożądany wynik.

Moja decyzja

Zdecydowałem się zachować analizator, który napisałem. Ostatecznie nie widziałem żadnych szczególnych zalet Flexa, a jego użycie spowodowałoby jedynie utworzenie dodatkowych zależności, które skomplikowałyby proces kompilacji. Dodatkowo mój wybór pozwala na większą elastyczność - na przykład możesz dodać instrukcję do języka bez konieczności edytowania wielu plików.

Parser/parser

Lista tokenów przechodzi przez parser i zamienia się w drzewo.

Następnym etapem jest parser. Przekształca tekst źródłowy, czyli listę tokenów (uwzględniając nawiasy i kolejność operacji), w abstrakcyjne drzewo składniowe, które pozwala strukturalnie przedstawić reguły tworzony język. Sam proces można nazwać prostym, jednak wraz ze wzrostem liczby konstrukcji językowych staje się on znacznie bardziej skomplikowany.

Bizon

Na tym etapie myślałem również o użyciu biblioteki strony trzeciej, szukając programu Bison do wygenerowania parsera. To trochę jak Flex – niestandardowy plik z regułami składni jest skonstruowany przy użyciu programu w C. Ale znowu zdecydowałem się nie używać narzędzi do automatyzacji.

Zalety programów niestandardowych

W przypadku leksykatora moja decyzja o napisaniu i użyciu własnego kodu (o długości około 200 linii) była dość oczywista: uwielbiam łamigłówki, a ta jest również stosunkowo banalna. Parser to inna historia: teraz długość kodu wynosi 750 linii i jest to już trzecia próba (pierwsze dwie były po prostu okropne).

Postanowiłem jednak zrobić parser sam. Oto główne powody:

  • zminimalizować przełączanie kontekstu;
  • uproszczenie montażu;
  • chęć samodzielnego poradzenia sobie z zadaniem.

O wykonalności rozwiązania przekonała mnie wypowiedź Waltera Brighta (twórcy języka D) w jednym z jego artykułów:

Nie polecałbym używania generatorów lekserów i parserów, a także innych tak zwanych „kompilatorów kompilatorów”. Napisanie leksera i parsera nie zajmie dużo czasu, a użycie generatora mocno Cię z tym zwiąże dalsza praca(co ma znaczenie przy przenoszeniu kompilatora do nowa platforma). Ponadto generatory charakteryzują się generowaniem nieistotnych komunikatów o błędach.

Abstrakcyjny wykres semantyczny

Przejście od drzewa składniowego do wykresu semantycznego

W tej części zaimplementowałem strukturę, która jest zasadniczo najbliższa „reprezentacji pośredniej” w LLVM. Istnieje niewielka, ale istotna różnica pomiędzy abstrakcyjnym drzewem składni (AST) a abstrakcyjnym wykresem semantycznym (ASG).

ASG kontra ASD

Z grubsza rzecz ujmując, wykres semantyczny to drzewo syntaktyczne z kontekstem. Oznacza to, że zawiera informacje takie jak typ zwracany przez funkcję lub w jakich miejscach używana jest ta sama zmienna. Ponieważ graf musi rozpoznawać i zapamiętywać cały ten kontekst, kod, który go generuje, potrzebuje wsparcia w postaci wielu różnych tabel objaśniających.

Początek

Po narysowaniu wykresu uruchomienie programu jest dość prostym zadaniem. Każdy węzeł zawiera implementację funkcji, która pobiera pewne dane wejściowe, wykonuje to, do czego została zaprogramowana (w tym możliwe wywołania funkcji pomocniczych) i zwraca wynik. Oto tłumacz w akcji.

Opcje kompilacji

Być może zastanawiasz się, skąd wziął się interpreter, ponieważ pierwotnie zdefiniowałem Pinecone jako język skompilowany. Rzecz w tym, że kompilacja jest znacznie trudniejsza niż interpretacja - wspominałem wcześniej, że na tym etapie napotkałem pewne problemy.

Napisz własny kompilator

Na początku spodobał mi się ten pomysł - lubię robić wszystko sam i od dawna chciałem nauczyć się języka asemblera. Jednak utworzenie od podstaw wieloplatformowego kompilatora jest trudniejsze niż pisanie kodu maszynowego dla każdego elementu języka. Uważam ten pomysł za całkowicie niepraktyczny i niewarty wydanych środków.