Ответ Javе и Flash'у [тема для программеров]

Any topics and questions
User avatar
NightRadio
Site Admin
Posts: 3954
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Ответ Javе и Flash'у [тема для программеров]

Post by NightRadio »

Ну не совсем встроен... Корректнее было написать, что WarmCode - это уровни 1,2,3. А уровень 4 уже отдельно реализуется. Идеальным вариантом будет, если и языки высокого уровня (Pixi3) и сам компилятор WarmCode будут реализованы на WarmCode - это в обязательных планах. Таким образом, мы станем полностью независимыми от коммерческого ПО, типа VisualStudio и других компиляторов.
Zuf
Posts: 110
Joined: Fri Dec 21, 2007 7:30 pm
Location: Msc
Contact:

Re: Ответ Javе и Flash'у [тема для программеров]

Post by Zuf »

NightRadio wrote:Идеальным вариантом будет, если и языки высокого уровня (Pixi3) и сам компилятор WarmCode будут реализованы на WarmCode - это в обязательных планах. Таким образом, мы станем полностью независимыми от коммерческого ПО, типа VisualStudio и других компиляторов.
Главное не увлекаться )
А еще интересно сложно ли будет добавить в gcc возможность компиляции в вармкод...
(Чисто теоретически инфораструктура gcc это позволяет и даже поощряет, как на практике - не знаю...)
User avatar
NightRadio
Site Admin
Posts: 3954
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Ответ Javе и Flash'у [тема для программеров]

Post by NightRadio »

Почему бы и не увлечься =) Было бы здорово. Я б и SunVox под WarmCode заточил... Но об этом, конечно, будем говорить уже потом, когда появится хоть какая-то рабочая часть WC.
Заставить компилить из GCC в WC можно. Например, в проекте LLVM (он чем-то похож на WC) нет компилятора Си++, дык там просто юзают C++ из комплекта GCC, а GCC компилит результат в код LLVM.
User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: Ответ Javе и Flash'у [тема для программеров]

Post by Al_Rado »

Грандиозные планы!
Такой многоуровневый подход даёт широкие возможности для кодера. Фактически, выводит Пикси3 в один уровень с С++ по прикладным параметрам.
Ждём!
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!
User avatar
NightRadio
Site Admin
Posts: 3954
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Ответ Javе и Flash'у [тема для программеров]

Post by NightRadio »

Публикую очередной вариант структуры WarmCode.

Code: Select all

Спецификация WarmCode. Версия 0.01

WarmCode - открытая кросс-платформенная библиотека функций для компиляции байт-кода в формате *.wcode в машинный код.
Различные компоненты библиотеки опционально выключаются, если нужно обеспечить приемлемую скорость работы WarmCode на платформах с медленным процессором или недостатком памяти.
WarmCode может выдавать машинный код как в форматах исполнимых файлов для конкретной платформы, так и в бинарном виде (например, для JIT компиляции).
WarmCode допускает включение ассемблерных вставок.
WarmCode для запуска не требует дополнительных библиотек и компиляторов.

Нулевая альфа-версия WarmCode будет экспериментальной и без особых наворотов. В ходе её тестирования будут выявляться ошибки и неудобства, которые предстоит исправить в первой версии. Не исключено, что и сам формат исходных данных (*.wcode) в первой версии поменяется.

[ ***** ]

Формат *.wcode. 
Описание основных конструкция байт-кода.

На текущий момент не решены следующие вопросы: 
  функции с переменным количеством переменных;
  стандартный набор функций;
  линковочный скрипт (как (и где) указывать базовые адреса и секции);
  текстовое представление *.wcode (twcode?);
  формат строк с ассемблерными вставками;
  подключение системных функций при компиляции в EXE-шник.

Именованным символам (переменные, функции, метки) даются уникальные номера (ID).
Таблицы с символами могут быть глобальными или локальными (в рамках одной функции).
Таблицы: базовые типы (g); структурные типы (g); глобальные символы: функции, переменные (g); локальные символы: переменные, метки (l).
Базовые типы:
0 - void
1 - pointer
2 - unsigned int 8
3 - signed int 8
4 - unsigned int 16
5 - signed int 16
6 - unsigned int 32
7 - signed int 32
8 - unsigned int 64
9 - signed int 64
10 - unsigned int 128
11 - signed int 128
12 - floating point 32
13 - floating point 64
14 - floating point 128

[ Типы значений, используемые в выражениях байт-кода ]

BYTE - байт
NUM_VBR8 - число с переменным количеством байт (старший бит говорит о том, что необходимо прочитать очередной байт)
FLAGS - BYTE(флаги)
BASE_TYPE - NUM_VBR8(номер базового типа)
STRUCT_TYPE - NUM_VBR8(структурный тип)
MIXED_TYPE - BYTE(0 - базовый; 1 - структурный) [ BASE_TYPE ] [ STRUCT_TYPE ]
DATA - какие-то данные: размер (NUM_VBR8) + байты
STR - DATA(строка без нулевого символа в конце)
SSA_VAR - переменная в формате SSA: NUM_VBR8(номер переменной; два первых бита: лок./глоб./временная) NUM_VBR8(индекс)
CONST - BASE_TYPE(тип константы) DATA
VAL - FLAGS(константа) [ SSA_VAR ] [ CONST ]

[ Описание инструкций байт-кода ]

Блок кода (с собственным набором локальных переменных, которые не видны за пределами блока).
BLOCK_BEGIN
BLOCK_END

Определение структурного типа.
DEV_TYPE_STRUCT FLAGS(упакованная) NUM_VBR8(кол-во полей) STR(имя) MIXED_TYPE(тип поля) STR(имя поля) ...

Определение переменной.
DEF_VAR MIXED_TYPE(тип переменной) FLAGS(empty,data) STR(имя) [ DATA ]

Определение массива.
DEF_ARRAY MIXED_TYPE(тип элементов массива) FLAGS(empty,data) NUM_VBR8(кол-во элементов) STR(имя) [ DATA ]

Определение функции.
DEF_FUNCTION BASE_TYPE(тип возвращаемого значения) NUM_VBR8(кол-во параметров) FLAGS(var_arg,calling convention) STR(имя) BASE_TYPE(тип параметра) STR(имя параметра) ... BLOCK_BEGIN ... BLOCK_END

Возврат из функции.
RET_VAR SSA_VAR
RET_CONST CONST
RET_VOID

Вызов функции.
CALL_FUNCTION_VOID VAL(указатель на функцию в любом виде) FLAGS(calling convention) NUM_VBR8(кол-во параметров) VAL(параметр) ...
CALL_FUNCTION VAL(указатель на функцию в любом виде) SSA_VAR(переменная для возвращаемого значения) FLAGS(calling convention) NUM_VBR8(кол-во параметров) VAL(параметр) ...

Метки.
LABEL STR(имя)
GOTO NUM_VBR8(номер локального символа с меткой)
SWITCH SSA_VAR(переменная базового типа) NUM_VBR8(номер локального символа с меткой default) NUM_VBR8(кол-во вариантов) DATA(значение) NUM_VBR8(номер локального символа с меткой) ...
IF_TRUE SSA_VAR(переменная базового типа) NUM_VBR8(номер локального символа с меткой)
IF_FALSE SSA_VAR(переменная базового типа) NUM_VBR8(номер локального символа с меткой)

Математика. Аргументы: res, val1, val2. Все три аргумента должны быть с одинаковым типом (базовым).
= SSA_VAR VAL
+ SSA_VAR VAL VAL
- SSA_VAR VAL VAL
* SSA_VAR VAL VAL
/ SSA_VAR VAL VAL
% SSA_VAR VAL VAL
& SSA_VAR VAL VAL
| SSA_VAR VAL VAL
^ SSA_VAR VAL VAL
- SSA_VAR VAL
~ SSA_VAR VAL
== SSA_VAR VAL VAL
> SSA_VAR VAL VAL
>= SSA_VAR VAL VAL
< SSA_VAR VAL VAL
<= SSA_VAR VAL VAL
<< SSA_VAR VAL VAL //Здесь val2 должен иметь тип unsigned int8
>> SSA_VAR VAL VAL //Здесь val2 должен иметь тип unsigned int8

