Лого (програмски језик)

С Википедије, слободне енциклопедије
Корњача графика Лого језика

Лого (енгл. Logo) је програмски језик високог нивоа који се базира на функционалном начину програмирања. Настао је из програмског језика Lisp и може да се сматра његовим дијалектом. Лого језик је блиско повезан са Лого порограмским окружењем које омогућава висок степен интерактивности у раду. Саставни део Лого језика је корњача графика, графички систем који се лако учи као и целокупан језик.

Лого је настао 1967. године. Креиран је са циљем да буде образовно средство и то не само у области програмирања. Његови творци су Daniel G. Bobrow, Wally Feurzeig и Симор Паперт.

Здраво свете[уреди | уреди извор]

Следећи код ће исписати "Zdravo svete!" у интерактивном начину рада:

PRINT [Zdravo svete!]

Процедура са именом Pozdrav, која има исто дејство као и код изнад, може да изгледа овако:

TO Pozdrav
  PRINT [Zdravo svete!]
END

Корњача графика[уреди | уреди извор]

Првобитно Лого није имао графичке могућности. Затим му је придодат уређај, врста робота, који је назван корњача (енгл. turtle). Овај уређај је био повезан са рачунаром и њиме се управљало наредбама Лого програмског језика. Корњача је могла да се креће по хоризонталној подлози напред назад и да мења смер и правац кретања. Уколико би се поставио лист папира испод корњаче она је могла да оставља траг формирајући графику која је названа корњача графика (енгл. turtle graphics).

Касније, наредбе Лого језика за покретање корњаче су остале, али је корњача постала виртуелан објекат на екрану рачунара. И ако се овај облик графике често веже за Лого језик, у оквиру кога је и настао, он постоји и у другим програмским језицима као што су Smalltalk, Питон, Јава...

Пример корњача графике[уреди | уреди извор]

На слици испод налази се једноставан пример корњача графике заједно са одговарајућим Лого наредбама, десно, које је формирају. Пример одговара UCBLogo Лого развојном окружењу као и остали примери уколико није другачије наведено:

Овде је корњача представљена у поједностаљвљеном облику као један једнакокраки троугао. Корњача се првобитно налази на средини прозора за графику, где се налази и тачка (0, 0) Декартовог координатног система. y-оса је усмерена „навише“ као и сама корњача. Прва наредба ће окренути корњачу удесно за 90 степени, односно променити јој смер тако да гледа у правцу x-осе. Следећа наредба помера корњачу за 100 јединица по x-оси остављајући траг. (Координатне осе су невидљиве). Затим се окрет и померање понављају... После четири понављања овог пара наредби (right 90 forward 100) корњачин траг ће формирати квадрат а коњача ће се наћи у почетном положају (укључујући правац и смер). На крају корњача још једном иде 100 јединица напред и исцртава вертикалну линију ван квадрата на чијем крају можемо да видимо њену симболичну представу у облику троуглића.

Горњи графички пример је формиран једино графичким наредбама. Употребом контролне структуре repeat иста графика може да се добије извршавањем следећег кода:

repeat 4 [right 90 forward 100]
forward 100

Корњача графика је врста векторске графике. Положај цртежа у горњем примеру зависи од почетног положаја, правца и смера корњаче. У овом примеру подразумевао се почетни положај корњаче по иницијацији Лого графичког окружења.

Синтакса[уреди | уреди извор]

Основе синтаксе лого језика су изведене из Lisp програмског језика, уз додатно упроштење: могућност изостављања заграда. Одатле неки Лого зову Lisp без заграда (односи се на мале, обле заграде). Могуће је писти и са заградама. На пример следећи код исписује број један:

(print 1)

и без заграда:

print 1

Мале заграде су неопходне код функција и процедура које могу да буду позиване са различитим броје параметара. Тада постоји само једна варијанта позива код које нису потребне заграде. У свим осталим случајевима заграде се користе.

На пример, print може да буде позвана са неограниченим бројем параметара, али заграде могу да се изоставе једино ако је предат један параметар:

(print 1 2)

исписаће бројеве једа и два, али сада су мале заграде неопходне.

Типови података[уреди | уреди извор]

Готово све верзија Лого језика садрже бар три типа података: бројеве, речи и листе. Већина садржи и асоцијативне низове.

Бројеви[уреди | уреди извор]

Бројеви у Лого језику имају децимални облик или/и се налазе у експоненцијалном запису. Интерно се користи облик са покретним зарезом. Примери бројева:

23
 4.35
-8
12е-9

Следећа наредба:

print 2000000

исписаће

2000000

док ће

print 2000000000000000000000000000000

исписати

2е+30

односно: два пута десет на тридесети степен.

Речи[уреди | уреди извор]

Речи су низови знакова. Синтаксно се разликују од других типова података јер почињу двоструким наводником. Примери речи:

"Јабука
"Jabuka
"jedan@dva.org

Извршавањем следећег кода:

print "мислим

исписаће се:

мислим

док ће следећи код:

print "мислим"

исписати:

мислим"

Могуће је добити и речи које садрже знак празнине.

Листе[уреди | уреди извор]

Листе су, синтаксно посматрано, спискови бројева, речи или других листа унутар угластих заграда. Не морају да буду хомогене. Примери:

[један два три]
[1 2 3]
[један 2 три 4 5]
[један [11 12] [једанаест дванаест [101]]]

