30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
1

Язык программирования компилятора в C++

29.08.2016, 16:35. Показов 1312. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Разглядывая новые возможности С++11 (С++14) и читая статьи, посвященные шаблонам, мне пришла в голову мысль - по сути шаблоны - это такой эдакий язык программирования компилятора. Посему возникает вопрос: а почему просто не взять и не сделать нормальное подмножество языка С++ с нормальным синтаксисом и языковыми конструкциями для этого (static_for, static_if, static_vars, static_switch...)? Спецификация структур/функций/классов - своего рода ветвление на этапе компиляции (if-else). Рекурсия - цикл foreach (или for). Тогда type_traits.h, например, можно будет забыть навсегда, т.к. он по своей сути является эдаким "мета-костылем". Назвать его костылем в прямом смысле слова нельзя, но те же conditional, enable_if и прочее это обход, замена static_if.
Как-то так...

Как считаете вы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.08.2016, 16:35
Ответы с готовыми решениями:

Как называется движение программирования или теория программы считывающая др. язык программирования
Не знал, как по другому задать вопрос, и также назвать тему, но буду краток: Допустим я хочу...

Новые ЯП: существует ли язык программирования лучше чем C++, а если нет, то появится ли через 2-3 года такой язык?
Привет, зашёл на сайт, увидел C++ и подумал: Существует ли ЯП лучше чем C++, или появится ли через...

Русский язык в строке ошибок компилятора
Подскажите, как изменить язык отчета об ошибках с английского на русский? Программа Dev C++. с...

Язык программирования
Добрый день. Учусть в институте на 2 курсе. На первом курсе изучал язык с++ и с#, основы. Теперь у...

18
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
29.08.2016, 16:37 2
Цитата Сообщение от [progeR] Посмотреть сообщение
Как считаете вы?
Так добавят же constexpr if. Ждите.
А делать то же самое, но красивее... хм, попробуйте.
Я не пробовал, так что не в курсе.
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 30
29.08.2016, 17:24 3
Цитата Сообщение от [progeR] Посмотреть сообщение
а почему просто не взять и не сделать нормальное
Цитата Сообщение от [progeR] Посмотреть сообщение
Как считаете вы?
Я считаю, что "нормальное" уже давно сделано в языках с более нормальным метапрограммированием. А В С++, говорят, еще много чего надо сделать нормально - но комитет не спешит.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
37446 / 20817 / 4281
Регистрация: 12.02.2012
Сообщений: 34,237
Записей в блоге: 14
29.08.2016, 17:52 4
[progeR], поясните, что значит "язык программирования компилятора".
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
29.08.2016, 19:16 5
Цитата Сообщение от [progeR] Посмотреть сообщение
а почему просто не взять и не сделать нормальное подмножество языка С++ с нормальным синтаксисом и языковыми конструкциями для этого
Да я вот тоже думаю, если бы С++ был объектно-ориентированным языком, он бы инкапсулировал свою сложнось внутри себя, а снаружи казался бы простым, но он таки вываливает ее всю на программиста!

Добавлено через 1 минуту
Цитата Сообщение от Catstail Посмотреть сообщение
[progeR], поясните, что значит "язык программирования компилятора".
Ну, имеется в виду программирование вычислений на стадии компиляции.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
37446 / 20817 / 4281
Регистрация: 12.02.2012
Сообщений: 34,237
Записей в блоге: 14
29.08.2016, 19:54 6
Цитата Сообщение от Mr.X Посмотреть сообщение
имеется в виду программирование вычислений на стадии компиляции.
- а откуда известно, что шаблоны реализованы именно так?
0
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
29.08.2016, 20:09 7
Цитата Сообщение от [progeR] Посмотреть сообщение
мне пришла в голову мысль - по сути шаблоны - это такой эдакий язык программирования компилятора. Посему возникает вопрос: а почему просто не взять и не сделать нормальное подмножество языка С++ с нормальным синтаксисом и языковыми конструкциями для этого (static_for, static_if, static_vars, static_switch...)?
Цитата Сообщение от [progeR] Посмотреть сообщение
Как считаете вы?
Исключительно на мой взгляд с горки как вариант:

Шаблоны пошли по декларативному-функциональному стилю программирования,
а С++ без шаблонов - императивный язык.

Для метапрограммирования в императивном стиле надо вводить новую подсистему метапрограммировани и новый программируемый парсер,
которые могли бы работать с помощью квазицитирования выражений и нового императивного скопа метапрограммирования
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
meta
{
    std::wstring names[] = {
        L"Example",
        L"Test"
    };
    for(const auto& name : names)
        добавитьКласс(
            <[
                class $name {
                public:
                    int value;
                };
            ]>
        );
    выполняемОстальныеМетаФункции();
}
с возможностью программировать парсер для дальнейшей обработки (хотя бы как в Nemerle, но можно сделать лучше :-) ).
Без программируемого парсера будут проблемы с расширением языка.

Тогда бы декларативные шаблоны можно было бы делать в стандартной библиотеке языка, не меняя компилятор.
Правда мы тут сталкиваемся с проблемой, что теперь надо отлаживать не только программу,
но и метапрограмму (хоть и теми же средствами, но уже на этапе компиляции),
т.е. умножаем количество затрат на отладку для целевой программы.

Где-то читал, что Страуструп идеологически не хочет(не хотел) допускать императивный стиль в метапрограммировании на C++.
Отсюда такие выкрутасы с шаблонами.
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
29.08.2016, 21:39 8
Цитата Сообщение от [progeR] Посмотреть сообщение
а почему просто не взять и не сделать нормальное подмножество языка С++ с нормальным синтаксисом и языковыми конструкциями для этого (static_for, static_if, static_vars, static_switch...)?
Как по-вашему должен работать static_for? "Развёрнутый" цикл?
static_if - что он должен делать? Условная компиляция не подходит?
static_vars - это что такое? Константы? Так они есть.
static_switch - реализовано в виде шаблонов.
Шаблоны дают больше. Зачем всё это? Чем по-вашему текущее состояние языка является ненормальным?
Приведите выдуманный пример с мифическим ключевым словом, который будет нормальным.
0
GbaLog-
29.08.2016, 21:57
  #9

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
"Развёрнутый" цикл?
Тогда у индусов работу отнимет компилятор. :D

0
Эксперт С++
 Аватар для hoggy
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.08.2016, 23:15 10
Цитата Сообщение от [progeR] Посмотреть сообщение
а почему просто не взять и не сделать нормальное подмножество языка С++ с нормальным синтаксисом и языковыми конструкциями для этого (static_for, static_if, static_vars, static_switch...)?
а вы попробуйте изобразить синтаксис, который сможет отвечать следующей задаче:

класс A параметризуется параметром Б, который в свою очередь обязан быть классом.
если в этом классе есть метод @name определенной сигнатуры,
тогда класс A должен быть относледован от класса Ц,
а иначе, он должен быть отнаследован от шаблона Д,
параметризованного параметром Б.


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

максимум что тут можно сделать - это упростить синтаксис,
но не сам подход к дизайну.

Добавлено через 7 минут
Цитата Сообщение от castaway Посмотреть сообщение
static_if - что он должен делать?
ветвление на стадии компиляции, очевидно жеж.

есть такая байка, я не знаю, правда ли это:
его долгое время лобировали в комитете.
и больше всех сопротивлялся Страуструп.

но вроде бы он сдал позиции,
и статик_иф таки встал на очередь вступления
в будущие версии стандарта.

Цитата Сообщение от castaway Посмотреть сообщение
Зачем всё это?
упрощение синтаксиса.
борьба с синтаксической сложностью.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
29.08.2016, 23:21 11
Цитата Сообщение от hoggy Посмотреть сообщение
максимум что тут можно сделать - это упростить синтаксис,
но не сам подход к дизайну.
+

Цитата Сообщение от [progeR] Посмотреть сообщение
мне пришла в голову мысль
Ваша мысль поверхностная. Вам стоит "мыслить глубже".

Добавлено через 4 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
ветвление на стадии компиляции, очевидно жеж.
Есть условная компиляция, но я просто хотел услышать мнение ТС.

Цитата Сообщение от hoggy Посмотреть сообщение
упрощение синтаксиса.
борьба с синтаксической сложностью.
То же самое. Интересовало мнение из уст ТС.
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
29.08.2016, 23:32 12
Цитата Сообщение от castaway Посмотреть сообщение
Есть условная компиляция
Имеете ввиду препроцессор?
Так он бесполезен для ветвлениях на типах и constexpr выражениях,
т.к. ничего ни о том, ни о другом не знает.
0
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
30.08.2016, 10:54  [ТС] 13
Так вот EVP в принципе неплохой пример привел.
А что касается static_if - это уже сказали правильно - ветвление на этапе компиляции. Тогда, например, для вычисления compile-time факториала не будет требоваться хвостовая функция (это просто пример, а жизненных примеров, где этот самый static if/constexpr if можно применить, я думаю, каждый найдет)).
static_for - статический цикл - цикл на этапе компиляции. Замена рекурсии, например (или наоборот - ее дополнение).
static_vars - compile-time переменные, которые в саму программу не попадут. Например использовать как вспомогательные переменные для вычислений каких-нибудь constexpr выражений. Ну, у кого опыта побольше - тот наверняка сталкивался с местами в коде, где такая возможность пригодилось бы.

