forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   создание MIDletPascal compiler'a (http://forum.boolean.name/showthread.php?t=6385)

satan 13.01.2009 05:08

Re: создание MIDletPascal compiler'a
 
Эээээ... А шо за готовый ассемблер???

Вообще щас выкинуть надо из кодогенератора виндовый ассемблер и прикрутить байткод ява асм...

Выкладываю IDE + контролы... (папка res) там же и иконки

abcdef 13.01.2009 09:24

Ответ: создание MIDletPascal compiler'a
 
assembler- файл из моего предыдущего вложения jcc.pas, (JavaClassCompiler) все равно, если реализовывать монолитно, практически весь код нужно будет брать из jcc,
ведь в class-файле главное даже не байтовый код (как в традиционных ассемблерах, а то и вправду было бы проще непосредственно в class-файл писать),
а его связка с константным пулом, и всякие структуры, которые jcc кстати позволяет писать в любом месте, он потом сам расставит все по своим местам

satan 13.01.2009 12:31

Re: создание MIDletPascal compiler'a
 
Мля... ну дыг я к етому и иду... Посмори в линкере... Там уже все твои структуры прописаны...

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

abcdef 13.01.2009 14:43

Ответ: создание MIDletPascal compiler'a
 
не спорю, подпрограмма кодогенерации действительно несколько раздута, но зато она однозначно знает какой тип операнда должен быть в текущий момент

satan 13.01.2009 14:52

Re: создание MIDletPascal compiler'a
 
Дыг какой тип операнда уже выдает парсер, он для етого и существует, фишка вся в том, что если делать по другому то вызовы функций внутри вызовов функций и рекурсивные функции просто умрут (как ты определишь адрес загрузки функции вот тут допустим)

writeLn(abs(chr(MyFunction(n,e, TwoFunction(e,n)+33))));

Serg153 13.01.2009 16:38

Ответ: создание MIDletPascal compiler'a
 
2satan - а где будут использованы такие выражения?
может Ограничить пользователя в построении сложных построений... ;=)
написав ошибку слишком сложное ....
либо ввести промежуточные (добавленные компилятором) перменые для хранения промежуточных результатов?
типа writeLn(abs(chr(MyFunction(n,e, TwoFunction(e,n)+33))));
_ex1 := TwoFunction(e,n) + 33;
_ex2 := MyFunction(n,e, _ex1);
_ex1 := chr(_ex2);
writeln(abs(_ex1));
типа так?

Serg153 13.01.2009 16:43

Ответ: создание MIDletPascal compiler'a
 
Зы - разбиение сложных выражений - на более простые, можно реализовать ещё врелакторе текста - типа на прогоне "препроцессора" -
который вставлял константы, делал подстановку макрокоманд..?
---
например: в тексте проги в отделе определения переменых будет макрокоманда типа
#define Cls; -пробел- setColor(255, 255, 255); fillRect(0, 0, getWidth, getHeight); #endef /выражение на языке паскаля/

при начале компиляции препроцессор заменит Cls на операторы и заодно разобьёт Сложные выражения на простые?

abcdef 13.01.2009 17:57

Ответ: создание MIDletPascal compiler'a
 
satan, да я не про верхний уровень компиляции, я всегда за рекурсию, тем более при сложных взаимосвязях, результаты рекурсии будут единичные вызовы в произвольных местах и на любой итерации, функции запихивающей в массив новую команду, просто для ассемблера будет полезно если будет вестись контроль передаваемых данных. а насчет адреса вызова, то это ведь java, ей нужно только имя переменной/метода она сама работает с
адресами памяти

Serg153 зачем использовать временные переменные? в стеке достаточно места...

Serg153 13.01.2009 18:56

Ответ: создание MIDletPascal compiler'a
 
Цитата:

Сообщение от abcdef (Сообщение 94637)
Serg153 зачем использовать временные переменные? в стеке достаточно места...

