Forté 4GL — это собственный сервер приложений, разработанный компанией Forté Software и использовавшийся для разработки масштабируемых корпоративных приложений с высокой доступностью.
Forté 4GL создавался как интегрированное решение для разработки и управления клиент-серверными приложениями. Forté 4GL состоит из сервера приложений, инструментов для развертывания и мониторинга приложения и собственного объектно-ориентированного языка программирования ИНСТРУМЕНТ (транзакционный объектно-ориентированный язык) . Учитывая, что ИНСТРУМЕНТ работает только на сервере приложений Forté, многие пользователи называют свои приложения «ИНСТРУМЕНТ» просто приложениями «Forté». Первая версия Forté 4GL была опубликована в августе 1994 года. После выпуска этого первоначального продукта Forté Inc. приступила к созданию нескольких расширений, в том числе:
В 1999 году компания Forté Software выпустила версию Forté, основанную на Java , а не на ИНСТРУМЕНТЕ, под названием SynerJ и также называвшуюся «Forté для Java». Как и в случае с исходными продуктами на базе ИНСТРУМЕНТА, он состоял из среды разработки, репозитория кода и среды выполнения. Этот новый Java-продукт заинтересовал Sun Microsystems , которая выкупила компанию. Перечисленные выше расширения на основе ИНСТРУМЕНТА были объединены вместе и переименованы в Unified Development Server (UDS) и Integration Server (IS) в рамках подразделения IPlanet . Позднее серверные модули были объединены в систему интеграции корпоративных приложений (EAI).
Sun объявила об окончании срока службы продукта, указав на отсутствие планов по продолжению разработки продукта. Официальная поддержка Forté со стороны Sun закончилась в апреле 2009 года. [1]
Будучи системой разработки корпоративных приложений, Forté 4GL поддерживал тесную связь с рядом различных систем реляционных баз данных , включая Oracle , Sybase , Microsoft SQL Server , Informix и DB2 . Эти связи могут осуществляться посредством SQL, встроенного в код ИНСТРУМЕНТА, или посредством SQL, создаваемого «на лету».
Также была поддержка распределенных приложений: разработчик создавал экземпляр определенного класса, который размещался на указанном пользователем сервере. Вызовы методов через экземпляр будут прозрачно передаваться по сети; разработчику не нужно будет знать основные детали того, как будет передаваться вызов.
ИНСТРУМЕНТ — это объектно-ориентированный язык со следующими функциями (среди прочих):
Object
Код ИНСТРУМЕНТА не чувствителен к регистру. Оператор всегда заканчивается точкой с запятой. Составные операторы заключаются в ключевые слова begin
и end
. Комментарии обозначаются // или -- (оставшаяся часть строки становится комментарием), /* ... */.
Типы данных
Простые типы данных:
Соответствующие типы данных объекта (некоторые примеры):
Массивы обозначаются ключевыми словами Array of
. Первый элемент массива имеет индекс 1.
Объявление переменной
имя: строка = 'Джон';результат: целое число;dataArray: Массив IntegerData = new;
Условные операторы (оператор if, оператор case)
если результат = 5100, то ...иначеесли результат != 0 тогда ...еще ...конец, если;результат дела когда я делаю .... когда 2 сделают .... еще ...конец корпуса;
Итерация, Циклы
для k от 1 до 10 на 2 сделать ...конец для;для dataItem в dataArray сделайте ...конец для;к: целое число = 2;пока k < 14 делать ... к = к + 1;закончить пока;
События
Событие публикуется, например, следующим оператором:
сообщение EV_CustomerSet (id = selectedID);
Этот оператор публикует событие с именем EV_CustomerSet
. Это событие имеет один аргумент с именем «id».
События обрабатываются обработчиками событий, например:
цикл событий предварительная регистрация зарегистрируйте GeneralHandler(); ... пострегистрация waitTimer.IsActive = правда; ... когда EV_CustomerSet(id) сделает ... когда waitTimer.Tick() делает Выход; когда задача. Выключение сделать Выход;конечное событие;
Обработка исключений
начинать ... поднять UsageException(); ...исключение когда e: UsageException сделать задача.ErrMgr.Очистить(); ... еще ... поднимать;конец;
Многопоточность
Новый поток запускается оператором типаstart task report.Print();