Конвертация базовых типов.
CONVERT_ZERO_EXT SSA_VAR(глобальная или временная) SSA_VAR
CONVERT_SIGN_EXT SSA_VAR(глобальная или временная) SSA_VAR
CONVERT_ZERO_EXT_TEMP SSA_VAR(временная) BASE_TYPE(к какому типу) SSA_VAR
CONVERT_SIGN_EXT_TEMP SSA_VAR(временная) BASE_TYPE(к какому типу) SSA_VAR

Память.
STORE VAL(прямой адрес или переменная с адресом) VAL(сохраняемое значение)
LOAD SSA_VAR(переменная базового типа для результата) VAL(прямой адрес или переменная с адресом)
GET_GLOBAL_PTR SSA_VAR(переменная базового типа для результата) NUM_VBR8(номер символа в глобальной таблице) NUM_VBR8(номер элемента)
GET_LOCAL_PTR SSA_VAR(переменная базового типа для результата) NUM_VBR8(номер символа в локальной таблице) NUM_VBR8(номер элемента)
STACK_ALLOC SSA_VAR(результат) NUM_VBR8(размер в байтах) NUM_VBR8(выравнивание в байтах)

Ассемблерные вставки.
INLINE_ASM STR()

SSA (функция Phi() задает соответствие нескольких переменных (параметров) одной переменной (результату) после операций ветвления).
PHI SSA_VAR(результат) NUM_VBR8(количество переменных-параметров) SSA_VAR(параметр) ...
Это минимум. Начать кодинг надеюсь уже в этом месяце. Планы такие:
1) написание библиотеки warmcode на чистом Си; максимально просто, модульно и с учетом кросс-платформенности;
2) написание Pixilang3 с использованием библиотеки warmcode; опять же, на Си и по тем же правилам;
3) разработка текстового представления байт-кода warmcode и написание компилятора под это дело;
4) при помощи компилятора из пункта (3) реализация компилятора Си на warmcode;
5) компиляция себя собой :) то есть, (4) откомпилит библиотеку warmcode.
Пункты первостепенной важности - 1 и 2. Остальные пункты - на будущее, как дальнейшее развитие warmcode.

Пока в спецификации никак не фигурируют системные и графические функции, т.к. они зависят от конкретного языка высокого уровня (Pixilang, например).

Как видно из описания, в основе warmcode лежит 3-адресный SSA байт-код. При желании его можно интерпретировать, но только для отладки, т.к. скорость будет медленная. Главное его приемущество при компиляции - при грамотной реализации всех методов оптимизации скорость работы должна сравняться с обычными компиляторами Си/Си++ (GCC, Visual Studio).
Zuf
Posts: 110
Joined: Fri Dec 21, 2007 7:30 pm
Location: Msc
Contact:

Re: Ответ Javе и Flash'у [тема для программеров]

Post by Zuf »

Ну что же ;) Хорошо ;)
User avatar
NightRadio
Site Admin
Posts: 3954
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Ответ Javе и Flash'у [тема для программеров]

Post by NightRadio »

Чтобы не возникало вопросов, поясню о состоянии WarmCode на сегодняшний день.
Готова спецификация WarmCode 0.03. По сравнению с 0.01 она более простая и универсальная.
Сейчас нужно следующее:
1) интерпретатор WC байткода для базовых тестов;
2) транслятор из WC байткода в машинный код процессора (минимум, x86);
3) транслятор из текстовых исходников в байткод WC.
Дело за малым - начать кодить :)
Но приоритеты изменились. Сейчас на первом месте интерпретатор Pixilang3, который в той или иной мере будет выполнять функции WarmCode.
А проект WarmCode можно считать замороженным на неопределенный срок.
Post Reply