LINUX.ORG.RU
ФорумTalks

TDD для компиляторов

 , ,


0

1

Почему почти никакие (распространённые, тем более) компиляторы не используют модульные тесты или вообще TDD при разработке? Удалось нагуглить только поделки студентов. Гуру программирования не умеют в современные средства разработки?

Это же так просто. Есть стандарт, который почти формальным языком описывает конструкции языка и поведение скомпилированного кода. Перевести это в юнит-тест - такая трудная задача? А так можно было бы точно знать, какие фичи уже поддерживаются, какие нет, на сколько процентов компилятор соответствует стандарту. Не было бы срачей типа «в моём компиляторе это поддерживается, а ты иди в биореактор».

Только clang/llvm имеет хоть какие-то модульные тесты в дереве, да и то, пользуются ими энтузиасты при разработки своих лексеров.

IRL на работе от тебя требуют «джвести фич к вечеру прикрутить», а тесты... ну не будет их - и ладно, лишь бы джвести фич было. Наверняка те энтузиасты, которым хватает сил вечером еще и компиляторы пилить, уже слишком деформированы RL чтобы делать «правильно»

stevejobs
()

А конкретно, какие именно? gcc использует, вроде. По крайне тест-сьют у него вроде был. И еще, он бутстрапится (причем в 3 шага) — сойдет за тесты?

Mono тоже имеет test suite. И пых тоже. И sbcl вроде. Это из того, что приходилось тыкать в последнее время.

Sectoid
()
Последнее исправление: Sectoid (всего исправлений: 1)

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

Юнит-тесты и TDD для этого не нужны, для этого есть специальные наборы тестов проверяющие соответствие реализации спецификации языка.

anatolat
()

Есть стандарт, который почти формальным языком описывает конструкции языка и поведение скомпилированного кода. Перевести это в юнит-тест - такая трудная задача?

Это не юнит-тест.

quiet_readonly
()

чтобы покрыть те тонны кода, которые есть в clang/llvm нужно тупо пропустить пару релизов, потратив время на написание тестов. к тому же далеко не факт, что изначально пацаны выполнили декомпозицию кода достаточно для независимого тестирования отдельных сущностей.

я бы им посоветывал бахнуть гору функциональных тестов под каждую новую фичу, которую мержат в мастер, там и работы не много будет и жопа прикроется.

x0r
()

Компиляторы относятся к классу самоверифицирующихся программ. Если компилятор не прошёл «теста» на собственную компиляцию из нескольких поколений, то такой компилятор не для релиза.

iZEN
()

Почему почти никакие (распространённые, тем более) компиляторы не используют модульные тесты или вообще TDD при разработке? Удалось нагуглить только поделки студентов. Гуру программирования не умеют в современные средства разработки?

Может, просто «гуру программирования» могут написать 20 строк корректного кода, не написав под него 100 строк юнит-тестов? Ну а студенты, соответственно, не могут. В результате первые продумывают алгоритм и, если нужно, покрывают тестами, а вторые обязательно пишут несколько тестов, а потом набор костылей и подпорок, который хоть как-то проходит их.

И вообще, софт сегодня - слишком динамично развивающаяся область, и писать на каждую строку кода 5 строк тестов - это добровольно сокращать свою производительность в шесть раз. При том, что через полгода весь код будет, возможно, выкинут на свалку вместе с тестами и заменён новым.

Ну и stevejobs верно написал - сегодня пользователи являются тестерами, так что тесты в принципе и не нужны, если софтина не управляет ядерным реактором, - пользователи сами и протестируют и в багтрекер напишут.

З.Ы. Сам являюсь веб-разработчиком, где 90% кода - это интеграция с внешними сервисами (отправить HTTP-запрос, распарсить ответ) или реализация прокладки между пользователем и сервером БД, и для написания юнит-тестов придётся мОчить половину реальной системы, так что тесты просто нерентабельны.

pv4
()

Почему почти никакие (распространённые, тем более) компиляторы не используют модульные тесты или вообще TDD при разработке?

а зачем? есть ведь CL, есть пайтон, есть php наконец! Если ты накручиваешь говнокод из говна и палок по принципу «лишь бы работало» (TDD по-русски), то накручивай. При чём тут компиляторы? В C/C++ этот подход работает плохо, можешь их за это ненавидеть.

drBatty
()
Ответ на: комментарий от schizoid

Ты, видимо, даже не понял, что такое TDD.

И что же это?

В идеале тесты TDD - это замена (или дополнение) техническому заданию, соответствие которой может быть проверено автоматически. Т.е. по сути, это удешевление и упрощение этапа тестирования и увеличение надёжности системы.

Однако грамотное построение тестов требует столько же, если не больше, времени, как и написание кода. Немногие готовы за это платить. Для среднестатистического заказчика проще заплатить за ТЗ, написанное быстро и на относительно понятном ему языке, и потом вручную пару раз пройтись по заложенному функционалу, чтоб убедиться, что всё работает. Потому что когда внезапно обнаружится, что получилось не то что он хотел и надо будет всё переделать, это можно будет сделать _быстро_.

Я пытался в каком-то виде применить это для своих проектов, но не получалось. Когда в системе 500 тестов и ты добавляешь функцию, предварительно написав для неё 5-10 тестов, удобно видеть, что ничто не сломалось. Однако, на написание тех 500 тестов уходит столько времени и рефакторинга, что в моём случае выигрыша это не давало.

Можешь продемонстрировать _выгоду_ от TDD на конкретном примере? Статьи в интернете, которые показывают, как удобно можно покрыть тестами встроенную в язык операцию сложения, увеличив время разработки всего в 5-10 раз, не считаются.

pv4
()
Ответ на: комментарий от pv4

В идеале тесты TDD - это замена (или дополнение) техническому заданию, соответствие которой может быть проверено автоматически. Т.е. по сути, это удешевление и упрощение этапа тестирования и увеличение надёжности системы.

Это правильно. Но в предыдущем твоём посте было не об этом, а о модульных тестах вообще.

Однако грамотное построение тестов требует столько же, если не больше, времени, как и написание кода.

Однако грамотное проектирование требует столько же, если не больше, времени, как и написание кода.

Как это можно вообще сравнивать?

Я пытался в каком-то виде применить это для своих проектов, но не получалось.

У меня тоже не сразу получалось. Это же не повод махнуть рукой. Наверное, у меня просто были перед глазами примеры того, как люди эффективно это применяли.

Однако, на написание тех 500 тестов уходит столько времени и рефакторинга, что в моём случае выигрыша это не давало.

Вот этого не понимаю в упор. У меня для небольшого приложения уходит либо две недели на проектирование и написание (с многочисленными итерациями), либо два-три дня на создание тестов и два-три дня на написание кода по тестам. Где вы все берёте этот оверхед?

Можешь продемонстрировать _выгоду_ от TDD на конкретном примере? Статьи в интернете, которые показывают, как удобно можно покрыть тестами встроенную в язык операцию сложения, увеличив время разработки всего в 5-10 раз, не считаются.

«Приведи пример, только не приводи примера.» Как ты себе это представляешь?

schizoid
() автор топика
Ответ на: комментарий от pv4

Можешь продемонстрировать _выгоду_ от TDD на конкретном примере? Статьи в интернете, которые показывают, как удобно можно покрыть тестами встроенную в язык операцию сложения, увеличив время разработки всего в 5-10 раз, не считаются.

Kent Beck - Test-Driven Development by Example

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.