Добро пожаловать!

Я Дож, программирование — моё хобби. По мере того, как я осваиваю что-то новое, стараюсь об этом написать пост.
На текущий момент в блоге затронуты следующие темы: vim, free pascal, lisp, forth, m4
Занимаюсь разработкой своего языка под названием DEmbro, подбробней: wiki и svn
Для постов, не связанных с программированием, у меня есть отдельное жж.

марта 27, 2012

Текущее состояние DEmbro

DEmbro сейчас не в лучшем состоянии, тем не менее разработка ведётся.

Из-за старта поддержки дембро под линуксом, появились ветвления
для каждой из платформ на разных уровнях — в исходниках, в makefile'е
и в m4 скриптах. Время от времени компиляция ломается, общая схема
стабилизации пока что не придумана.

Запланированный год назад глобальный рефакторинг, видимо,
следует считать успешным. Но я планировал сделать гораздо больше,
чем написал в том посте, и потому считаю рефакторинг провальным :)

Принял решение разделить исполняемый файл «dembro32»
на динамическую библиотеку de32.dll/libde32.so и программу-оболочку,
анализирующую командную строку и реализующую repl, который
перенаправляет запросы в библиотеку. Сразу же столкнулся с тем,
что free pascal версии 2.4 неправильно создаёт динамическую
библиотеку у меня в линуксе, подробнее история тут.


Чтож, начал переписывание исходников под свежую версию fpc.

Таким образом, ближайшие задачи: переписать код под новый паскаль,
стабилизировать компиляцию, откатить неудачные последствия глобального
рефакторинга, и после всего этого навести порядок на свне.


Читать дальше......

февраля 24, 2012

Реанимация DEmbro

DEmbro был в коме более месяца. Разработки не только не велись, но даже скомпилировать проект из транка было невозможно, т.к. makefile для сборки был в подвешенном состоянии. Вчера, наконец, я смог выделить время и реанимировал компиляцию в линуксе, а сейчас приступил к написанию универсальной сборки, чтобы и в posix-окружении, и в windows работало, причём без конфигурационных инструментов. Пришлось использовать небольшой хак. :)

У меня в голове есть несколько глобальных мыслей о DEmbro, и я решил их потихоньку оформлять в виде текстов в этом блоге. (Кстати, заметил, что то, что в моей голове выглядит мощно, в записанном виде получается чем-то незначительным или бредовым. Поэтому не претендую на то, что тут что-то умное.)

Мысли о «собери DEmbro сам»

Я понял, что не хочу иметь большую монолитную систему, какими обычно являются компиляторы/интерпретаторы. Хочу получить эдакий конструктор «собери DEmbro сам», с возможностью определять базовый набор команд в бинарнике, особенности DEmbro-машины и прочее. Польза от этого следующая:

  1. Лёгкость в совершении глобальных изменений.
  2. Возможность в случае возникновения специфической задачи быстро сделать специализированное под эту задачу ядро DEmbro
  3. (Следствие пункта 1.) Возможность тестирования и прикидок -- можно попробовать несколько решений и посмотреть какое из них ведёт себя лучше.
Приведу пример — RetroForth. Это талантливо написанная реализация одного из диалектов форта, но полностью лишённая гибкости. А именно: всё заточено под 16-битный асм, каждая следующая команда реализуется через предыдущие, в качестве шитого кода только машинный код. Нет возможности изменить что-то в ядре (форматы хранения словарных статьей, базовый набор команд, производимые оптимизации). И т.д.

Технически гибкость достигается, понятное дело, разделением кода на части, связи между которыми минимальны. И первый шаг к этому я уже сделал: команды дембро описываются в отдельных файлах со своим форматом, из которых собираются исходные коды. Как минимум я уже получил независимость реализации дембро-машины от команд, которые доступны в языке, и как следствие возможность лёгкого отключения групп команд (например, можно скомпилировать ядро без команд для работы с плавающей точкой). В идеале у меня есть идея записывать реализации этих команды не на паскале, а на каком-то совсем своём ограниченном промежуточном языке, который легко преобразовывать в конкретный (паскаль/си/etc), тогда можно бы было реализовать дембро-машину на разных языках программирования, что повысило бы переносимость.

Мысли о совместимости версий

Исходя из предыдущей идеи, у DEmbro не должно быть как таковой линейки версий, а должно быть большое дерево разновидностей с кучей диалектов, не совместимых друг с другом. Тем не менее, некую основную ветвь я буду разрабатывать, под неё писать спецификацию.

Однако, я не хотел бы себя загонять в рамки бесконечной поддержки предыдущих версий. Т.е. если я захочу переназвать кучу команд, изменить тонкости их поведения и т.д., то я это и сделаю (и уже делал). Это, конечно же, приведёт к тому, что код, расчитанный на предыдущие версии дембро, в новых версиях не будет работать. Чтобы, однако, не терять старый код, будет возможность включать режим старых диалектов, как-то так:
include" units/dialects/dembro.0.23.de"
DIALECT DEMBRO0.23
// код, расчитанный под старую версию DEmbro
\DIALECT
// тут снова можем писать код для новой версии DEmbro

Технически это не должно быть чем-то сложным. Как минимум, уже сейчас есть механизм словарей, обеспечивающий лвиную долю функционала.

Возможно, даже, будет что-то типа такого :)
include" units/dialects/retroforth.de"
DIALECT RETROFORTH
...
\DIALECT


Читать дальше......

февраля 01, 2012

Лисп в первый раз в жизни

Вопрос к лисп-аудитории.

Мне скоро потребуется заменить моего друга на кружке по теории алгоритмов. Рассказывать я могу о чём угодно в течении полутора часов, и я решил рассказать о некоторых философских идеях лиспа для расширения кругозора. Пока что мне приходят в голову две темы для рассказа:

  1. Кодогенерация (макросы, использование программы как данных)
  2. ФП на примере обработки списков (lambda, map, reduce, apply и т.д.)
А какие ещё идеи по вашему мнению стоило бы включить в рассказ?

[update] Если что, то слушатели — десятиклассники, их опыт программирования недалеко выходит за школьный, но есть некоторая стандартная алгоритмическая база.


Читать дальше......

декабря 30, 2011

ConnectBot

В догонку к моему недавнему посту про настройку линукса под андроидом. В программе ConnectBot, которая нужна для работы через консоль, можно назначить Esc на клавишу поиск, что очень полезно, т.к. на док. станции к моему планшету нет клавиши Esc. Это даже удобнее, чем если бы клавиша Esc была: она в виме используется весьма часто, и на обычной клавиатуре находится далеко от основных клавиш. А вот клавиша поиск находится слева от пробела. Теперь я даже при работе за обычным компьютером или ноутом применяю комбинацию Ctrl+C, потому что не хочу тянуться к Esc.


Читать дальше......

декабря 15, 2011

DEmbro в unix+ARM окружении!

Начал портировать DEmbro на свой планшет :) Сейчас уже запускается, правда, почему-то не хочет исполнять внешние файлы, а без этого туго: дембро при запуске не имеет почти что команд, их нужно подключать конфигурационным файлом. Вообще, это было плохой идеей, я хотел сделать нечто типа "собери свой форт сам", но лучше это теперь вынести на этап компиляции, потому что тормозит запуск (хочется, чтобы моментально запускался и сразу начинал исполнять, без всяких подготовок). Ну а пока что я могу поиграться, вручную подключив нужный функционал командой builtin :)

 Портировал по принципу "что не пашет, то комментирую". Основные проблемы при портировании были из-за разделителя директорий, который отличается в windows и unix, из-за разных символов переносов строк. Из-за того, что ассемблерные вставки для i386 не работают в ARM, и из-за использования windows-специфичных функций серьёзных проблем не возникло. Может быть потому, что я был к этому готов.

Надо будет как-то получше организовать сборку с учётом платформ и зависимостей, а то сейчас всё в кашу превратилось. Может быть написать систему конфигурации на DEmbro? :) А то как-то лениво изучать существующие.


Читать дальше......

декабря 11, 2011

Устанавливаем на планшет Asus Eee Transformer tf101 в дополнение линукс

Недавно я стал счастливым обладателем планшета ASUS Eee Transformer tf101 16gb с док-станцией в комплекте и Android в качестве операционной системы. Мне, как программисту, хочется использовать девайс не только для чтения книг и интернета, но и для программирования. Поэтому я решил установить в дополнение к андроиду линукс.

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

На нижней стороне устройства находится его серийный номер. Если он начинается на B60 или меньше, то в инете можно найти кучу способов для получения root-доступа. Мне же досталась серия B80, для нее единственный известный способ -- использование программы Razorclaw. Программу нужно скачать, установить, запустить, и нажать на единственную в ней кнопку, после чего рут-доступ получен. Возможно, что перед этим потребуется обновить андроид до последней версии (это можно сделать в настройках).

Ок, после того, как рут-доступ получен, можно приступить к установке линукса. Для этого качаем с маркета программу Linux Installer, документацию для нее смотрите здесь. Авторы предупреждают, что неправильное использование программы может привести к порче устройства (если система будет достаточно серьезно повреждена, то восстановить ее не получится, и устройство можно будет выбрасывать).

Итак, запускаем Linux Installer, открываем в меню Setup. Нужно поменять только один параметр: путь к loop-файлу, я его установил в "/data/Linux.loop". На значение по умолчанию выдавался варнинг о том, что путь вроде как находится на съемном диске (несмотря на то, что это не так). По вкусу я еще поменял hostname и domainname на более короткие и приятные.

