Въпрос за програмните езици

9 отговора 16 прегледа
#1

Въпрос за програмните езици

Ами въпросът ми е нещо като този за кокошката и яйцето, ама все пак... Как се създава програмен език? Доколкото знам, той се дефинира на метаезик. Но никъде не съм чувал откъде мога да намеря такова нещо, нито пък как да си служа с него. А тези метаезици как се създават? Как се създава първият компилатор за даден език? Може би на Асемблер? А как е създаден първият компилатор за Асемблер? Май задълбах прекалено надълбоко...
Отговор
в отговор на Philip #2

Въпрос за програмните езици

Много сложна тема си подхванал, направо за дисертация (нещо от областта на "история на информатиката :-) И отгоре на всичко не би трябвало аз да ти отговарям, а някой от предното поколение програмисти, които активно са участвали в разработването на всички концепции които си изброил по-горе. Все пак понеже вече 5 часа никой не ти е отговорил, ще се пробвам. Когато IBM са разработили първата машина, която е имала отдалечено сходство с днешните компютри, то предполагам тя е могла да бъде програмирана само на машинен език, т.е. операторите са записвали директно машинните кодове на инструкциите по някакъв магически начин (може би чрез превключватели). След това предполагам са били написани модули за поддръжката на най-примитивни периферни устройства, например перфоркарти за вход и съвсем примитивен вариант на принтер за изход. По това време програмите са представлявали просто поредица от числа, които са се зареждали на определен адрес в паметта на компютъра. След това са се досетили на всеки код на машинна инструкция да дадат име и програмите вече са станали последователност от имена на инструкции с параметри (операнди) към всяка инструкция - например инструкцията за преход има за операнд адреса към който се прави преход. Естествено за целта са написали съвсем примитивна програма на машинен код, която да приема от оператора програмата записана чрез имената (мнемокодовете) на инструкциите в нея. Програмата е преобразувала мнемокодовете в машинни инструкции и ги е записвала в паметта на компютъра. След това като са прегледали програмите си са видяли повтарящи се блокове от инструкции и са добавили мнемокодове за групи инструкции, т.е. превеждащата програма, като срещне такъв мнемокод го превежда не до една инструкция, а до цяла група такива. Паралелно с развитието на програмите са се усъвършенствали и самите компютри, като най-често срещаните групи инструкции са били добавяни направо нови инструкции (т.е. една инструкция върши същата работа както цяла група инструкции преди това). Все пак на проектантите не им било изгодно да вмъкват прекалено много различни машинни инструкции. Ето защо: целта на програмистите е да правят колкото се може по-малки програми. Представи си че имаш 256 инструкции, един байт побира 256 различни стойности (от 0 до 255), така че 256-те инструкции можеш да ги опишеш (кодираш) чрез 1 байт (по 1 от 256-те стойности за всяка инструкция). Ако сега решиш да добавиш още една инструкция към досегашните 256 и инструкциите станат общо 257, вече няма да ти стигне 1 байт за описването на една инструкция, а ще ти трябват 2 байта, т.е. за всяка инструкция в програмата ти ще ти трябва (грубо) два пъти повече място, т.е. програмата ти ще стане 2 пъти по-дълга. Затова винаги има алгоритми, които няма да могат да се изпълнят директно от една машинна инструкция, а ще трябва поредица от инструкции. Така че превеждащите програми (транслаторите) ще са винаги една стъпка пред процесорния набор от инструкции, защото трябва да осигуряват на програмиста удобен запис на често използвани поредици от инструкции. Транслиращите програми непрекъснато се усложняват, като всяко следващо поколение се описва чрез транслиращите програми от предното поколение. По някое време математиците (по-точно тези от тях които разработват теоретичните основи на информатиката) се усетили че този път май хората ще минат без тях и се втурнали да формализират по-горните понятия с цел да могат и те да се пишат в разните "credits" и "thanks to" финални надписи. Особено преуспял в това някой си Ноъм Чомски, който успял да се изкара че е формализирал понятия като описание на програмен език и е описал какви видове описания на програмните езици съществуват (т.е. дали дадена система за описание е достатъчно мощна да опише еди кой си сложен програмен език). Оттам нататъка работата става мътна и кървава. Новите програмни езици почват да никнат като гъби. Появяват се "компилатори на компилатори", т.е. такива програми на които като им подадеш формално описание на даден програмен език и те ти изплюват готов компилатор за този език. Езика на който се пишат тези описания се нарича метаезик. Ако те интересуват въпросните "компилатори на компилатори", можеш да разгледаш програмите "lex", "bison" и "yacc". Има ги към development програмите към повечето Linux дистрибуции а освен това могат да се компилират за най-различни платформи. Естествено в днешно време когато се разработи нова хардуерна платформа, разработката на компилатори за тази платформа не започва от нулата. За целта се ползват така наречените крос компилатори. Това са компилатори които вървят на една платформа, но програмите които компилират са за друга платформа. Просто разработчиците си харесват един език, например C, описват на метаезик, как C-то се превежда до машинен код на новата платформа, подават метаезиковото описание на "компилатора на компилатори" и хоп! имат компилатор за C който отгоре на всичко е във вид на изпълним файл за новата платформа. Това е горе-долу. Тук-таме съм послъгал, а другаде понагласил нещата, ама да не ти пука :-) -------------- "Bugs? Yes! Do I care? No!"
Отговор
в отговор на Penguin #3

Въпрос за програмните езици

Опааааа! Виждам че горе съм се поувлякъл: крос компилаторите са компилатори които вървят на старата платформа, но компилират код за новата платформа, а не са компилатори които вървят на новата платформа. ------------------ Famous last words:
Отговор
в отговор на Penguin #4

Въпрос за програмните езици

Napravo mi vze dumite ot ustata : )))))
Отговор
в отговор на DirectX #5

