Флейм
GameDev.ru / Флейм / Форум / Язык программирования ν (Ню, Nu)

Язык программирования ν (Ню, Nu)

Страницы: 1 2 3 4 5 6 7 Следующая »
Great V.Постоялецwww12 окт. 201723:21#0
Здесь будет уютненький сайт уютненькая тема, посвященная языку Ню (англ. Nu, греч. ν).
Т.к. тема постоянно рефакториццо, не удивляйтесь если что-то будет лежать не на своем месте :)

Краткое описание



Ню - контекстно-зависимый синтаксически-ориентированный компилируемый язык с сильной статической типизацией.
Можно было бы сказать, что это язык программирования, но теоретически применение Ню программированием не ограничивается.
Язык нацелен на создание предметно-ориентированных языков (Domain-Specific Language - DSL) на его основе, автоматизирование разработки, генерации кода и его анализа.
Основная идея - дать возможность создавать удобные синтаксические конструкции. Наш слоган: "как это работает не должно влиять на то, как это может быть записано".
Развернутое описание будет приведено ниже и позже. Тем не менее, вот некоторые особенности, которые планируется включить в язык:

1. Метапрограммирование.
Препроцессор реализуется на том же языке, что и исходный код.
Это позволяет генерировать код программы используя любые конструкции языка, прямо на этапе компиляции.
2. Перегрузка операторов.
Перегрузка любых операторов с любыми именами, любыми возвращаемыми значениями и с любыми аргументами.
Будь то "===" из JavaScript, "select" из С# или свой кастомный оператор "@".
3. Атрибуты.
Если в каком-то месте вам вдруг понадобился const или mutable, virtual, abstract или override, спецификатор чистой функции или любой другой кастомный атрибут — вы всегда можете это организовать.
4. Order independent declaration.
Многопроходная модель трансляции без проблем обработает имена, которые используются до объявления.
5. Контекстно-зависимый синтаксис.
Для прикладных задач можно определить свой порядок разбора программы на определенном участке кода.
6. Кроссплатформенность.
Ню не привязан к каким-либо ограничениям платформы, будь то 4 байта в целом числе, 8 бит в байте или двуличностьдвоичность бита.
7. Ориентированность на IDE.
Выхлоп транслятора несет в себе не только промежуточный код, но и структуру исходного кода, которую можно использовать в редакторе. Это позволит разработчикам среды не заморачиваться с собственным парсером языка.

Правка: 16 мар. 2018 20:38

Great V.Постоялецwww12 окт. 201723:22#1

Где это можно применить?



Ну во-первых — программирование.
Ню не декларирует ни базовые типы, ни подходы к работе с памятью, ни алгоритмы или синтаксический сахар.
А потому на его основе можно пилить диалекты как для высокоуровневых программ, так и для низкого уровня, вплоть до ассемблера.
Более того — никто не запрещает эти подходы комбинировать, вплоть до совмещения в одном файле.
Например, код для микроконтроллера(написанного на ассемблере-диалекте для данного контроллера) и высокоуровневый код, который будет обрабатывать пакеты с этого контроллера через СОМ-порт и виводить на UI.
Так же, никто не мешает реализовать на нем некую вариацию динамической типизации, через механизмы полиморфизма.
Какую версию полиморфизма выбирать — с множественным наследованием, интерфейсами или виртуальными конструкторами — решать вам. Можно, конечно, и свой вариант.

Как это работает?


Выхлоп транслятора


Транслятор переводит исходный код Ню в промежуточный код, который далее будем называть Эта (англ. Eta, греч. η).
Основное предназначение этого кода - быть максимально простым для последующей обработки.
В этом отношении Ню выступает сложным и запутанным для обработки, позволяющим реализовать хитрые конструкции, которые облегчат разработку.
А Эта — минимальное представление, для которого можно быстро и легко написать парсер.

back-end


В целях независимости от платформы, чистый Ню почти не имеет встроенных типов и не занимается компиляцией в конечные машинные команды (или что бы там не было).
Этой частью занимаются системы, которые мы будет называть back-end.
Back-end делает две вещи: описывает элементарные составные элементы конечной платформы и занимается компиляцией промежуточного кода Эта в конечный код платформы.

Процесс выглядит следующим образом:
1. Back-end объявляет базовые типы и функции для конкретной платформы
2. Разработчик использует в качестве примитивов для написания программы
3. Программа скармливается транслятору, который превращает ее в код на Эта
4. Этот код скармливается back-endу, который превращает его в код конечной платформы.

