Pull to refresh
  • by relevance
  • by date
  • by rating

GW-BASIC под лицензией MIT форкнут и доработан до компилируемого состояния, но работает пока не всё

History of ITOld hardware


Выпуск в мае этого года первой версии интерпретатора GW-BASIC под лицензией MIT стал отличным подарком всем ретрокомпьютерщикам, но код был опубликован в таком виде, в котором его было невозможно откомпилировать. Теперь же он форкнут несколькими энтузиастами и доработан до состояния, поддающегося компиляции.
Читать дальше →
Total votes 9: ↑9 and ↓0 +9
Views5.6K
Comments 80

Идея нового серверного ПО

Lumber room
Констант и переменных в CSS реально начинает не хватать. Писать генератор CSS на PHP как-то обломно. Может изобресть какой-нибудь CSS Interpreter, который будет брать некий документ (*.csx), уже похожий по синтаксису на CSS, только с некоторыми дополнительными инструкциями — и интерпретировать эти инструкции, выдавая на выходе CSS.
Читать дальше →
Total votes 5: ↑3 and ↓2 +1
Views173
Comments 29

Для начала или вводный курс в эзотерический язык

Programming
Это конечно же хобби, хотя...

Brainfuck придуман Урбаном Мюллером в 1993 году, в основном для забавы. Уникальный, вполне себе интересный Тьюринг-полный язык программирования с размером компилятора в 240 байт! В нём используется всего лишь 8 команд, каждая из них записывается одним символом. Программа на языке Brainfuck представляет собой последовательность этих самых команд.

Машина, которой управляют команды Brainfuck, состоит из упорядоченного набора ячеек и указателя текущей ячейки, получается что-то вроде стека и смещения в нём. Так же реализована возможность механизма ввода-вывода, далее будет понятно на примере.
Читать дальше →
Total votes 65: ↑50 and ↓15 +35
Views2.1K
Comments 65

CPrompt — интерпретатор языка си

Programming
С июня 2009 года я занимаюсь разработкой интерпретатора Си. (я уже упоминал об этом в статье о вызовах функций).
Сейчас уже реализовано достаточно много конструкций: циклы, выбор, вычисление выражений, вызовы функций (как объявленных пользователем, так и стандартных), инклуды и другое.
интересно?
Total votes 50: ↑38 and ↓12 +26
Views5.1K
Comments 74

Интерпретатор Brainfuck размером 160 байт

Programming
Прочитав про IP-стэк twIP, который помещается в размер твита и отвечает на пинги, корейский программист Канг Сеонгхун (Kang Seonghoon) решил создать нечто такое же миниатюрное и при этом работоспособное. И он создал самый маленький интерпретатор Brainfuck на C размером всего 160 байт.

s[99],*r=s,*d,c;main(a,b){char*v=1[d=b];for(;c=*v++%93;)for(b=c&2,b=c%7?a&&(c&17?c&1?(*r+=b-1):(r+=b-1):syscall(4-!b,b,r,1),0):v;b&&c|a**r;v=d)main(!c,&a);d=v;}
Читать дальше →
Total votes 83: ↑79 and ↓4 +75
Views3.8K
Comments 32

Интерпретатор Brainfuck на Brainfuck

Abnormal programming
Sandbox
После нахождения на Хабре ряда постов имеющих отношение к Brainfuck'у в том числе его интерпретации у меня возникло какое-то желание написать и свой интерпретатор Brainfuck'а. Но для удовлетворение тех необходимых ощущений, которые нам приносит сам язык, нужно это было написать именно на Brainfuck. И у меня это частично получилось. Сразу оговорюсь о том чего нету: этот интерпретатор на данный момент не поддерживает циклы и ввод входных данных (в случае входных данных — нет откуда их считывать, так как на вход подается Brainfuck программа) — если кратко — то не работают комманды "[", "]" и ",".
Читать дальше →
Total votes 89: ↑64 and ↓25 +39
Views11.4K
Comments 51

