30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
|
|
1 | |
Язык программирования компилятора в C++29.08.2016, 16:35. Показов 1312. Ответов 18
Метки нет (Все метки)
Добрый день!
Разглядывая новые возможности С++11 (С++14) и читая статьи, посвященные шаблонам, мне пришла в голову мысль - по сути шаблоны - это такой эдакий язык программирования компилятора. Посему возникает вопрос: а почему просто не взять и не сделать нормальное подмножество языка С++ с нормальным синтаксисом и языковыми конструкциями для этого (static_for, static_if, static_vars, static_switch...)? Спецификация структур/функций/классов - своего рода ветвление на этапе компиляции (if-else). Рекурсия - цикл foreach (или for). Тогда type_traits.h, например, можно будет забыть навсегда, т.к. он по своей сути является эдаким "мета-костылем". Назвать его костылем в прямом смысле слова нельзя, но те же conditional, enable_if и прочее это обход, замена static_if. Как-то так... Как считаете вы?
0
|
29.08.2016, 16:35 | |
Ответы с готовыми решениями:
18
Как называется движение программирования или теория программы считывающая др. язык программирования Новые ЯП: существует ли язык программирования лучше чем C++, а если нет, то появится ли через 2-3 года такой язык? Русский язык в строке ошибок компилятора Язык программирования |
29.08.2016, 17:24 | 3 |
Я считаю, что "нормальное" уже давно сделано в языках с более нормальным метапрограммированием. А В С++, говорят, еще много чего надо сделать нормально - но комитет не спешит.
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
29.08.2016, 19:16 | 5 |
Да я вот тоже думаю, если бы С++ был объектно-ориентированным языком, он бы инкапсулировал свою сложнось внутри себя, а снаружи казался бы простым, но он таки вываливает ее всю на программиста!
Добавлено через 1 минуту Ну, имеется в виду программирование вычислений на стадии компиляции.
0
|
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
|
||||||
29.08.2016, 20:09 | 7 | |||||
Исключительно на мой взгляд с горки как вариант:
Шаблоны пошли по декларативному-функциональному стилю программирования, а С++ без шаблонов - императивный язык. Для метапрограммирования в императивном стиле надо вводить новую подсистему метапрограммировани и новый программируемый парсер, которые могли бы работать с помощью квазицитирования выражений и нового императивного скопа метапрограммирования
Без программируемого парсера будут проблемы с расширением языка. Тогда бы декларативные шаблоны можно было бы делать в стандартной библиотеке языка, не меняя компилятор. Правда мы тут сталкиваемся с проблемой, что теперь надо отлаживать не только программу, но и метапрограмму (хоть и теми же средствами, но уже на этапе компиляции), т.е. умножаем количество затрат на отладку для целевой программы. Где-то читал, что Страуструп идеологически не хочет(не хотел) допускать императивный стиль в метапрограммировании на C++. Отсюда такие выкрутасы с шаблонами.
1
|
29.08.2016, 21:39 | 8 |
Как по-вашему должен работать
static_for ? "Развёрнутый" цикл?static_if - что он должен делать? Условная компиляция не подходит?static_vars - это что такое? Константы? Так они есть.static_switch - реализовано в виде шаблонов.Шаблоны дают больше. Зачем всё это? Чем по-вашему текущее состояние языка является ненормальным? Приведите выдуманный пример с мифическим ключевым словом, который будет нормальным.
0
|
GbaLog-
|
29.08.2016, 21:57
#9
|
0
|
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
29.08.2016, 23:15 | 10 |
а вы попробуйте изобразить синтаксис, который сможет отвечать следующей задаче:
класс A параметризуется параметром Б, который в свою очередь обязан быть классом. если в этом классе есть метод @name определенной сигнатуры, тогда класс A должен быть относледован от класса Ц, а иначе, он должен быть отнаследован от шаблона Д, параметризованного параметром Б. вообще, дизайн современных шаблонов - это цена за их мощность и гибкость. попытка изобрести что-то сопоставимое по мощности и гибкости, которое при этом гармонично впишется в центральную тему с++ - ООП, приведет к тому, что у вас получится такой же максимум что тут можно сделать - это упростить синтаксис, но не сам подход к дизайну. Добавлено через 7 минут ветвление на стадии компиляции, очевидно жеж. есть такая байка, я не знаю, правда ли это: его долгое время лобировали в комитете. и больше всех сопротивлялся Страуструп. но вроде бы он сдал позиции, и статик_иф таки встал на очередь вступления в будущие версии стандарта. упрощение синтаксиса. борьба с синтаксической сложностью.
0
|
29.08.2016, 23:21 | 11 |
+
Ваша мысль поверхностная. Вам стоит "мыслить глубже". Добавлено через 4 минуты Есть условная компиляция, но я просто хотел услышать мнение ТС. То же самое. Интересовало мнение из уст ТС.
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
|
30.08.2016, 11:03 | 14 | |||||
Она и сейчас не требуется:
В constexpr функции, как видим, оно и так на этапе компиляции. Так constexpr же есть. Просто его можно использовать не только в compile-time.
0
|
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
|
|
30.08.2016, 23:26 | 16 |
0
|
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
30.08.2016, 23:29 | 17 |
constexpr - это смелая попытка предоставить программисту возможность писать привычный ему код,
в привычном простом синтексисе, но так, что он будет исполняться времени компиляции. в некотором смысле, движки в эту сторону именно то, что хочет ТС. однако, технология достаточно сложная. развиваться она будет медленно. и она не в состоянии упразднить классические шаблоны.
0
|
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
30.08.2016, 23:50 | 18 |
Это уже было. В 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 |
0
|
31.08.2016, 00:10 | |
31.08.2016, 00:10 | |
Помогаю со студенческими работами здесь
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 предоставляет дополнительный уровень безопасности для работы с репозиториями. Для начала необходимо создать пару ключей, обычно это осуществляется с. . .
|