Зачем? все равно никто кроме автора использовать не будет )
поживем увидим ))
Добавлено (23.01.2014, 22:16) --------------------------------------------- Полностью переработал синтаксис языка: убрал ключевые слова procedure, function, constructor, destructor, заменил на одно ключевое слово def, переменные можно объявлять где угодно, а не в блоке var, так же убрал это ключевое слово, убрал присваивание := и заменил на =, +=, -=, --, ++ ... Нескольок примеров кода:
перемножение 2х матриц 4x4 с SIMD векторизацией:
Код
def mmul (const m1, m2: mat4f): mat4 inline // res : mat4; for i : int = 0, 3 do ci : <4 x float> = m1[i][0]*m2[0];
for j : int = 0, 3 do ci += m[i][j]*m2[j] end;
res[i] = ci; end;
return res; end;
перевод числа в строку:
Код
def int2str (val : int) : string x,v,l : int = 0; v = val; // if (val == 0) then return "0"; end; while (v != 0) do l++; v /= 10; end;
len : int = l; string res = new string(len+1);
while (l != 0) do x = val % 10; l--; res.data[l] = x+'0'; val /= 10; end;
data[len] = #0; return res; end;
декодирования UTF8:
Код
def decodeUTF8 (uc : wchar) : string res : string; // if (uc == 0x0040) then return ""; end; if (uc >= 0xD800) && (uc <= 0xDFFF) then return ""; end; // if (uc > 0x1) && (uc <= 0x007F) then res += Char(uc); elsif (uc > 0x007F) && (uc <= 0x07FF) then b1 : char = 0xC0 | (uc & 0x7C0) >> 6; b2 : char = 0x80 | (uc & 0x3F);
так же в будущем планирую написать хороший макропроцессор, пример макроса для развертки циклов:
Код
// macro unroll (depth : int) step : int = 1;
match ("for %i = %val, %to ?(, %step) do %body end;"); emit ("for %i = %val, %to, %step*%depth do");
for j = 0, depth do emit (replace(%body, %i, "%i+%j"));
emit ("end;"); end;
def main() unroll(4) for i = 0, 16 do Write('%d, ', i); end; end; end;
после перпроцессора сгенерирует код:
Код
def main() for i = 0, 16, 1*4 do Write('%d, ', i+0); Write('%d, ', i+1); Write('%d, ', i+2); Write('%d, ', i+3); end; end;
Добавлено (11.03.2014, 19:39) --------------------------------------------- почти доделал первую версию языка программирования ) через неделю-две выложу тестовую версию компилятор, надеюсь найдутся тестеры )
Сообщение отредактировал Xakep - Среда, 12 Марта 2014, 09:22
Хорошая работа, но хотелось бы воткнуть свои 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
по синтаксису опирался в основном на lua и ruby, такой вот получился, для обратного цикла нужно указать шаг -1:
Код
for i : int = 10, 0, -1 do
endif не красиво и больше буковок ) я уже много кода написал на нем, и вроде читается все хорошо, может еще доработаю синтаксис ) а так спасибо за отзыв
ЦитатаAkyltist ()
PS: какие файлы на выходе по размеру.
2 кб пока что
Сообщение отредактировал Xakep - Вторник, 11 Марта 2014, 21:49
съедобно, а можно пример простого приложения (консольного или гуи) и генерируемый на выходе asm листинг? просто интересно возможно ли будет использовать этот компилятор для разработки Kolibri OS приложений без гемороя и напильника)
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);
а можно взглянуть на 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
а можно взглянуть на rtl типа include "sys.apc"; потому как что-то уж слишком хорошо))))) хотелось бы посмотреть оберки new (alloc malloc realloc) в общем кросплатформенность как обеспечивается.
менеджер памяти не писал, и думаю что не буду писать, возьму готовый какойнить, потому-что на эту тему пишут целые исследования проводят и научные работы пишут, пока что сделан через пул, позже выложу код. ) кроссплатформенность обеспечивается через макросы: $ifdef linux / darwin / win но если так интересно то вот все модули которые я пока что сделал, на данный момент пишу opengl.apc. sys.apc math.apc glfw3.apc string.apc
Xakep Здравствуйте) Компиляция в x64 поддерживается? Рефлексия есть? Планируется? Парсер писали с помощью бизона, яка или чего другого? Если да, то как справились с проблемой в else statement LL1? Просто сам стал сейчас писать компилятор и решил всё разузнать))
Сообщение отредактировал BellPlayer - Среда, 12 Марта 2014, 17:10
Xakep Круть)) Я планировал начать с компилятора С, а потом раскручивать до C++ во всех ипостасях, но оказалось сложнее стратиграфии))) Сейчас взялся за что-то попроще.
Спасибо за ссылки)
А как осуществляется сборка в PE исполняемый файл? В ссылках вроде только elf?
Сообщение отредактировал BellPlayer - Среда, 12 Марта 2014, 17:39
А llvm позволяет провести такие манипуляции или самому придётся с нуля возиться с образами?
позволяет, там только не в ассемблер генерировать код нужно будет, а в LLVM IR, описание есть здесь: http://llvm.org/docs/LangRef.html а дальше можно либо подключить библиотеку llvm и в коде уже все манипуляции произвести, либо бинарники использовать.
Добавлено (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;
Или так(что в общем то так же как и С++, но никто не жаловался, да и короче):
не, это в паскале так, в C++ так: int = (int) b; ну у меня в прицнипе как раз как в дельфи сейчас, просто возникли трудности, точнее некоторые моменты с указателями не удобно делать.