Интерпретатор из подворотен

Compilers
Если ваше образование окончилось после второго класса, если словарный запас ограничен, а речь невнятна, если вы попросту тупы, не знаете этих непонятных латинских букв, но всё равно хотите стать программистом, вам поможет наш быдлоязык Йоба. Йоба — язык для риальных пацанов!

Ну а если серьёзно, как-то раз у нас на работе кто-то в шутку предложил написать гоп-язык, чтобы программистом мог себя почувствовать себя любой. Начинать конструкции со слова «чо» и всё такое. Тут надо заметить, что, не встретив на своём жизненном пути образования в области computer science, я пропустил все те интересные курсы по построению компиляторов, формальным грамматикам и прочим вкусностям, которые вкушают нормальные студенты на втором-третьем курсе. Книга Вирта по построению компиляторов хотя и добавила мне знания всяких умных терминов типа БНФ, но практической пользы не принесла ­— ни одного компилятора я так и не написал. Поэтому задача оказалась для меня довольно интересной.
Если вы старше 18 лет, адекватно воспринимаете обсценную лексику нашего родного языка и вам интересно, с чего начать, добро пожаловать под кат.
Читать дальше →
Total votes 192: ↑172 and ↓20 +152
Views36.9K
Comments 28

Пишем интерпретатор трехадресного кода

Algorithms

Введение



Добрый день.
Продолжаю писать о около-компиляторных темах. В этот раз затрону вопрос о проектировании и создании интерпретатора, который работает с синтаксическими деревьями.
Рекомендую ознакомиться с предыдущей статьёй — «Пишем LR(0)-анализатор. Простыми словами о сложном», потому что в интерпретаторе я не строю синтаксический анализатор с нуля, а использую наработки, описанные в той статье. Ах да, еще один немаловажный момент — писать будем на JavaScript. Я не поклонник этого языка, но считаю что это наиболее удобный для общественности способ посмотреть результат. Не каждый рискнёт качать неизвестно что, да и это всё же сложнее чем просто открыть страничку. Нетипичность инструмента компенсируется «учебностью» примера. Скорость работы не важна (100-150 строк лимит, мне кажется больше никто не захочет набирать того чтобы поиграться с интерпретатором), а понятность кода у JS достаточно велика.

Читать дальше →
Total votes 31: ↑31 and ↓0 +31
Views6.5K
Comments 8

Интерпретатор Brainfuck на BAT

Abnormal programming
Sandbox
Простота языка Brainfuck порождает множество реализаций его исполнения. На хабре уже были интерпретаторы и компиляторы на различных языках программирования, даже на Bash. Мне показалось, что несправедливо обойти еще один командный процессор. А именно командные файлы семейства WindowsNT, они же батники. При написании данного интерпретатора была поставлена цель реализовать всё только на встроенном «языке» консоли.

Читать дальше →
Total votes 47: ↑41 and ↓6 +35
Views3.4K
Comments 41

Замыкания и объекты JavaScript. Переизобретаем интерпретатор

JavaScriptCompilersООP
Tutorial
Обычно концепции или парадигмы программирования объясняют либо описательно — «разжёвывая» новые идеи простыми словами, либо метафорически — уподобляя их хорошо знакомым аудитории предметам и понятиям. Но ни первый, ни второй способ не дает такого точного и полного представления о предмете, как взгляд с точки зрения низкоуровневой реализации.

Когда в изучении языка доходишь до нетривиальных вещей, бывает полезно сместить уровень абстракции, чтобы понять, как на самом деле всё устроено. Ведь, по большому счету, любые конструкции языков сколь угодно высокого уровня сводятся к старому доброму машинному коду. Писать в объектно-ориентированном или функциональном стиле можно и на чистом C, и даже на ассемблере. Грубо говоря, любой высокоуровневый язык — это зафиксированный на уровне компилятора или интерпретатора набор синтаксических карамелек и шоколадок. Повышение уровня абстракции позволяет писать более сложные программы с меньшими усилиями, но вот понять в начале пути, что конкретно имеется в виду под наследованием или замыканием, как это всё работает и почему, гораздо легче, разобравшись, каким образом всё это реализовано.

JavaScript, как никакой другой язык, нуждается в именно таком объяснении. Функциональная природа, скрытая за Си-подобным синтаксисом, и непривычная прототипная модель наследования поначалу сильно сбивают с толку. Давайте мысленно понизим уровень JavaScript до простого процедурного, наподобие Си. Отталкиваясь от этого «недоязыка», переизобретем функциональное и объектно-ориентированное программирование.
Читать дальше →
Total votes 114: ↑113 and ↓1 +112
Views23.9K
Comments 30

Изобретаем язык программирования для тренировки мозгов. Или эзотерический язык программирования за 5 минут

Abnormal programming
Изучая вики по эзотерическим языкам я наткнулся на интересный язык программирования Piet. Отличительной особенностью которого является графическое представление программы. Например, эта программа выводит «Hello World!»
image
И показалось мне, что данная программа похожа на QR-Code.
image
Только Piet использует цветовую кодировку. А QR-Code использует комбинацию расположения точек.
Читать дальше →
Total votes 84: ↑74 and ↓10 +64
Views5.5K
Comments 23

LISP-интерпретатор на чистом C

Abnormal programmingC++Lisp
Я люблю язык C за его простоту и эффективность. Тем не менее, его нельзя назвать гибким и расширяемым. Есть другой простой язык, обладающий беспрецедентной гибкостью и расширяемостью, но проигрывающий C в эффективности использования ресурсов. Я имею в виду LISP. Оба языка использовались для системного программирования и имеют давнюю и славную историю.

Уже достаточно долго я размышляю над идеей, объединяющей подходы обоих этих языков. Её суть заключается в реализации языка программирования на основе LISP, решающего те же задачи, что и C: обеспечение высокой степени контроля над оборудованием (включая низкоуровневый доступ к памяти). На практике это будет система LISP-макросов, генерирующая бинарный код. Возможности LISP для препроцессирования исходного кода, как мне кажется, обеспечат небывалую гибкость, в сравнении с препроцессором C или шаблонами C++, при сохранении исходной простоты языка. Это даст возможность на базе такого DSL надстраивать новые расширения, повышающие скорость и удобство разработки. В частности, на этом языке может реализовываться и сама LISP-система.

Написание компилятора требуют наличие кодогенератора, а в конечном итоге — ассемблера. Поэтому практические изыскания стоит начинать с реализации ассемблера (для подмножества инструкций целевого процессора). Мне было интересно минимизировать какие-либо зависимости от конкретных технологий, языков программирования и операционной системы. Поэтому я решил с нуля реализовать на C простейший интерпретатор импровизированного LISP-диалекта, а также написать к нему систему макрорасширений, позволяющих удобно кодировать на подмножестве ассемблера x86. Венцом моих усилий должен стать результирующий загрузочный образ, выводящий «Hello world!» в реальном режиме процессора.

На текущий момент мною реализован работающий интерпретатор (файл int.c, около 900 строк C-кода), а также набор базовых функций и макросов (файл lib.l, около 100 строк LISP-кода). Кому интересны принципы выполнения LISP-кода, а также подробности реализации интерпретатора, прошу под кат.
Читать дальше →
Total votes 48: ↑44 and ↓4 +40
Views17.5K
Comments 25

Контроллер MeteoBoard

PythonProgramming
Понадобилось нам однажды измерять температуру и влажность в одном помещении, несложная задача, стоит обратиться в гугл и там до кучи примеров на ардуино как это сделать, скетчи, схемы и пояснения. Простые задачи подобного рода возникают достаточно часто и каждый раз модифицировать код для контроллера не хотелось. Мы подумали, а что если написать что-то типа интерпретатора для микроконтроллера(МК), который бы принимал команды и выполнял их. Таким образом отпадает необходимость писать софт каждый раз для МК, это занятие требует времени зачастую больше, чем под ПК из-за того, что объем памяти МК ограничен и не попользуешься развитыми средствами типа regex и прочего. Интерпретатор должен быть расширяемый, то есть добавление новой команды, не должно быть зубодробительной операцией. Также в будущем он должен быть легко переносим на ARM Cortex-M3 архитектуру и способен работать через различные интерфейсы связи будь то RS485, Ethernet, ZigBee.

Другие наши проекты здесь

На основании этих требований было решено разработать такое устройство и + библиотеки для работы с ним под несколько языков (сейчас Python и GCC C/C++) и ОС ( Win и Linux) чтобы не париться больше с написанием каждый раз софта для контроллера, который делает рутину — собирает данные или что-то включает или выключает.


Рис. 1. Контроллер MeteoBoard
Читать дальше →
Total votes 35: ↑31 and ↓4 +27
Views25.1K
Comments 68

Пишем свой интерпретируемый шестнадцатиричный язык программирования для QR-кодов

Abnormal programmingProgramming
Вдохновившись проектом Google Glass, я подумал, как хорошо было бы сделать крайне простой, но мощный инструмент дополненной реальности специально для таких очков. И почему бы не сделать его на основе такой широко используемой технологии как QR-коды. Так родилась задумка языка QuRava — набора байтов, записанных в QR-коде и интерпретируемого в полноценную программу, реализующую часть возможностей языка Java.

Хочу сразу предупредить, что все нижеизложенное — альфа-версия, сделано за несколько вечеров. Поэтому по поводу маленьких возможностей сильно не ругайтесь и вопросов про отсутствие лямбда-исчисления не задавайте.

Читать дальше →
Total votes 51: ↑42 and ↓9 +33
Views14.1K
Comments 37

Программная симуляция микропроцессора. Коробка передач

Intel
Tutorial
В этой статье я хочу рассказать о том, как создатели симуляторов добиваются максимальной производительности моделей процессоров, при этом не жертвуя гибкостью и расширяемостью полного решения. Если кратко, то решение состоит в сосуществовании нескольких движков, наилучшие качества которых используются на различных этапах работы модели.
Содержимое данной заметки будет основываться на моём опыте разработки функциональных симуляторов, а также на публикациях и технических статьях, описывающих различные симуляторы и виртуальные машины: Wind River Simics, VMWare, Qemu, Bochs и другим. Слово «функциональный» в контексте данной статьи обозначает то, что точность моделей ограничена уровнем набора команд (instruction set architecture, ISA).
Читать дальше →
Total votes 48: ↑44 and ↓4 +40
Views30.1K
Comments 8

Простой интерпретатор с нуля на Python (перевод) #1

Python
Sandbox
Tutorial


Вещь, которая привлекла меня изучать компьютерную науку была компилятором. Я думал, что это все магия, как они могут читать даже мой плохо написанный код и компилировать его. Когда я прошел курс компиляторов, я стал находить этот процесс очень простым и понятным.


В этом цикле статей я попытаюсь захватить часть этой простоты путем написания простого интерпретатора для обычного императивного языка IMP (IMperative Language). Интерпретатор будет написан на Питоне, потому что это простой и широко известный язык. Также, питон-код похож на псевдокод, и даже если вы не знаете его [питон], у вас получится понять код. Парсинг будет выполнен с помощью простого набора комбинаторов, написанных с нуля (подробнее расскажу в следующей части). Никаких дополнительных библиотек не будет использовано, кроме sys (для I/O), re (регулярные выражения в лексере) и unittest (для проверки работоспособности нашей поделки).
Читать дальше →
Total votes 28: ↑25 and ↓3 +22
Views38.5K
Comments 14

