Пятница, 08 Ноября 2024, 06:51

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 3 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Aphalin Compiler
XakepДата: Вторник, 11 Марта 2014, 19:39 | Сообщение # 41
めちゃくちゃちゃ
Сейчас нет на сайте
Цитата shubniggurath
Зачем? все равно никто кроме автора использовать не будет )

поживем увидим ))

Добавлено (23.01.2014, 22:16)
---------------------------------------------
Полностью переработал синтаксис языка: убрал ключевые слова procedure, function, constructor, destructor, заменил на одно ключевое слово def, переменные можно объявлять где угодно, а не в блоке var, так же убрал это ключевое слово, убрал присваивание := и заменил на =, +=, -=, --, ++ ... Нескольок примеров кода:


так же в будущем планирую написать хороший макропроцессор, пример макроса для развертки циклов:


Добавлено (11.03.2014, 19:39)
---------------------------------------------
почти доделал первую версию языка программирования ) через неделю-две выложу тестовую версию компилятор, надеюсь найдутся тестеры )


Сообщение отредактировал Xakep - Среда, 12 Марта 2014, 09:22
AkyltistДата: Вторник, 11 Марта 2014, 21:42 | Сообщение # 42
заслуженный участник
Сейчас нет на сайте
Хорошая работа, но хотелось бы воткнуть свои 5 копеек.

1
Код
if (val == 0) then return "0"; end;

наличие end; на конце без begin не тру!

либо if then else endif
либо if then begin end else begin end;

в данном случае не понятно зачем он ибо излишен.
Код
if (val == 0) then return "0";

после then не было открытия блока (begin) значит до первой ;
Хотя мысль ясна в принципе, но массивные куски кода будут тяжело читаться, так как разные ключевые слова для начала блоков: then и do, но жить можно!
2
Код
for j : int = 0, 3 do

учитывая? что типизация языка таки строгая, в цикле for всегда будет int
так понимаю, что обратный цикл будет downto ?
при подставновке функций с параметрами в тело условия цикла, будет возникать много запятых
Код
for j : int = 0, pos(str1, 0, 17, str2) do

предложил бы доработать до нечто подобного
Код
for (j=0; 3; ++) do
for (j=7; 1; --) do

в общем читабельность и простота

PS: уже хорошая чистка проведена.
PS: какие файлы на выходе по размеру.

PPS: LLVM тоже вышли на Google Summer of Code 2014
XakepДата: Вторник, 11 Марта 2014, 21:48 | Сообщение # 43
めちゃくちゃちゃ
Сейчас нет на сайте
по синтаксису опирался в основном на lua и ruby, такой вот получился, для обратного цикла нужно указать шаг -1:
Код
for i : int = 10, 0, -1 do

endif не красиво и больше буковок )
я уже много кода написал на нем, и вроде читается все хорошо, может еще доработаю синтаксис )
а так спасибо за отзыв
Цитата Akyltist ()
PS: какие файлы на выходе по размеру.

2 кб пока что


Сообщение отредактировал Xakep - Вторник, 11 Марта 2014, 21:49
AkyltistДата: Вторник, 11 Марта 2014, 22:11 | Сообщение # 44
заслуженный участник
Сейчас нет на сайте
Цитата Xakep ()
2 кб пока что

съедобно, а можно пример простого приложения (консольного или гуи) и генерируемый на выходе asm листинг?
просто интересно возможно ли будет использовать этот компилятор для разработки Kolibri OS приложений без гемороя и напильника)
XakepДата: Среда, 12 Марта 2014, 07:25 | Сообщение # 45
めちゃくちゃちゃ
Сейчас нет на сайте
ну вот пример создания окошка:
Код

include "sys.apc";
include "math.apc";
include "glfw3.apc";
include "opengl.apc";
include "string.apc";
include "memory.apc";
//
def main()
    glfwInit();

    win : ^GLFWwindow = glfwCreateWindow (640, 480, "Hello World with OpenGL :)", nil, nil);
       
    glfwMakeContextCurrent (win);
    glfwSwapInterval (0);

    t0 : float = glfwGetTime();
    fps, frames : float = 0;

    while (glfwWindowShouldClose(win) != 1) do
     t : float = glfwGetTime();

     if ((t-t0) > 1) || (frames == 0) then
      fps = frames / (t-t0);
      t0 = t; frames = 0;
     end;

     frames++;

     glfwSwapBuffers (win);
     glfwPollEvents();
    end;

    glfwDestroyWindow (win);
    glfwTerminate();
end;


asm код:
Код

  .def  @feat.00;
  .scl    3;
  .type    0;
  .endef
  .globl    @feat.00
@feat.00 = 1
  .def  _main;
  .scl    2;
  .type    32;
  .endef
  .text
  .globl    _main
  .align    16, 0x90
_main:                    # @main
# BB#0:                    # %code
  push    esi
  sub    esp, 20
  call    _glfwInit
  mov    dword ptr [esp + 16], 0
  mov    dword ptr [esp + 12], 0
  mov    dword ptr [esp + 8], L_str
  mov    dword ptr [esp + 4], 480
  mov    dword ptr [esp], 640
  call    _glfwCreateWindow
  mov    esi, eax
  mov    dword ptr [esp], esi
  call    _glfwMakeContextCurrent
  mov    dword ptr [esp], 0
  call    _glfwSwapInterval
  call    _glfwGetTime
  fstp    st(0)
  jmp    LBB0_2
  .align    16, 0x90
LBB0_1:                    # %while.do
                    #   in Loop: Header=BB0_2 Depth=1
  call    _glfwGetTime
  fstp    st(0)
  mov    dword ptr [esp], esi
  call    _glfwSwapBuffers
  call    _glfwPollEvents
LBB0_2:                    # %while.do
                    # =>This Inner Loop Header: Depth=1
  mov    dword ptr [esp], esi
  call    _glfwWindowShouldClose
  cmp    eax, 1
  jne    LBB0_1
# BB#3:                    # %while.end
  mov    dword ptr [esp], esi
  call    _glfwDestroyWindow
  add    esp, 20
  pop    esi
  jmp    _glfwTerminate          # TAILCALL

  .section    .rdata,"r"
  .align    16                      # @str
L_str:
  .asciz    "Hello World with OpenGL :)"



Сообщение отредактировал Xakep - Среда, 12 Марта 2014, 07:31
LabirintikДата: Среда, 12 Марта 2014, 10:36 | Сообщение # 46
постоянный участник
Сейчас нет на сайте
Цитата Xakep ()
ну вот пример создания окошка:

О удобно!


Сообщение отредактировал Labirintik - Среда, 12 Марта 2014, 10:37
AkyltistДата: Среда, 12 Марта 2014, 11:35 | Сообщение # 47
заслуженный участник
Сейчас нет на сайте
Цитата Xakep ()
ну вот пример создания окошка:

а можно взглянуть на rtl типа include "sys.apc";
потому как что-то уж слишком хорошо))))) хотелось бы посмотреть оберки new (alloc malloc realloc) в общем кросплатформенность как обеспечивается.
Код
для обратного цикла нужно указать шаг -1

все лучше чем downto, в принципе наличие end; уже не так раздражает, код норм читается при 2 операторах начала блока (then & do).

PS: а есть что то типа switch case ?

что с поддержкой операторов сдвига? появились ли асм вставки (AT&T or Intel), если нет, то есть ли возможность включения бинарного потока в исполняемый файл? типо:
Код
code(0x66,0xC1,0xE0,0x10);

которое даст на выходе в том месте где вставлено: shl eax, 16 по смыслу, хотя в листенге это будет всего лишь
db 0x66
db 0xC1
db 0xE0
db 0x10 ; 16
XakepДата: Среда, 12 Марта 2014, 16:40 | Сообщение # 48
めちゃくちゃちゃ
Сейчас нет на сайте
Цитата Akyltist ()
а можно взглянуть на rtl типа include "sys.apc";
потому как что-то уж слишком хорошо))))) хотелось бы посмотреть оберки new (alloc malloc realloc) в общем кросплатформенность как обеспечивается.

менеджер памяти не писал, и думаю что не буду писать, возьму готовый какойнить, потому-что на эту тему пишут целые исследования проводят и научные работы пишут, пока что сделан через пул, позже выложу код. ) кроссплатформенность обеспечивается через макросы: $ifdef linux / darwin / win
но если так интересно то вот все модули которые я пока что сделал, на данный момент пишу opengl.apc.
sys.apc
math.apc
glfw3.apc
string.apc

а все хорошо так выглядит благодаря llvm;
Цитата Akyltist ()
PS: а есть что то типа switch case ?

есть конечно, вот пример:
Код

  case a of
   0 : a = 2; break;
   2 : a = 3; break;
   default : a = 0;
  end;


Цитата Akyltist ()
что с поддержкой операторов сдвига

сдвиг вправо: >>
сдвиг влево: <<

Цитата Akyltist ()
появились ли асм вставки (AT&T or Intel), если нет, то есть ли возможность включения бинарного потока в исполняемый файл? типо:

асм нету, будет в будущем, с ним некие сложности есть с переменными ) бинарного потока тоже нет.
BellPlayerДата: Среда, 12 Марта 2014, 17:05 | Сообщение # 49
был не раз
Сейчас нет на сайте
Xakep
Здравствуйте)
Компиляция в x64 поддерживается?
Рефлексия есть? Планируется?
Парсер писали с помощью бизона, яка или чего другого? Если да, то как справились с проблемой в else statement LL1?
Просто сам стал сейчас писать компилятор и решил всё разузнать))


Сообщение отредактировал BellPlayer - Среда, 12 Марта 2014, 17:10
XakepДата: Среда, 12 Марта 2014, 17:28 | Сообщение # 50
めちゃくちゃちゃ
Сейчас нет на сайте
Цитата BellPlayer ()
Рефлексия есть? Планируется?

нет, но планируется добавить мета программирование.
Цитата BellPlayer ()
Парсер писали с помощью бизона, яка или чего другого? Если да, то как справились с проблемой в else statement LL1?

нет я через C++ делал парсер, но есть ссылки на статьи:
Компиляция. 1: лексер
Компиляция. 2: грамматики
Компиляция. 3: бизон
Компиляция. 4: игрушечный ЯП
Компиляция. 5: нисходящий разбор
Компиляция. 5 и 1/2: llvm как back-end (отступление от цикла, показывает как реализовать все что делается дальше средствами LLVM)
Компиляция. 6: промежуточный код
Компиляция. 7: назначение регистров
Компиляция. 8: оптимизация
Компиляция. 9: исполняемый код
Компиляция. 10: компиляция в ELF

Добавлено (12.03.2014, 17:28)
---------------------------------------------

Цитата BellPlayer ()
Компиляция в x64 поддерживается?

поддерживается )
BellPlayerДата: Среда, 12 Марта 2014, 17:33 | Сообщение # 51
был не раз
Сейчас нет на сайте
Xakep
Круть))
Я планировал начать с компилятора С, а потом раскручивать до C++ во всех ипостасях, но оказалось сложнее стратиграфии)))
Сейчас взялся за что-то попроще.

Спасибо за ссылки)

А как осуществляется сборка в PE исполняемый файл?
В ссылках вроде только elf?


Сообщение отредактировал BellPlayer - Среда, 12 Марта 2014, 17:39
XakepДата: Среда, 12 Марта 2014, 18:14 | Сообщение # 52
めちゃくちゃちゃ
Сейчас нет на сайте
Цитата BellPlayer ()
А как осуществляется сборка в PE исполняемый файл?
В ссылках вроде только elf?

точно так же как и в elf, только у pe другая структура, погугли )
BellPlayerДата: Среда, 12 Марта 2014, 18:16 | Сообщение # 53
был не раз
Сейчас нет на сайте
Xakep
Ну это то понятно)
А llvm позволяет провести такие манипуляции или самому придётся с нуля возиться с образами?
XakepДата: Среда, 12 Марта 2014, 18:19 | Сообщение # 54
めちゃくちゃちゃ
Сейчас нет на сайте
Цитата BellPlayer ()
А llvm позволяет провести такие манипуляции или самому придётся с нуля возиться с образами?

позволяет, там только не в ассемблер генерировать код нужно будет, а в LLVM IR, описание есть здесь: http://llvm.org/docs/LangRef.html
а дальше можно либо подключить библиотеку llvm и в коде уже все манипуляции произвести, либо бинарники использовать.
WookieДата: Суббота, 15 Марта 2014, 10:52 | Сообщение # 55
Decembear
Сейчас нет на сайте
Питоноподобный же?

XakepДата: Воскресенье, 16 Марта 2014, 03:14 | Сообщение # 56
めちゃくちゃちゃ
Сейчас нет на сайте
Цитата Wookie ()
Питоноподобный же?

на питоне никогда не программировал )

Добавлено (16.03.2014, 03:14)
---------------------------------------------
как лучше сделать синтаксис для sizeof/offsetof и преобразования типов:
1 вариант:

Код

   b : float;
   a : int = cast(int) b;
   sizeof(a); offsetof(b); alignof(a);


2 вариант:
Код

   b : float;
   a : int = b.cast(int);
   a.size; b.size; a.align;
AevienДата: Воскресенье, 16 Марта 2014, 03:44 | Сообщение # 57
почти ветеран
Сейчас нет на сайте
Отличная работа smile
WookieДата: Воскресенье, 16 Марта 2014, 07:28 | Сообщение # 58
Decembear
Сейчас нет на сайте
Цитата Xakep ()
как лучше сделать синтаксис для sizeof/offsetof и преобразования типов

ИМХО, второй вариант лучше, (но я, эм, не сильно разбираюсь в тонкостях языков)


vasua99Дата: Воскресенье, 16 Марта 2014, 09:21 | Сообщение # 59
GNU follower
Сейчас нет на сайте
как лучше сделать синтаксис для sizeof/offsetof и преобразования типов:

как по мне лучше 1). Второй подразумевает представление переменной в качестве класса(что в случае базовых типов неверно).

и еще, насчет преобразования типов. Я бы сделал так:
Код

a : int = cast(int, b);


Или так(что в общем то так же как и С++, но никто не жаловался, да и короче):

Код

a : int = int(b);


Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
XakepДата: Воскресенье, 16 Марта 2014, 10:30 | Сообщение # 60
めちゃくちゃちゃ
Сейчас нет на сайте
Цитата vasua99 ()
Или так(что в общем то так же как и С++, но никто не жаловался, да и короче):

не, это в паскале так, в C++ так: int = (int) b;
ну у меня в прицнипе как раз как в дельфи сейчас, просто возникли трудности, точнее некоторые моменты с указателями не удобно делать.
  • Страница 3 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг