Понедельник, 25 Ноября 2024, 15:05

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 4 из 4
  • «
  • 1
  • 2
  • 3
  • 4
Aphalin Compiler
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)
---------------------------------------------
Решил все переделать biggrin Очень понравилось реализовывать свой яп, решил новый синтаксис теперь реализовать
Вот что пока что на придумывал:

Работа со списками:
Код
<4 x Int> A = <2, 5> ++ <3, 5> // Склейка списков
[7 x Int] x = [1,2,3...]
[3 x Int] r = [1] ++ [2,4]

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

Возведение в степень вещественных чисел **, целых чисел ^
Код
Float a = a ** 2


Преобразование типов:
Код
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, Понял, спасибо!
  • Страница 4 из 4
  • «
  • 1
  • 2
  • 3
  • 4
Поиск:

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