Новые Xbase продукты.
Введение.
Ситуация, в которой оказались разработчики, использующие Клиппер, после отказа Computer Associates поддерживать этот продукт, широко известна. Клиппер оказался в стороне от современных технологий и его ниша на рынке стремительно сокращается.
Некоторые наиболее удачные "3-rd party" библиотеки расширяют границы возможностей Клиппера. Это, в первую очередь, Advantage Xbase Server фирмы Extended Systems - замечательный продукт, позволяющий строить на Клиппере клиент-серверные системы, кардина льно повышающий производительность Клипперных программ, надежность хранения и модификации данных. Это FiveWin и Clip4Win – библиотеки, позволяющие создавать полноценные Windows приложения, использовать в программах Windows API. Это Btrieve RDD, драйверы от OpenPath, TopConnect и др. Это всем известный Six RDD, Funcky, Telepathy, Faxual и много других Clipper add on средств, делающих его действительно лучшим инструментом для работы с базами данных.
Но все эти продукты лишь продляют угасание Клиппера ( не хочется говорить – агонию ), не решая главную проблему – 16-разрядный барьер. Поэтому даже производители упомянутых выше программ постепенно переориентируются на другие средства. Так, Extended Syst ems большее внимание уделяют своим новым драйверам – 32-bit Client Engine для Delphi, Visual Basic, Microsoft Visual C. Fivetech развивает FiveWin++ для Xbase++.Все это вынуждает нас искать пути миграции на другие средства разработки, многие из которых представлены на этой конференции.
Кто-то переходит на Delphi, Visual C, Visual Basic. Это требует коренной переделки всех программ и даже парадигмы программирования, хотя применение таких средств доступа к данным, как Apollo/Artemis, уже упоминавшийся Advantage Client Engine позволяют сохранить существующие базы данных и даже индексы.
Кто-то использует Visual Objects, Visual Foxpro, Visual Dbase. В этих продуктах сохранен Xbase синтаксис, но переделки требуются значительные.
Xbase++ позволяет полностью сохранить клипперовский текст, но у них свои проблемы – медлительность, огромные размеры exe’шников, необходимость использования кучи DLL, пока еще немало ошибок. И цена – для сыроватого продукта, каким пока является Xbase, он а велика.Проект Harbour.
Но есть и другой путь. Если Computer Associates не хочет развивать Клиппер, переносить его на другие платформы, на 32-разрядные коды, мы можем сделать это сами. Группа постоянных участников ньюсконференции comp.lang.clipper выбрала этот путь. Так в к онце марта этого года родился проект Harbour по созданию Клиппер - совместимого, кросс-платформенного компилятора с открытыми исходными текстами.
Инициатором проекта является Антонио Линарес – автор FiveWin, владелец компании FiveTech. Он выложил наметки своего Клиппер-совместимого компилятора Five для всеобщего обозрения и выступил с идеей создания нового Клиппер-компилятора на базе стандартны х средств Lex / Yacc. Разговор первоначально шел именно о новом Клиппере, в качестве названия для проекта предлагались OpenClipper, Clipper32 и даже Clipper 6.0 . Но поскольку “Clipper” – зарегистрированная торговая марка – собственность Computer Associates, от использования этого слова пришлось отказаться. Название Harbour ( гавань ), по словам Линареса, предложила его жена. Оно было принято как сим вол той новой гавани, куда стремится Clipper ( быстроходный корабль ).
Основные цели проекта:
- 100% совместимость с Клиппером, что даст возможность почти без проблем использовать все Клиппер-приложения;
- кросс-платформенность - что позволит использовать одни и те же программы в 16-разрядной, 32-разрядной ( и больше ) среде, в DOS, Windows, Linux, OS/2 и с др. операционными системами;
- открытые исходные коды, что позволит привлечь к участию в проекте всех желающих, делает проект открытым для новых идей, позволит воплотить в жизнь то, чего нам не хватало в Клиппере.
Предполагаемые дополнения к базовым возможностям Клиппера:
- будут сняты некоторые ограничения, связанные с 16-разрядной средой, например, размер строки ( в Клиппере - до 64К ), общая ширина колонок в TBrowse, количество директив препроцессора, размер массива ( был до 4096 элементов ) и т.д. ;
- расширение возможностей препроцессора ;
- полноценная поддержка ООП ;
- предполагается поддержка многопотоковости ( multi-threads ).
- Кроме того, теперь станет возможным прямое использование Win32 API, WINSOCK API, MAPI, ODBC и т.д. и т.п.
Harbour - бесплатен, он будет распространяться по GNU лицензии с некоторыми исключениями, что не исключает, что какая-либо фирма может продавать его, написав, к примеру, программу установки, IDE и записав на CD.
Технология разработки.
Harbour – международный проект, среди его участников граждане Австралии, Бразилии, Великобритании, Венгрии, Германии, Испании, Индонезии, Италии, Канады, Нидерландов, Польши, России, США, Чили и других стран мира. Средой для совместной работы столь далеко живущих друг от друга людей является, конечно, Интернет. Основные коммуникационные средства, использующиеся для совместного проектирования, это:
- CVS - Control Version Server ;
- два листа почтовой рассылки ;
- Web site - http://www.harbour-project.org
CVS – это программный комплекс, состоящий из серверной и клиентской частей. Он позволяет синхронизировать копии проекта, находящиеся у каждого разработчика с копией на сервере, одновременно работать над одними и теми же файлами нескольким разработчика м, разрешая конфликты, возникающие при модификации одних и тех же строк кода. CVS хранит ВСЕ версии каждого файла, позволяет восстановить любую из них в случае необходимости, выдает журнал изменения любого файла по запросу клиента и т.д.
Листы рассылки используются как основное средство общения разработчиков и всех интересующихся ходом проекта.
Основной лист для разработчиков - harbour@onelist.com. Чтобы подписаться на него, просто отправьте пустое сообщение на адрес harbour-subscribe@onelist.com . Еще один лист рассылки - harbourtalk@onelist.com - служит для дискуссий, не связанных напрямую с оперативной работой над проектом. Подписаться на негл можно, отправив пустое сообщение по адресу harbourtalk-subscribe@onelist.com. Чтобы отменить подриску на листы, надо отправить сообщения, соответственно, по адресам Harbour-unsubscribe@ONElist. com и harbourtalk-unsubscribe@ONElist.com. Архивы этих листов рассылки можно найти по следующим ссылкам:
http://www.onelist.com/viewarchive.cgi?listname=Harbour
http://www.onelist.com/viewarchive.cgi?listname=Harbourtalk
Средства разработки
- лексические анализаторы lex & yacc ;
- C компилятор - любой, имеющийся в распоряжении ;
- GNU MAKE ( желательно ).
В числе используемых С компиляторов –
Для платформы Microsoft Windows:
- GCC ( CYGWIN)
- Borland C/C++ 4/5/Builder
- Microsoft Visual C++ 10/11/12
- IBM Visual Age for C++
Для DOS 32bit
- GCC ( DJGPP)
- Watcom C/C++
Для DOS 16bit
- Borland C/C++ 3.1
Для Linux
- GCC ( разные версии )
Для OS/2
- GCC ( EMX)
- IBM C++
Для Macintosh
- MPW
Особенно хочу подчеркнуть, что используется именно С, а не С++, причем ANSI C. Это делается для обеспечения переносимости исходных текстов на различные платформы.
Основные компоненты.
Это, естественно, тот же набор, что и у Клиппера:
-
препроцессор ;
- компилятор ;
- виртуальная машина ;
- RTL - Run-time library ;
- RDD ;
- run-time компилятор макросов ;
- GT API.
Получить все файлы проекта вы можете с сайта http://www.harbour-project.org – там лежат “официальные” релизы – как исходные тексты, так и комплекты с уже изготовленными бинарными файлами – компилятором и б иблиотеками для разных платформ.
Если вы хотите узнать самую последнюю информацию о проекте, вам нужно подключиться к CVS. Для этого надо сначала скачать клиентскую часть CVS ( можно прямо с сайта проекта ), установить ее, установить переменные окружения:
SET CVSROOT=:pserver:cvsanon@harbour.joca.es:/home/devel/cvsroot
SET HOMEDRIVE=C:
SET HOMEPATH=\CVS
После этого можно входить:
cvs login
указав пароль cvsanon, и скачать файлы проекта:
cvs extract -P harbour
Если вы взяли файлы с CVS, или комплект с исходниками с сайта, вам надо построить компилятор и библиотеки самостоятельно. Для этого вам нужно иметь программы Flex и Bison ( их можно взять с сайта ) и какой-либо из упомянутых выше С компиляторов. Все н еобходимые для построения bat-файлы находятся в корневом каталоге проекта. Если что-то не получится – пишите в лист рассылки или мне – по адресу alex@belacy.belgorod.su .
Текущее состояние проекта.
Оно непрерывно изменяется, в том числе и сейчас, когда я пишу эти строки.
На момент написания этих тезисов препроцессор практически готов компилятор почти закончен, виртуальная машина работает, значительная часть RTL написана, ядро RDD готово, GT API - только для Win32 console.
Значительная степень готовности у ООП системы. Уже достигнута большая функциональность, чем у Клиппера. На ее основе написана Get-система, классы Error, Tbrowse, Todbc.
В качестве примера в приложении приведен текст простенькой программы, демонстрирующей работу класса TOdbc.
Существующая версия ( build 30 ) позволяет получить Harbour программы, как 16-разрядные, так и 32-разрядные, работающие в DOS, Windows 95/98/2000, NT, OS/2, Linux.
Библиотеки сторонних производителей для Harbour.
К настоящему времени разрабатывается ( появились первые демо ) Fivewin для Harbour. Антонио Линарес написал мне, что собирается выпустить альфа – версию на днях ( возможно, к началу конференции она уже готова ). Harbour + FiveWin – это полноценное 32- разрядное Windows – приложение.
Extended Systems объявили о своем намерении начать разработку RDD клиента к своему Advantage Xbase Server для Harbour.
Фирма TopConnect объявила о своем желании подготовить свои библиотеки для работы с Harbour.
Что осталось сделать ?
Run-time компилятор макросов, RDD, GT API для разных платформ. Необходима оптимизация виртуальной машины, файловых драйверов и GT API для повышения производительности. Закончить RTL, выловить и исправить ошибки. Работы много - и от всех нас зависит, к ак скоро она будет сделана.
Присоединиться к проекту может любой. Не обязательно быть знатоком С. Вы можете помочь, тестируя Harbour на разных платформах. Кроме того, часть исходных текстов пишется на Клиппере – Harbour’е, так что есть работа и для клипперистов.
Max.
Тем временем выходит в свет еще один ( но коммерческий ) продукт, авторы которого провозглашают частичную Клиппер-совместимость и кросс-платформенность ( Win32, Linux ). Это - MAX.
К настоящему времени вышла версия MAX под Linux.
Разработчики заявили о своей принципиальной позиции поддерживать только текстовый режим работы ( отказ от GUI, X-Windows, и т.п. ). Этим достигается полная переносимость приложений с платформы на платформу и высокая производительность.
Max является наследником Clipper’87, хотя туда добавлено немало новшеств, присущих Clipper 5.xx, как, например, поддержка многомерных массивов, кодоблоков, составных операторов ( +=, -=, и др. ), унарных операторов ( ++, -- ), реализация препроцессора , LOCAL и STATIC переменные, множество дополнительных команд и функций. От полной совместимости с Clipper’ом разработчики отказались. Ниже приведен список элементов Clipper 5.xx, не поддерживаемых Max’ом:
- Не поддерживаются директивы препроцессора #command, #translate, передача параметров в псевдофункциях ;
- Не поддерживается ООП и, соответственно, предопределенные классы GET, Tbrowse, TBColumn, Error ;
- Не реализованы REPORT FORM и LABEL FORM, вместо них предлагаются другие средства создания отчетов ( в частности, мой генератор отчетов, выложенный в PUBLIC DOMAIN ) ;
- Отсутствуют команды FIELD, MEMVAR, EXTERNAL, BEGIN SEQUENCE … END ;
- Отсутствуют функции aeval(), dbeval(), valtype() – вместо них предлагаются другие решения.
Max реализует свой собственный формат индексных файлов, они имеют расширение MTX.
Формат MEM файлов тоже имеет отличия, но Max может читать MEM файлы, созданные Клиппером и другими Xbase продуктами.
Компилятор Max не создает exe – файлы, он производит файлы с расширением .max, которые затем исполняются программой Maxrun.
Ниже приведен частичный перечень новых функций Max.
Поддержка Unix:
- termlog() – возвращает имя устройства, связанного с текущим терминалом ( "/dev/tty1a" ) ;
- termname() - возвращает тип терминала ( ansi, vt100 );
- termwrite() – прямая запись на экран, минуя экранные буферы и драйверы.
Поддержка IBM Mainfraim:
- asc2ebc() – преобразует строку из ASCII в EBCDIC;
- ebc2asc() – преобразует строку EBCDIC в ASCII.
Функции для работы с числами:
- bin2f() – преобразует строку в 8-байтовом IEEE формате в число;
- f2bin() - преобразует число в строку в 8-байтовом IEEE формате;
- lennum() – определяет количество значащих разрядов числа;
- log10() – логарифм;
- mod() – остаток от деления;
- rand() - генерирует случайное число от 0 до 0.999999;
- sign() – возвращает знак числа.
Строковые функции:
- difference() – сравнивает две строки на базе SOUNDEX кодов;
- like() – сравнивает строку с маской ( ‘?’, ‘*’ );
- initcap() – переводит первые буквы всех слов в строке в верхний регистр.
Сетевые функции:
- network() – определяет, работаем ли мы в многопользовательском окружении.
Логика переходов:
- switch() – Подобна DO CASE … ENDCASE, но может использоваться в выражениях.
Обработка ошибок:
- criticalerror() – вызывается при критической ошибке ОС. Эта функция может быть переопределена пользователем;
- uniqueviol() – определяет, было ли нарушение уникальности индекса;
- usererror() – исполняется при появлении (перед userexit( ));
- userexit() – исполняется по завершении приложения.
Файловые функции:
- attrib() – возвращает и изменяет атрибуты файла;
- cd() – переход в другой каталог;
- fcommit() – заставляет ОС записать на диск буферы определенного файла;
- fpath() – возвращает полный путь файла;
- indexalias() – возвращает алиас, соответствующий указанному индексу;
- md() – создает каталог;
- rd() – удаляет катлог.
Клавиатурные функции:
- autoclose() – закрывает файл, открытый autorec( ) или autorun( );
- autorec() – записывает в файл коды нажатых клавиш и интервалы времени;
- autorun() – ‘проигрывает’ предварительно записанный с помощью autorec( ) файл;
- capslock() – определяет и изменяет статус CAPSLOCK;
- isalt() – определяет статус клавиши ALT;
- isctrl() - определяет статус клавиши CTRL;
- isins() - определяет статус клавиши INS;
- islshift() - определяет статус клавиши SHIFT;
- ismouse() - определяет, есть ли мышь;
- isrshift() - определяет статус клавиши SHIFT;
- numlock() - определяет и изменяет статус NUMLOCK;
- restkey() – восстанавливает функцию, связанную с клавишей перед сохранением с помощью savekey();
- savekey() – сохраняет функцию, связанную с клавишей посредством SET KEY;
- scrlock() - определяет и изменяет статус SCROLL LOCK;
- xlastkey() - определяет и изменяет код последней нажатой клавиши.
Функции работы с массивами:
- ainit() – объявляет и инциализирует массив;
- alen() – определяет длину многомерного массива;
- aredim() – переопределяет размерность массива;
- axchg() – обмен элементами массива;
- mcopy() – копирование многомерного массива;
- mdel() – удаление элементов многомерного массива;
- mdir() – многомерная версия adir( );
- mfields() – многомерная версия afields( );
- mins() – вставляет элементы в многомерный массив;
- msort() – многомерная версия asort().
Этот список можно продолжить, но у меня сейчас нет времени. Читайте документацию !
Приложение.
Пример программы, читающей из файла Microsoft Access с помощью класса Todbc.
FUNCTION Main() LOCAL aOrders LOCAL nOp LOCAL dsFunctions LOCAL cExePath := substr( cargv(), 1, rat( "\", cargv() ) - 1 ) LOCAL cConStr := "DBQ=" + "harbour.mdb;" + "Driver={Microsoft Access Driver (*.mdb)}" dsFunctions := TODBC():New( cConStr ) set COLOR TO "W+/B" CLS WHILE .T. @ 00, 00 SAY padc( "¦ TODBC Demonstration ¦", 80 ) COLOR "B/W" dsFunctions:SetSQL( "SELECT * FROM Functions" ) dsFunctions:Open() @ 03, 24 TO len( dsFunctions:Fields ) + 4, 55 aOrders := {} FOR i := 1 TO len( dsFunctions:Fields ) aadd( aOrders, dsFunctions:Fields[ i ] :FieldName ) @ i + 3, 25 PROMPT padc( "ORDER BY " + aOrders[ i ], 30 ) NEXT MENU TO nOp IF nOp == 0 EXIT ENDIF dsFunctions:Close() dsFunctions:SetSQL( "SELECT * FROM Functions ORDER BY " + aOrders[nOp]) dsFunctions:Open() FOR i := 11 TO 24 @ i, 00 SAY REPL( " ", 80 ) NEXT @ 10, 00 TO 10, 79 @ 24, 00 TO 24, 79 @ 12, 00 TO 12, 79 @ 11, 00 SAY "" @ 11, 02 SAY "Statement:" COLOR "GR+/B" @ 11, col() + 1 SAY dsFunctions:cSQL @ 14,05 SAY " " + padr( dsFunctions:FieldByName("Code") :FieldName, 3 )+" " + ; padr( dsFunctions:FieldByName( "Function" ) :FieldName, 15 ) + " " + ; padr( dsFunctions:FieldByName( "State" ) :FieldName, 2 ) + " " + ; padr( dsFunctions:FieldByName( "Comments" ) :FieldName, 40 ) ; COLOR "B/W" WHILE !dsFunctions:Eof() ? " " + padr( dsFunctions:FieldByName( "Code" ) :Value, 3 ), "¦", ; padr( dsFunctions:FieldByName( "Function" ) :Value, 15 ), "¦", ; padr( dsFunctions:FieldByName( "State" ) :Value, 2 ), "¦", ; padr( dsFunctions:FieldByName( "Comments" ) :Value, 40 ) dsFunctions:Skip() ENDDO dsFunctions:Close() ENDDO dsFunctions:Destroy() RETURN ( NIL )