Skip to content

Поделе програмских језика

До данас је креирано више хиљада програмских језика, али нису сви једнако важни и заступљени. Поред важности и заступљености, програмски језици могу се поделити на много начина и у много категорија у зависности од критеријума на основу којих се врши подела.

Подела према степену блискости са архитектуром процесора

Из предмета Рачунарство и информатика научио си да је централна процесорска јединица (енгл. Central Processing Unit - CPU), скраћено процесор, електронска компонента која извршава инструкције програма и обрађује податке. Процесори се, према типу инструкција које извршавају, могу грубо поделити на две врсте:

  • RISC (енгл. Reduced Instruction Set Computer) процесори користе мањи скуп једноставних инструкција, где се свака инструкција извршава веома брзо, често у једном циклусу процесора, што поједностављује дизајн процесора и повећава ефикасност; и
  • CISC (енгл. Complex Instruction Set Computer) процесори подржавају сложеније инструкције, где једна инструкција може да обави сложен задатак који би на RISC архитектури захтевао више инструкција.

На пример, у твом мобилном телефону или таблету вероватно се налази ARM процесор заснован на RISC архитектури. Донедавно, у лаптоп и десктоп рачунарима доминирали су x86/x64 процесори засновани на CISC архитектури компанија Intel и AMD. Међутим, новији декстоп и лаптоп рачунари компаније Apple користе Apple Silicon процесоре (M1, M2 и M3) који су такође засновани на ARM (RISC) архитектури, показујући да границе између ових технологија постају све флексибилније.

Према степену блискости са архитектуром процесора, програмски језици деле се на језике ниског нивоа (машински и асемблерски) и језике високог нивоа (C, C++, C#, Java...). Језици ниског нивоа подразумевају блискост са одређеном процесорском архитектуром, док се језици високог нивоа, захваљујући компајлерима, могу користити на рачунарима са различитим архитектурама процесора.

То значи да ће асемблерски програм написан за процесор у CISC технологији бити неупотребљив за процесор у RISC технологији и обрнуто. Врло је вероватно и да ће асемблерски програм написан за процесор у одређеној технологији одређене генерације бити неупотребљив за процесор исте технологије много новије или много старије генерације. С друге стране, програм написан у програмском језику високог нивоа може да буде функционалан за процесор било које технологије и било које генерације.

Машински програм извршава се директно у процесору и овакви програми су потпуно неразумљиви човеку. Асемблерски програми састоје се из мнемоничких наредби које готово директно одговарају појединачним инструкцијама машинског језика. Наредбе програмских језика високог нивоа су блиске енглеском језику и структуриране су тако да одговарају начину размишљања програмера.

Следе примери програма у програмским језицима високог нивоа (C, C++, C#) и ниског нивоа (асемблерски програм и део машинског кôда). По извршавању, сви програми на стандардни излаз, односно у конзолу исписују текст Hello, World!.

#include <stdio.h>

int main(void)
{
    printf("Hello, World!");
    return 0;
}
#include <iostream>

int main(void)
{
    std::cout << "Hello, World!";
    return 0;
}
using System;

namespace HelloWorld
{
    internal class Program
    {
        static void Main()
        {
            Console.WriteLine("Hello, World!");
        }
    }
}
printf      proto
includelib  msvcrt.lib
includelib  legacy_stdio_definitions.lib

.data
        msg db 'Hello, World!', 0

.code
main    proc
        sub rsp, 40h
        mov rcx, offset msg
        call printf
        add rsp, 40h
        ret
main    endp
        end
00: 4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00
01: b8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00
02: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
03: 00 00 00 00 00 00 00 00 00 00 00 00 f8 00 00 00
04: 0e 1f ba 0e 00 b4 09 cd 21 b8 01 4c cd 21 54 68
05: 69 73 20 70 72 6f 67 72 61 6d 20 63 61 6e 6e 6f
06: 74 20 62 65 20 72 75 6e 20 69 6e 20 44 4f 53 20
07: 6d 6f 64 65 2e 0d 0d 0a 24 00 00 00 00 00 00 00
08: af c0 6f c1 eb a1 01 92 eb a1 01 92 eb a1 01 92
09: 54 dd 00 93 e8 a1 01 92 54 dd 04 93 f3 a1 01 92
0A: 54 dd 05 93 e0 a1 01 92 54 dd 02 93 e8 a1 01 92
0B: ff ca 00 93 ef a1 01 92 eb a1 00 92 ac a1 01 92
0C: 32 dc 05 93 ea a1 01 92 32 dc fe 92 ea a1 01 92
0D: 32 dc 03 93 ea a1 01 92 52 69 63 68 eb a1 01 92
0E: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0F: 00 00 00 00 00 00 00 00 50 45 00 00 64 86 0a 00
10: c3 e8 42 64 00 00 00 00 00 00 00 00 f0 00 22 00
...

Чак и ако не знаш ништа о програмирању и програмским језицима, а знаш енглески језик, можеш отприлике да претпоставиш шта наредбе у језицима високог нивоа значе. Такође, ове програме можеш компајлирати за различите рачунарске системе, са различитим процесорима и различитим оперативним системима.

Дати асемблерски програм ће бити функционалан само ако се користи Microsoft асемблер на 64-битној верзији оперативног система Windows на рачунарима са Intel или AMD 64-битним процесорима у CISC технологији. Уколико се користи неки други асемблер на другом оперативном систему, или се користи рачунар са другом архитектуром процесора, дати програм неће бити функционалан. С друге стране, дати изворни кôд програма написаног у C-у је преносив. То значи да се исти кôд може успешно компајлирати помоћу одговарајућег C компајлера за готово сваки оперативни систем и процесорску архитектуру.

У одређеној литератури прочитаћеш да је ово подела програмских језика према генерацијама. Тако, машински језик се сматра програмским језиком прве генерације, асемблерски језик програмским језиком друге генерације, а програмски језици високог нивоа (Fortran, Pascal, C и др.) програмским језицима треће генерације. Генерацијска класификација језика на високом нивоу, од треће генерације на даље, никада није била у потпуности прецизирана, а касније је и напуштена.

Подела према начину извршавања програма

Да би рачунар могао да разуме програм написан у неком програмском језику високог нивоа, као што су Python, C, C++, C# или Java, тај програм се мора превести на машински језик. Постоје два основна начина на која се овај превод и извршавање одвијају, а на основу тога језике делимо на компајлерске и интерпретерске.

Компајлерски језици

Код ових језика, цео изворни кôд програма се одједном преводи у машински кôд помоћу специјалног програма који се зове компајлер (енгл. compiler). Резултат овог процеса је извршни фајл (са екстензијом .exe у Windows-у), која садржи инструкције које процесор може директно да изврши. Предности компајлерских језика у односу на интерпретерске огледају се у:

  • брзини извршавања (програми су веома брзи јер се извршавају директно у процесору),
  • откривању грешака (компајлер анализира цео програм и пријављује многе грешке пре него што се програм преведе у машински кôд и покрене) и
  • дистрибуцији (лако је дистрибуирати извршни фајл корисницима).