Возвращаемся из Setup, далее действуем по инструкции, которая выводится вверху экрана рядом с пингвином. А именно: жмем create target loop, format target loop, далее идем в Setup, ставим галку около "Allow write to /sys", возвращаемся, жмем mount loop, жмем install distribution in loop. Начались закачивание и установка линукса, нужно подождать какое-то время. Как только это закончилось, жмем Udpate launcher script, теперь для безопасности жмем Stop env loop, заходим в Setup, снимаем галку у "Allow write to /sys", возвращаемся и жмем mount loop. Ок, линукс готов к использованию.

Теперь нужно установить программу-консоль. У меня клавиатура внешняя (на док-станции) и сильно отличается от того, что обычно бывает на смартфонах, поэтому стандартный ConnectBot не подходит. Зато есть специальный ConnectBot для именно моего планшета. Устанавливаем, запускаем. В левом нижнем углу выбираем тип соединения local, вводим какое-нибудь название для сессии (doj, например), жмем Enter. Сейчас мы находимся в псевдолинукс системе самого андроида, в нем мы мало что можем делать. Набираем linuxchroot, должен запуститься установленный ранее линукс с bash в качестве оболочки.

Устанавливем базовый комплект для программирования, для этого набираем:
apt-get install vim
apt-get install make
apt-get install gcc
apt-get install g++

Ок, теперь у нас есть vim (версии 7.2, т.е. со всеми основными вкусностями вима) и компилятор g++. Можем приступить непосредственно к программированию:
mkdir /root/hello
cd /root/hello
vim hello.cpp

Отмечу на счет вима вот что: на клавиатуре нет клавиши Esc, вместо нее нужно использовать комбинацию Ctrl+C. Набираем минимальную прогу
#include <stdio.h>

int main(int argc, char* argv[]) {
  printf("Hello from Android!\n");
  return 0;
}

Выходим, выполняем
g++ hello.cpp -o hello
./hello

Видим, что прога работает.


Читать дальше......

ноября 23, 2011

Меняем шрифты в vim'е

Недавно по рекомендации Darthman'а решил сменить используемый шрифт. Всегда раньше использовал FixedSys, но попробовать другие стало интересно. В посте я попытался описать как настраивать шрифты в виме.

Если vim запущен в консольном режиме, то отображаемый шрифт полностью зависит от программы-оболочки, реализующей консоль. Поэтому всё, что написано ниже, имеет отношение к gVim'у.

Опция gVim'а, настраивающая шрифт, называется guifont. Если в качестве параметра ей передать звёздочку, то появится диалоговое окошко (проверено под Windows, в других ОС не гарантируется)
:set guifont=*


Этот способ запуска полезен для перебора разных вариантов, но неудобен для настроек (не поместить в vimrc файл, например). Вместо звёздочки можно передать название шрифта с дополнительными опциями. Вот что написано в хелпе о формате дополнительных опций под windows:
        For the Win32 GUI                                       *E244* *E245*
        - takes these options in the font name:
                hXX - height is XX (points, can be floating-point)
                wXX - width is XX (points, can be floating-point)
                b   - bold
                i   - italic
                u   - underline
                s   - strikeout
                cXX - character set XX.  Valid charsets are: ANSI, ARABIC,
                      BALTIC, CHINESEBIG5, DEFAULT, EASTEUROPE, GB2312, GREEK,
                      HANGEUL, HEBREW, JOHAB, MAC, OEM, RUSSIAN, SHIFTJIS,
                      SYMBOL, THAI, TURKISH, VIETNAMESE ANSI and BALTIC.
                      Normally you would use "cDEFAULT".

          Use a ':' to separate the options.
        - A '_' can be used in the place of a space, so you don't need to use
          backslashes to escape the spaces.
        - Examples: >
            :set guifont=courier_new:h12:w5:b:cRUSSIAN
            :set guifont=Andale_Mono:h7.5:w4.5


Вот несколько моих примеров со скриншотами:
set guifont=consolas:h11:cRUSSIAN


set guifont=DejaVu_Sans_Mono:h11:cRUSSIAN


Некий обзор шрифтов для программирования можно почитать в этой статье.

Если не передавать опцию cRUSSIAN, то могут начаться проблемы с отображением русских букв в разных ситуациях. Если же всё же нет возможности передать такую опцию, то ИМХО самым простым способом решения проблемы является изменение кодировки ввода и языка сообщений:
set guifont=consolas:h11
set encoding=utf-8
lan mes en


Читать дальше......

Постоянные читатели

Обо мне

Моя фотография
Мой e-mail: vitek_03(at)mail(dot)ru