vasua99 | Дата: Воскресенье, 16 Марта 2014, 10:45 | Сообщение # 61 |
GNU follower
Сейчас нет на сайте
| Цитата Xakep ( ) int = (int) b; Это старый Си-синтаксис. В новом именно так, как я написал(вообще поддерживаются оба)
Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
|
|
| |
Xakep | Дата: Пятница, 21 Августа 2015, 18:28 | Сообщение # 62 |
めちゃくちゃちゃ
Сейчас нет на сайте
| решил сделать первый вариант. Цитата vasua99 ( ) Это старый Си-синтаксис. В новом именно так, как я написал(вообще поддерживаются оба) действительно такое есть, ну в С++ вообще принято писать static_cast/dynamic_cast/reinterpret_cast/const_cast ну и тд )) ну и для указателей вряд ли использовать int(a) удобнее.
Добавлено (29.05.2014, 19:53) --------------------------------------------- сделал оба варианта преобразования: Код a : ptr = cast (ptr) myobj; x : int = float (num);
сделал простенький препроцессор для определения нужной платформы на которой компилируется программа: Код $ifdef x86_64 def memcpy (dst, src : ptr; size : int64; alignVal : int = 4; isVolatile : bool = false) external "llvm.memcpy.p0i8.p0i8.i64"; def memset (dst : ptr; val : byte; len : int64; alignVal : int = 4; isVolatile : bool = false) external "llvm.memset.p0i8.i64"; $else def memcpy (dst, src : ptr; size : int; alignVal : int = 4; isVolatile : bool = false) external "llvm.memcpy.p0i8.p0i8.i32"; def memset (dst : ptr; val : byte; len : int; alignVal : int = 4; isVolatile : bool = false) external "llvm.memset.p0i8.i32"; $endif
добавлены оптимизации для распределенных вычислительных систем (суперкомпьютеров, кластеров), автоматическая параллелизация через OpenMP, в том числе и на GPGPU (только NVIDIA на CUDA). Данные оптимизации пока что работают только на Linux, в будущем будут работать и на Windows. Сейчас делаю макросы и шаблоны (ключевые слова macro и template) и в скором времени будет поддержка OpenMP в самом компиляторе. Так же пришлось писать собственные аллокаторы памяти для компилятора, пока еще не дописанные, но уже почти ) сами аллокаторы уже есть, а вот менеджера памяти пока нету, точнее он не дописан.
Добавлено (29.05.2014, 19:54) --------------------------------------------- так же добавил новые ключевые слово alias для псевдонимов, пример: Код alias LPCSTR = ^char; alias GLSecondaryColor3bEXT = def gl_cc (red: GLbyte; green: GLbyte; blue: GLbyte);
Добавлено (21 августа 2015, 18:28) --------------------------------------------- Решил все переделать Очень понравилось реализовывать свой яп, решил новый синтаксис теперь реализовать Вот что пока что на придумывал:
Работа со списками: Код <4 x Int> A = <2, 5> ++ <3, 5> // Склейка списков [7 x Int] x = [1,2,3...] [3 x Int] r = [1] ++ [2,4] в угловатых скобочках как и раньше векторные типы, операции над ними производятся через SIMD
Возведение в степень вещественных чисел **, целых чисел ^
Преобразование типов: Код Int a = static_cast<float> 1.f auto pl = dynamic_cast<Player> obj
есть ключевое слово auto, по смыслу такое же как и в C++, но не такое гибкое конечно, там слишком сложно они сделали. ptr<Type> - указатель на тип, может потом сделаю более удобно, но планирую что в языке не нужно будет особо пользоваться указателями, а эта возможность для всяких интересных "хаков", для более удобной реализации связных списков например. Динамическое выделение памяти через умные указатели, может и не будет их, пока не решил ) Инициализация структур данных можно производить через фигурные скобочки. Строки - это просто списки из символов: Код String hello = "Hello " ++ "World!" думаю как нибудь импортировать некторые вещи из стандартной библиотеки С++, например вектор: Код Vector<int> a = {1, 2, 4} a.push(12)
лямбда выражения (может переделаю): Код onClick (lambda[a](Int x, Int y) -> Int
auto r = a.pop() putStr x+y+r return x+y+r
end)
range based циклы: Код for (auto i : a) ... end
for (Int a in [0..10]) ... end
Импорт модулей: Код import system import glfw import openal import opengl
Типы: Код enum Align = Left, Right, Center // Перечисление typeclass Num = Int, Float, Double // Класс типа, для автоматической генерации, на подобие шаблонов alias String = [Char]
// Итераторы, конечто же по другому все будет, это там пример class MyList <Int size> private: [Size x Int] data Int cursor = 0
public:
def begin() -> ptr<Int> :: inline addr (data[0])
def end() -> ptr<Int> :: inline addr (data[size-1])
def next() -> ptr<Int> :: inline addr (data[++cursor])
def prev() -> ptr<Int> :: inline addr (data[--cursor])
def get() -> Int :: inline data[cursor]
end
тип можно задать с именными компонентами, к примеру у массива: Код alias Vec4f = <4 x Float> :: x <-> r, y <-> g, z <-> b, w <-> a Vec4f color = <0,0,0,0> color.a = 1; // или color.w = 1 будет эквивалентно Так же и с матрицами: Код alias Mat4f = [4 x Vec4f] :: a, b, c, d можно задать константы матрицы таким образом: Код const Mat4f.zero = [<0.f, ...>, ...] const Mat4f.indent = // Возможно сделаю вместо точки ::, т.е. Mat4f::Indent = [...] [ <1.f, 0.f, 0.f ,0.f>, <0.f, 1.f, 0.f ,0.f>, <0.f, 0.f, 1.f ,0.f>, <0.f, 0.f, 0.f ,1.f> ] Функции: Код def sum (const Num a, b) -> auto a+b
// Возведение в степень def binary ** (<Num> a, <Num> a, b) -> auto :: inline fpow (a, b) end
// Перемножение 2х чисел def binary * (const Mat4f m1, m2) -> Mat4f :: inline Mat4f res for (Int i in [0..3]) :: unroll (all) Vec4f ci = m1[i][0]*m2[0]; for (Int i in [0..3]) :: unroll (all) ci += m[i][j]*m2[j] res[i] = ci end return res
end
Пример обновления модельной матрицы объекта: Код def updateMatrices()
Mat4f mr = math::rotateMat (Mat4f.indent, rotation, <0.f, 0.f, 1.f>) Mat4f mt = math::translateMat (Mat4f.indent, <position, 0.f>) Mat4f ms = math::scaleMat (Mat4f.indent, <scale , 1.f>)
modelMatrix = mt*mr*ms; MVPMatrix = camera.MVPMatrix*modelMatrix
end
Автоматического сборщика мусора не будет, вместо них будут умные указатели, как в C++: Код [unique_ptr<Object>] objects objects ++= object objects.erase object.get() Ассоциативные массивы создаются таким образом: Код [String <- unique_ptr<Object>] objects :: Hash оператор :: Hash говорит что нужно использовать хэш таблицы вместо красно-черных деревьев Способ можно будет самому запрограммировать после :: в основном будет идти макрос который нужно использовать (так же как и unroll в предыдущем примере с матрицами)
------
Все это чисто для фана, так что не нужно писать что "А зачем это нужно когда есть то-то и то-то..."
Сообщение отредактировал Xakep - Пятница, 21 Августа 2015, 18:46 |
|
| |
JackNazaryan | Дата: Воскресенье, 01 Ноября 2015, 03:18 | Сообщение # 63 |
старожил
Сейчас нет на сайте
| Сделаешь нормальное ООП - будут тебе сердечки и воздушные поцелуи, и заодно более современный ЯП
|
|
| |
tracer07 | Дата: Понедельник, 02 Ноября 2015, 22:21 | Сообщение # 64 |
постоянный участник
Сейчас нет на сайте
| Xakep, Давно интересует эта тема, все никак не решался спросить... Твой язык компилируется в машинный код? или транслируется в ассемблер? или в другой язык?
|
|
| |
Xakep | Дата: Понедельник, 02 Ноября 2015, 22:26 | Сообщение # 65 |
めちゃくちゃちゃ
Сейчас нет на сайте
| Цитата tracer07 ( ) Xakep, Давно интересует эта тема, все никак не решался спросить... Твой язык компилируется в машинный код? или транслируется в ассемблер? или в другой язык? Ну вообще компилируется в машинный код, но сначала транслируется в LLVM-IR дальше через LLVM промежуточный код оптимизируется, а потом транслируется либо в ассемблер, либо сразу в объектный код, но по сути ассемблер - это и есть символическое представление машинного кода.
|
|
| |
tracer07 | Дата: Понедельник, 02 Ноября 2015, 22:40 | Сообщение # 66 |
постоянный участник
Сейчас нет на сайте
| Xakep, Понял, спасибо!
|
|
| |