На примере back-endа для какого-то рода ассемблера это будет выглядеть следующим образом:
Back-end предоставляет базовые примитивы для целевой платформы, такие как типы WORD/DWORD и инструкции типа ADD, MOV, а так же объекты EAX, EBX и т.д.
Далее, все эти примитивы используются при написании основной программы, которая использует их как хочет: заворачивает в сложные многоуровневые уравнения, циклы, структуры и т.д.
После этого программа транслируется в Эту, в которой все использования примитивов помечены соответствующими маркерами.
Back-end все это парсит и получает модель основной программы на уровне примитивов, которую и превращает в конечные инструкции для целевой платформы.

Правка: 16 мар. 2018 21:06

Great V.Постоялецwww12 окт. 201723:22#2

Состояние дел



На данный момент проект движется маленькими шагами.
Цель шагов - не написать полноценный язык, а протестировать фичу или концепцию.
Если концепция годная - она интегрируется в язык и проект шагает дальше. Если нет (или если нужны правки) - итерация начинается сначала.

Последние правки


Все объекты разделились на два лагеря: типизированные и нетипизированные.
Нетипизированные объекты объявляются ключевым словом single и фигурными скобками:
my-namespace: single {}

Типизированные объекты создаются фабрикой, которую можно объявить с помощью ключевого слова factory и фигурных скобок:
my-factory: factory {}

Фабрика, в свою очередь, нетипизированный объект.
Имея фабрику, можно создать типизированный объект:
my-variable: new my-factory;

Объекты single можно наполнять:
a: single {
  b: single {}
  c: single {}
}

Также, для объектов single можно определить операторы со скобками:
a: single {
  algorithm none();
}

Ключевое слово algorithm объявляет оператор. После него следует указать тип результата (имя фабрики), скобки (круглые, квадратные или фигурные), аргументы внутри них и тело оператора.
Такие операторы будут исполнены, если после имени объекта разместить скобки (и соответствующие аргументы):
a();

Тело оператора задается ключевым словом body и фигурными скобками, но может быть упущено (заменено на ";"), если на данный момент оно не используется:
a: single {
  algorithm none() body {}
}

Внутри тела можно писать исполняемый код. Пока поддерживаются всего две инструкции:
1. Создание переменной
A: factory {}
...
a: new A;

2. Вызов оператора
f: single {
  algorithm none() ...
}
...
f();

Правка: 23 апр. 2018 22:19

Great V.Постоялецwww12 окт. 201723:23#3
[reserved]
return [](){};Участникwww12 окт. 201723:31#4
Тему не читал (т.к. нет ничего), но используй llvm.
Джек АллигаторПостоялецwww13 окт. 20170:18#5
Great V.
> "С++, только без костылей"
Rust

> На данный момент пилю наброски транслятора (т.к. конечный выхлоп не машинные
> команды или ассемблер). Работы еще вагон и джве тележки, хоть это уже и не
> первая (и даже не десятая) итерация.
Почему не используешь flex+bison?

Sbtrn. DevilПостоялецwww13 окт. 20171:00#6
Джек Аллигатор
> без костылей
> Rust
Это было бы даже смешно, если бы не было так не смешно.
Джек АллигаторПостоялецwww13 окт. 20171:18#7
Sbtrn. Devil
- хочу С++, только без костылей
- Rust
- да нууу, там тоже есть костыли, поэтому я продолжу стрелять себе по ногам в крестах. и насрать на все удобства и что этих костылей на порядки меньше.
так чтоли?
+ Показать

Правка: 13 окт. 2017 1:24

Great V.Постоялецwww13 окт. 20172:24#8
return [](){};
Тут есть одна интересная идея.
Если выхлоп подобного транслятора представить не в виде машинных инструкций или llvm, а в виде чего-то очень легкого для парса (чтобы не пришлось писать супер-крутой парсер и для выхлопа транслятора) - то можно было бы использовать язык не только в качестве языка программирования, а и в качестве, например, языка разметки (или еще чего, хз).
Но об этом чуть позже. Я к этому вопросу обязательно вернусь, когда основы разъясню : )
MrShoorУчастникwww13 окт. 20173:02#9
Джек Аллигатор
> - Rust
Чо там у нас с инфраструктурой для Rust?
Как дела с IDE?
Как дела с отладчиками?
Как дела с профайлерами?
Как дела со сторонними библиотеками? Как например подключить PhysX? Или как писать UI?

Правка: 13 окт. 2017 3:05

jaguardУчастникwww13 окт. 20173:13#10
Адовый ад и израэлевый израэль.
Что делает язык, какие проблемы решает, какие удобные конструкции можно запилить одной строчкой - не, такие проблемы мы решать не хотим. Мы хотим блжад переопределить общепринятый и удобный способ создания комментариев. Почему? А без причины, нам так захотелось.

Фак май брейнфак..

Panzerschrek[CN]Участникwww13 окт. 20176:31#11
Great V.
Привет.

>Начиналось все с влажных фантазий на тему "С++, только без костылей
У меня тоже всё с этого начиналось. Думаю, много кто хочет запилить убийцу крестов.

> Грубо говоря, язык можно разделить на четыре основные части: имена, типы,
> функции и переменные.
А шаблоны, исчисление времени компиляции и т. д. как же?

> контекстно-зависимые правила синтаксического разбора
Ересь какая. В крестах все писатели компиляторов от контекстозависимости плюются. Оно зачем тебе?

> На данный момент пилю наброски транслятора
А что уже есть то? Лексический/синтаксический анализ, построение промежуточного кода, генерация машинного кода?


PS:
Тоже пилю свой язык, но не "Nu", а "Ü".
На данный момент есть компилятор, генерирующий llvm-ir: https://github.com/Panzerschrek/U-00DC-Sprache

Компилятор уже может всякие функции, структуры, пространства имён, методы, шаблоны классов.

Great V.Постоялецwww13 окт. 20178:57#12
jaguard
Остынь, приятель : )
Во-первых, я как бы намекнул, что печатаю с планшета, а потому тема будет наполнятся долго.
Во-вторых, переопределяю комментарии я не просто так, ведь символы "/" и "*" могут использоваться пользователями для именования объектов.
Да и комментарии бывают самые разные, начиная от # и ремов и заканчивая всякими <!-- --!> в языках разметки. Как по мне - так дело привычки, не более.
Great V.Постоялецwww13 окт. 20179:17#13
Panzerschrek[CN]
Йо : )

Panzerschrek[CN]
> А шаблоны, исчисление времени компиляции и т. д. как же?
Все это будет, но не в прямом виде. Например, сохранить синтаксис плюсов для шаблонов (угловые скобки) не получиться.
Все это будет реализовано средствами каскадной компиляции, о которой я напишу чуть позже.

Panzerschrek[CN]
> Ересь какая. В крестах все писатели компиляторов от контекстозависимости
> плюются. Оно зачем тебе?
Чтобы можно было задавать разные приоритеты операторов для разных областей.
А чего плюются? Что там аццкого то?

Panzerschrek[CN]
> А что уже есть то? Лексический/синтаксический анализ, построение промежуточного
> кода, генерация машинного кода?
Пока-что закончен лексический анализатор и парсер. Если в двух словах - то работа с именами (определение, переопределение, доступ к вложенным и ранее определенным объектам, етц.)
Из планируемых объектов готовы пока только неймспейсы, т.к. на них было легче всего все это тестить.
Генерация машинного кода не планируется, если что.

У меня сейчас скорее фаза дизайна. Нужно переварить все то, что накопилось за последний год и понемногу запихивать в язык.

Джек АллигаторПостоялецwww13 окт. 201711:57#14
MrShoor, Рим не один день строился.

> Чо там у нас с инфраструктурой для Rust?
Полный порядок.
https://crates.io/

> Как дела с IDE?
> Как дела с отладчиками?
> Как дела с профайлерами?
https://forge.rust-lang.org/ides.html
https://areweideyet.com/
https://gist.github.com/KodrAus/97c92c07a90b1fdd6853654357fd557a

> Как дела со сторонними библиотеками? Как например подключить PhysX? Или как
> писать UI?
Биндинги за пару минут пишутся: https://doc.rust-lang.org/book/first-edition/ffi.html
Их уже много готовых есть: https://crates.io/search?q=bindings&sort=downloads хотя конкретно для PhysX ещё не сделали.
У меня вот в проекте куча всякого сишного: OpenGL, glfw, freetype.
UI - тоже никто не мешает подключить сишную библиотеку: https://github.com/cyndis/qmlrs
https://www.reddit.com/r/rust/comments/6flge4/i_need_to_gui_framework/
https://users.rust-lang.org/t/current-state-of-gui-development-in-rust/11643/3

Есть и такое:
http://docs.piston.rs/conrod/conrod/guide/chapter_1/index.html

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

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

Правка: 13 окт. 2017 12:00

Страницы: 1 2 3 4 5 6 7 Следующая »

/ Форум / Флейм / ПроЭкты

2001—2018 © GameDev.ru — Разработка игр