Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
[progeR]
30 / 8 / 0
Регистрация: 20.08.2011
Сообщений: 609
Завершенные тесты: 1
#1

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

29.08.2016, 16:35. Просмотров 575. Ответов 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++):

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

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

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

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

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

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

18
HelicopterK52
682 / 207 / 28
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 1
29.08.2016, 16:37 #2
Цитата Сообщение от [progeR] Посмотреть сообщение
Как считаете вы?
Так добавят же constexpr if. Ждите.
А делать то же самое, но красивее... хм, попробуйте.
Я не пробовал, так что не в курсе.
0
_Ivana
3185 / 1801 / 153
Регистрация: 01.03.2013
Сообщений: 5,030
Записей в блоге: 3
29.08.2016, 17:24 #3
Цитата Сообщение от [progeR] Посмотреть сообщение
а почему просто не взять и не сделать нормальное
Цитата Сообщение от [progeR] Посмотреть сообщение
Как считаете вы?
Я считаю, что "нормальное" уже давно сделано в языках с более нормальным метапрограммированием. А В С++, говорят, еще много чего надо сделать нормально - но комитет не спешит.
0
Catstail
Модератор
22828 / 11194 / 1812
Регистрация: 12.02.2012
Сообщений: 18,431
29.08.2016, 17:52 #4
[progeR], поясните, что значит "язык программирования компилятора".
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
29.08.2016, 19:16 #5
Цитата Сообщение от [progeR] Посмотреть сообщение
а почему просто не взять и не сделать нормальное подмножество языка С++ с нормальным синтаксисом и языковыми конструкциями для этого
Да я вот тоже думаю, если бы С++ был объектно-ориентированным языком, он бы инкапсулировал свою сложнось внутри себя, а снаружи казался бы простым, но он таки вываливает ее всю на программиста!

Добавлено через 1 минуту
Цитата Сообщение от Catstail Посмотреть сообщение
[progeR], поясните, что значит "язык программирования компилятора".
Ну, имеется в виду программирование вычислений на стадии компиляции.
0
Catstail
Модератор
22828 / 11194 / 1812
Регистрация: 12.02.2012
Сообщений: 18,431
29.08.2016, 19:54 #6
Цитата Сообщение от Mr.X Посмотреть сообщение
имеется в виду программирование вычислений на стадии компиляции.
- а откуда известно, что шаблоны реализованы именно так?
0
EVP
390 / 246 / 43
Регистрация: 14.12.2010
Сообщений: 472
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
Эксперт С++
4887 / 3022 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 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
6691 / 2873 / 493
Регистрация: 15.11.2014
Сообщений: 6,465
Завершенные тесты: 1
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
Эксперт С++
4887 / 3022 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
29.08.2016, 23:21 #11
Цитата Сообщение от hoggy Посмотреть сообщение
максимум что тут можно сделать - это упростить синтаксис,
но не сам подход к дизайну.
+

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

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

Цитата Сообщение от hoggy Посмотреть сообщение
упрощение синтаксиса.
борьба с синтаксической сложностью.
То же самое. Интересовало мнение из уст ТС.
0
HelicopterK52
682 / 207 / 28
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 1
29.08.2016, 23:32 #12
Цитата Сообщение от castaway Посмотреть сообщение
Есть условная компиляция
Имеете ввиду препроцессор?
Так он бесполезен для ветвлениях на типах и constexpr выражениях,
т.к. ничего ни о том, ни о другом не знает.
0
[progeR]
30 / 8 / 0
Регистрация: 20.08.2011
Сообщений: 609
Завершенные тесты: 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
682 / 207 / 28
Регистрация: 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
Эксперт С++
4887 / 3022 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
30.08.2016, 23:22 #15
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Имеете ввиду препроцессор?
Так он бесполезен для ветвлениях на типах и constexpr выражениях,
т.к. ничего ни о том, ни о другом не знает.
Да.
Я понимаю. А чем может быть полезна условна компиляция, основанная на constexpr и т.д. и т.п.?
0
30.08.2016, 23:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2016, 23:22
Привет! Вот еще темы с ответами:

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

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

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

Какой язык программирования выбрать? - C++
Привет, участникам форума. Мне 23 года, решил заняться программированием. Неделю побаловался на Паскале и решил перейти на С++. Все...


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

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

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