Компилатор (интерпретатор) Brainfuck - AlterVision
Компилатор (интерпретатор) Brainfuck
Понякога университетските преподаватели дават много интересни задачи. Този път идеята на уважаемия Едуард Емилиевич Александров, който вече ме подтикна да създам мениджъра на паметта MC Heappie и генератора Landscape Winter OpenGL, беше да създам компилатор ... Едно "но" - разбира се, той не уточни кой в началото) Моят добър приятел Тим веднъж говори за прекрасен език за програмиране, който "прецаква мозъка" ... След като прегледах любимата си Wikipedia, се натъкнах на изключително интересен език за програмиране - Brainfuck!
Брейнфук (англ. brain brain + fuck) е един от най-известните езотерични езици за програмиране, изобретен от Urban Muller през 1993 г. за забавление. Езикът има осем команди, всяка от които е написана с един знак. Изходният код на програмата Brainfuck е поредица от тези знаци без допълнителен синтаксис.
Един от мотивите на Urban Muller беше да създаде език с възможно най-малко компилатор. Той беше частично вдъхновен от езика FALSE, който имаше 1024 байтов компилатор. Има езикови компилатори на Brainfuck, по-малки от 200 байта. Програмирането на езика Brainfuck е трудно за писане, поради което понякога се нарича езикът на мазохистите. Но в същото време е важно да се отбележи, че Brainfuck е напълно естествен, пълен и прост език и може да се използва при дефиниране на концепцията за изчислимост.
Машината, управлявана от командите на Brainfuck, се състои от подреден набор от клетки и указател към текущата клетка, наподобяващ лентата и главата на машина на Тюринг. В допълнение, това предполага устройство за комуникация с външния свят (вижте командите . и ,) чрез входния поток и изходящия поток.
Основното нещо, което трябва да знаете, за да напишете компилатор, е интерпретацията на езиковите команди.
> | ++p; | преминете към следващата клетка |
» преместете текущия показалец върху клетъчното пространство на машината на Тюринг. В този случай, ако показалецът се опита да се премести в отрицателната област или излезе от пространството, той се нулира. Командите за промяна на стойността "+" и "-" отговарят за увеличаване и намаляване на стойността в клетката, върху която се намира показалецът. Команда за извеждане на информация "." отпечатва съдържанието на текущата клетка на екрана. Тъй като клетките са байтове, съдържанието лесно се отпечатва като символ, съответстващ на дадената ASCII стойност. Командата за въвеждане "," чете един знак от основния вход - това означава, че потребителят трябва да натисне клавиш. Командата за стартиране на цикъла "[" записва указателя на текущата команда в стека и започва изпълнението на цикъла, ако стойността на текущата клетка е по-голяма от нула. Командата за край на цикъла "]" чете последния команден указател от стека и се връща към него. |
В края на програмата стекът се изчиства, ако възникнат грешки. Това приключва работата на функцията и се счита, че програмата е приключила успешно ... или почти успешно)
А сега - най-важното - "Здравей свят! " на BrainFuck!!
Запишете това във файла hw.bf и го стартирайте като run hw.bf от командния ред. какво виждаме Здравей свят! Така че компилаторът е успешен!!
Изтегляне : изходните кодове на програмата и самия компилатор, както и няколко примера.