Интерпретатор Python: о чём думает змея? (часть I-III)

PythonProgramming
image

От переводчика
Весьма вольный перевод серии из трёх статей об устройстве питоновского интерпретатора. Автор занимается разработкой собственного велосипеда по этой теме и решил поделиться знаниями, появившимися в процессе. Посмотрим, что у него из этого получилось.


Данная серия статей рассчитана на тех, кто умеет писать на python в целом, но плохо представляет как этот язык устроен изнутри. Собственно, как и я три месяца назад.

Небольшой дисклеймер: свой рассказ я буду вести на примере интерпретатора python 2.7. Всё, о чем пойдёт речь далее, можно повторить и на python 3.x с поправкой на некоторые различия в синтаксисе и именование некоторых функций.

Итак, начнём.
Читать дальше →
Total votes 35: ↑34 and ↓1 +33
Views43.3K
Comments 6

Простой интерпретатор с нуля на Python #2

Python
Translation
Tutorial


В предыдущей статье мы рассматривали сам язык IMP и основную структуру интерпретатора. Также, мы тщательно рассмотрели лексер. В этой статье мы будем писать небольшой парсер для нашего языка. Он будет извлекать AST (abstract syntax tree) из списка токенов, сгенерированных лексером. Библиотека комбинатора будет независимая, то есть с помощью нее можно будет написать парсер для любого языка.


Что такое комбинаторы парсеров?

Есть очень много способов написать парсер. Самым простым и быстрым способом сделать это являются комбинаторы.

Вы можете считать парсер функцией, которая принимает поток токенов. Если успешно, то парсер будет «съедать» немного токенов из потока. Функция вернет часть финального AST вместе с остальными токенами. Комбинатор — это функция, которая производит парсер, как его результат, обычно после приема одного или нескольких анализаторов (парсеров) в качестве входных данных, отсюда и название — «комбинатор». Вы можете использовать комбинаторы для создания законченного парсера для языка, как IMP, путем создания множества маленьких парсеров для каждой части языка.
Читать дальше →
Total votes 28: ↑26 and ↓2 +24
Views15.3K
Comments 0

Простой интерпретатор с нуля на Python #4

Python
Translation
Tutorial


В предыдущих трех частях мы создали лексер, парсер и AST для нашего игрушечного языка IMP. Мы даже написали нашу собственную библиотеку парсеров комбинаторов. В этой, финальной статье мы напишем последний компонент интерпретатора — исполнитель.


Давайте подумаем, как обычно исполняются программы. В любой момент времени есть некоторые «точки контроля», которые указывает на то, какое выражение программа собирается выполнить дальше. Когда следующее выражение исполняется, оно модифицирует состояние программы, путем улучшения «точки контроля» и изменения значений переменных.
Читать дальше →
Total votes 30: ↑28 and ↓2 +26
Views13K
Comments 1

Простой интерпретатор с нуля на Python (часть 3)

Python
Sandbox
image


Разъяснение к публикации
Пользователь @duse ранее выкладывал переводы двух предыдущих статей, явно намереваясь перевести всю серию. Так как тема меня очень интересует, а новых переводов нет, обратился к первоисточнику. С английским не очень силён, чтобы не терять суть, стал переводить на русский. Так и родился этот перевод. Прошу прощения у @duse в случае, если мне стоило ещё чуточку потерпеть. Но для сообщества в любом случае должна быть польза.


Таким образом, мы написали лексер библиотеку комбинатора парсеров для нашего интерпретатора. В этой части, мы создадим структурные данные абстрактного синтаксического дерева (AST), и напишем парсер, используя нашу библиотеку комбинаторов, которые переводят список токенов, возвращенных лексером, в абстрактное синтаксическое дерево (AST). После того, как мы распарсим AST, запустить программу будет очень просто.

Читать дальше →
Total votes 26: ↑24 and ↓2 +22
Views14.5K
Comments 1