Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 28 мар 2024, 13:55

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Re: Модульность и язык Си
СообщениеДобавлено: 18 фев 2018, 17:59 
Не в сети

Сообщения: 146
vlad писал(а):
Еще раз - посмотрите на реакцию prospero78su.
Мне бывает сложно общаться с prospero78su, но в этом-то его ответе что не так? Вам не поправилась гиперболизация? Это ещё одна особенность человеческой речи. Понимать его слова следует приблизительно так - писать на Си в модульном стиле неудобно по сравнению с модульными языками. Не согласны? Считаете, что его реакция изменилась бы, если в пункте с grep не было бы излишней конкретизации?


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Модульность и язык Си
СообщениеДобавлено: 18 фев 2018, 18:26 
Не в сети

Сообщения: 108
Вот мои альтернативные правила, без драмы:

1. Модуль в С = .h + .c

2. В .h файл кладется только то, что потом требуется импортить другим модулям, включая прототипы функций, экспортируемые данным модулем.
Хотя С и позволяет вызвать необъявленные функции, такой вызов считается устаревшей и плохой практикой (компилятор выдаст варнинг и не сможет проверить соответствие типов аргументов, что в итоге приведет к ошибке линковки).

3. Все остальное кладется в .с файл. Если для реализации модуля используются неэкспортируемые функции и глобальные переменные, то они должны быть объявлены как static, чтобы избежать перекрытия с одноименныи функциями переменными из других модулей (ошибка линковки).

4. Модуль "импортируется" с помощью #include "module_name.h". При этом становятся доступны типы и экспортируемые функции из module_name.

5. Каждый .c файл первым делом #include свой .h файл, чтобы у компилятора была возможность проверить соответствия прототипов функций из .h реализованным фунциям в .c. Кроме того, для реализации модуля скорее всего потребуются описания типов их .h.

Все. Что я упустил по существу из оригинальных правил?


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Модульность и язык Си
СообщениеДобавлено: 18 фев 2018, 19:45 
Не в сети

Сообщения: 146
vlad писал(а):
Сформулировано коряво, но "не буду придираться к словам". Не буду также упоминать, что есть довольно распространненная практика по более детальному делению хедеров в С++ на forward declaration, декларации классов и декларации определений шаблонов. Т.е. хередров будет более одного и ничего крамольного в этом не будет.
Цитата:
• Внешней вызывающей процедуре об этом модуле должны быть известны только комментарии в header-файле.

[1]Еще более коряво. Но тоже можно догадаться чего имел ввиду автор. Однако суть правила не раскрыта. Использовать что-то, что не задекларировано в С невозможно и без всяких правил, это все-таки не динамический язык. Единственное исключение - вызов функции без прототипа, который специфичен только для С (не С++) и "правило" для которого описано ниже.
Это не единственное ограничение. Во-первых, в самом Си -файле можно наобъявлять что угодно и привести к чему угодно и вызвать что заблагорассудиться, во-вторых, люди часто злоупотребляют грубой работой с памятью, чему способствует знание содержания Си файла и расчёт на то, что это не случайная особенность текущего состояния реализации.

Цитата:
Цитата:
• Для проверки целостности каждый модуль должен импортировать свой собственный header-файл.
Какой целостности? Без контекста выглядит просто как пугалка. Не написал "#include" и все, никакой целостности? Тут мне не догадаться, бред 100%.
Оно и с #include не гарантирует целостности, но include даёт компилятору больше возможности проверки соответствия интерфейса и реализации.

Цитата:
Цитата:
• Прототипы функций можно использовать только в header-файлах. (Это правило необходимо, поскольку язык Си не имеет механизма проверки того, что функция реализуется в том же модуле, что и ее прототип; так что использование прототипа может маскировать ошибку «отсутствия функции» — «missing function»).
Бред 100%. Но можете попробовать переформулировать.
Не бред и даже не знаю, нужно ли это переформулировать, чтобы Вам угодить. Можно, конечно, уточнить, что автор забыл о возможности косвенной рекурсии.
Цитата:
Цитата:
• Любая глобальная переменная в модуле, и любая функция, кроме той, что импортируется через header-файл, должны быть объявлены статическими.
Специфично для C. Для С++ для этого есть анонимный namespace. Опять же, что будет если не следовать этому правилу не поясняется. Потеря целостности? :) На самом деле или ничего не будет или будет ошибка линковки.
Если в N Си-файлах окажутся переменные с одним именем, где >=N-1 объявлений будут без инициализаторов, то в конечной программе будет объявлена только одна переменная без ошибок связывания. В больших программах это не такая уж невозможная ситуация, сталкивался. Если есть возможность, то может помочь опция -flto. Также, доступность внутримодульных переменных извне по имени - это да, нарушение целостности.

И так далее. Пока надоело писать.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Модульность и язык Си
СообщениеДобавлено: 18 фев 2018, 21:57 
Не в сети

Сообщения: 108
Comdiv писал(а):
vlad писал(а):
Единственное исключение - вызов функции без прототипа, который специфичен только для С (не С++) и "правило" для которого описано ниже.
Это не единственное ограничение. Во-первых, в самом Си -файле можно наобъявлять что угодно и привести к чему угодно и вызвать что заблагорассудиться,


Зачем? Любое злоупотребление имеет смысл и совершается только тогда, когда правильный способ неочевиден или неудобен (больше букв писать, грубо говоря). "Наобъявлять и вызывать" конечно можно, но тупо написать #include и очевиднее и удобнее и правильнее.
Так же как в обероне можно сделать IMPORT SYSTEM и начать калечить память - зачем?

Comdiv писал(а):
во-вторых, люди часто злоупотребляют грубой работой с памятью, чему способствует знание содержания Си файла и расчёт на то, что это не случайная особенность текущего состояния реализации.


Такая проблема есть, но существующие возможные подходы к инкапсуляции потрохов в С вообще никак не покрыты обсуждаемыми правилами. Кроме весьма неоднозначного (бредового) предложения работать с хедерами и объектными файлами...

Цитата:
Оно и с #include не гарантирует целостности, но include даёт компилятору больше возможности проверки соответствия интерфейса и реализации.


Ну я так и написал в своей редакции правил :) Но понять что значит в оригинале "контоль целостности" сложно, а звучит страшно.

Цитата:
Цитата:
Цитата:
• Прототипы функций можно использовать только в header-файлах. (Это правило необходимо, поскольку язык Си не имеет механизма проверки того, что функция реализуется в том же модуле, что и ее прототип; так что использование прототипа может маскировать ошибку «отсутствия функции» — «missing function»).
Бред 100%. Но можете попробовать переформулировать.
Не бред и даже не знаю, нужно ли это переформулировать, чтобы Вам угодить. Можно, конечно, уточнить, что автор забыл о возможности косвенной рекурсии.


Я так и не понял, какую проблему имел ввиду автор даже после твоего пояснения. Использования прототипов для неэкспортируемых функций внутри .с/.cpp обычная практика... Рекурсивный вызов только пример того, когда это неообходимо больше всего.


Цитата:
Цитата:
Цитата:
• Любая глобальная переменная в модуле, и любая функция, кроме той, что импортируется через header-файл, должны быть объявлены статическими.
Специфично для C. Для С++ для этого есть анонимный namespace. Опять же, что будет если не следовать этому правилу не поясняется. Потеря целостности? :) На самом деле или ничего не будет или будет ошибка линковки.
Если в N Си-файлах окажутся переменные с одним именем, где >=N-1 объявлений будут без инициализаторов, то в конечной программе будет объявлена только одна переменная без ошибок связывания. В больших программах это не такая уж невозможная ситуация, сталкивался. Если есть возможность, то может помочь опция -flto.


Видимо это особенность твоего компилятора. Мои всегда ругались на mutiple instances или че-то такое. Впрочем я это тоже отразил в моей редакции правил...

Цитата:
И так далее. Пока надоело писать.


Я вообще не понимаю, чего вы вступились за эти правила. Сформулированы откровенно хреново, с упором на критику, а не на понимание "как надо". Попробуй сравнить с моими и сказать, что в моих не хватает. При том, что мои короче в несколько раз и без истерик про целостность.
Ну и нагуглить можно что-то более подробное и адекватное, вот самая первая ссылка: http://umich.edu/~eecs381/handouts/CHea ... elines.pdf


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Модульность и язык Си
СообщениеДобавлено: 19 фев 2018, 08:20 
Не в сети

Сообщения: 28
  1. Закатить истерику по поводу правил
  2. Придумать такие-же, но "без истерик"
  3. ???????
  4. PROFIT


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Модульность и язык Си
СообщениеДобавлено: 20 фев 2018, 00:26 
Не в сети

Сообщения: 146
vlad писал(а):
Зачем?
Я ответил на "невозможно". Также могу заверить, что находятся люди, которые уверены, что знают зачем.

Цитата:
Такая проблема есть, но существующие возможные подходы к инкапсуляции потрохов в С вообще никак не покрыты обсуждаемыми правилами. Кроме весьма неоднозначного (бредового) предложения работать с хедерами и объектными файлами...
Ваше обращение с отрицанием и "кроме" потрясающе. Не только в этом утверждении.

Цитата:
Ну я так и написал в своей редакции правил :)
Зачем же тогда это критиковать.
Цитата:
Но понять что значит в оригинале "контоль целостности" сложно, а звучит страшно.
Остальные как-то поняли. Видимо сказывается разница в настрое.

Цитата:
Использования прототипов для неэкспортируемых функций внутри .с/.cpp обычная практика...
Для Си много чего обычная практика, чему не стоило быть таким, но язык провоцирует.

Цитата:
Видимо это особенность твоего компилятора. Мои всегда ругались на mutiple instances или че-то такое. Впрочем я это тоже отразил в моей редакции правил...
Какого именно из моих - gcc, clang, tcc, ccomp и т.д.(visual studio не пользуюсь)? Вообще-то это особенность языка, который, как уже неоднократно упоминалось, совсем не c++.

Цитата:
Я вообще не понимаю, чего вы вступились за эти правила.
Я отвечал на конкретные утверждения, которые, на мой взгляд, были неверны.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Модульность и язык Си
СообщениеДобавлено: 20 фев 2018, 06:14 
Не в сети

Сообщения: 108
trurl писал(а):
  1. PROFIT


Да, конструктива не получилось, но я сам виноват...


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Модульность и язык Си
СообщениеДобавлено: 20 фев 2018, 07:49 
Не в сети

Сообщения: 203
vlad писал(а):
trurl писал(а):
  1. PROFIT

Да, конструктива не получилось, но я сам виноват...

Да, trurl что-то удивил, пора ему менять имя на troll... Хотя, произносятся эти два слова практически одинаково же...


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Модульность и язык Си
СообщениеДобавлено: 20 фев 2018, 07:56 
Не в сети

Сообщения: 203
Вообще, не понимаю смысла обсуждать "Проблемы модульности в Си". Ну не является Си модульным языком, чего вы насилуете этот трупик? Пользуйтесь С++ уже наконец, он даже в режиме "Си с классами" даёт преимущества более строгой типизации, например... Пространства имён в С++ делают его почти модульным языком, и, в отличии от оберона, в нём есть перечислимый тип!!! Профит же!


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Модульность и язык Си
СообщениеДобавлено: 20 фев 2018, 08:29 
Не в сети

Сообщения: 28
vlad писал(а):
Да, конструктива не получилось, но я сам виноват...

Да, статью не назовешь образцом стиля. Но ведь Ваша критика не лучше. Все эти "бред", "а вот в С++", отсылки к поведению каких-то компиляторов и т.п. отнюдь не способствут ясности изложения.


Последний раз редактировалось trurl 20 фев 2018, 08:50, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club