r23 - 25 Sep 2006 - 18:16:48 - Anton OrlovYou are here: TWiki >  Refaldevel Web > JavaBackend

Java backend

JAR-архив rfpc.jar включает в себя компилятор из Refal+ (самосконвертированный в Java), а также набор class-файлов, необходимых для работы рефал-программ, сконвертированных в Java.

Запуск компилятора производится командой

java -jar rfpc.jar [опции]

Список опций выводится командой

java -jar rfpc.jar -h

Для компиляции и запуска рефал-программ, сконвертированных в Java, необходимо добавить rfpc.jar в CLASSPATH.

Пример: компиляция и запуск =hello.rf

Для того чтобы запустить Рефал+-программу hello.rf, находящуюся в поддиректории samples корневой директории проекта, необходимо проделать следующее действия (находясь в директории samples; считаем, что rfpc.jar помещён в корневую директорию проекта; все пути указаны, как принято в Unix):

  1. Компилируем hello.rf в Java:
       java -jar ../rfpc.jar -j -B ../library/include/refal-plus hello.rf
       
    Должен появиться файл hello.java.
  2. Компилируем Java-программу hello.java:
       javac -classpath ../rfpc.jar hello.java
       
    Должен появиться файл hello.class
  3. Запускаем программу:
       java -classpath ../rfpc.jar:. hello
       
    На экране должно быть напечатано: Hello!

Получение Java-версии компилятора Рефала+ из исходников

  1. О том как получить исходные коды системы, рассказано на странице RefalOnCVS.
  2. Необходима работающая версия компилятора Рефала+.
    Если действовать согласно инструкциям по установке системы, то такая версия будет находится в директории refal/bootstrap/compiler.
    Либо можно использовать rfpc.jar, как описано выше.
  3. Дальнейшие действия производятся из директории refal/compiler. Все пути указаны, как принято в Unix.
  4. Компилируем рефал-исходники компилятора в Java:
       ../bootstrap/compiler/rfpc -j -B ../library/include/refal-plus/ *.rf
       
  5. Компилируем полученные java-файлы:
       javac -classpath ../java *.java
       
  6. Должны получиться готовые к работе class-файлы. Основной класс: rfpc. Проверяем:
       java -classpath ../java:. rfpc
       
    Компилятор должен вывести список своих опций.

Ниже идут _устаревшие, не соответствующие действительности, отрывочные комментарии по устройству Java-рантайма.

Классы

  • DONE Еxpr.java -- описывает входные данные в языке РЕФАЛ+
  • DONE HELP StdIO? .java -- класс ввода/вывода
  • DONE Arithm.java -- целочисленная арифметика, работающая с длинными числами
  • DONE Box.java -- описывает тип Ящик в языке РЕФАЛ+
  • DONE Convert.java -- содержит методы которые преобразуют типа данных (char, int, ...)
  • DONE String.java -- описывает тип Строка в языке РЕФАЛ+
  • DONE Table.java -- описывает тип Таблица в языке РЕФАЛ+
  • DONE Vector.java -- описывает тип Вектор в языке РЕФАЛ+
  • DONE Error.java -- класс для обработки исключений
  • DONE Dos.java -- содержит статические методы: Time, Exit, Arg
  • DONE Compare.java -- описывает библиотеку Compare языка РЕФАЛ+
  • DONE Apply.java -- описывает библиотеку Apply языка REFAL+
  • DONE Access.java -- описывает библиотеку Access языка REFAL+
  • DONE Class.java -- описывает библиотеку Class языка REFAL+
  • DONE Channel.java -- описывает библиотеку Channel языка REFAL+

Методы классов переделаны в соответствии формата: $func Fname Fin Fout; То есть функции получают в качестве аргумента входные данные и выходные.

Особенности имплементации runtime'a

Класс Expr.java

Каждое выражение представлено ввиде массива Объектов и двух целочисленных индексов, указывающих на начало и длину выражения.
   private Object[] expr;

   private int index;

   private int length;
   

В классе Expr находится внутренний класс Split Iterator? который реализует итерации в java-приложении. Пример:

   Expr.SplitIterator iter = expr.SplitIterator();
   iter.lsplit (expr, 0, leftSplit, rightSplit);
   for ( ; ; iter.next ())
    {
    _continue1: 
    {
      if (!iter.hasNext ())
      {
        break _block1_branch1;
      }
      ...
   }
   

Внутри класса вся работа ведется с объектами типа Term (см. ниже). Это позволяет без изменения Expr добавлять новые объекты в библиотеку. При этом новый объект должен наследоваться от интерфейса Term.

Интерфейс Term

Все объекты в java-runtime-е наследуются от интерфейса Term. Интерфейс Term имеет общие методы для всех объектов, такие как:
  • term_eq
  • eq
  • ...

Примеры (samples)

На данный момент работают все примеры в каталогах:
  • refal/samples/Arithm
  • refal/samples/Convert
  • refal/samples/String
  • refal/samples/Vector
  • refal/samples/Table
  • refal/samples/Box
  • refal/samples/Dos
  • refal/samples/Compare
  • refal/samples/Apply
  • refal/samples/Access
  • refal/samples/Class
  • refal/samples/Dir

А также примеры select*.rf

Backend Select.rf Select1.rf Select2.rf Select3.rf
Java 8.21s 7.41s 6.94s 8.86s
C++ 2.39s 2.22s 1.42s 5.32s

-- Alex Nesterov - 01 Sep 2004

-- Alex Nesterov - 10 Mar 2005

-- Alex Nesterov - 27 Mar 2005

Show attachmentsHide attachments
Topic attachments
I Attachment Action Size Dateup Who Comment
zipzip javaBackend.zip manage 61.1 K 27 Mar 2005 - 13:06 Alex Nesterov  
zipzip JavaRuntime.zip manage 60.9 K 12 Sep 2005 - 17:48 Unknown User  
elsejar rfpc.jar manage 375.4 K 18 Jul 2006 - 00:40 OrloV R+-compiler (in Java) and Java RTS for refal programs
zipzip rfpj-bin.win.zip manage 901.7 K 21 Sep 2006 - 21:47 Anton Orlov Native Windows binary for rfpj -- Refal+Java launcher
zipzip rfp.zip manage 408.2 K 25 Sep 2006 - 18:16 Anton Orlov Refal+Java launcher (and compiler, and libraries)
Edit | WYSIWYG | Attach | Printable | Raw View | Backlinks: Web, All Webs | History: r23 < r22 < r21 < r20 < r19 | More topic actions
 
R+

This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback