Флейм
GameDev.ru / Флейм / Форум / Ü (Programmiersprache)

Ü (Programmiersprache)

Страницы: 1 2 327 28 Следующая »
Panzerschrek[CN]Участникwww14 окт. 201718:50#0
Пришло время и мне создать такую тему.

Пилю свой язык программирования под названием "Ü".

Цель:
Хочется запилить язык программирования навроде крестов, но без недостатков крестов и с минимизацией возможности прострела ноги.
Язык должен быть компилируемым, со статической строгой типизацией. Управление памятью - через деструкторы. Никаких говносборщиков мусора.
Планируется контроль за обращениями к памяти на подобие того, как есть в языке "Рашт".

Что уже есть:
Язык разрабатывается параллельно с его компилятороом.
Исходники компилятора: https://github.com/Panzerschrek/U-00DC-Sprache
Компилятор использует библиотеку llvm, пока что умеет генерировать только промежуточный llvm код. Но можно на выхлоп компилятора натравить llc и получить бинарь.

Уже реализованные возможности в компиляторе/языке:
•) Базовые конструкции управления потоком исполнения - if, while, break, continue, return.
•) Переменные, массивы, глобальные константы. Auto-переменные.
•) Набор унарных/бинарных операторов.
•) Преобразования между фундаментальными типами.
•) Функции. Прототипы функций.
•) Перегрузка функций.
•) Структуры, в. т. ч. вложенные. Опережающее объявление структур.
•) Методы.
•) Конструкторы, деструкторы.
•) Автогенерация конструкторов/деструкторов.
•) Простанства имён.
•) Псеводнимы типов.
•) Инициализаторы переменных через =, вызов конструктора. Почленная инициализация структур. Зануляющая инициализация.
•) Константные выражения, static_assert.
•) Импорт.
•) Шаблоны структур.
•) Проверка ссылок.
•) Перегрузка операторов
•) Перечисления.

Примеры кода:

+ Факториал
+ Структура с методами
+ Преобразования числа в строку
+ Простейший шаблон структуры

Правка: 8 дек. 2017 17:27

Panzerschrek[CN]Участникwww14 окт. 201718:50#1
О контроле ссылок

Контроль ссылок есть функционал компилятора, реализующий статическую проверку корректности обращения к памяти.
Главное правило контроля ссылок гласит "на одну переменную может указывать или одна изменяемая ссылка, или же от нуля до бесконечности неизменяемых ссылок". Данное правило позволяет не допустить обращения к уже освобождённой памяти.
Переменной считается объявленная на стеке переменная (через "var" или "auto"), аргумент функции, временная переменная, получившаяся в результате оператора конструирования временной переменной, временная переменная - результат функции.
Ссылкой считается стековая ссылка (объявленная через "var" или "auto"), ссылочный аргумент функции, ссылка внутри какой-либо переменной. Ссылка может указывать на любое количество переменных от нуля до бесконечности. Ссылка фактически может указывать не только на саму переменную, но и какую-то её часть (член массива, структуры  т. д.). Далее мы просто будем говорить "указывает" имея в виду указывание на переменную или её часть.

Простейший пример анализа ссылок:

+ Показать

Пример ссылки, указывающей на разные переменные:

+ Показать

В вышеизложенном примере в комментарии указано, что функция вернёт ссылку на один из её аргументов. Но почему так? Для функций, возвращающих ссылки, по-умолчанию считается, что они возвращают ссылки на любой из их ссылочных аргументов. Но что, если мы хотим, чтобы вызывающий код считал, что ссылка возвращается не на все входные аргументы? Мы можем это указать при помощи ссылочных тегов. Ссылочный тег есть строковый идентификатор, ассоциированный с входной или выходной ссылкой в сигнатуре функции.
Например:

+ Показать

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

Правка: 24 мар. 2018 10:01

Panzerschrek[CN]Участникwww14 окт. 201718:50#2
О контроле ссылок (продолжение)

Контроль ссылок также позволяет отловить случаи сохранения ссылок на уже умершие переменные.
Например:

+ Показать

Правка: 24 мар. 2018 10:06

Panzerschrek[CN]Участникwww14 окт. 201718:51#3
О контроле ссылок для ссылок внутри структур

Внутри структур могут существовать ссылки. Они могут быть объявлены явно, как ссылочные поля, либо же существовать неявно, как поля, содержащие структуры со ссылками или ссылки внутри std::vector, хранящего структуры со ссылками.

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

+ Показать

В примере выше мы видим две новых сущности: первая - список внутренних тегов аргумента функции, вторая - список связываний.
Список внутренних тегов может иметь тип, хранящий в себе ссылки. Обычные структуры без ссылок имеют 0 внутренних тегов, переменные со ссылочными полями - 1. Планируется добавить возможность указывать у структур количество тегов, большее, чем 1. Функция может использовать внутренний тег для навешивания его на возвращаемое значение.
Список связывания есть список в конце функции, в котором указано, в какой внутренний тег входной переменной какая заносится ссылка. Если тег-источник (справа) есть тег ссылочного аргумента, то считается, что заносится ссылка только на него. Если тег-источник есть внутренний тег, то считается, что заносится ссылка на внутреннюю переменную аргумента и на любые переменные, достижимые по ссылкам из неё.
Не допускается, чтобы функция заносила ссылку на что-либо в переменную, доступную через внутреннюю ссылку аргумента.

Пример работы связывания:

+ Показать

Правка: 24 мар. 2018 10:35

Panzerschrek[CN]Участникwww14 окт. 201718:51#4
[[reserved]]
ВасянУчастникwww14 окт. 201718:59#5
Баян :-)
return [](){};Участникwww14 окт. 201719:11#6
Шаблоны через угловые скобки - путь в никуда
Panzerschrek[CN]Участникwww14 окт. 201719:17#7
return [](){};
> Шаблоны через угловые скобки - путь в никуда
Как раз таки шаблоны через круглые скобки, как во сяких "Д" и "Свифт" это путь в никуда. Круглые скобки для шаблонов и круглые скобки для функций тяжело различать и компилятору и человеку. Поэтому специально были выбраны скобки, отличные от () и []. <> тоже были отброшены, т. к. добавляют неоднозначности при синтаксическом разборе. Поэтому были выбраны скобки </ />, как удовлетворяющие вышеперечисленным требованиям. Можешь предложить что-то лучшее, если знаешь как.
MAMOHT-92Постоялецwww14 окт. 201720:59#8
зачем? плюсы - это же сложный язык, там и множественное наследование и шаблоны, Rvalue и просто ссылки, а так же и просто адреса есть. А буст и стл тоже дописывать к своему языку будешь?
Panzerschrek[CN]Участникwww15 окт. 20175:09#9
MAMOHT-92
> там и множественное наследование и шаблоны
Как будто это что-то плохое.
А без щаблонов язык это не язык, а basic какой-то. Всейчас во всех нормальных языках есть шаблоны или что-то похожее.

> А буст и стл тоже дописывать к своему языку будешь?
STL буду писать, без этого никак. А Boost это костыль к STL, который потребовался потому, что в STL что-то попадает с черпашьей скоростью. Не думаю, что мне такой костыль понадобиться.


На счёт сложости - согласен, кресты сложноваты, местами, но не там, где ты думаешь.
Некоторые особенности крестов я принципиально реализовывать не собираюсь, а именно:

  • ) Указатели (как часть языка).
  • ) const, &, && как часть типа. "типом"считается только фундаментальный тип, массив, структура.
  • ) Битовые поля. Добавляют лишних сущностей в выражениях, а по факту фича очень сомнительная. Если надо, можно использовать побитовые операции.
  • ) Union, т. к. это есть нетипобезопасное говно.
  • ) Возврат значения операторами =, +=, -=, ++, —. В Ü это не операторы, а statement. По факту возвращаемое значение нужно в 0.5% случаев, но под эти случаи надо реализовывать возврат в перегруженных "операторах".
  • ) goto.
  • Правка: 15 окт. 2017 5:51

    SuperInoyПостоялецwww15 окт. 20175:43#10
    Panzerschrek[CN]
    > Можешь предложить что-то лучшее
    > <
    MrShoorУчастникwww15 окт. 20176:24#11
    Panzerschrek[CN]
    > Пилю свой язык программирования под названием "Ü".
    Считаю надо переименовать язык пока еще не поздно. Вот пару примеров красивых названий языка:
    "Ъ"
    "Ы"
    /A\Постоялецwww15 окт. 201710:59#12
    Panzerschrek[CN]
    > Битовые поля. Добавляют лишних сущностей в выражениях, а по факту фича очень
    > сомнительная. Если надо, можно использовать побитовые операции.
    Битовые поля, также как и типы char и short реализуются через битовые операции, по крайней мере так было раньше, когда я смотрел асемблерный код.
    Реально используются только типы int, int64.
    /A\Постоялецwww15 окт. 201711:04#13
    А по сабжу, единственное ради чего я бы перешел на другой язык так это больше возможностей кодогенерации и чтоб это было намного проще чем в с++ (с учетом новых стандартов).
    Sbtrn. DevilПостоялецwww15 окт. 201713:45#14
    Panzerschrek[CN]
    > Поэтому были выбраны скобки </ />, как удовлетворяющие вышеперечисленным
    > требованиям. Можешь предложить что-то лучшее, если знаешь как.
    Угловые скобки не создают проблемы, если их ставить не после имени, а перед.
    Ну или как вариант, таки угловые скобки - в именах типов они не создают особых проблем, и даже более того - их похожесть на "чтение из массива" очень в кассу, т. к. как бы намекает, что шаблонный тип - это мап по специализирующим типам, а скобки - это выборка из мапа.

    > fn
    Руст - проэкт-неудачник, подражать ему до такой степени нет смысла.

    Страницы: 1 2 327 28 Следующая »

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

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