Празна листа:

[]

Променљиве и наредба доделе вредности[уреди | уреди извор]

Променљиве у Лого језику су речи (подаци типа реч) којима је придружена вредност. Над овим речима можемо да применимо све функције које одговарају и обичним речима. Током извршења програма могуће је променити вредност променљиве. Нова вредност може да буде различитог типа (од претходно додељеног). Променљиве се не декларишу изузев локалних променљивих унутар процедура.

У следећем примеру, речи jedan_broj се придружује вредност 56:

make "jedan_broj 56

Функција thing нам омогућава да приступимо придруженој вредности:

print thing "jedan_broj

ће исписати:

56

Следи код који речи jedna_reč придружује реч jedan_broj:

make "jedna_reč "jedan_broj

Ако извршимо следећи ред:

print thing "jedna_reč

исписаће се:

jedan_broj

док ће наредни код

print thing thing "jedna_reč

исписати

56

односно садржај променљиве jedan_broj.

Вредност променљиве може да се добије и писањем двотачке испред речи која представља променљиву:

make  "резултат 3 + 2
print :резултат

исписаће:

5

слично као и следећи код:

make  "резултат 3 + 2
print thing "резултат

Процедуралност[уреди | уреди извор]

И ако највећи део основе језика чине функције, Лого није прави функционални језик. Између осталог, Лого поседује наредбу додељивања вредности и могућност креирања процедура. Писање процедура је основни начин проширивања језика.

Процедуре имају једноставну синтаксу. Између речи to и end уписује се код који треба да се изврши. Непосредно иза to налази се име процедуре иза кога опционо могу да се нађу формални параметри.

Пример процедуре, која исцртава квадрат са страницом дужине 100 јединица:

to kvadrat1
  repeat 4 [right 90 forward 100]
end

Мало апстрактнија процедура, која црта квадрат, чија је страница произвољне дате дужине dužina, може да изгледа овако:

to kvadrat2 :dužina
  repeat 4 [right 90 forward :dužina]
end

Процедуре могу и да врате вредност, када у ствари добијамо (или) функцију или функцијску процедуру. Следи пример функције која за дати број враћа тај број увећан за један:

to uvećanik :n
  output :n + 1
end

Проширивост[уреди | уреди извор]

Лако је надоградити програмски језик Лого. У ову сврху се обично користе процедуре. Могуће је чак креирати нове контролне структуре, што је веома тешко, или готово немогуће, у већини данас популарних програмских језика.

Сам Лого садржи велики број контролних структура тако да ћу у следећем примеру само поново да дефинишем већ коришћену repeat понављачку структуру (петљу) али са другим именом. Назваћу је ponovi:

to ponovi :brojPonavljanja :posao
  repeat :brojPonavljanja :posao
end

Процедура ponovi није у потпуности еквивалнтна контролној структури repeat, али омогућава да квадрат нацртам на следећи начин:

ponovi 4 [right 90 forward 100]

Рекурзија[уреди | уреди извор]

Рекурзивна спирала

Програмски језик Лого омогућава и подстиче рекурзивни начин писања програма. Свака процедура може да садржи рекурзивне позиве.

Посебан облик рекурзије је репна рекурзија, код које се рекурзивни позив јавља на крају процедуре или функције. Овај овлик рекурзије се лако претвара у итеративни поступак. Лого интерпретатор би требало да уме да препозна и оптимизује овакав код, изостављајући алокацију простора на стеку за повратну адресу, параметре и локалне променљиве (при рекурзивном позиву).

Пример репне рекурзије[уреди | уреди извор]

Следећа процедура користи репну рекурзију:

to spirala :korak
  if  :korak > 30 [stop]    ; Услов за излаз из процедуре
  forward :korak right 15
  spirala :korak * 1.02     ; Рекурзивни позив
end

Ако овако дефинисану процедуру позовемо са, на пример:

spirala 10

добићемо цртеж сличан спирали.

Примена у образовању[уреди | уреди извор]

Један од циљева који је постављен када је стваран Лого језик је да буде успешно образовно средство. Данас Лого поседује особине које га сврставају у сам врх у овој области:

  • Лако се учи.
    • Има једноставну синтаксу која омогућава да и деца у основној школи са лакоћом могу да почну да га користе.
    • При развоју програма програмеру пружа лако схвативе повратне информације.
  • Пружа велике изражајне могућности.
    • Језик је лако поширив. Појам порцедуре може да се уведе веома брзо, обично на другом наставном чесу.
    • Корњача графика омогућава, програмеру на узрасту детета, креирање геометријских форми за какве би у другом систему било потребно познавање математике на академском нивоу.
    • Омогућава креирање нових језичких конструкција као што су контролне структуре, што је практично немогуће у програмским језицима који се најчешће користе у настави у школама у Србији као што су Паскал, Јава, или у некој варијанти BASIC програмског језика.
    • ...


Постоје посебно развијене варијанте Лого језика које су намењене за симулирање сложених система. И ако се обично користе у образовању на академском нивоу, лакоћа коришћења ових језика омогућава њихово коришћење и на нижем образовном нивоу. Познати примери оваквих варијанти Лого језика су StarLogo i NetLogo. Примењују се за креирање симулација система у многим областима укључујући друштвене системе, биолошке системе, системе који се проучавају у физици, хемији, психологији...

Спољашње везе[уреди | уреди извор]