быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||
1 | ||||||
Как заставить компилятор не компилить неправильную программу?29.12.2012, 14:56. Показов 2723. Ответов 26
Метки нет (Все метки)
Мне не даёт покоя разговор с одним программистом, имевший место быть несколько лет назад. Тот сказал, что он так кодит, что у него неправильный код просто-напросто не компилится, а я не стал уточнять. Многое я бы отдал, чтобы вернуться к тому разговору!
Ясно дело, что даже если это и правда, то правда условная. Компилятор же не знает, что нужно человеку. Тем не мене, может есть какие-то способы ограничить поведение (предотвратить его) программы на стадии компиляции при синтаксически правильном коде? Будем здесь их обсуждать. Начнём с простого.
0
|
29.12.2012, 14:56 | |
Ответы с готовыми решениями:
26
Компилятор в Qt Creator: как заставить скомпилироваться и запуститься программу? есть ли компилятор для андроида? на планшете хочу компилить Как компилить программу с libjpeg? Как компилить программу .exe в другое разрешение? |
15 / 15 / 2
Регистрация: 29.03.2012
Сообщений: 41
|
||||||
29.12.2012, 15:22 | 2 | |||||
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
29.12.2012, 15:43 | 4 |
kravam, Средствами языка все же никак. Присвоение ведь идет не на этапе компиляция
0
|
113 / 113 / 28
Регистрация: 05.07.2009
Сообщений: 225
|
|
29.12.2012, 15:49 | 5 |
kravam, заблокировать присвоение переменной определённого значения до этапа компиляции конечно возможно (теоретически, с использованием интерпретатора), однако бессмысленно, т.к большинство программ получает данные извне, что невозможно контролировать на этапе компиляции. Если же ваша переменная не зависит от внешней среды и входных данных, то лучше, наверное, написать для неё специальный класс и перегрузить оператор присваивания, так будет гораздо проще
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
29.12.2012, 16:00 | 7 |
diagon, static_assert соглашусь. assert - нет. первое - не этап компиляции, второе - только отладочный режим.
0
|
OhMyGodSoLong
|
29.12.2012, 16:00
#8
|
Не по теме: Использовать Haskell.
1
|
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
|
|
29.12.2012, 17:19 | 9 |
не по теме, но как-то на защиту к нам зашел другой преподаватель, и когда я заговорил о константах, он сказал "а хочешь я докажу, что констант не существует?", правда я ответил "нет спасибо" и он не стал говорить, но, всё же, что он имел ввиду?
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
30.12.2012, 12:23 | 12 |
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
||||||
30.12.2012, 12:44 | 13 | |||||
Легко. Вот это неправильный код, реализующий умножение двух чисел:
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
30.12.2012, 12:46 | 14 |
По языку здесь всё правильно, синтаксическую проверку прога пройдёт.
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
30.12.2012, 12:47 | 15 |
Вот только функция не делает то, что должна делать.
0
|
Неэпический
|
|
30.12.2012, 12:47 | 16 |
Код правильный, точнее валидный но компилятор же не знает что нужно программисту. Тут логика не та и это уже не заботы компилятора. В конце концов, если клавиатура сломана, он еще и печатать должен за программиста?
Компьютер невероятно быстрая и в тоже время необычайно тупая машина. Не помню в какой книге вычитал(точно учебник Си++).
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
30.12.2012, 13:13 | 17 |
С чьей точки зрения должна? Она делает то, как написана, то есть то, что должна делать с точки зрения компилятора. А то, что "программист" не понимает смысла собственных действий, к делу не относится. Чтоб не допускать семантических ошибок, надо думать, что пишешь, и знать язык, а синтаксически функция правильна.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||
30.12.2012, 14:33 [ТС] | 18 | ||||||||||
Так-то из области фантастики задача, но хоть ЧТО-ТО мы ведь можем проконтролировать? Щас вот изучаю C# так там прямо сказано- они частично ошибки времени выполнения делаю ошибками компиляции с помощью хитрой какой-то перетипизации
+++++++++++++++++++++++++++++++++++++++++++ Ну вот допустим я пишу так (ошибочно!)
Ну то есть чтобы был контроль типов. Чтобы логика компилятора была примерно такая:
2) Определяем, что параметром к этому оператору может идти какой-нибудь класс T1 3) Пытаемся перетипизировать (T1)8, а не получается 4) Вот и ошибка компиляции. Как-то так.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
30.12.2012, 15:08 | 19 |
Конструктор не работает на этапе компиляции и как ты не проверяй параметр в конструкторе, компилятор не сможет понять, чего ты хотел. Он может только формально перевести текст в код, но не проанализировать логику на предмет того, какую сгенерить "пользовательскую" гугломессагу. Он понимает лишь алгоритмы, но не их назначение. Единственное, как можно конкретное значение запретить при компиляции, это сделать его не представимым, например, сократить разрядность до 3-х бит, тогда диапазон представимых чисел от ноля до семи, восемь в него не входит.
Добавлено через 1 минуту Можно, конечно, каждое разрешённое значение закейсовать, но это перенос проблемы и её усугубление, а не решение: можно ошибиться при написании миллиардов кейсов и компилятор это проглотит.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
30.12.2012, 15:50 | 20 |
taras atavin, Это знаете-ли неправда. constexpr конструкторы никто не отменял.
0
|
30.12.2012, 15:50 | |
30.12.2012, 15:50 | |
Помогаю со студенческими работами здесь
20
Как заставить компилятор применить нужную команду Как заставить компилятор выводить имя файла? Как заставить компилятор делать определенный отступ между методами Как заставить компилятор давать имена символам, соответствующие названиям функций? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |