Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
[progeR]
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 614
Завершенные тесты: 1
#1

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

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

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

Как считаете вы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2016, 16:35
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Язык программирования компилятора в C++ (C++):

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

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

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

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

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

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

18
HelicopterK52
780 / 210 / 32
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 1
29.08.2016, 16:37 #2
Цитата Сообщение от [progeR] Посмотреть сообщение
Как считаете вы?
Так добавят же constexpr if. Ждите.
А делать то же самое, но красивее... хм, попробуйте.
Я не пробовал, так что не в курсе.
0
_Ivana
3233 / 1861 / 235
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
29.08.2016, 17:24 #3
Цитата Сообщение от [progeR] Посмотреть сообщение
а почему просто не взять и не сделать нормальное
Цитата Сообщение от [progeR] Посмотреть сообщение
Как считаете вы?
Я считаю, что "нормальное" уже давно сделано в языках с более нормальным метапрограммированием. А В С++, говорят, еще много чего надо сделать нормально - но комитет не спешит.
0
Catstail
Модератор
23536 / 11646 / 2036
Регистрация: 12.02.2012
Сообщений: 18,985
29.08.2016, 17:52 #4
[progeR], поясните, что значит "язык программирования компилятора".
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
29.08.2016, 19:16 #5
Цитата Сообщение от [progeR] Посмотреть сообщение
а почему просто не взять и не сделать нормальное подмножество языка С++ с нормальным синтаксисом и языковыми конструкциями для этого
Да я вот тоже думаю, если бы С++ был объектно-ориентированным языком, он бы инкапсулировал свою сложнось внутри себя, а снаружи казался бы простым, но он таки вываливает ее всю на программиста!

Добавлено через 1 минуту
Цитата Сообщение от Catstail Посмотреть сообщение
[progeR], поясните, что значит "язык программирования компилятора".
Ну, имеется в виду программирование вычислений на стадии компиляции.
0
Catstail
Модератор
23536 / 11646 / 2036
Регистрация: 12.02.2012
Сообщений: 18,985
29.08.2016, 19:54 #6
Цитата Сообщение от Mr.X Посмотреть сообщение
имеется в виду программирование вычислений на стадии компиляции.
- а откуда известно, что шаблоны реализованы именно так?
0
EVP
489 / 257 / 57
Регистрация: 14.12.2010
Сообщений: 515
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
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
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 Посмотреть сообщение
"Развёрнутый" цикл?
Тогда у индусов работу отнимет компилятор.

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

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


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

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

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

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

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

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

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

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

Цитата Сообщение от hoggy Посмотреть сообщение
упрощение синтаксиса.
борьба с синтаксической сложностью.
То же самое. Интересовало мнение из уст ТС.
0
HelicopterK52
780 / 210 / 32
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 1
29.08.2016, 23:32 #12
Цитата Сообщение от castaway Посмотреть сообщение
Есть условная компиляция
Имеете ввиду препроцессор?
Так он бесполезен для ветвлениях на типах и constexpr выражениях,
т.к. ничего ни о том, ни о другом не знает.
0
[progeR]
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 614
Завершенные тесты: 1
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
HelicopterK52
780 / 210 / 32
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 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
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
30.08.2016, 23:22 #15
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Имеете ввиду препроцессор?
Так он бесполезен для ветвлениях на типах и constexpr выражениях,
т.к. ничего ни о том, ни о другом не знает.
Да.
Я понимаю. А чем может быть полезна условна компиляция, основанная на constexpr и т.д. и т.п.?
0
tapochka
40 / 40 / 17
Регистрация: 25.04.2014
Сообщений: 499
30.08.2016, 23:26 #16
Цитата Сообщение от castaway Посмотреть сообщение
А чем может быть полезна условна компиляция, основанная на constexpr и т.д. и т.п.?
вместо enable_if например
0
hoggy
Заблокирован
30.08.2016, 23:29 #17
Цитата Сообщение от castaway Посмотреть сообщение
А чем может быть полезна условна компиляция, основанная на constexpr и т.д. и т.п.?
constexpr - это смелая попытка предоставить программисту возможность писать привычный ему код,
в привычном простом синтексисе, но так, что он будет исполняться времени компиляции.

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

однако, технология достаточно сложная.
развиваться она будет медленно.
и она не в состоянии упразднить классические шаблоны.
0
Fulcrum_013
Заблокирован
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
DarkVortex
103 / 69 / 19
Регистрация: 07.07.2014
Сообщений: 240
31.08.2016, 00:10 #19
Цитата Сообщение от [progeR] Посмотреть сообщение
он по своей сути является эдаким "мета-костылем"
Ну да, а мы сделаем еще один "мега-костыль"...
0
31.08.2016, 00:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2016, 00:10
Привет! Вот еще темы с решениями:

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

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

Как понять язык программирования?
Всем привет. Мучает кое какой вопрос. Занимаюсь программированием около 2ух лет...

Как понять язык программирования?
Всем привет. Мучает кое какой вопрос. Занимаюсь программированием около 2ух лет...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru