Продолжение с того же места

Укажите на папку, которую не открывали годами, и увидите ровно то, что там лежит.

Проект как он есть

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

Знакомые конструкторы

Формы, классы, меню и отчёты редактируются там, где вы их ожидаете найти, рядом с менеджером проектов, командным окном и отладчиком, который встаёт на вашей строке.

Ваши данные — остаются вашими

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

Всё, что слушала старая версия — она слушает и сейчас

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

Как это выглядит

IDE на примере собственных примеров Visual FoxPro. Каждый снимок экрана — реальная сессия.

Пример Solution из Visual FoxPro, запущенный на экране: форма запуска примеров с контуром образцов ActiveX, Controls, Databases и Forms, рядом обозреватель проекта со списком форм, меню, программ, библиотек классов, баз данных, свободных таблиц и отчётов; в строке состояния написано 'Waiting for events'.
Собственный пример Solution из Visual FoxPro, импортирован и работает: форма запуска на экране, 123 формы проекта, 7 меню и 11 библиотек классов в обозревателе, рантайм ждёт событий.

Редактор программ с открытым примером FormsUI, линтер отмечает синтаксическую ошибку inline на строке FOR, а ниже окна Output и Command.
Редактор работает через компилятор самого рантайма, поэтому то, что он подчеркнёт, действительно упадёт.

Отладчик встал на строке 26 программы, одна инструкция дальше точки останова на строке 25: текущая строка подсвечена, ниже окно Output, стек вызовов, локальные переменные, окно watch и список точек останова.
Встал на одну инструкцию дальше точки останова в основной программе: стек вызовов, локальные переменные, watches и строка останова.

Обозреватель таблиц показывает 17 записей контейнера базы данных с memo-полями как ссылками, рядом обозреватель проекта со списком форм, меню, программ, библиотек классов и баз данных.
Контейнер базы данных в обозревателе таблиц: 8 полей, 17 записей, memo-поля в клик.

Программа FoxScript регистрирует HTTP-маршруты с лямбдами, вызывает 32-битную библиотеку шифрования из одной из них, а окно Output выдаёт, что сервер слушает на порту 8080.
FoxScript: лямбды отвечают на HTTP-маршруты, 32-битная библиотека вызывается из одной из них, слушает на 8080.

Построена для соответствия, не для приближения

Маленькие отличия ломают старые приложения: число напечаталось на колонку шире, событие пришло чуть позже, ошибка выдала неправильный номер. Поэтому здесь поведение определяется тем, что выдаёт сама Visual FoxPro, а не прочтением справочной страницы в надежде на лучшее.

Результат — рантайм, написанный с нуля: быстрый на запуск, самодостаточный и прямолинейный о тех углах, которые пока не перекрыты.

1 722
элемента справочника языка Visual FoxPro 9, известного рантайму
1 534
из них проверены тестом, сравнивающим результат с результатом оригинального продукта
3
названия, которые рантайм ещё не встречал; всё остальное работает, игнорируется намеренно или отклоняется по названию

Что было бы Visual FoxPro 10

Visual FoxPro остановилась на версии 9, и на 32 битах. Здесь — тот же язык, пересобранный на основе, которая не заморожена с 2007 года. Четыре части делают это возможным.

64-бит насквозь

Visual FoxPro — 32-битная программа, и это решает больше, чем кажется. Поэтому таблица не может быть больше двух гигабайт, memo-файл — не может быть больше двух гигабайт, и большой отчёт исчерпывает память на машине с кучей свободной. Пределы — это знаковые 32-битные числа, спрятанные в обработке файлов, а не лицензионное решение.

FoxDev Studio — 64-битная насквозь. Каждый смещение файла — 64-битное, таблица вообще никогда не читается в память целиком, поэтому тот же .dbf, который раньше падал, спокойно растёт в сотни гигабайт. Одно, что надо знать перед тем, как на это полагаться: таблица, выросшая больше двух гигабайт, в Visual FoxPro уже не откроется. Если вы ещё работаете в обеих средах, это дверь в один конец.

Виртуальная машина

Компилятор, и машина, построенная на то, чтобы выполнять то, что он делает.

Visual FoxPro компилировала программу в p-code и поставляла рантайм для его выполнения. Здесь то же самое, пересобрано: компилятор и интерпретатор байт-кода, написанные на Rust и скомпилированные в WebAssembly, поэтому одна машина выполняет ваш код везде, где работает приложение. Редактор проверяет набираемый текст через этот же компилятор, поэтому то, что он подчёркивает, и то, что отклоняет рантайм, никогда не разойдутся.

Запущенная программа — это волокно (fiber). Когда ей нужно что-то из внешнего мира (окно сообщения, модальная форма, следующая запись), она не выполняет блокирующий вызов; она уступает управление, работа выполняется пока машина не в стеке, и ответ возвращается обратно. Вот почему MESSAGEBOX() останавливает программу без замораживания окна позади, почему READ EVENTS ждёт без спин-лока, и почему SetFocus может вызвать GotFocus, а Init может запуститься пока форма ещё строится, в том порядке, в котором FoxPro это всегда делала.

Экран

Форма, которую вы видите, — это дерево объектов, а не его снимок.

Работающая форма — это живое дерево объектов со свойствами, которые вы бы ожидали, и интерфейс рисуется прямо из этого дерева через React. Каждый объект смотрит только на себя, поэтому THISFORM.lblGreeting.Caption = cMsg перерисовывает один ярлык, а не всю форму. На плотном экране это разница между мгновенным и вялым.

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

32-битный мост

Файл .fll — это 32-битный образ, и каждый процесс в 64-битном приложении — 64-битный, поэтому ничто внутри приложения не может его открыть. Вместо того, чтобы сказать, что это невозможно, SET LIBRARY TO запускает маленький 32-битный процесс, единственная работа которого — держать вашу библиотеку, и рантайм с ним общается. Вызовы синхронны, потому что программа может вызвать библиотеку посередине выражения, и ответ, пришедший позже, не был бы ответом. Проверено на реальных библиотеках: библиотека шифрования, FoxTools и библиотеки, построенные из собственных примеров API Microsoft.

Ничему 64-битному не нужен мост: DECLARE ... DLL достигает современной библиотеки в том же процессе, и объекты автоматизации достигаются так, как они всегда были. Старая дорога остаётся открытой; просто она больше не единственная.

FoxScript: тот же язык, с большей свободой

Всё, что написано раньше, по-прежнему означает то же самое. FoxScript только добавляет сверху: блок, который можно передать чему-то другому для выполнения позже, и способ ответить на веб-запрос из кода, который уже знает вашу логику.

&& ваши старые библиотеки расширений загружаются так же, как раньше
SET LIBRARY TO "vfpencryption71.fll" ADDITIVE

LOCAL oServer
oServer = FoxScript.Http.CreateServer()

oServer.Get("/api/v1/customers/:id", LAMBDA(req, res)
    LOCAL lnId
    lnId = VAL(req.Params("id"))

    SELECT * FROM customer WHERE cust_id = lnId INTO CURSOR c_cust

    IF RECCOUNT("c_cust") > 0
        res.Status(200).Json(FoxScript.Data.CursorToJson("c_cust"))
    ELSE
        res.Status(404).Json('{"error": "Not found"}')
    ENDIF

    USE IN c_cust
ENDLAMBDA)

oServer.Listen(8080)
READ EVENTS

Каждая строка этого выполняется на том же рантайме, на котором работают формы. Запросы, курсор и вызов библиотеки — обычный FoxPro; лямбда и сервер — то, что добавляет FoxScript: нет второго языка, нет сервиса, стоящего рядом.

Загрузка

Ночная сборка пересобирается после каждого push в main и публикуется как pre-release на GitHub. Не подписана, поэтому при первом запуске попросит подтверждение.

Windows
Инсталлятор (.exe) и рантайм (.zip), x64.
Скачать
Ubuntu и другие Linux
AppImage и .deb, x64.
Скачать
Исходный код на GitHub
FoxDevCommunity/FoxDevStudio: IDE, VM, этот сайт и каждый релиз.
Посмотреть

Документация

Каждая часть продукта документирована, включая те, которых ещё нет.

  • Обзор — что такое FoxDev Studio и где описана каждая часть.
  • Начало работы — установите IDE, откройте проект, запустите форму, выпустите исполняемый файл.
  • Необходимые инструменты — что нужно, чтобы запустить IDE, и что нужно, чтобы собрать её из источника.
  • Виртуальная машина — волокна, запросы хоста и почему VM никогда не блокируется.
  • Байт-код — формат модуля, как компилируется программа и что находится в фрейме.
  • Справочник инструкций — каждая инструкция с её операндами и эффектом стека, сгенерирована из источника VM.
  • Новые ключевые слова — LAMBDA, ENDLAMBDA, пространство имён FoxScript и два новых типа значений.
  • HTTP API — FoxScript.Http, его сторона Node и почему он сделан именно так.

Что готовится

Работа, уже нанесённая на карту, примерно в том порядке, в котором она строится.

  • Последние части языка — короткий список открытых углов, каждый проверяется в сравнении с оригиналом по мере закрытия.
  • Отчёты — дизайнер отчётов и механизм отчётов, полоса за полосой, измеренный так же, как остальное.
  • Таблицы больше двух гигабайт как собственный формат — 64-битные смещения уже есть; контейнер, честный об ограничениях заголовка DBF, приходит дальше.
  • Инсталлятор для того, что вы доставляете — ваше приложение в руках людей, которые его используют, как одно целое, которое они могут запустить, без необходимости что-то настраивать.