Język wysokiego poziomu
Język wysokiego poziomu (ang. high-level programming language) – typ języka programowania, którego składnia i słowa kluczowe mają w jak największym stopniu ułatwić rozumienie kodu programu przez człowieka, tym samym zwiększając poziom abstrakcji i dystansując się od sprzętowych niuansów. Większość z nich można zaliczyć do języków uniwersalnych, służących do rozwiązywania szerokiego zakresu problemów. Kod napisany w języku wysokiego poziomu nie jest bezpośrednio „zrozumiały” przez procesor komputera – większość kodu stanowią normalne słowa, jak w języku naturalnym. Aby umożliwić wykonanie programu napisanego w takim języku należy wpierw poddać go procesowi kompilacji. Do języków wysokiego poziomu zalicza się m.in. Pascal, C, C++, Logo i BASIC[1][2].
Cechy
edytujPojęcie „język wysokiego poziomu” oznacza odwoływanie się do wyższego poziomu abstrakcji niż poziom kodu maszynowego, a nawet poziom języków niskopoziomowych. Zamiast zajmować się rejestrami, adresami pamięci oraz stosami, języki wysokiego poziomu dotyczą zmiennych, tablic, obiektów, zaawansowanych arytmetycznych oraz logicznych wyrażeń, podprogramów i funkcji, pętli, kroków oraz innych abstrakcyjnych konceptów komputerowych, z naciskiem na użyteczność ponad optymalną wydajność programu. Inne ich cechy to procedury do obsługi ciągów znaków, obiektowe cechy programowania, obecne mogą być również procesy wejścia/wyjścia. W przeciwieństwie do języków niskiego poziomu, języki wysokiego poziomu mają co najwyżej kilka elementów, które bezpośrednio tłumaczy się na kod języka maszynowego. Ważnym faktem jest również, że pozwalają one na odseparowanie kodu źródłowego programów od architektury konkretnej maszyny. W przeciwieństwie do języków niskiego poziomu, takich jak asembler lub język maszynowy, języki wysokiego poziomu mogą „wzmacniać” instrukcje programistów i wywoływać wiele zmian w danych (realizowanych w tle) bez ich wiedzy. Odpowiedzialność i moc wykonywania instrukcji zostały zdjęte z barków programisty i złożone na karb maszyny.
Charakterystyka kodu
edytujJęzyki wysokiego poziomu są przeznaczone do zapewniania cech, które standaryzują częste zadania, zezwalają na bogate debugowanie oraz zajmują się architektonicznym agnostycyzmem, podczas gdy języki niskiego poziomu częściej tworzą więcej wydajnego kodu poprzez optymalizację pod specyficzną architekturę. Narzut abstrakcji jest granicą, która zapobiega dołączaniu technik wysokiego programowania tam, gdzie ograniczenia obliczeniowe, zgodność ze standardami lub ograniczenia fizyczne odwołują się do niskopoziomowych warstw architektonicznych zasobów (dla przykładu – czas na odpowiedź czy integracja sprzętowa).
Wysokopoziomowe programowanie eksponuje cechy takie jak:
- bardziej ogólne struktury danych/operacji;
- interpretacja czasu działania oraz średnio zaawansowanych plików z kodem, z których często wynika uruchomienie większej ilości operacji, niż jest to potrzebne;
- większego użycia pamięci oraz binarnie większego objętościowo kodu.
Z tego powodu kod, który musi być szczególnie szybki oraz wydajny, może wymagać użycia języka niskiego poziomu, nawet jeżeli użycie wysokopoziomowego języka byłoby łatwiejsze. W wielu sytuacjach krytyczne części programu napisanego w języku wysokiego poziomu mogłyby być zakodowane ręcznie w asemblerze, co doprowadziłoby do szybszego, bardziej wydajnego lub po prostu niezawodnie funkcjonującego i zoptymalizowanego programu. Jednakże wraz ze zwiększającą się złożonością nowoczesnej architektury mikroprocesorów, dobrze stworzone kompilatory języków wysokiego poziomu częściej produkują kod porównywalny w wydajności do tego, który niskopoziomowi programiści są w stanie napisać ręcznie, a wyższy poziom abstrakcji może pozwolić na zastosowanie lepszych technik, z których wynikają lepsze ogólne wyniki, niż w ich niskopoziomowych odpowiednikach w konkretnych ustawieniach.
Istnieje również grupa języków wysokiego poziomu, które tworzone są jako całkowicie niezależne od architektury systemu komputerowego. Ułatwia to uruchamianie programów napisanych w takich językach w jakimkolwiek systemie operacyjnym, który ma odpowiednie wsparcie interpretera bądź kompilatora JIT (Just-In-Time – realizacja w czasie rzeczywistym). Fundamentalnymi przykładami takich rozwiązań są wirtualna maszyna Javy oraz środowisko uruchomieniowe .NET CLR.
Ewolucja
edytujJęzyki wysokiego poziomu mogą być rozwijane w wyniku wprowadzania ulepszeń specyfikacji. Przykładem jest język Scala, który utrzymuje kompatybilność wsteczną z Javą, co oznacza, że programy lub biblioteki napisane w Javie mogą być użyte również, gdy programiści przejdą na Scalę. Ułatwia to przenoszenie oprogramowania. Dla kontrastu, niskopoziomowe programy rzadko są w stanie przetrwać poza konkretną architekturą, dla której zostały napisane, bez większych zmian.
Przykład
edytujPrzykładowy program w języku niskopoziomowym – asemblerze:
.START ST
ST: MOV R1,#2
MOV R2,#1
M1: CMP R2,#20
BGT M2
MUL R1,R2
INI R2
JMP M1
M2: JSR PRINT
.END
i ten sam program w języku wysokopoziomowym – BASIC-u:
A:=2;
FOR I:=1 TO 20 LOOP
A:=A*I;
END LOOP;
PRINT(A);