Технология
Jpho
Jpho

Jpho


Ресурсы:


Вопросы/предложения на почту:   igor.tomassov@tomaslutas.ru  

Что такое Jpho ?

Jpho (Jfo 6) - язык программирования (скрипт, язык-оператор, система программирования)
реализованный на Java.

По-русски называем Джи-фо.

Возможности

  • интерпретация кодов Jpho и разнородных текстов (альтернативная интерпретация)
  • полная интеграция с Java (создание объектов, вызов методов)
  • определение констант, переменных, работа с операторами и их расширение
  • определение и компиляция слов (функций) и их динамическая модификация
  • возможность определения конструкций на любом языке (можно писать на английском, рускком и любом другом !)
  • встроенные менеджеры данных, встроенный Web-сервис
  • краткость, высокая скорость интерпретации
  • ... и многое другое

Самое главное

Стек - параметры приходят из стека, результат выкладывается в стек.

Постфиксная запись (польская) - вначале положите в стек всё, что вам надо, а потом выполните слово (функцию).

Сразу пример:

В обычном языке, (например Java) найдем сумму двух чисел, пишем: int sum = 5 + 8;
(Не забудем, что надо описать класс, создать объект этого класса и выполнить данную функцию, вернув результат куда-то ...)

В Jfo пишем: 5 8 +
Создавать ничего не надо параметры выложены в стек, а слово + возьмет параметры из стека и результат запишет в стек. Подробнее:
5 - на вершину стека выкладывается число 5
8 - на вершину стека выкладывается число 8 (число 5 сместилось с вершины стека (0-позиция) на позицию 1)
+ - берет из стека 2 числа, скдадывает и помещает результат на вершину стека

Пример первой программы (выдать в выходной поток Hello World !)

Java:

class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello World !);
  }
}

PHP:

echo "Hello World !";

Jfo:

$. Hello World !

А если вернуться к суммированию двух чисел, то сложить и выдать в выходной потк в Jfo:

5 8 + .

. (точка, dot) - взять с вершины стека значение, отправить в выходной поток.


В операциях скобки в Jfo не нужны

стандартный язык:

5 * (8 + 10)

Jfo:

8 10 + 5 *

В чем основная идея или основные решаемые задачи Jfo ?

  • Обрабатывать(интерпретировать) любой текст в заданной кодировке (базовая кодировка UTF-8).
  • "Родным" текстом(кодом) для Jfo может служить, например: Jfo-код, HTML, XML, MIF, обычный текст, вообще не имеющий отношения к языкам программирования.
  • Определять слова на любом языке общения. Можно писать на английском, русском, немецком, китайском и т.д. (если вам ближе родной язык).
  • Сократить размер кода. Слова в Jfo короткие, но за ними может скрываться большой функционал.
  • Предоставить возможность строить сложные конструкции/объекты на базовом языке (в данном случае Java), а оперировать этими конструкциями в Jfo.
И последнее. Почему называется Jfo ?
Название Jfo произошло от: JavaForth. При создания языка Jfo использовались идеи языка Forth и уникальные возможности языка Java.

Термины Jfo

Слово - основная синтаксическая единица языка, аналог термина 'функция'.
Входной поток - входной текст для интерпретатора.
Интерпретатор - функциональная единица Jfo для интерпретации слов из входного потока.
Словарь - зона видимости слов, в Jfo предопределены два словаря JFO — базовые слова, USR – словарь загрузки (пользователя).
Режим исполнения - в этом режиме интерпретатор выполняет слова входного потока.
Режим компиляции - в этом режиме интерпретатор компилирует слова входного потока во внутреннее представление.
Рабочий стек(стек) - стек для передачи параметров.
Стек возвратов (историческое название) - вспомогательный стек для упрощения описания кода.
Префикс - символ в начале слова, определяющий интерпретацию данного слова.
Инфикс - символ в середине слова, определяющий интерпретацию данного слова.
Постфикс - символ в конце слова, определяющий интерпретацию данного слова.

История

Прототипом Jfo является язык Forth, придуманный и реализованный Чарльзом Муром еще в начале 70-х годов.
Краткость, простота реализации и мощь языка Forth были взяты на вооружение при создании Jfo.
Forth всегда отличался от других языков - маленькое ядро (чуть более 5 Кб), возможность использования без операционной системы
на разных платформах и возможность "выжать" из него больше, чем на первый взгляд кажется.

Отправной точкой для создания Jfo послужила практическая необходимость.
В 1997-1998 годах, работая над клиент-серверным приложением, базирующемся на RMI протоколе, разработчики столкнулись со стандартной проблемой
- созданием огромного количества быстро изменяющихся отчетов и документов.
Естественно, создать новый отчет/документ на Java можно, но при этом требовалась перекомпиляция самого приложения, а пожелание отдельно взятого клиента, скажем, срочно изменить название колонки отчета, приводило к бесконечным модификациям и перекомпиляциям.
Стало очевидно, что необходим скриптовый язык, интегрированный с Java и оперирующий объектам Java, а также способ описания отчетов/документов.
Игорь Томасов (автор языка) в течении недели сформулировал и реализовал базовую версию Jfo.
Эта версия стало первой и получила обозначение Jfo v. 1.0.

Версия Jfo 1.0 расширялась, и в конечном итоге кроме отчетов/документов на Jfo были переведены и формы ввода данных.

Jfo v. 2.0 была фактически переработкой версии 1.0 и использовалась для тех же целей, плюс в одном из проектов на Jfo 2.0 производилась обработка SMS-сообщений,
приходящих в Web-приложение со стороны сервера мобильного оператора. В первых двух версия Jfo следовал стандартам Forth, лишь добавив интеграцию с Java.

Начиная с версии 3.0 Jfo все больше отклонялся от Forth, при этом, оставляя только принципиальные идеи.
В Jfo v. 3.0 появилась концепция декларации слов-примитивов, освобождения синтаксиса от большого числа предопределенных слов и использования префиксов.
Префиксы в частности должны были решить проблему создания строк. Вот так создавалась строка в Forth и Jfo v. 1.0-2.0:

" Hello world"
- слово " читало входной поток до следующей кавычки и полученную строчку укладывало в стек.
Заметим, что между первой кавычкой и символом H есть пробел, так как именно слово " было обременено функциональностью прочитать строку из входного потока.
Это соответствует языковой концепции Forth, но при этом часто приводит к ошибкам в программировании.
Более естественно написать "Hello world", но Forth в данном случае выдал бы ошибку: "Hello - not found.
Это следует из работы стандартного интерпретатора Forth, который в цикле читает слова из входного потока, отделенные пробелом, и пробует их интерпретировать.
В Jfo 3.0 этого избежали - если слово не найдено, то надо попробовать обработать префикс.
Jfo версии 4.0 был промежуточным результатом и на историю развития языка влияния не оказал.

Jfo версии 5.* был продолжением и расширением предыдущих версий.
Была реализована интеграция с Web-приложениями, работа в разных потоках, работа с базами данных и статистический анализ.
Но было желание еще более укоротить фразы языка, упростить работу с переменными, а также унифицировать конструкции языка.

Поэтому была реализована версия языка 6.0 (Jpho).
Сравнение кода на Jfo 5.* с Jpho (Jfo 6):

Работа с переменными Jfo 5:
var u 10 u ! // создание переменной u и присваивание значения 10
var v 15 v ! // создание переменной v и присваивание значения 15
u @ v @ + // выдать значение u+v

Работа с переменными Jfo 6:
10 u! // создание переменной u и присваивание значения 10
15 v! // создание переменной v и присваивание значения 15
u+v // выдать значение u+v

То есть 36 символов в 5-версии, против 16 символов в 6-версии.

Текущая версия Jfo 6.0 (Jpho, год реализации 2016, на данный момент v. 1.1-b2 build 83). И дальнейшее описание Jfo касается именно этой версии.