---
ну я так понял из постов Satan`a -
>>
...но тут опять грабли, строка вида 1+a+2+b+3+c
Может вырасти в очень длинный код на ассемблере, поэтому её надо оптимизировать, тобишь привести к виду a+b+c +6, что бы уменьшить код конечного файла, что бы не падал компилятор от переполнения...
>>
...вызовы функций внутри вызовов функций и рекурсивные функции просто умрут ...
---
что при компиляции сложных выражений будет переполнение стека Джавамашины... ну в общем мидлет упадёт... :=) - но в принципе я в это нелезу...
пока немного сложновато втыкать в ваш диалог :=)

2satan - ммм... скачал я ide - у мню дельфи 7 - так ругается при открытии формы и компиляции...
типа TActionMainMenuBar - not found...
ToolBar.. properties не определно.. и тд...
может что поправить надо?

satan 13.01.2009 22:00

Re: создание MIDletPascal compiler'a
 
Надо поставить Турбо Делфи (или скачать Borland Delphi 10 Lite) она 30 мб весит

получицо такая вот как в аттаче хренотень как на картинке(в смысле исходники и интерфейс аналогичный...

А так проверить в работе прикладываю в аттаче
Система клавишь как в делфи... тоисть Ctrl+Shift+I увеличить отступ Ctrl+Z откат и т.д....

Подсветка паскаля и ассемблера(настраиваемая...) ну и т.д.

abcdef 15.01.2009 22:00

Ответ: создание MIDletPascal compiler'a
 
Вложений: 1
satan, посмотрел исходники, хорошо изложил!
теперь нужно переводить под синтакис java и отладить, это где-то 30% от все работы...
несколько начальных шагов я предпринял но переделывать еще много, результат в прикрепленном файле (генерирует asm-файл), если интересны готовые решения/идеи глянь в мой файл "compile.pas" - тотже алгоритм, только без поддержки подпрограмм/типов/массивов

Что нужно доделать:
1. окончательно вычистить от кода, отвечающего за работу с памятью
2. дописать разделение команд загрузки/сохранения в переменную на работу с локальными переменными/глобальными/массивами
3. добавить инструкцию define, которая будет связывать методы из внешних классов и их параметры вызова, с внутренним именем в исходном коде, как описывал ранее

в будующем:
добавить типы данных String/StringBuffer/Byte и разделить команды для их обработки
___
p.s. жду изменений...

temned 16.01.2009 19:59

Ответ: создание MIDletPascal compiler'a
 
Парни, я тока скатал pascal на комп, скатал ваши ide, не полушается што-то компилировать. Подскажите што-делать.

abcdef 17.01.2009 00:35

Ответ: создание MIDletPascal compiler'a
 
мои исходники можно компилить в Turbo Pascal 6 и выше. Размеры дистрибутива от 1 до 8 мб (после установки проверить пути к каталогам исходников и tpu библиотекам, и должен существовать каталог для компиленных файлов), также в меню compile отметить destination disc. Также можно откомпилировать в delphi 7 и ниже, для этого достаточно файлов: dcc32.exe; *.cfg; каталоги lib; source. dcc-компилятор командной строки; в файле cfg-пути к каталогам. размеры зависят от кол-ва библиотек, и в пределах 1..50 мб

Serg153 23.01.2009 02:45

Ответ: создание MIDletPascal compiler'a
 
мгммгм... возможно уже спрашивал -)
можно ли сделать из Jar файла - просто жавовское приложение - не для телефона - ЕХЕ файл?
---
если такая возможность есть - то тогда можно присобачить уже готовый жаваасемблер - Жасмин (вроде он фри) только сделать Jar to eхе...
---
модернизировать иде - добавить ДВФ файлы - в которых возможно описать Паскальслово - от него Java строки - от них Jasm строчки - от них Байт_код.... а также всяческие хелп строки...
тогда легко можно будет модернезировать язык - Иде не меняется - только изменются разные справочные базы...

abcdef 23.01.2009 13:21

Ответ: создание MIDletPascal compiler'a
 
нецелесообразно переделывать код генерации под процессор x86, хотя не сложно модифицировать команды asm-листинга. Лучше использовать компилятор выложенный satan'ом, только добавить набор стандартных функций. если не охота возиться с компилятором можно написать набор МР-библиотек: хоть для Turbo Pascal, хоть для Delphi -делал так когда-то но заглушками, для проверки синтаксиса программы

satan 27.01.2009 01:21

Re: создание MIDletPascal compiler'a
 
Прива все!!!
abcdef
Дружище... Посмотрел твою модификацию.... Ээээээ... Ты зачем внутренний стек меняешь то? Не надо... Этот стек сформирован для внутренней нашей виртуальной машины...

То есть функция GenOp просто добавляет в массив Code[] команды и параметры для них. Приблизительно после разбора проги получается примерно следущее в стеке

39 10 28 61 28 77 41 3

переводим на полурусский
OPJmp 10 -> Перепрыгнуть через 10 команд
OPLdC 61 -> Загрузить Сhar(букву) A - код 61
OPLdC 77 -> Загрузить Char(букву) F - код 77
OPCall 3 -> Вызвать подпрограмму с номером 3 в IdentTab

Вот внутренний ассемблер и делает перевод в опкод i386 а нам надо просто перевести в опкод Java...

Поэтому стек не надо переделывать, он уже готов...

Нам надо перекроить всего 2 функции
1. AssembleAndLink (Она перекраивает наш стековый байт код в машинный код)
2. В линкере сформировать константный пул из IdentTab
Ну и в конце концов связать пул и код....

satan 27.01.2009 03:29

Re: создание MIDletPascal compiler'a
 
Кстати кто волокет в грамматиках могу подкинуть компилятор компиляторов (исходники) и транслятор Java->Pascal
Транслятор правдо доделывать надо, а вот компилер компилеров работает на ура, создает сразу готовый проект компилятора для Delphi

temned 27.01.2009 21:22

Ответ: создание MIDletPascal compiler'a
 
Да Кинь плиз!

Serg153 22.02.2009 13:59

Ответ: создание MIDletPascal compiler'a
 
вернусь к IDE, как к одному из ключевых моментов компилятора...
неудалось мне использовать ide от satan - ненашёл полный набор для сунедита...
---
вобщем начал писать на Д7 - редактор - будет Rich текст
с подсветкой синтаксиса и предварительной трансляции в Паскаль-подобный язык...
на этапе парсера возникла небольшая проблема с индетификацией ещё необьявленных переменных,функций, процедур...
например есть текст
var
a1,a2,a3 : integer;
c1 : command;
---
может немножко поменяем Синтаксис Языка?
например так
Var
Integer : a1,a2,a3;
Command : c1;
???
---
тогда и в параметрах функций писать func name( string : s1,s2;integer : byte a1); ???
надоели begin end - может заменить на { } - а многострочные комменты оформлять в виде /* comment */ ???
тем более редактор автоматом будет оформлять {} [] ()
---
определиться бы с ТИПАМИ переменных
у нас их будет примерно:
· boolean
· char
· integer
· real
· string
· image
· command
· recordStore
· http
· resource
Комплексные типы:
· record
· array

если JAVA поддерживает байтовые - то можно добавить тип byte ?
---
как вариант назвать компилятор MidletPScript - так как язык немного изменится...
---
редактор на выходе будет выдавать - тут несколько вариантов:
- текст на java
- текст на j ассемблере
- или на каком нибудь подобии языка...
отдельным ЕХЕ сделать уже чисто компилятор исходника в CLASS
и запускать его из Редактора... тогда можно будет использовать редактор для разных языков...
---
попробую реализовать транслятор из Редактора в Java ассемблер (нашёл компилятор Жасмин) - вернее сперва в Java, затем в Жасмин...
---
редатор на этапе набора текста будет осуществлять синтаксическую проверку, использовать "коде темплате", вывод в хелп окошко - файл помощи по конкретонму оператору, также при присоеденению к проекту файла рсиунка - обработает его с помощью pngout.exe - для сжатия картинки....
---
скоро выложу текст иде для тестирования...

Serg153 25.02.2009 12:58

Ответ: создание MIDletPascal compiler'a
 
Вложений: 1
вот примерно так выглядит эта Иде... :=)

в Зипе - как бы рабочая папка компилятора
---
пока всё недоделано.. чиста на Предварительный вид
---
доделаю - хелпокно на каждый оператор + коде джампер + синтаксичесуий анализатор кода и выложу исходники - пользую D7

pamalofeev 21.05.2009 07:29

Ответ: создание MIDletPascal compiler'a
 
Проект совсем умер? Понимаю, что оффтоп, но уж больно долго тема молчит. Не забили ли разработчики на это дело из-за недостатка внимания к проекту со стороны пользователей? Было бы обидно.

abcdef 21.05.2009 11:22

Ответ: создание MIDletPascal compiler'a
 
не внимание нужно, а помощь... (это ведь не развлечение игрушки писать, а еще проектировать и тестировать надо долго...)

наверное ждем пока другие сделают?...

Teadon 21.05.2009 20:22

Ответ: создание MIDletPascal compiler'a
 
Всем привет. Я могу помочь ;)... Сам сейчас это всё обдумываю. Где-то через 3-4 месяца смогу представить рабочую версию проекта. Всё зависит от времени. Настроен на разработку высокоуровневой проффесиональной среды программирования. =)

Richik 21.05.2009 23:45

Ответ: создание MIDletPascal compiler'a
 
Многие будут за ;)

Да и еще, встройте пошаговый отладчик пожалуйста, ну если это в принципе представляется возможным.

В MIDletPascal очень сложно следить за корректностью работы мидлета, приходиться постоянно что-то выводить на экран, да и еще чтоб все "увиделось", нужно что-то включать и переключать по несколько раз.

ViNT 22.05.2009 00:04

Ответ: создание MIDletPascal compiler'a
 
Чтобы иметь пошаговый отладчик, нужно эмулятор JVM писать.

Richik 22.05.2009 19:34

Ответ: создание MIDletPascal compiler'a
 
Цитата:

Сообщение от ViNT (Сообщение 105533)
Чтобы иметь пошаговый отладчик, нужно эмулятор JVM писать.

о том и говорю ;)

abcdef 24.05.2009 13:18

Ответ: создание MIDletPascal compiler'a
 
про эмулятор здесь уже говорил, его сделать в принципе не сложно. Но чтоб проги запускались надо написать еще несколько сотен библиотек... врятли кто-нибудь здесь возьмется за это, или я ошибаюсь?

p.s. можно просто сделать режим компиляции с отладкой, когда в генерируемый код автоматически будет вставляться строка исходного кода, которая будет выводиться на консоль при выполнении на любом эмуляторе

Teadon 27.05.2009 22:45

Ответ: создание MIDletPascal compiler'a
 
Насчёт эмулятора, буду думать когда всё сделаю остальное. Делать или неделать его. abcdef - хороший вариант откладки

satan 27.05.2009 23:27

Re: создание MIDletPascal compiler'a
 
Прива всем... Я тоже не забил на проект, переписал IDE и начал разбираться с Java ASM скорее всего и проще для меня наверное будет сделать Java Assembler а потом просто транслятор с Pascal в JASM, простой ассемблер уже зашивал в IDE так что кому нужен инструмент для компиляторов с рабочим ассемблером и примерами пишите.

Сосо/r не заморачивался поиском, кому надо найдет в сети, просто щас пару проектов больших, сцуко отнимают все время...

Serg153 29.05.2009 07:58

Ответ: создание MIDletPascal compiler'a
 
Hi All...
в прошлом году тоже начал писать Иде - на дельфях
заделал редактор - с подсветкой кода - Хелпом по каждому оператору - и тд...
но потом в аварию попал ... 5 месяцев провалялся - в общем пока восстановится несмог...
===
по Компилятору :
может сделать примерно такую схему
MidPascal
( с вставками на JavaAsm(типа Жасмин) оформлять в коде Asm: EndAsm;
и вставками на Jave (Jav: EndJav;
==>>
трансляция на JAva ==>> на Jasmin == Мидлет

и в ИДЕ предусмотреть обратную конвертацию
Мидлет ==> Jasmin ==> Java ==> MidPas
---
гдето я видел ЕХЕ компилятора Jasmin в Class
(компиляторы и трансляторы можно сделать в виде отдельных прог - которые вызываются из Иде - тогда можно распределить задачи здесь на форуме - кто то возьмётся за трансляторы, кто за компиляторы а кто и дизасемблер....
===
я немного подздоровею и вплотную впрягусь в какиенибудь подзадачи...

Serg153 29.05.2009 08:22

Ответ: создание MIDletPascal compiler'a
 
Вложений: 1
примерный вид Иде...
подшаманю немного и выложу исходники....

abcdef 08.06.2009 16:44

Ответ: создание MIDletPascal compiler'a
 
какой-то faq по java, со списком компиляторов
http://xoomer.virgilio.it/csadun/javafaq.html

-------содержание текста-------
GCJ - http://gcc.gnu.org/Java/
The GNU Compiler for the Java Programming Language, compiles Java source or
bytecode to native machine code. Most APIs are supported, except the AWT,
Swing and RMI. Open Source! Lo si puт usare anche sotto Windows con CygWin
http://sources.redhat.com/cygwin/, ma и ancora lontano dall'essere finito.

JCC - http://www.geocities.com/CapeCanaver.../4040/jcc.html
A Java to C converter - A direct Java to C translator. Unlike other translators
JCC does not convert Java class files, but instead processes Java source code
directly. Completamente free!

JET Deployment Environment - http://www.excelsior-usa.com/jet.html
built around an optimizing Java to native code compiler for Windows.
The compiler produces conventional EXE and DLL files that do not use JVM
during execution from Excelsior. A pagamento.

Jolt - http://www.meurrens.org/ip-Links/Jav...Down/jolt.html
Hackers-only prototype of a Java bytecode to C translator written in Java.

Toba - http://www.cs.arizona.edu/sumatra/toba
Java-to-C Translator: translates Java class files into C source code to allow
making, fast, directly executable programs that avoid the overhead of
interpretation. For stand-alone applications, not applets.

IBM Jikes - http://oss.software.ibm.com/develope...nsource/jikes/
JikesTM is a compiler that translates Java source files as defined in The Java
Language Specification into the bytecoded instruction set and binary format
defined in The Java Virtual Machine Specification.

Harissa - http://www.irisa.fr/compose/harissa/
Harissa is a Java environment that includes a compiler from Java bytecode to C
and a Java interpreter. While Harissa is aimed at applications that are
statically configured, such as the Javac compiler, it is also designed to allow
code to be dynamically loaded in an already compiled application.

Jasmin - http://mrl.nyu.edu/~meyer/jvm/
Jasmin is a Java Assembler Interface. It takes ASCII descriptions for Java
classes, written in a simple assembler-like syntax and using the Java Virtual
Machine instruction set. It converts them into binary Java class files suitable
for loading into a JVM implementation.

JToExe - http://www.bravozulu.com/Products/JToExe/jtoexe.html
Lo riporto solo per "completezza"... il dominio и significativo:"bravo zulщ"...
a chi? A chi lo usa! ;)

BeanShell - http://www.beanshell.org/
BeanShell is a small, free, embeddable, Java source interpreter with object
scripting language features, written in Java. BeanShell executes standard
Java statements and expressions, in addition to obvious scripting commands
and syntax. BeanShell supports scripted objects as simple method closures
like those in Perl and JavaScript(tm).

JFlex - http://www.jflex.de/
JFlex is a lexical analyzer generator (also known as scanner generator)
for Java(tm), written in Java(tm). It is also a rewrite of the very useful
tool JLex which was developed by Elliot Berk at Princeton University.

JLex - http://www.cs.princeton.edu/~appel/modern/Java/JLex/
JLex is a lexical analyzer generator, written for Java, in Java.
JLex was developed by Elliot Berk at Princeton University. It is now
maintained by C. Scott Ananian.

Jad - http://www.geocities.com/SiliconVall.../8617/jad.html
Jad - the fast Java Decompiler. Jad is a Java decompiler, i.e. program that
reads one or more Java class files and converts them into Java source files
which can be compiled again. Jad is a 100% pure C++ program and it generally
works several times faster than decompilers written in Java.

JODE - http://jode.sourceforge.net/
JODE (Java Optimize and Decompile Environment) is a Java package containing
a decompiler and an optimizer for Java. This package is freely available under
the GPL.

Delphi2Java - http://www.javadelphi.com/
Creates Java source code from Delphi's Pascal code. Commerciale :(

See also:
http://dmoz.org/Computers/Programmin...s/Translators/
Java Code Engineering & Reverse Engineering -
http://www.meurrens.org/ip-Links/Java/codeEngineering/

abcdef 15.06.2009 10:36

Ответ: создание MIDletPascal compiler'a
 
исходники на delphi простейшего редактора с подсветкой синтаксиса
http://sources.codenet.ru/download/3...Highlight.html

p.s. что-то без предложений/исходников по компилятору, пропадает интерес продолжать проект...

ViNT 18.06.2009 00:34

Ответ: создание MIDletPascal compiler'a
 
Вычистил флуд.
Кто бот, кто не бот - разбирайтесь в "Болтовне".

satan 18.06.2009 01:04

Re: создание MIDletPascal compiler'a
 
Вложений: 1
abcdef а какие тебе исходники надо?
Ну вот держи подсветку чуть покруче чем в примере...

А вообще у меня куча исходников на любой вкус...

Serg153 19.06.2009 06:39

Всем привет...
---
прижде чем выкладывать ide ? хотелосьбы обсудить несколько вопросов по будущему языку...
---
I. - структура каталогов самого Компилятора
1 - MPascal(условное название каталога Компилятора)
2 - Help(каталог со всякими справочными материалами по языку)
3 - Libs(каталог с готовыми библиотеками Class файлов + Txt файлы с такимже именем - описание либы(будет выводиться в инспекторе библиотек)
4 - Units (каталог с библиотеками на исходном языке(мпаскале) + Тхт описание
5 - Source (каталог содержащий всякие разные подкаталоги напр музыку, картинки и тд... то что будет чаще всего использоваться в Проекте)
5.1 - Image - каталог Png, Ico? Bmp? Jpg?
5.2 - Sound - каталог Wav Midi Mp3
5.3 - OtherSrc - ?
6 - Projects(каталог пользовательских проектов)
7 - MPIni??? - (настроечные / вспомогательные файлы компилятора (например дополнительные ЕХЕ - транслято

2 satan - посмотри в исходниках - может есть пример редактора на Tmemo со структурой?

ничего непонимаю :-) - текст в мессагах почемуто обрезается... по дцать раз редактировал - а он опять пропадает.... попробую ещё разик...
----
---
I. - структура каталогов самого Компилятора
1 - MPascal(условное название каталога Компилятора)
2 - Help(каталог со всякими справочными материалами по языку)
3 - Libs(каталог с готовыми библиотеками Class файлов + Txt файлы с такимже именем - описание либы(будет выводиться в инспекторе библиотек)
4 - Units (каталог с библиотеками на исходном языке(мпаскале) + Тхт описание
5 - Source (каталог содержащий всякие разные подкаталоги напр музыку, картинки и тд... то что будет чаще всего использоваться в Проекте)
5.1 - Image - каталог Png, Ico? Bmp? Jpg?
5.2 - Sound - каталог Wav Midi Mp3
5.3 - OtherSrc - ?
6 - Projects(каталог пользовательских проектов)
7 - MPIni??? - (настроечные / вспомогательные файлы компилятора (например дополнительные ЕХЕ - трансляторы, компиляторы, декомпиляторы, линковщики, архиваторы, редакторы рисунков...)
8 -
9 ??? что нибудь добавить?
=======
II. - каталог Проекта с пользовательской программой
в нём файл проекта - обычный ИНИ(с секциями и разделами - описывающие фалы проекта , какиенибудь настройки...
1 - ImgIn - файлы рисунков используемых в проекте (разных форматов)
2 - ImgOut - теже фалы рисунков - но обработынных утилитой pngout.exe - для формирования "сжатых" PNG файлов? кажется утилита бесплатная и будет поставлятся юзверям языка в комплекте ??
3 - SrcSound - разные музыкальные файлы проекта
4 - SrcMpas - редактируемы исходники на языке
5 - OutJava - оттранслированные Исходники в промежуточный язык компилятора Java???
6 - OutJAsm - оттранслированные Java в ЖаваАссемблер?
7 - Classes - полученные готовые класс файлы из Ассемблера???
8 - Bin - готовые для вставки в телефон Jar Jad
===
теперь по языку III. некоторые изменения синтаксиса Мпаскаля-ля-ля-ля... :-)
1 - многострочные комментарии - мля... удобнее набирать с клавы, как мне кажется, символы /* и */???
2 - begin end - может заменим эту комбинацию на фигурные скобки? {}
3 - изменить описание переменных и функций... мля... для синаксического анализатора и коде жампера - былобы полегче использовать конструкцию типа: Описание : Индетефикатор(ы) чем NAme:type
секция Var
int: Name1, name2 = 10;
double: name3 = 3.14592;
string: function fName(string:param1,param2);
???

III. вопросы по языку...
5. секция UseLibs - использование готового class из каталога Libs компилятора, типа так: описание(имя либы и описание используемых в ней процедур/функций?
UseLibs Lib_advui: // Библиотека для управления огоньками и вибратором.
int: function set_lights (int: num, level);
/*-----------------------------------------------------------------------
Включить/выключить огоньки с номером num.
level - яркость данного огонька (0-100).
Пример:
a:=set_lights(0, 0) выключает экран.
Возвращает: 0 - ф-ция сработала нормально
-1 - неверный аргумент (нет огонька с номером num или
превышен интервал level)
*/

int: function flash_lights (int: dur);
/*-----------------------------------------------------------------------
Аналог flashBacklight...
dur - время мигания экрана в миллисекундах
Возвращает: 0 - ф-ция сработала нормально
-1 - неверный аргумент (время < 0)
*/

int: function startVibra (int: freq, dur );
/*-----------------------------------------------------------------------
Запустить вибратор на время dur в миллисекундах.
freq - частота вибрации (0-100)
Возвращает: 0 - ф-ция сработала нормально
-1 - ошибка аргумента (время < 0 или превышен интервал
частоты)
-2 - телефон не поддерживает вибрацию
*/

procedure stopVibra;
/*-----------------------------------------------------------------------
Останавливает вибратор, например если он был запущен с помощью
startVibra и время вибрации ещё не кончилось.
*/
EndLibs;
=======

хотя текст и большой - но в редакторе его можно будет "схлопнуть" в в одну строчку:
[+] UseLibs Lib_advui: // Библиотека для управления огоньками и вибратором. [...]
и этот текст будет автоматически? скопирован из файла описания ТХТ либы, в редактор, менеджером проекта...
а комментарии будут показаны в окне пооператорного Хелпа - если встретится в тексте процедура из библиотеки..???

III. о языке -
6. сделать структуру CASE такого типа:

Код:

DoCase
  Case (условие):
    операторы;
  Case (условие):
    операторы;
  Case (условие):
    операторы;
  Other:
    операторы;
EndCase;

???
---
7 - ещё про типы данных хотел поспрашивать... какие они будут в дополнение к "стандартным".. будут ли байтовые?

8. - из уже существующих библиотек для мидлет паскаля - отлаженных и проверенных - внести Их в новый компилятор....

abcdef 19.06.2009 11:42

Ответ: создание MIDletPascal compiler'a
 
не садился за проект с момента выкладывания последних исходников.
пока есть доступ к сети смотрю инфу и программы.
________
сейчас два варианта создания компилятора:
1. либо взять Pascal-s и в подпрограмме вывода листинга преобразовать текст к формату java-text-asm, а в код pascal-s добавить вывод ошибки при генерации вложенных подпрограмм и передаче в параметрах ссылки на переменную, т.е. "procedure p(VAR i : integer; j : integer);". т.к. java-спецификация не поддерживает таких конструкций в силу того что переменные метода локализованы.

2. либо написать с нуля упростив конструкцию (принципиально убрать из алгоритма возможность генерации всего лишнего), недавно принялся писать с чистого листа, поглядывая в pascal-s, сделал единую таблицу для всего (имен,идентефикаторов,типов и т.д.) скорость компиляции немного упадет, но появится однообразие структуры.... написал около 600 строк, вижу что не получается настолько эффективно как в pascal-s... подумываю чтобы вернуться к первому вариатну.
________
но важнее разобраться вот в чем:
как поступить с типом "record": как в mp - делать класс с набором переменных или разбить отдельные элементы и пусть хранится как отдельные переменные. тогда появляется вопрос: как организовать передачу записи в параметре функции, копировать поэлементно в стек потом извлекать?

также заминка на типе String для простоты можно будет сделать как в mp - отдельный метод с набором функций

если использовать float и double - необходимо перепроектировать блок арифметических операций для разделения целочисленных команд и с плавающей точкой.
________
немного об ассемблере: до сих пор не добавил верификатор, т.е. автоматическую генерацию структуры StackMap (исходники то есть, но не знаю где почитать полную информацию по этому процессу) - это очень нужно завершить.

из попадавшихся исходников java-ассемблеров более простых, чем сделал, не находил
________
про все остальное: в самых первых сообщениях говорил что надо сделать компилятор в class-файлы, упаковщики, ide - это уже другой разговор

Serg153 - если заменить код программы "begin ... end" на "{ ... }" и т.д. то получится java-исходник. для этого можно просто собрать программку на строк 200 (здесь подобное уже выкладывал), которая будет менять ТОКЕНЫ, и это компилировать в чистой java, но думаю интереса к такого рода переходникам ни у кого не возникнет.
______
общая дока по компиляторам, (без конкретных исходников)
http://ag-kastens.upb.de/wir/taiko/diss/CLDCSpec.pdf
http://www.europrog.ru/paper/obe_java2.pdf
http://delphi.od.ua/article/a-33.html

satan 20.06.2009 04:37

Re: создание MIDletPascal compiler'a
 
Цитата:

пример редактора на Tmemo со структурой
Ээээ а по подробнее, это что за зверь?

ЗЫ...

Мля... и поставте наконец Turbo Delphi или FreePascal нафик, иначе в будущем не разгребешь...

Serg153 22.06.2009 23:02

Ответ: создание MIDletPascal compiler'a
 
2abcdef - по компилятору....
начни всётаки с компилятора JavaAsmbler to Class
ведь по идее - какойбы небыл язык в ИДЕ, он оттранслируется в жаваасм
а также в Проекте появится возможность :
- имеем jar проги - нажали кнопочку - бац... произошло дизасемблирование...(несколькоуровневое) -
из Class - появится JavAsm - который по возможности, преобразуется в MPascal - со вставками недиз. в кодах Asm.... EndAsm
===
2satan - имеется в виду пример(исходник редактора) основанный на стандартных компонентах delphi из TMemo или TRichEdit - с гуттером (полоска с номерами строк и [+] [-] развёрток структур
---
а скоко весит TDelphi ? где можно скачать? (я оттого спрашиваю - потому что, юзаю инет, через жопорез... а там многого нескачать... :-(

Serg153 23.06.2009 01:40

Ответ: создание MIDletPascal compiler'a
 
чтобы например AsemblerJavaByte (AJB) понимал и делалл Class из такого файла...
Код:

; в заголовке указываем имя основного класса (например, Hello)
 ; Объявляем класс Hello наследуемый от MIDlet
.class public Hello
.super javax/microedition/midlet/MIDlet

 ; объявляем поля:
 ; Display display - менеджер дисплея
.field display Ljavax/microedition/lcdui/Display;
 ; Form form - форма отображаемая на экране
.field form Ljavax/microedition/lcdui/Form;

 ; конструктор класса
.method public <init>()V
  .limit stack 1
  .limit locals 1
  aload_0             
  invokespecial javax/microedition/midlet/MIDlet/<init>()V
  return               
.end method             

 ; точка входа в программу - метод startApp
.method public startApp()V
  .limit stack 4
  .limit locals 1
 ; display = Display.getDisplay(this) - получаем ссылку на менеджер дисплея
  aload_0             
  aload_0             
  invokestatic javax/microedition/lcdui/Display/getDisplay(Ljavax/microedition/midlet/MIDlet;)Ljavax/microedition/lcdui/Display;
  putfield Hello/display Ljavax/microedition/lcdui/Display;
 ; form = new Form("Hello") - создаем новую форму
  aload_0             
  new javax/microedition/lcdui/Form
  dup                 
  ldc "Hello"
  invokespecial javax/microedition/lcdui/Form/<init>(Ljava/lang/String;)V
  putfield Hello/form Ljavax/microedition/lcdui/Form;
 ; form.append("Hello, World!") - добавляем в форму текст "Hello, World!"
  aload_0             
  getfield Hello/form Ljavax/microedition/lcdui/Form;
  ldc "Hello, World!"
  invokevirtual javax/microedition/lcdui/Form/append(Ljava/lang/String;)I
  pop
 ; display.setCurrent(form) - выводим форму на экран                 
  aload_0             
  getfield Hello/display Ljavax/microedition/lcdui/Display;
  aload_0             
  getfield Hello/form Ljavax/microedition/lcdui/Form;
  invokevirtual javax/microedition/lcdui/Display/setCurrent(Ljavax/microedition/lcdui/Displayable;)V
 ; возвращаемся из метода
  return               
.end method             

 ; метод pauseApp
.method public pauseApp()V
  .limit stack 0
  .limit locals 1
  return               
.end method             

 ; метод destroyApp
.method  public destroyApp(Z)V
  .limit stack 0
  .limit locals 2
  return               
.end method


satan 23.06.2009 04:12

Re: создание MIDletPascal compiler'a
 
Я выше закидывал пример, но вот ссылка на компонент
http://www.silicontaiga.ru/home.asp?artId=5131

А TDelphi - около 30 метров (Китайский урез, называется Delphi 10 lite)... Но она из простой делфи, у меня к ней
пристройка есть что бы все было чин-чинарем - типа Turbo...

Serg153 23.06.2009 20:15

Ответ: создание MIDletPascal compiler'a
 
2Satan - спасибо за ссылку... поковыряю оттуда реализацию гуттера...
(щас проблемка в алгоритме свёртывания блоков текста)
---
а вообщето только от реализации Ассемблера/дизасемблера class файлов(в отдельных от IDE модулях(ехе)) - зависит какой язык(синтаксис) получится...
ведь если асм есть - то можно будет сделать "легко" и мидлетбейсик и паскаль и си и вообще свой скриптоязык... ведь там будет просто транслятор Язык--> в Аsм -
---
2abcdef - кажется ты уже сделал именно ассемблерный компилятор(asm-->class)?
будь ласка, опиши спецификацию реализованного, я тогда к Иде прикручу транслятор и будем пробовать уже чтото писать... :-)

Serg153 23.06.2009 23:10

Ответ: создание MIDletPascal compiler'a
 
---
да и ассемблер должен быть более "дружественным"...
например в текущем асме числа загружаются в стек такими командами
числа от -1 до 5: iconst_m1, iconst_0, iconst_1, iconst_2, iconst_3, iconst_4, iconst_5.
Числа от 6 до 127: bipush 6, bipush 44, bipush 127.
Числа от 128 до 32767: sipush 128, sipush 255, sipush 1000, sipush 4096, sipush 32767.
Числа от 32768 до (2^31)-1: ldc 32768, ldc 16777215, ldc 1000000000.
Числа от 2^31 до (2^63)-1: ldc2 1000000000000
---
так пускай асм возмёт на себя проверки диапазонов и вставку нужного байт кода - а юзер пусть пишет типа iPush 25235(любые числа) или dPush 3.14592

satan 24.06.2009 03:39

Re: создание MIDletPascal compiler'a
 
Да хренотенью вы страдаете :)
abcdef уже давно выложил структуры class файла, их заполнить парсером три секунды, тут их штуки три или четыре...

Я говорю наверно раз в 10, что весь гиморой начнётся с качественным парсингом математических выражений, тоесть самый начальный нижний уровень, а ассемблер java писать, тока руки марать, вот пример асма java на коленях (типа теория)

type operator = (op1,op2,op3.........op50,op51);
var NameOp = ('iconst_0', 'iconst_1', 'iconst_2'......'ldc')

.... -> типа сканер уже написан
PHP код:

ReadToken // Читаем слово
If Token=op1 then addCodeList(ord(Token)); // Добавляем код в листинг кода сразу опкод по позиции 
case Token of
  op1
..op9f=1;// Сдесь по диапазону задаем флаг кол-ва операндов для опкода
  
op10..op30f=2;
  
op31..op50f=3;
end;
i:=0;
repeat
readToken
// читаем операнд
case Token of
_int
:; // проверяем токен на корректность
_float:;
_string:;
....
else
  
error// Ошибка если не корректный
end
inc
(i);
if 
i>f then error;// ошибка если кол-во операндов больше
ReadToken// читаем след. слово(по идее ',')
until Token=','// Крутим код пока токен - ',' 

Типа все... Строку разобрали и запихнули в листинг...
Я не пойму что тут сложного?

Serg153 24.06.2009 04:36

Ответ: создание MIDletPascal compiler'a
 
>>>что весь гиморой начнётся с качественным парсингом математических выражений,
---
приведи примеры таких выражений... я гдето видел на дельфях парсер(ехпрессион) математических выражений... я поковыряю его насчёт алгоритмов...
я просто в примерах и библиотеках MidletPascala невстречал очень уж сложных выражений... так, в одной строке (+-)*/ 3-4-5 операндов....

satan 24.06.2009 06:44

Re: создание MIDletPascal compiler'a
 
Ну например

x:=((12+(y/z-33.456)+d[a+b-c]*56) mod 5 = 44.5);

К стати когда пишешь типовые компиляторы потом глубоко осознаешь почему вот этот код

for i:=0 to 100 do writeln(chr(i));

коренным образом отличается от
S:=''
for i:=0 to 100 do S:=S+chr(i)+#13#10;
WriteLn(S);

impersonalis 24.06.2009 12:25

Ответ: создание MIDletPascal compiler'a
 
может, пригодится:
http://algolist.manual.ru/syntax/index.php

Serg153 25.06.2009 03:02

Ответ: создание MIDletPascal compiler'a
 
2satan - вот твой оператор - x:=((12+(y/z-33.456)+d[a+b-c]*56) mod 5 = 44.5);
а что ты от него хотел оптимизировать? - покажи результат?.
---
а так ещё в редакторе текста он выдаст Error о несоответсвии типов операндов подкрасив в красный цвет слово mod - оператор остатка Целочисленного деления(для операндов типа Integer...
опятьже - изменив оператор деления на / x:=((12+(y/z-33.456)+d[a+b-c]*56) /5 = 44.5);
получим логическое выражение.. true или false
т.е транслятор схавает такое выражение и передаст ассемблеру на формирование байт кода
[1oe преобразование текста - Язык в Java]
Код:

   
    public static int x;
    public static int a;
    public static int b;
    public static int c;
    public static int d[];
    public static int y;
    public static int z;
        F.D(y, z) - F.fI(33, 45600);
        F.fI(12);
        JVM INSTR swap ;
        JVM INSTR iadd ;
        F.M(d[(a + b) - c - 1], F.fI(56));
        JVM INSTR iadd ;
        F.fI(5);
        F.D();
        F.fI(44, 50000);
        JVM INSTR icmpeq 147;
          goto _L1 _L2
_L1:
        break MISSING_BLOCK_LABEL_143;
_L2:
        break MISSING_BLOCK_LABEL_147;
        x = 0;
        break MISSING_BLOCK_LABEL_151;
        x = -1;

[2oe преобразование текста будет - Java -> Asm ]
...
типа так будет....

satan 25.06.2009 09:18

Re: создание MIDletPascal compiler'a
 
Вот... наконец то мы подошли к главному...

А теперь, что бы мысль не скакала впереди носа, попробуй ПРОГРАМНО определить ошибку в любом выражении... Так, для прикола набросай функцию (эдакий маленький синтаксический анализатор) на корректность...

Просто кнопочку и Edit в котором будем вводить выражения... :) а лучше что бы он еще и считал все что ему на данном этапе можно просчитать...
Не надо спешить и формировать как это БУДЕТ выглядеть в компиляторе, тут до этого куча работы... :)))

А вот уже после этого компилятор написать, что к подруге сходить...

ЗЫ к стати public static int d[]; может быть совсем не int или сначала будет int а потом real (приведение типа) а z сначала может быть одним, а в самый неподходящий момент(например выше по коду) вдруг оказаться нулём, и компилер упадет от переполнения...

Самое интересное начнется в выражениях такого плана

x:= d[d[a]*a] или d[d[c-a[d[c]]]] если диапазон не верный...

Вобщем тут куча примерчиков, которая очень хорошо понимается когда кодируешь а не когда рассказываешь...

Serg153 25.06.2009 17:07

Ответ: создание MIDletPascal compiler'a
 
навскидку...
во первых - чтобы анализировать выражения - нужно знать Типы операндов
- далее разбиваем выражения на "лексемы" -
минимальные выражения ^+-*/ ,(+добавляем Вес к выражению
в виде табл (операнд|тип || Операнд Тип || операция+-* || вес || признак законченности разложения
(щас я не знаю конкретную реализацию асм - куда промежутоные результаты вносить, в стек или промеж переменные - генерируемые транслятором -
---
именно редактор текста(IDE) , совместно с транслятором на АСМ(Java) -
будут подготавливать текст уже для Компилятора
===
например x:=((12+(y/z-33.456)+d[a+b-c]*56) /5 = 44.5);
табличка будет формироваться в несколько интераций
1-
(это относится к компилятору - продолжу попозже...
а вот насчёт анализатора выражений...
...приведу пример из дельфи, выражение которое мы хотим парсировать:
Код:

(23.34 + 21.21) * 2.92 - 12.21 * sin (180) * -1
Вот пример синтаксического анализатора выражений, наследника TParser, который может разобрать вышеуказанное выражение. Он использует следующие определения для выражений:

Код:

      Expr  ::= Term + Expr | Term - Expr | Term
      Term  ::= Factor * Term | Factor / Term | Factor
      Factor ::= + Item | - Item | Item
      Item  ::= ( Expr ) | Fn( Expr ) | Number
      Fn    ::= Sin | Cos
      Number ::= floating point literal number (плавающая точка литерала числа)

Далее идет модуль и форма, показывающие как это можно использовать. Вы должны скопировать текст формы в окно редактора Delphi и сохранить как DFM-файл. Мои расчеты вашего выражения привели к результату 130.086 - это правильно?
Примечание: TParser имеет ошибку в подпрограмме парсирования плавающего числа. Любое сочетание символов с символами '+' или '-' воспринимается как часть плавающего числа, поскольку 1e+3 корректное выражение. Естественно, это должно быть правильным только в совокупности с символом 'e'. Поэтому вы должны убедиться, что перед символами '+' и '-' имеется хотя бы один пробел, как показано в вашем выражении. Вы можете это исправить (если у вас есть исходный код VCL), редактируя функцию TParser.NextToken.

Скопируйте поочередно три приведенных ниже файла и вставьте их в окно редактора Delphi. Самый простой способ - закройте все открытые проекты и создайте новый модуль. Выделите весь текст, сгенерированный Delphi и вставьте текст модуля ExpParse. Сохраните его под именем ExpParse.pas. Затем создайте другой модуль, перенесите в него EvalForm.pas и также сохраните. Снова закройте файл и создайте новый модуль. Вставьте в него EvalForm.dfm и сохраните, выбрав меню "Save as" и отметив в списке тип файла DFM. Затем создайте новый проект, удалите форму, созданную по умолчанию и добавьте файл EvalForm.pas.

-----------------------ExpParse.pas----------------------------
Код:

   
unit ExpParse;
interface
uses Classes ;
{ Набор парсируемых элементов определяется как подмножество выражений Delphi Object Pascal, подобно этому:

Expr  ::= Term + Expr | Term - Expr | Term
Term  ::= Factor * Term | Factor / Term | Factor
Factor ::= + Item | - Item | Item
Item  ::= ( Expr ) | Fn( Expr ) | Number
Fn    ::= Sin | Cos | другое...
Number ::= floating point literal number (плавающая точка литерала числа)
}

type
TExpressionParser = class( TParser )
protected
 function  SkipToken( Value : char ) : boolean ;
 function  EvalItem : double ; virtual ;
 function  EvalFactor : double ; virtual ;
 function  EvalTerm : double ; virtual ;
public
 function  EvalExpr : double ;
end ;

implementation

uses SysUtils ;

function  TExpressionParser.SkipToken( Value : char ) : boolean ;
begin
{ возвращаем истину, если текущий признак Value,
и если так, то получаем следующий признак }
Result := Token = Value ;
if Result then NextToken ;
end ;

function  TExpressionParser.EvalItem : double ;
var
Expr : double ;
Fn  : integer ;
begin
case Token of
toInteger : Result := TokenInt ;
toFloat  : Result := TokenFloat ;
'(' : begin
NextToken ;
Result := EvalExpr ;
CheckToken( ')' ) ;
end ;
toSymbol : begin
if CompareText( TokenString, 'SIN' ) = 0 then Fn := 1 else
if CompareText( TokenString, 'COS' ) = 0 then Fn := 2 else
Raise EParserError.CreateFmt( 'Неизвестный элемент "%s"', [ TokenString ]
) ;
NextToken ;
CheckToken( '(' ) ;
NextToken ;
Expr := EvalExpr ;
CheckToken( ')' ) ;
case Fn of
1 : Result := SIN( Expr ) ;
2 : Result := COS( Expr ) ;
end ;
end ;
else
Raise EParserError.CreateFmt( 'Неожидаемый символ "%s"', [ Token ] ) ;
end ;
NextToken ;
end ;

function  TExpressionParser.EvalFactor : double ;
begin
case Token of
'+' : begin
NextToken ;
Result := EvalItem ;
end ;
'-' : begin
NextToken ;
Result := -EvalItem ;
end ;
else Result := EvalItem ;
end ;
end ;

function  TExpressionParser.EvalTerm : double ;
var
AToken : char ;
begin
Result := EvalFactor;
if SkipToken( '*' ) then Result := Result * EvalTerm else
if SkipToken( '/' ) then Result := Result / EvalTerm ;
end ;

function  TExpressionParser.EvalExpr : double ;
begin
Result := EvalTerm ;
if SkipToken( '+' ) then Result := Result + EvalExpr else
if SkipToken( '-' ) then Result := Result - EvalExpr ;
end ;
end.

--------------------------EvalForm.pas---------------------------

Код:

unit EvalForm;

interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ExpParse;
type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
private { Private declarations }
public { Public declarations }
end;

var Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var s : string ;
MemStream : TMemoryStream ;
ExpressionParser : TExpressionParser ;
begin { get the string to evaluate }
s := Edit1.Text ;
{ создаем поток для работы с памятью, содержащий текст -
TParser может разбирать выражения из потока}
MemStream := TMemoryStream.Create ;
try
MemStream.SetSize( Length( s ) ) ;
MemStream.WriteBuffer( s[ 1 ], Length( s ) ) ;
MemStream.Position := 0 ;
{ создаем анализатор выражения, используя поток }
ExpressionParser := TExpressionParser.Create( MemStream ) ;
try
Label2.Caption := Format( 'Результат=%g', [ ExpressionParser.EvalExpr ]) ;
finally
ExpressionParser.Free ;
end ;
finally
MemStream.Free ;
end ;
end;
end.

-------------------------EvalForm.dfm-----------------------------
Код:

   
object Form1: TForm1
Left = 216
Top = 102
Width = 433
Height = 300
Caption = 'Form1'
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'System'
Font.Style = []
PixelsPerInch = 96
TextHeight = 16
object Label1: TLabel
Left = 8
Top = 8
Width = 74
Height = 16
Caption = 'Выражение'
end
object Label2: TLabel
Left = 120
Top = 72
Width = 297
Height = 16
AutoSize = False
Caption = 'Результат='
end
object Edit1: TEdit
Left = 8
Top = 27
Width = 409
Height = 24
TabOrder = 0
Text = '(23.34 + 21.21) * 2.92 - 12.21 * sin (180) * -1'
end
object Button1: TButton
Left = 8
Top = 64
Width = 89
Height = 33
Caption = 'Оценка'
Default = True
TabOrder = 1
OnClick = Button1Click
end
end


Serg153 25.06.2009 18:59

Ответ: создание MIDletPascal compiler'a
 
PS -
а z сначала может быть одним, а в самый неподходящий момент(например выше по коду) вдруг оказаться нулём, и компилер упадет от переполнения...
----
диапзаон - почему именно компилятор должен упасть - если диапазон неверный? - ведь он просто транслирует комманды введёные пользователем в машинный код...
(тут 2 варианта - 1-добавить в математическую библиотеку
выражения типа
try
{
}
catch(Exception exception) { }
для обработки массивов - да и почему компилятор должен

2 - на стадии ввода текста (при синт анализе выводить при "сложных"
выражениях сообщения о Оптимизации кода - пускай юзер преобразует
код в более лёгкое для понимания выражение
-----------
стати public static int d[]; может быть совсем не int или сначала будет int а потом real (приведение типа)
---
в мобильнике нет реал - это будет в библиотеке.. try { } и туда вставить
---
Самое интересное начнется в выражениях такого плана
x:= d[d[a]*a] или d[d[c-a[d[c]]]] если диапазон не верный...
---
неее - ты приведи пример где Реально требуются такие выражения - что это за изврат???
ну и всё одно транслятор сгенерирует примерно такой код
;x:= d[d[a]*a];
varK1 = d[a]
varK2 = varK1 * a
x = d[varK2]
или
;x:= d[d[c-a[d[c]]]] - надеюсь а[ это отдельный массив?
varK1 = d[с]
varK2 = a[varK1]
varK3 = c - varK2
varK4 = d[varK3]
x := d[varK4]
---
тут конечно можно пооптимизировать насёт повторного использования
переменных сгенерированных компилятором(varKn)...
но это уже поле для дальнейшего "улучшения" реального транслятора...
==========
ЗЫ - под транслятором я понимаю промежуточную програмку(модуль ЕХЕ) - который преобразует введёный пользователем тест на Языке(мПамкаль) - в код понятный Именно компилятору (псевдо ассемблер - или.. если у нас пользуется Мидлет - то типа к JASMin коду)
а уже Компилятор сгенерирует обьектынй код (Class) - для использования в мобиле...
---
а засовавать ВСЁ в одно.. это точно Извращение...
какая мне разница(юзеру) - сколько прогонов будет сделано для получения из Текста - готовый JAr Jad файлы?
3..4... 5 секунд или 10? если я пользую это на своём двухядерном E6600 к примеру...

Serg153 25.06.2009 19:39

Ответ: создание MIDletPascal compiler'a
 
2Satan - поясни пжлста что ты подразумеваешь под "оптимизациями" с примерами....
----
- неотимизированное Выражения на Языке(паскаль)
- оптимизированное выражение на Языке
- неотимизированный код на псевдо ассемблере
- оптимизированный код на псевдо ассемблере
------
покажи примеры - какой "выйгрышь" даст оптимизация - в чём она будет заключаться....
=====
да... по проекту Нового Мидлет Паскаля... нужно всётаки составить ТЗ на весь комплекс (IDE, компиляторы, трансляторы, дизасемблеры редакторы рисунков, редакторы файлов помощи, сами фалы помощи, доп файлы... хз что ещё добавить...:-) )
а также составить список ToDo
---------------
подробное| кто | исполнение
задание | взялся | zip исходников
---------------------------------------
1
2
3....

satan 26.06.2009 00:43

Re: создание MIDletPascal compiler'a
 
varK1 = d[с]
varK2 = a[varK1]
varK3 = c - varK2
varK4 = d[varK3]
x := d[varK4]

То есть дополнительные переменные???
Ужос... Для одной строки 4 переменных, а если у меня 1 рекурсия на 35635 итераций?

получим 35635*4 переменных (более того их не как не оптимизишь - ибо рекурсия подразумевает обработку своего же кода), в итоге транслятор 35635 раз сгенерирует один и тот же код... Пример:

function a(i: integer): integer;
begin
while i<1000 do begin
i:=a(i)+1;
end;
Result:=i;
end;

Код условный и без смысла....

Ну да не в этом суть, в принципе легче в таких случаях (использование внешнего компилятора) вообще взять JOB и транслировать Pascal->Modula

Cмысл (я так считаю) сделать продукт выше по возможностям MidletPascal иначе овчинка свеч не стоит...

Serg153 26.06.2009 04:01

Ответ: создание MIDletPascal compiler'a
 
да небедет таких проблем...
твой код
Код:

function fa(i: integer): integer;
begin
  while i<1000 do begin
    i := fa(i) + 1;
  end;
  fa:=i;
end;

----
будет преобразован в промежуточный java код
----
Код:

   
public static int fa(int i)
    {
        int varK1 = 0;
        for(; (byte)(i < 1000 ? -1 : 0) != 0; i = fa(i) + 1);
        varK1 = i;
        return j;
    }

и никакой генерации этого кода в 1000 повторениях....
затем он преобразуется в код JavaAsm для окончательной компиляции
---
Код:

.method                  public static fa(I)I
  .limit stack          2
  .limit locals        2
  .var 0 is            i I from LABEL0x0 to LABEL0x20
  .var 1 is            varK1  I from LABEL0x2 to LABEL0x20
  .line                15
LABEL0x0:
  iconst_0             
  istore_1             
  .line                16
LABEL0x2:
  iload_0             
  sipush                1000
  if_icmplt            LABEL0xd
  iconst_0             
  goto                  LABEL0xe
LABEL0xd:
  iconst_m1           
LABEL0xe:
  i2b                 
  ifeq                  LABEL0x1c
  iload_0             
  invokestatic          proj1/fa(I)I
  iconst_1             
  iadd                 
  istore_0             
  goto                  LABEL0x2
  .line                17
LABEL0x1c:
  iload_0             
  istore_1             
  .line                18
  iload_1             
  ireturn             
LABEL0x20:
.end method


Serg153 26.06.2009 04:20

Ответ: создание MIDletPascal compiler'a
 
Цитата:

Код условный и без смысла....
вот именно - Ключевое слово безсмысленный... :-)
ведь я просил привести пример Реально нужный - нужный для проверки оптимизации кода....
ведь такая многоуровневая рекурсия очень редка - и она
может быть преобразована в обычный цикл - возможно транслятором - a возможно Ручками и мозгами Программиста....
---
а лучшее ... Сперва бы повторить Мидлет Паскаль - С открытым кодом -
чтобы все желающие смогли поучавствовать кто чем сможет в расширении и улучшении его... моё ИМХО... :-)

satan 26.06.2009 15:12

Re: создание MIDletPascal compiler'a
 
Вложений: 1
Блин - вот фраза

Цитата:

будет преобразован в промежуточный java код
Может я не так думаю, но по моему смысл предприятия в том что бы вот этот код

function fa(i: integer): integer;
begin
while i<1000 do begin
i := fa(i) + 1;
end;
fa:=i;
end;
сразу переводить в этот

Код:

.method                  public static fa(I)I
  .limit stack          2
  .limit locals        2
  .var 0 is            i I from LABEL0x0 to LABEL0x20
  .var 1 is            varK1  I from LABEL0x2 to LABEL0x20
  .line                15
LABEL0x0:
  iconst_0             
  istore_1             
  .line                16
...................................

Вот я именно про эти грабли и рассказываю, когда по концепции ПАСКАЛЬ компиляторов (нисходящая рекурсия+один проход) получаем сразу байт код, без использования промежуточных машин, кодов, батников и т.д.

Короче как я понял без примера тут не обойтись... Постораюсь накидать пример Expr который СРАЗУ переводит в JavaAsm...

ЗЫ...

Добавил пример

demon112 26.06.2009 17:48

Ответ: создание MIDletPascal compiler'a
 
Можно такой нескромный вопрос? Что вы собираетесь делать вообще?)

Serg153 26.06.2009 19:17

Ответ: создание MIDletPascal compiler'a
 
>>Постораюсь накидать пример Expr который СРАЗУ переводит в JavaAsm...
---
вот.вот... при таком подходе мы загоняем себя в рамки... а как расширять?...
тут то - при промежуточных трансляциях - можно будет добавлять
библиотеки написанные на Java, + вставки кода на Асме прямо в коде текста...
а также - можно будет реализовать разные Мидлет языки программирования(при соответствующих трансляторах этих языков в Java или в Асм) - а уже готовый Компилятор(один из нескольких модулей ЕХЕ, нашего IDE) - будет формировать Class файлы из Асма...
(вроде так было задумано на страницах этого топика...)
===
>>Можно такой нескромный вопрос? Что вы собираетесь делать вообще?)
из за того что официальный MidletPascal накрылся медным тазом...
даже исходников неоставили...
а вообше то почитай первые посты.... :-)

satan 26.06.2009 21:07

Re: создание MIDletPascal compiler'a
 
Код:

вот.вот... при таком подходе мы загоняем себя в рамки... а как расширять?...
Не понял?

Библиотеки можно писать на самом же паскале
Если писать на Java то abcdef сделал прекрасный дизасм для такого дела, более того, если и компилятор и дизасм объеденить для работы с одними (а только так и получица) структурами то и формирование пула будет автоматом происходить...

Если делать вставки типа asm end; то ассемблер пишется 15-20 минут, я уже к дизасму функцию прикручивал где по опкоду формируется мнемоника, она обратима, то есть по мнемонике можно сформировать опкод

Единственная проблема в двух компиляторах (PascalS и BeroTP) это функция Expr,
которая рекурсивно-спускаема, а Java - имеет стековую машину, для которой идеально подходит алго Декстры(ОПЗ)...

Я так и думал, что сдесь как раз и занимаются доработкой уже готового а не чего то нового...

Вообще по данным этих топиков компилятор можно написать за день, причем хороший...

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

Но могу просто дать совет по преобразованию BeroTyniPascal в JavaPascal без лишних замутов... Там же сложного ничего нет, поменять всего 2-3 функции...

Serg153 27.06.2009 00:13

Ответ: создание MIDletPascal compiler'a
 
>>Но могу просто дать совет по преобразованию BeroTyniPascal в JavaPascal без лишних замутов...
---
угу.. подскажи...
===
>>Там же сложного ничего нет, поменять всего 2-3 функции...
мдааа.. глянул я на исходник... мля... (по крайней мере у меня весь такой текст и без пробелов....
---
Код:

PROCEDURE I2(VAR T:INTEGER);
VAR I,J,SZ,FT:INTEGER;
BEGIN
IF G3=44 THEN U5;
IF G3=0 THEN BEGIN I:=U9;
IF G16[i].I3<>3 THEN U2(133);
T:=G16[i].I2; U5;
END ELSE BEGIN IF G15=MTC THEN U2(134);
G15:=G15+1;T:=G15;
IF G3=42 THEN BEGIN U5; U6(6); FQ(T);
END ELSE BEGIN U7(45);
IF G11=MLC THEN U2(135);
G11:=G11+1;G13[G11]:=0;U6(0);SZ:=0;
REPEAT
U8(G4,2,0); I:=G14; U5;
WHILE G3=17 DO BEGIN
U5; U6(0); U8(G4,2,0); U5;
END;
J:=G14; U7(8); I2(FT);
REPEAT
G16[i].I2:=FT; G16[i].I8:=SZ; SZ:=SZ+G17[FT].T0; I:=I+1;
UNTIL I>J;
IF G3=18 THEN BEGIN
U5;
END ELSE BEGIN U6(22);
END;
UNTIL G3<>0;
G17[T].T0:=SZ; G17[T].I3:=2; G17[T].T4:=G13[G11]; G11:=G11-1; U7(22);
END;
END;
END;

===
[quote]Но... объясняю ситуаци%u

satan 27.06.2009 02:35

Re: создание MIDletPascal compiler'a
 
Вложений: 1
А форум надо повнимательнее читать... Я же потом выкинул нормальные исходники...

:-D:-D:-D

ОК выкладываю ишо раз, подальше от топиков смешанных...

Serg153 29.06.2009 18:35

Ответ: создание MIDletPascal compiler'a
 
вопросы по оптимизации...
---
подскажите как лучше организовать трансляцию из Паскаля в Javу(ассемблер)
---
может обьеденить ВСЁ приложение в один Class файл - за исключением сторонних библиотек(class)
а то ведь как происходит? -
нужна мне математическая функция к примеру Синус (из библиотеки)
так сотовый телефон в архиве Jar найдёт такой файл(библиотеку)
проинициализирует переменные, константый пул установит, свяжется со всякими Import... выполнит Init класса.. и тд. итп..
а так - всю матем библиотеку(исходник на Жаве или Асме) транслятор
присобачит к основному файлу, создаст таблицу перекрёстных ссылок
и все неиспользуемы переменные и функции удалит из текста....
может так?
а также :
- сделать развёртку циклов?(как?)
- (прикинуть примерно выходной файл в Кб.. если меньше например 50...100 кб размер файла Class) то сделать автоматическую развёртку Функций в текст откуда произошёл вызов - за исключение рекурсивных функций.... (из рефер таблицы брать самые часто?( редко) используемые функции)
ведь мне кажется важна оптимизация по Скорости...
--------------

abcdef 16.07.2009 11:56

Ответ: создание MIDletPascal compiler'a
 
Проще и правильней спроектировать, всегда сложнее чем реализовать.
Поэтому давайте глянем как все сделано в MidletPascal:
Код:

type
  _record_ = record
    x,y : integer;
  end;

var
  _real_        : real;
  _integer_    : integer;
  _char_        : char;
  _boolean_    : boolean;
  _string_      : string;
  _http_        : http;
  _resource_    : resource;
  _recordstore_ : recordstore;
  _command_    : command;
  _image_      : image;
begin
  _boolean_:=false;
  _boolean_:=true;
  _boolean_:=(3<>4);
  delay(1);
end.

получаем на java:
Код:

  public static int _real_;
  public static int _integer_;
  public static int _char_;
  public static int _boolean_;
  public static String _string_;
  public static H _http_;
  public static InputStream _resource_;
  public static RecordStore _recordstore_;
  public static Command _command_;
  public static Image _image_;

т.е. фактически все вычисления и обработка данных ведется в Integer (real, integer, char, boolean)
__
Тип String стоит особняком, т.к. есть только инструкция для передачи/получения из стека, а если нужна обработка, то она производится в спец.классе, компилятор только загружает пераметры в стек и вызывает метод, и больше не имеет к этому ни какого отношения
__
http - как в случае и с типом String: вся работа в отдельном классе, на MP операции устанавливаются ссылки на методы H.class.
__
InputStream, RecordStore - указатели как и в обычной java
__
command и image - как и в обычной java
__
ну и последнее, пользовательские типы:
Код:

public class R_1 {
public int x;
public int y;
public R_1() {
  x = 0;
  y = 0;
}
public R_1 Copy(R_1 r_1) {
  x = r_1.x;
  y = r_1.y;
  return this;
}
}

для нашего тип сгенерировался класс, с инициализацией элементов типа и оперицией копирования типа в тип.

====
Вот и все. Поправьте меня, если что-то упустил или написал не так...

abcdef 16.07.2009 13:50

Ответ: создание MIDletPascal compiler'a
 
немножко вернемся назад к java-assembler'у на Turbo Pascal.
О верификации и создании структуры stackmap (или stackmaptable).
__________
Повторюсь (писал об этом ранее): в WTK имеется утилита "preverify1.1.exe", и файлы "cldcapi11.jar", "midpapi20.jar". Чтобы легко провести верификацию надо сделать запускной bat-файл и скопировать эти 4-е файла в отдельный каталог, а также создать в нем два подкаталога "class" и "tmp". Для верификации поместить "сырые" class-файлы в подкаталог "tmp" и после запуска bat-файла в подкаталоге "class" появятся проверенные классы с добавленной структурой "stackmap".
Вот пример bat-файла для этого случая:
Код:

preverify1.1 -nofp -nofinalize -nonative -classpath midpapi20.jar;cldcapi11.jar; -d "class" "tmp"
pause

Также имеется openSource java-верификатор "proguard" его можно поскать на http://sourceforge.net/ и о нем писал pilgrim в Canterbury Pascal for J2ME http://forum.boolean.name/showthread.php?t=6028
Но т.к. текущая разработка без использования java, т.о. его можно посмотреть для ознакомления.
__________

Теперь о собственной реализации и вставке структуры "stackmap"
Более близкое что удалось найти в сети представлено здесь:
Код:

http://asm.ow2.org/asm223/javadoc/user/org/objectweb/asm/attrs/StackMapTableAttribute.html
http://www.cs.karelia.ru/alumni/2003mag/hyppenen.ppt
http://sun.tpu.ru/teachingmaterials/download;jsessionid=b7d7cc41754158548d66f8f93900d?path=java/Safonov_Java_Seminar_new/7_JVM_CLASS.pdf

Остальное добыто компиляцией и дизассемблированием c помощью JD.exe (Java Disassembler, TurboPascal) типовых примеров, итак:

Структура "stackmap" содержит список локальных переменных и состояние стека в точках куда передается управление через goto/if_icmpne и т.д. Причем запоминается состояние виртуальной машины на операторе перехода, и записывается в участок "stackmap" со смещением где находится метка, т.о. мы указываем виртуальной машине еще до запуска, что будет в стеке или таблице локальных переменных, если в конкретное место будет переход.

Примечание: т.к. в Pascal'е переменные в подпрограммах создаются в начале, а уничтожаются при выходе, то эта часть "stackmap" будет неизменной, а меняться будет только вторая часть "состояние стека".
--
Теперь необходимо разобраться с формированием "stackmap", если в одну точку переходит несколько операторов
Код:

(*)  - Общая точка
repeat
repeat
...
until
...
until

и собрать свой алгоритм

____
p.s. нашел ссылку с очень похожей реализацией java-assembler'а и java-disassembler'а (TurboPascal), на языке java:
https://svn.forge.objectweb.org/cgi-...objectweb/asm/


Часовой пояс GMT +4, время: 12:39.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot