Симула (енгл. Simula; изговор: симула) је назив за два симулациона програмска језика, Симула I и Симула 67, који су развијени 60-их година 20. века у Норвешком компјутерском центру у Ослу, од стране Оле-Јохана Дала и Кристена Најгарда. Синтаксички то је верни наследник Алгола 60.[1]:1.3.1
Симула 67 је увео објекте[1]:2, 5.3, класе[1]:1.3.3, 2, наслеђивање, поткласе[1]:2.2.1, виртуалне процедуре[1]:2.2.3, симулације дискретних догађаја и сакупљање отпадака.[1]:9.1
Може се рећи да је Симула први објектно-оријентисани језик. Као што му и само име каже, дизајниран је за симулације и потребе тог домена су обезбедиле оквир за многе карактеристике данашњих објектно-оријентисаних језика.
Симула се користи за симулацију ВЛСИ дизајна, моделирање процеса, протокола, алгоритама, али и у другим областима као што су: рачунарска графика, подешавање типова и едукација.
Утицај Симуле је често подређен, а Симулини типови објеката су често имплементирани од стране других програмских језика међу којима су: C++, C#, Java, Object Pascal.
Рачунарски научници, као што су Бјарне Стравструп[2], творац C++, и Џејмс Гослинг[3], творац Јаве, су признали да је Симула имала главни утицај на њих и њихове језике.[4]
Историјат
Кристен Најгард је почео да пише рачунарске програме за симулације 1957. године. Он је уочио потребу за бољим начином да се опишу хетерогеност и операције система. Да би наставио даље са својим идејама, Најгард је схватио да му је потребан неко са бољим вештинама у програмирању. Оле-Јохан Дал му се придружио у јануару 1962. год. Недуго након тога одлучено је да језик буде повезан са језиком Алгол 60. До маја исте године главни концепти за симулациони језик су били постављени. Настао је језик СИМУЛА I, програмски језик специјалне намене за симулацију дискретних догађаја.
Кристен Најгард је позван у UNIVAC крајем маја 1962. године у вези са рекламирањем њиховог новог UNIVAC 1107 рачунара. У тој посети Најгард је представио идеје Симуле Робертy Бернерy, директору системског програмирања UNIVAC-а.
Бернер је био велики обожавалац Алгола и допала му се идеја о пројекту Симула. Он је позвао Најгарда на другу интернационалну конференцију за процесирање информација која је била организована од стране ИФИП-a[5], где је Најгард је преставио свој чланак о симули.
Норвешки рачунарски центар је добио UNIVAC 1107 у августу 1963. године са великим попустом на којем је Дал имплементирао Симулу I под уговором са UNIVAC-ом. Имплементација је базирана на "UNIVAC ALGOL 60" компајлеру. Симула I је била потпуно оспособљена на UNIVAC 1107 до јануара 1965. године. У наредних неколико година, Дал и Најгард су провели пуно времена предајући Симулу. Симула се убрзо проширила у неколико земаља широм света.
Дал и Најгард су изнели свој чланак о класним и поткласним декларацијама на ИФИП конференцији за симулационе језике у Ослу, маја 1967. године. Тај чланак је постао прва формална дефиниција СИМУЛЕ 67.
Симула је имала доста утицаја на развој Смолток-а[6] и касније објектно-оријентисане програмске језике.
Касних 60-их и раних 70-их постојале су 4 главне имплементације Симуле:
UNIVAC 1100
System/360 и System/370 од стране Норвешког рачунарског центра
CDC 3000
TOPS-10
Ове имплементације су уграђене на многим платформама. TOPS-10 је имплементирао концепт јавних, заштићених и приватних променљивих и процедура, који је касније имплементиран у Симулу 87. Симула 87 је најновији стандард и распрострањен је на више платформи. Постоје 3 главне имплементације:
У новембру 2001. године, Дал и Најгард су добили Џон фон Нојманову медаљу од стране ИЕЕЕ[8], за увођење концепата објектно-оријентисаног програмирања кроз дизајн и имплементацију Симуле 67. У априлу 2002. године су добили Тјурингову награду од стране АЦМ-а[9], због идеја неопходних за настанак објектно-оријентисаног програмирања, кроз дизајн програмских језика Симула I и Симула 67.
Нажалост, ни Дал ни Најгард нису могли да присуствују додели награда, јер су преминули у јуну и августу исте године.[10]
Симула се и дан данас предаје на многим курсевима и универзитетима.[11]
Неке од карактеристика Симуле 67
Подршка за алгоритме
Симула 67 садржи многе погодности Алгола 60, којег су творци Симуле искористили као темељ јер је Алгол био изузетно популаран у Европи 60-их година.
Декомпозиција
У циљу решавања неких великих проблема приступа се разбијању тог проблема на мање засебне целине које се даље могу решавати појединачно. Декомпозиција је посебно важна уколико се решавањем проблема бави више од једног програмера.
Класе
Централни концепт Симуле 67 је објекат. Објекат је инстанца класе који садржи своје променљиве и понашања која се дефинишу путем класне декларације. Приступање одређеним пољима датог објекта врши се тачка нотацијом.
Функције и процедуре за манипулацију текста
Симула 67 је увела карактер (енгл. Character) и текст (енгл. Text ) као нове типове података.
Стандардни улаз/излаз
Алголу 60 је често замерано то што није имао процедуре за улаз/излаз. Пошто је Симула пре свега замишљена да буде језик опште намене њени творци су сматрали да ће овим процедурама језик добити на флексибилности.
Минимални програм
Празан фајл је минимални програм у Симули, а мери се величином изворног кода. Међутим, минимални програм се углавном представља као празан блок:
BeginEnd;
Он почиње са извршавањем и одмах се зауставља.
Програм у Симули нема сопствену повратну вредност.
"Здраво свете!" програм
Пример "Здраво свете!" програма у Симули:
BeginOutText ("Hello World!");
Outimage;
End;
Симула није осетљив на велика и мала слова.
Класе, поткласе и виртуалне процедуре
Пример коришћења класа, поткласа и виртуалних процедура
BeginClass Glyph;
Virtual: Procedure print IsProcedure print;
BeginEnd;
Glyph Class Char (c);
Character c;
BeginProcedure print;
OutChar(c);
End;
Glyph Class Line (elements);
Ref (Glyph) Array elements;
BeginProcedure print;
BeginInteger i;
For i:= 1 Step 1 Until UpperBound (elements, 1) Do
elements (i).print;
OutImage;
End;
End;
Ref (Glyph) rg;
Ref (Glyph) Array rgs (1 : 4);
! Main program;
rgs (1):- New Char ('A');
rgs (2):- New Char ('b');
rgs (3):- New Char ('b');
rgs (4):- New Char ('a');
rg:- New Line (rgs);
rg.print;
End;
У горенаведеном примеру имамо једну суперкласу("Glyph"), две поткласе("Char" и "Line") и једну виртуалну процедуру са две имплементације.
Извршавање почиње од "main" програма. Симула не подржава концепт апстрактних класа.
Позив функције по имену
Симула подржава позив функције по имену. Једноставан пример јесте функција за сумирање, која је имплементирана на следећи начин:
RealProcedure Sigma (k, m, n, u);
Name k, u;
Integer k, m, n; Real u;
BeginReal s;
k:= m;
While k <= n DoBegin s:= s + u; k:= k + 1; End;
Sigma:= s;
End;
Симулин стандард одређује ограничења за променљиву контроле тока(к) у "for" петљи. Стога, горенаведени код користи "while" петљу због портабилности.
Сума:
се може имплементирати на следећи начин:
Z:= Sigma (i, 1, 100, 1 / (i + a) ** 2);
Симулација
Симула садржи пакет за симулацију, прецизније за симулацију дискретних догађаја. Тај пакет је заснован на Симулиним објектно-оријентисаним карактеристикама. Следећи пример показује како се Симула користи за симулације:
Мика, Жика и Пера купују одећу. Они морају да деле једну кабину. Свако од њих разгледа у бутику око 12 минута и онда користи кабину око 3 минута. Симулација коришћења кабине се имплементира на следећи начин:
Simulation BeginClass Kabina; BeginRef (Head) vrata;
Boolean u_upotrebi;
Procedure zahtev; BeginIf u_upotrebi ThenBegin
Wait (vrata);
vrata.First.Out;
End;
u_upotrebi:= True;
End;
Procedure napusti; Begin
u_upotrebi:= False;
Activate vrata.First;
End;
vrata:- New Head;
End;
Procedure ispisi (poruka); Text poruka; Begin
OutFix (Time, 2, 0); OutText (": " & poruka); OutImage;
End;
Proces Class Osoba (ime); Text ime; BeginWhileTrueDoBegin
Cekaj (Normal (12, 4, u));
ispisi (ime & " zahteva kabinu");
kabina1.zahtev;
ispisi (ime & " je usao u kabinu");
Cekaj (Normal (3, 1, u));
kabina1.napusti;
ispisi (ime & " je izasao iz kabine");
End;
End;
Integer u;
Ref (Kabina) kabina1;
kabina1:- New Kabina;
ActivateNew Osoba ("Mika");
ActivateNew Osoba ("Zika");
ActivateNew Osoba ("Pera");
Hold (100);
End;
Главни блок почиње кључном речју "Simulation", да би се омогућила симулација. Пакет за симулацију се може користити на било ком блоку и симулације могу бити угњеждене.
Објекат кабина користи ред "vrata" за приступ кабини. Кад неко захтева кабину, а она се користи, онда он мора да чека у реду. Кад неко напусти кабину, први из реда напушта ред.
Особа је поткласа класе Процес и њено понашање је описано функцијом чекај.
"Main program" креира све објекте и смешта особе у ред. "Main program" чека 100 минута, након чега се програм терминира.