Въпрос за програмните езици

skoro четох че борланд пускат сорса на компилатора на паскал. може и да го има. една група има която пише фрии паскал. в крайна сметка изглежда като делфи 1.
Отговор
в отговор на Philip #6

Въпрос за програмните езици

ami... Filipe.. dokolkoto si zabeliazal ot "tvoite" sorsove, PASCAL 6 e pisam am assembler! a, inace, vsicko e iasno! malko po malko nestata se usavarsenstvat!! posle zapadat.... :-) kak se sazdava ezik! ami, kakvo tolkova! izmislias go! i, mu napisvas kompilator na nekav drug ezik! po izbor kakav...... tova e! ne zvuci mnogo slojno!!!!! obsto vzeto vseki koito se napane moje da si napravi kompiletor nekakav! obace da se napravi HUBAV kompilator........ edvali vseki moje! vkraia na kraistata hubavite kompilatoei za daden ezik i procesor v sveta ne sa koi znai kolko mnogo!...
Отговор
в отговор на Penguin #7

Въпрос за програмните езици

abe, to mnogo slojno zvuci!!!!!?????? kato kazano ot matematik! :-))))) kvo pravi kompilatora? ami, sresta aritmeticen izraz, prevejda go do vid udoben za smiatyane! sresta REPEAT UNTIL... prevejda go kato E1: LOOP E1 ..... sresta PRINTF prevejda go kato MOV AH,9 MOV dx,xxxxx INT 21 :-)))), sresta FUR a=3.5 DO 8 TO ..... i kazva GRESKA!!!!!!!!! kvo tolkova!
Отговор
в отговор на Philip #8

Има и нещо друго...

В по-стари времена, за "ресурс" на една машина се разсъждаваше почти "хардуерно". По тази и някои други причини, специалистите здраво заковаха в главите си мисленето за "последователно кодиране". При това положение, в синтаксиса на език ти трябват само две неща, от сорта: if - условен преход goto - безусловен И толкоз... Въпроса с операнди и операциите над тях е вече една друга тема. Те тогава може да се мисли за компилатор,крос компилатор и прочее... Аз лично мога що-годе сносно да работя C, но много избягвам, щото се заравям като "свинка в тиква" с указатели. Навремето като работех Clipper, си бях направил 3 Mb сорсове (мои библиотеки). И в тях няма пукната библиотечна функция на MSC, само указатели. Как раbотеха вярно, чак се чудя?!... Между впрочем, и майсторите в C, яката пердашат с указатели. Що ли? Ами разбирането за максимално "изтръскаване" на ресурса, за когото мърморех по горе. Добре де, я разгледайте една яка (дай-боже добра) OS. Огромни ресурси, за които се мисли софтуерно. Тогава вече почваме да говорим за "проект" или нещо такова. Горките езици за програмиране! Ами тяхната визия съвсе изфирясва Хептен заприличват на засукани .BAT (за DOS-а).
Отговор
в отговор на momchil #9

Въпрос за програмните езици

Naprotiv, mnogo po-prosto e, ama naistina tryabva pyrvo da poprochetesh diskretna matematika, i po-secialno gramatiki.
Отговор
в отговор на Penguin #10

Въпрос за програмните езици

Много добре казано... А ето и страницата на един мета-компилатор и извадка от нея ([линк]): ANTLR, ANother Tool for Language Recognition, (formerly PCCTS) is a language tool that provides a framework for constructing recognizers, compilers, and translators from grammatical descriptions containing C++ or Java actions [You can use PCCTS 1.xx to generate C-based parsers]. Честно казано, работи доста впечатляващо...
Отговор