LINUX.ORG.RU
ФорумTalks

А почему из c11 выкинули complex.h?

 , , тормоз


0

2

Предыстория: жил себе не тужил и вдруг выяснил, что в c99 были комплексные числа из коробки: https://ru.wikipedia.org/wiki/Complex.h Но радость была недолгой, так как выяснилось что оные были выставлены на мороз (сделаны необязательными) в с11: https://en.wikipedia.org/wiki/C11_(C_standard_revision)#Optional_features

Кто-нибудь помнит почему?

Аналогично были выкинуты Variable length arrays

★★★★★

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

WG14 немного более открытая, чем другие рабочие группы ISO, так что документацию можно найти. Конкретно эти изменения внесены N1443. MISRA C рекомендует не использовать комплексные числа и VLA. Разработчики компиляторов для всякого эмбеддеда хотят чтобы их компиляторы формально соответствовали стандарту, но не хотят реализовывать хлам, который им никогда не понадобится.

ilammy ★★★
()
Ответ на: комментарий от fsb4000

Complex - мало кому нужны.

Есть области, где это не так. Не даром, до сих пор Fortran существует в современности в том числе и потому, что комплексные числа там из коробки от рождения.

VLA - дыра и уязвимость + мало кому нужны.

Про мало кому нужны сильно, сильно не уверен.

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от ilammy

Понятно, то есть это «заговор продавцов фитнесс-тренажёров» ☺ Хотя казалось бы для встроенных реализаций свой стандарт есть…

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

Про мало кому нужны сильно, сильно не уверен.

По моей ссылке:

True. Here are some of the known problems with VLAs:

- Putting arbitrarily large arrays on the stack causes trouble
in multithreaded programs in implementations where stack growth
is bounded.

- There's no way to recover from an out-of-memory condition when
allocating a VLA.

- Microsoft declines to support them.

- VLAs aren't used much. There appear to be only three in
Google Code, and no VLA parameters. The Linux kernel had one,
but it was taken out because there was no way to handle an
out of space condition. (If anyone can find an example of
a VLA parameter in publicly visible production code, please
let me know.)

- The semantics of VLA parameters is painful. They're
automatically reduced to pointers, with the length information
lost. "sizeof" returns the size of a pointer.

- Prototypes of functions with VLA parameters do not have
to exactly match the function definition. This is
incompatible with C++ style linkage and C++ function
overloading, preventing the extension of this feature
into C++.

John Nagle 
fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

Тут перечислены причины почему это «сложно сделать», а не почему это «мало кому нужно» кроме 4 пункта, с которым как бы далее по треду спорят с некоторым количеством примеров.

Причина почему это не широко используется вызвано разнобоем среди компиляторов вида gcc поддерживает, а clang болт забивает, а не тем, что это «мало кому нужно».

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

Evgueni ★★★★★
() автор топика
Последнее исправление: Evgueni (всего исправлений: 2)
Ответ на: комментарий от luke

Проблема не в том, что в стандарте, а что имплементируется.

Вот, например, я столкнулся на уроке информатике: один юный питонист написал программу с VLA один в один из примеров стандарта c99 (не специально, в смысле я говорил ранее что так делать не стоит, но он не слушал), а при сборке с помощью clang программа пухла и дохла (с gcc таких проблем нет).

Ну и complex.h это не из плюсов, а из Fortran 77.

Evgueni ★★★★★
() автор топика
Последнее исправление: Evgueni (всего исправлений: 2)
Ответ на: комментарий от X512

Ну что же тут поделать, когда всё доброе и вечное в качестве основы имеет копролит ибо всё остальное уж очень жидкое по своей субстанции…

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

Что, шланг не может в 99 стандарт? Надо им накатать тогда.

Оффтоп: что, в ФМШ Паскаль теперь не в моде?

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

Скорее всего «может C11», где на это можно болт положить.

Мы там поговорили и решили: ну этот Паскаль нафиг…

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

Да тот же Fortran 77 куда удобнее для работы с комплексными числами, он древнее Си. Си – это историческое недоразумение, наспех сделанная замена ассемблера для UNIX в 1972 году всё ещё используется.

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

Я посмотрел описание complex.h и не вижу чем оно хуже, чем то, что есть в Fortran 77. IMHO в данном случае наличие лучше, чем отсутствие.

Ну и вы говорите так, как будто портабельная замена ассемблеру это что-то плохое. Как минимум оно хорошо тем, что Ритчи смог продолжить играть на PDP-11 в Астероиды без необходимости писать новую ОС на ассемблере.

Evgueni ★★★★★
() автор топика
Последнее исправление: Evgueni (всего исправлений: 6)
Ответ на: комментарий от luke

Хорошая идея. Я подумаю, но это в любом случае не ранее следующего полугодия, а там я скорее всего отойду от этих дел.

Evgueni ★★★★★
() автор топика
Последнее исправление: Evgueni (всего исправлений: 1)
Ответ на: комментарий от LikeABoss

Это школьники выискивают пути обхода учительских заданий через использование новых стандартов.

luke ★★★★★
()
Ответ на: комментарий от LikeABoss

Сишники случается используют gcc вообще-то.

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от luke

Да нет. Они ничего про эти стандарты не знают (в этом конкретном случае точно), просто пишут как им говорили в своё время на Python. То, что оно совпало с примером из C99 не более чем случайность вызванная аналогией.

Evgueni ★★★★★
() автор топика
Последнее исправление: Evgueni (всего исправлений: 2)
Ответ на: комментарий от ilammy

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

никогда не понадобится

очень громко сказано.

aiqu6Ait ★★★★
()

Все правильно сделали.

Reset ★★★★★
()

Аналогично были выкинуты Variable length arrays

туда им и дорога. Нужны динамические массивы - используй malloc/realloc

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

На самом деле не так, если нужны complex и нормальные динамические массивы, то надо использовать Fortran 95.

Reset ★★★★★
()
Ответ на: комментарий от X512

Си – это историческое недоразумение, наспех сделанная замена ассемблера для UNIX

А если не наспех, то как нужно было делать?

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

лисп-машинам это не мешало…

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

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

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

Это да, но чтобы их изжить коммерческим компиляторам Паскаль потребовалось 10+ лет, а к тому времени C уже заховал весь мир и тоже поменялся.

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от X512

Он там был ажно в 1975 году, что неудивительно, так как эти проекты имеют общие корни.

Evgueni ★★★★★
() автор топика
Последнее исправление: Evgueni (всего исправлений: 1)
Ответ на: комментарий от X512

На Паскале например.

Язык для обучения студентов, появился в 1970, то есть в самом начале разработки UNIX. По моему тогда там ещё не было указателей. Даже Никлаус Вирт использовал Оберон для написания ОС, но это было гораздо позже.

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

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

cobold ★★★★★
()

Не даром, до сих пор Fortran существует в современности в том числе и потому, что комплексные числа там из коробки от рождения.

В стародавние времена ещё была изкоробочная реализация XSC Languages (C-XSC, PASCAL-XSC) ©.

quickquest ★★★★★
()
Ответ на: комментарий от X512

или сделать новый, язык простой

Ну так версия K&R языка C была довольно простой. Что действительно становилось источником сложности, так это макросы препроцессора, а в дальнейшем и все эти auto tools. Типичный системный код на C - это заросли всего этого малопонятного мусора, поверх основного не сложного кода. Ну и ещё ограничения памяти и прочие ограничения железа провоцировали прочие нечитабельные конвенции, как например слишком короткие названия переменных, длина строки не больше перфокарты (80 символов) и прочее.

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

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

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

Нет цели изучать информатику. Есть цель изучать элементы информатики полезные при работе по предметной области. Паскаль в таком разрезе не нужен.

Evgueni ★★★★★
() автор топика
Последнее исправление: Evgueni (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.