И, я считаю, синтаксис может упростится. А возможно и само написание кода.

Или вот, например, есть constexpr функции. Но ведь не каждую функцию можно объявить constexpr. Должны быть выполнены определенные условия, например, если не ошибаюсь, такая функция должна иметь только один return. А так, пожалуйста, используя это гипотетическое подмножество, функция будет из коробки compile-time с несколькими return, if-else...

Ведь все от желания зависит - захотят, будет нечто подобное. И проблемы, которые возникнут при этом, тоже будут решены, и синтаксис будет придуман и прочее.

Вон, язык D, не оттого что ветер в голове гуляет, стали придумывать.
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
30.08.2016, 11:03 14
Цитата Сообщение от [progeR] Посмотреть сообщение
Тогда, например, для вычисления compile-time факториала не будет требоваться хвостовая функция
Она и сейчас не требуется:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <cstdint>
 
 
constexpr uint32_t fact(uint32_t arg)
{
    if(arg == 0)
        return 1;
    uint32_t value = arg;
    for(--arg;arg>1;--arg)
        value *= arg;
    return value;
}
 
 
enum
{
    fact0 = fact(0),
    fact1 = fact(1),
    fact2 = fact(2),
    fact5 = fact(5),
};
 
int main()
{
    std::cout << fact0 << " " << fact1 << " " << fact2 << " " << fact5 << std::endl;
}
http://rextester.com/FOWC70327
Цитата Сообщение от [progeR] Посмотреть сообщение
static_for - статический цикл - цикл на этапе компиляции. Замена рекурсии, например (или наоборот - ее дополнение).
В constexpr функции, как видим, оно и так на этапе компиляции.
Цитата Сообщение от [progeR] Посмотреть сообщение
static_vars - compile-time переменные, которые в саму программу не попадут.
Так constexpr же есть. Просто его можно использовать не только в compile-time.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
30.08.2016, 23:22 15
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Имеете ввиду препроцессор?
Так он бесполезен для ветвлениях на типах и constexpr выражениях,
т.к. ничего ни о том, ни о другом не знает.
Да.
Я понимаю. А чем может быть полезна условна компиляция, основанная на constexpr и т.д. и т.п.?
0
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
30.08.2016, 23:26 16
Цитата Сообщение от castaway Посмотреть сообщение
А чем может быть полезна условна компиляция, основанная на constexpr и т.д. и т.п.?
вместо enable_if например
0
Эксперт С++
 Аватар для hoggy
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.08.2016, 23:29 17
Цитата Сообщение от castaway Посмотреть сообщение
А чем может быть полезна условна компиляция, основанная на constexpr и т.д. и т.п.?
constexpr - это смелая попытка предоставить программисту возможность писать привычный ему код,
в привычном простом синтексисе, но так, что он будет исполняться времени компиляции.

в некотором смысле, движки в эту сторону именно то, что хочет ТС.

однако, технология достаточно сложная.
развиваться она будет медленно.
и она не в состоянии упразднить классические шаблоны.
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
30.08.2016, 23:50 18
Цитата Сообщение от [progeR] Посмотреть сообщение
очему просто не взять и не сделать нормальное подмножество языка С++ с нормальным синтаксисом и языковыми конструкциями для этого (static_for, static_if, static_vars, static_switch...)?
Это уже было. В PL/1. Но по каким то причинам от этого отказались даже при том что именно на PL/1 написан бортовой софт шаттлов. Наверное по причине того что такие штуки резко снижают воспринимаемость и читабельность алгоритма (ну хотя конечно не настолько насколько SFINAE),при этом отладка превращается в тихий ужас. А там где они действительно нужны не столько уж и много обычно кода чтобы нельзя было его продублировать, а после появления ООП не продублировать а написать один абстрактный базовый класс и несколько специализаций абстракции.

Добавлено через 9 минут
При этом не так уж и сложно сделать генератор программного кода на самом C++ для некоторых случаев где бывает необходимо куча подобного кода в котором точность подставляемых данных важнее интеллектуальности. С необходимостью создания таких генераторов сталкивался 2 раза - таблицы для подгрузки функций OpenGL и набор операторов для операций над 2D и 3D векторами и матрицами во всех вариантах урезания (т.е. матрица поворота, расширенная матрица, униформ матрица во всех сочитаниях).

Добавлено через 10 минут
А вот к примеру введение в стандарт свойств и полной RTTI (т.е. фактически доступ к словарю компиляции в рантайме) была бы на порядок удобнее и позволяла бы решать просто огромное количество сложных (в плане создания таблиц адресов геттеров и сеттеров и т.п. вручную) для сегодняшнего С++ задач (к примеру полиморфной сериализации/десериализации данных). Так же как и введение нативных делегатов многие бы задачи упростило бы и сделало бы инициализацию делегатов гораздо более читабельной и писАбельной чем пользуемые для этих средств костыли, при этом нативные делегаты работают всегда быстрее чем шаблонные или иные костыли на эту тему.
0
103 / 69 / 19
Регистрация: 07.07.2014
Сообщений: 240
31.08.2016, 00:10 19
Цитата Сообщение от [progeR] Посмотреть сообщение
он по своей сути является эдаким "мета-костылем"
Ну да, а мы сделаем еще один "мега-костыль"...
0
31.08.2016, 00:10
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.08.2016, 00:10
Помогаю со студенческими работами здесь

Язык программирования С++
Доброго времени суток, Уважаемые Форумчане! Я учусь в БГУИР на инженер-программиста (Минск). И...

скачать язык программирования С
где я могу скачать язык программирования С

Основы программирования язык С
Здравствуйте, у меня такая проблема, необходимо писать программы в turbo c запускаю через...

Как учить язык программирования
Как лучше всего учить языки, в частности с++? Вот читаю я эту книгу на 1200 страниц, читаю 3 дня...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

Новые блоги и статьи
Преобразование полей (элементов управления содержимым) в обычный текст
РоΜа 23.01.2025
Возникла необходимость преобразовать поля в текст (те, что на вкладке разработчик добавляются) . Помучившись родил следующее: Sub ПоляВТекст() Преобразует все поля в текст (даты, текст,. . .
Как проверить существование директории в скрипте Bash
bt_guru 23.01.2025
При разработке скриптов Bash одной из ключевых задач является корректная работа с файловой системой, где особое место занимает проверка существования директорий. Эта операция становится критически. . .
Как работают срезы (slice) в Python
bytestream 23.01.2025
Python предоставляет разработчикам мощный и гибкий инструмент для работы с последовательностями данных - срезы (slices). Эта функциональность позволяет извлекать, модифицировать и управлять. . .
Как удалить подмодуль (submodule) в Git
bytestream 23.01.2025
При работе с крупными проектами в системе контроля версий Git разработчики часто сталкиваются с необходимостью управления зависимостями и внешними компонентами. Подмодули (submodules) представляют. . .
В чем разница между @staticmethod и @classmethod в Python. Декораторы методов
bytestream 23.01.2025
В Python декораторы методов представляют собой мощный инструмент, позволяющий модифицировать поведение функций и методов без изменения их исходного кода. Эта возможность является одной из. . .
Как преобразовать InputStream в String в Java
bytestream 23.01.2025
В мире Java-разработки работа с потоками данных является одной из ключевых операций при создании современных приложений. InputStream, как фундаментальный класс для обработки входных потоков данных,. . .
Как обновить форк (ответвление) репозитория в Git
bytestream 23.01.2025
Одним из наиболее мощных инструментов Git для организации совместной работы является механизм форкинга репозиториев, который позволяет создавать независимые копии проектов для дальнейшей разработки. . . .
Как работает async/await в C#. Асинхронное программировани­е в .NET
bytestream 23.01.2025
Введение в асинхронное программирование Асинхронное программирование представляет собой важнейшую концепцию современной разработки программного обеспечения, особенно в контексте создания. . .
КуМир: полное руководство
bytestream 23.01.2025
Введение в КуМир: история создания и назначение КуМир (Комплект Учебных МИров) представляет собой образовательную среду программирования, которая была создана для обучения основам алгоритмизации и. . .
Что такое OLAP. Где и как использовать многомерный анализ данных
bytestream 23.01.2025
Введение в OLAP-технологии В современном мире бизнес-аналитика и обработка больших массивов данных играют ключевую роль в принятии стратегических решений. Организации накапливают огромные объемы. . .
MongoDB: что это, для чего нужна и как использовать
bytestream 23.01.2025
Введение в MongoDB: современная документоориентированная СУБД В современном мире разработки программного обеспечения выбор правильной системы управления базами данных является критически важным. . .
Как использовать закрытый ключ шифрования в Git. Шифрование в Git
bytestream 23.01.2025
Установка и настройка закрытых ключей в Git предоставляет дополнительный уровень безопасности для работы с репозиториями. Для начала необходимо создать пару ключей, обычно это осуществляется с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru