IT в России и мире в реалиях мирового кризиса

1,395,831 8,447
 

Фильтр
adolfus
 
Слушатель
Карма: +18.92
Регистрация: 12.02.2010
Сообщений: 11,943
Читатели: 2
Цитата: ivan2 от 07.11.2024 10:03:16Все исполняемые коды делаются из ассемблера.

Не факт. В общем случае файл на ассемблере -- просто промежуточный или левый файл, геерируемый компилятором по запросу программиста опцией -S.  Если нет этой опции может сразу генерироваться объектный код для компоновщика. Может использоваться встроенный кросс-ассемблер, которому передается псевдокод из оптимизатора. Ветка генерации ассемблера может быть тупиковой и заканчиваться формированием .s/.asm файла, а процесс генерации объектного кода может идти параллельно и не факт, что .s-файл будет ассемблирован в тот же .o-файл, что генерируется без опции -S.
  • -0.02 / 3
  • АУ
ivan2
 
russia
Санкт-Петербург
63 года
Слушатель
Карма: +7.07
Регистрация: 16.11.2008
Сообщений: 9,918
Читатели: 1
Цитата: adolfus от 07.11.2024 13:49:00Не факт. В общем случае файл на ассемблере -- просто промежуточный или левый файл, геерируемый компилятором по запросу программиста опцией -S.  Если нет этой опции может сразу генерироваться объектный код для компоновщика. Может использоваться встроенный кросс-ассемблер, которому передается псевдокод из оптимизатора. Ветка генерации ассемблера может быть тупиковой и заканчиваться формированием .s/.asm файла, а процесс генерации объектного кода может идти параллельно и не факт, что .s-файл будет ассемблирован в тот же .o-файл, что генерируется без опции -S.

Вы откровенно ФЛУДИТЕ. Замыливая спор.Я прямо сказал, что на ассемблере любая разница будет видна.
Что return, что ret. что return (x). Причём х может быть выражением, возвращающим значение. Даже вектор, как нам выше показывали, НО НА САМОМ ДЕЛЕ ВОЗВРАШАЕТСЯ АДРЕС.
Просто надо посмотреть писание на ассемблере.
Отредактировано: ivan2 - 07 ноя 2024 14:03:02
Нам нужен мир!
Желательно весь.

Измаил должен быть взят!
  • +0.00 / 0
  • АУ
adolfus
 
Слушатель
Карма: +18.92
Регистрация: 12.02.2010
Сообщений: 11,943
Читатели: 2
Цитата: ivan2 от 07.11.2024 13:50:59Вы откровенно ФЛУДИТЕ. Замыливая спор.Я прямо сказал, что на ассемблере любая разница будет видна.
Что return, что ret. что return (x). Причём х может быть выражением, возвращающим значение. Даже вектор, как нам выше показывали, НО НА САМОМ ДЕЛЕ ВОЗВРАШАЕТСЯ АДРЕС.
Просто надо посмотреть писание на ассемблере.

Ну так посмотрите, кто вам мешает. Я, вообще-то использую асемблер в повседневной своей работе. Мало того, еще три года учил таких как вы его использованию. Как автономно, так и в составе проектов на си и си++.

return x и return (x) генерируют один и тот же код. Причем всегда x будет значением (или объектом), которое возвращается. Где объект возвращается, зависит от ABI. НЯП из Agner Fog, все 64-разрядные никсы имеют одинаковый ABI (но это не точно), ну а шинды, как всегда свой.
Под катом две функции и их вызов:

Скрытый текст

А ниже код из стрелы

Скрытый текст

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

Исходники:
Скрытый текст

Код:

Скрытый текст
  • +0.00 / 3
  • АУ
ivan2
 
russia
Санкт-Петербург
63 года
Слушатель
Карма: +7.07
Регистрация: 16.11.2008
Сообщений: 9,918
Читатели: 1
Цитата: adolfus от 07.11.2024 15:18:17Ну так посмотрите, кто вам мешает. Я, вообще-то использую асемблер в повседневной своей работе. Мало того, еще три года учил таких как вы его использованию. Как автономно, так и в составе проектов на си и си++.

return x и return (x) генерируют один и тот же код. ...

О! Ну слава си-богам.
А то тут некоторые пытались нас как ксёнзы охмурить, и сбить с пути.
return x и return (x) генерируют один и тот же код.
Только:        
nop
leave
вызывает интерес.
Ну ладно  leave. Это понятно.
А nop это как и зачем?
Отредактировано: ivan2 - 07 ноя 2024 18:31:03
Нам нужен мир!
Желательно весь.

Измаил должен быть взят!
  • +0.00 / 0
  • АУ
ps_
 
Слушатель
Карма: +11.56
Регистрация: 04.04.2009
Сообщений: 3,803
Читатели: 2
Цитата: adolfus от 07.11.2024 13:17:07Проблема современного C++, кстати, и C тоже, состоит в том, что никто не желает понять, как оно работает, а желает, чтобы оно работало так, как он это понимает. В результате вселенский треп о "небезопасности" си и си++, ну и клятое UB.

Я про это и писал. Если для использования языка мне надо изучить полторы тысячи страниц сложного технического текста, то МНЕ этот язык не подходит. И я желаю ему умереть, как умер Кобол и умирает Фортран (в последних стандартах в него добавили кучу возможностей, но это никого не интересует)
Я помню, как с++ из простой идеи "с++ с классами как в Smalltak" превратился в современного монстра. Пусть умрет с миром.
А я пойду rust изучать
  • +0.04 / 2
  • АУ
ps_
 
Слушатель
Карма: +11.56
Регистрация: 04.04.2009
Сообщений: 3,803
Читатели: 2
Цитата: ivan2 от 07.11.2024 15:42:53О! Ну слава си-богам.
А то тут некоторые пытались нас как ксёнзы охмурить, и сбить с пути.
return x и return (x) генерируют один и тот же код.

Естественно, что код генерируемый return будет одинаковый для x и (x).
А вот код до и после вызова функции будет разный.

И если я случайно забуду скобочки вокруг x, то программа будет работать неправильно.
  • +0.00 / 0
  • АУ
ivan2
 
russia
Санкт-Петербург
63 года
Слушатель
Карма: +7.07
Регистрация: 16.11.2008
Сообщений: 9,918
Читатели: 1
Цитата: ps_ от 07.11.2024 17:29:21Естественно, что код генерируемый return будет одинаковый для x и (x).
А вот код до и после вызова функции будет разный.

И если я случайно забуду скобочки вокруг x, то программа будет работать неправильно.

Слабо пример привести?
На конкретном компиляторе, который такое делает. Что бы я запомнил.
Нам нужен мир!
Желательно весь.

Измаил должен быть взят!
  • +0.00 / 0
  • АУ
ps_
 
Слушатель
Карма: +11.56
Регистрация: 04.04.2009
Сообщений: 3,803
Читатели: 2
Цитата: ivan2 от 07.11.2024 17:33:03Слабо пример привести?
На конкретном компиляторе, который такое делает. Что бы я запомнил.

Мне лениво.
Я просто привел пример как введение оператора typedecl сделало в с++ return x и return (x) семантически разными.
И по моему это неправильно.
Продолжать дискуссию дальше а не хочу.
  • +0.00 / 0
  • АУ
Прокруст
 
Слушатель
Карма: +1.75
Регистрация: 25.01.2014
Сообщений: 1,524
Читатели: 1
Цитата: ps_ от 07.11.2024 17:18:52Я про это и писал. Если для использования языка мне надо изучить полторы тысячи страниц сложного технического текста, то МНЕ этот язык не подходит. И я желаю ему умереть, как умер Кобол и умирает Фортран (в последних стандартах в него добавили кучу возможностей, но это никого не интересует)
Я помню, как с++ из простой идеи "с++ с классами как в Smalltak" превратился в современного монстра. Пусть умрет с миром.
А я пойду rust изучать

Собственно язык С++ - состоит из основы С и фич. Много фич. Крутых фич. Отличная штука для понтов.
К сожалению мне потребовалось много времени чтобы это понять.
Но таки перешел обратно на С - и перестал разгадывать загадки с шаблонами, просто кодирую. И как-то  про объектность перестал думать, достижение цели внезапно стало важнее.
PS.
rust - язык для мазохистов. Для тех кому нравится чтобы компилятор придирался как законченный бюрократ.
Сами пишите тесты в умеренном количестве - и будет вам работающий код.
Отредактировано: Прокруст - 07 ноя 2024 20:14:19
  • +0.07 / 3
  • АУ
ivrom
 
united_states_of_america
Las Vegas
53 года
Слушатель
Карма: +8.32
Регистрация: 16.03.2017
Сообщений: 576
Читатели: 4
Цитата: ps_ от 07.11.2024 17:18:52Я про это и писал. Если для использования языка мне надо изучить полторы тысячи страниц сложного технического текста, то МНЕ этот язык не подходит.
Скрытый текст


Вот это вот высказывание и показывает, что вы абсолютно не понимаете саму концепцию С++. Совсем не обязательно использовать всю мощь С++ если вам это не надо или он вам не по силе. Огромная часть стандарта С++ посвящена шаблонам и STL. Если не используете это - то и не читайте. Если рассматривать только функциональное программирование, то С++ полностью обратно совместим с С. Хотите писать как на С - пожалуйста. Кажется, что единственно что С++ не поддерживает по сравнению с С - это VLA. А хотите писать как на "С с классами" - так и пишите! Отдельные индивиды/компании не любят исключения С++ - так и не используйте их! Я, пожалуй, не знаю настолько гибкого языка программирования, как С++. И он не менял свою спецификацию таким образом, что весь старый код переставал работать (да да, я знаю, register выкинули, но ведь ничего не поломалось. auto в копилку, но опять же - ничего не поломали!).

Я понимаю запрос на интерпретируемый язык в дополнение к транслируемым С и С++. Питон, возможно, хорошо удовлетворяет таким запросам,как раньше это делал Perl и частью PHP. Но никакой интерпретируемый язык никогда, никогда не заменит строго типизированный  транслируемый язык. Такие языки, как С и в особенности С++ осуществляют огромное количество работы по статической проверке типов/инвариантов/ошибок на этапе компиляции. Программа же на Питоне умрёт 10 разными способами из 10 запусков.

Еще одно и очень важное. С/С++ - это языки системного программирования. Пожелание им смерти - это как совершить харакири. И никакой Rust это не изменит.

Если вам С++ не люб,то сверх упрощённый golang вам в руки. google когда-то даже декларировал его, как язык системного программирования, чем вызывал у меня приступы смеха.  Удачи в освоении Rust, ибо почему бы и нет?

PS Вот что точно сложно в С++, так это асинхронное программирование и корутины. И то из-за того, что библиотечная поддержка со стороны стандарта отсутствует напрочь. Иронично, что поддержку асинхронности Питон получил раньше, чем стандартный С++, хотя он лишь воспользовался наработками по асинхронности С++. Задержки в стандартизации иногда есть зло.
  • +0.10 / 6
  • АУ
ivan2
 
russia
Санкт-Петербург
63 года
Слушатель
Карма: +7.07
Регистрация: 16.11.2008
Сообщений: 9,918
Читатели: 1
Цитата: ivrom от 07.11.2024 20:53:15Вот это вот высказывание и показывает, что вы абсолютно не понимаете саму концепцию С++. Совсем не обязательно использовать всю мощь С++ если вам это не надо или он вам не по силе. ...

Закос С++ на объекты привёл к абстракциям, чем лишил С свойства языка программистов для программистов.
С практически ассемблер без закидонов. Синтаксические единицы С прямо ложатся на ассемблер.
С++ оторвал прелесть связи С с железом и пошло поехало.
Увлечение абстракциями от физики и железа породило дураков объектно-ориетированных и тех, кто действительно программисты. Типа драйверы пишут.
Отредактировано: ivan2 - 07 ноя 2024 21:15:07
Нам нужен мир!
Желательно весь.

Измаил должен быть взят!
  • +0.03 / 3
  • АУ
adolfus
 
Слушатель
Карма: +18.92
Регистрация: 12.02.2010
Сообщений: 11,943
Читатели: 2
Цитата: ivan2 от 07.11.2024 15:42:53О! Ну слава си-богам.
А то тут некоторые пытались нас как ксёнзы охмурить, и сбить с пути.
return x и return (x) генерируют один и тот же код.
Только:        
nop
leave
вызывает интерес.
Ну ладно  leave. Это понятно.
А nop это как и зачем?

Это проставляет компилятор. Думаю, что для отладчика, чтобы тот в пошаговом режиме мог остановиться после последнего С-оператора перед фигурной скобкой, не выходя из процедуры. Если вы работали в отладчике, то наверное заметили, что в пошаговом режиме после выполнения последнего оператора управление в вызывающий код не передается, даже если этот последний оператор -- return. Вам нужно сделать еще один шаг, чтобы leave и ret сработали.
  • +0.00 / 0
  • АУ
ivan2
 
russia
Санкт-Петербург
63 года
Слушатель
Карма: +7.07
Регистрация: 16.11.2008
Сообщений: 9,918
Читатели: 1
Цитата: adolfus от 07.11.2024 22:10:06Это проставляет компилятор. Думаю, что для отладчика, чтобы тот в пошаговом режиме мог остановиться после последнего С-оператора перед фигурной скобкой, не выходя из процедуры. Если вы работали в отладчике, то наверное заметили, что в пошаговом режиме после выполнения последнего оператора управление в вызывающий код не передается, даже если этот последний оператор -- return. Вам нужно сделать еще один шаг, чтобы leave и ret сработали.

Да я не великий С-программист. Так, от истоков и Борланд. Всякие крутые вещи типа передачи управления по указателям на функции по спискам я конечно не делал.
Но пошаговый отладчик в Борланде был просто изумительный.
Это я могу зуб дать.
Нам нужен мир!
Желательно весь.

Измаил должен быть взят!
  • -0.01 / 2
  • АУ
ivrom
 
united_states_of_america
Las Vegas
53 года
Слушатель
Карма: +8.32
Регистрация: 16.03.2017
Сообщений: 576
Читатели: 4
Цитата: ivan2 от 07.11.2024 21:07:44Закос С++ на объекты привёл к абстракциям, чем лишил С свойства языка программистов для программистов.
С практически ассемблер без закидонов. Синтаксические единицы С прямо ложатся на ассемблер.
С++ оторвал прелесть связи С с железом и пошло поехало.
Увлечение абстракциями от физики и железа породило дураков объектно-ориетированных и тех, кто действительно программисты. Типа драйверы пишут.


Да и пусть у каждого будет свой инструмент разработки по способностям/желанию! При всей моей любви к С++, я отчётливо понимаю, что этот язык не для всех. И даже жалобы, что он супер сложный тоже понимаю и принимаю. Посему, пусть даже Питон развивается. Только жаль, что его засовывают в места, где он - негодный инструмент. И что важнее - небезопасный!

Уже давно индустрия разработки отошла от немногих одарённых к концепции муравьиной кучи. Поведение легко заменяемых муравьёв более прогнозируемо с точки зрения бизнес логики. И средства разработки следуют этому пути. А контроль качества переложен на потребителя (что бесит, но неподконтрольно нам). И поэтому мой последний ноутбук под линуксом не имеет рабочего звука уже 9 месяцев (здравствуй новое поколение CPU от Интел), а другой 2х летний уже два раза его терял. Так и использую ядро 6.9 вместо стокового 6.11, хотя везде статус бага висит как пофикшеный (ага, это был фикс на фикс на фикс).


PS жалобы на изменения в программной среде - это разговоры в пользу бедных. Из почти 20 лет, прожитых в США, родилось эмпирическое правило: ни одно важное дело не делается с первой попытки. Всегда готовься к худшему и перепроверяй! Пусть QA осуществляет потребитель - это уже не в США, а по всему миру, похоже. Поэтому использование инструментов, осуществляющих большинство проверок мимо человека - это всемирное добро. Отсюда и появился запрос на что-то типа Rust. Я сам ругал собственного сына за использование голых указателей в коде на С++. А он ещё был лучшим в университете в программировании. Всё плохое, что потенциально может быть сделано человеком - им пренепременно будет сделано.
  • +0.09 / 6
  • АУ
GrinF
 
Слушатель
Карма: +73.98
Регистрация: 15.02.2018
Сообщений: 6,656
Читатели: 4
Цитата: ps_ от 07.11.2024 17:18:52Я про это и писал. Если для использования языка мне надо изучить полторы тысячи страниц сложного технического текста, то МНЕ этот язык не подходит. И я желаю ему умереть, как умер Кобол и умирает Фортран (в последних стандартах в него добавили кучу возможностей, но это никого не интересует)
Я помню, как с++ из простой идеи "с++ с классами как в Smalltak" превратился в современного монстра. Пусть умрет с миром.
А я пойду rust изучать

Агде менше то...ВОхьми программирование любой панели(HMI интерфейм)  700-800... Вохьми программирование ПЛК - страниц 400 это кодесис старый, страниц 800 новый...Возьбми любой стандарт IEC - полкевую шину, чрп,opc uaю ьам вообще счет идет га тысячи страниц (иной раз по 20 часте1 и в каждо1 по 200 стоаниц)... Это то что мне пришлось за лето полистать и почитать.. Да любое RFC более менее занимает 50-100 страниц...
  • +0.03 / 2
  • АУ
ivan2
 
russia
Санкт-Петербург
63 года
Слушатель
Карма: +7.07
Регистрация: 16.11.2008
Сообщений: 9,918
Читатели: 1
Цитата: ivrom от 07.11.2024 22:27:04...Всё плохое, что потенциально может быть сделано человеком - им пренепременно будет сделано.

Если это про С и С++, то прямо в дырочку. НО с другой стороны на С сделано всё самое прекрасное.
Нам нужен мир!
Желательно весь.

Измаил должен быть взят!
  • +0.03 / 2
  • АУ
adolfus
 
Слушатель
Карма: +18.92
Регистрация: 12.02.2010
Сообщений: 11,943
Читатели: 2
Цитата: ps_ от 07.11.2024 17:18:52Я про это и писал. Если для использования языка мне надо изучить полторы тысячи страниц сложного технического текста, то МНЕ этот язык не подходит. И я желаю ему умереть, как умер Кобол и умирает Фортран

Оба переживут и питон и раст.
Что касается кобола, то программисты на нем являются самыми высокооплачиваемыми -- 90% кода, имеющего дело с 99% движений бабла, написано на коболе и требует поддержки. Остальные 10% -- это попытки IBM писать новый бизнес-софт на java. Попытки "слезть" с кобола наблюдаются с 80-х и все они потерпели  поражение -- кобол очень простой и выразительный язык, генерирует компактный м быстрый код. Ничего из остального и рядом не стояло. Может платежи мимо SWIFT изменят этот баланс.
Теперб о фортране. Весь космос написан на нем и код этот живее всех живых. Есть контора  IERS, которая следит за вращением Земли и составляет поправки ко времени, к ориентации Земли относительно звездного неба и прочее, без чего сегодня ничего не работает, включая "эти ваши интернеты". Численные модели нутации, прецесии, движения Луны и планет вокруг Солнца написаны на фортране и как минимум корректируются всякий раз, когда по экспериментальным данным  корректируются сами модели. Все, чем пользуются астрономы, моряки, летчики в своих самолетах и прочие, написано на фортране и немножко на си. Разумеется, все это обернуто другими языками в виде полезных приложений, но это все использует код, полученный компиляцией из фортран-исходников (дифуры, линейная алгебра, статистика, интерполяция, космос, ...). Например, модели магнитного и гравитационного полей Земли сопровождаются эталонными программами на фортране, чтобы те, кто делает свой софт, могли "подсмотреть" или проверить, правильно ли они этот код используют. Есть книжка Абрамовиц, Стиган, в которой приведены почти все использующиеся в численных вычислениях формулы. Все это давно запрограммировано и доступно в виде библиотек для многих языков, включая питон и прочие бейсики. Тем не менее, постоянно случаются попытки бросить вызов и запрограммировать хоть что-нибудь оттуда на более модном и молодежном языке. Однако это происходит исключительно по той причине, что претендент просто не в курсе того, что все уже давно написано и, кроме всего, не содержит ошибок. есть среди них и такие, кто знает, но не может смириться, что им "остались только объедки от трапезы великанов".
Числодробительный софт, исполняющихся на кластерах с сотнями тысяч процессоров, пишется либо на фортране, либо на си. Все остальные привязки -- это обертки. Вся математика (см. netlib.org) чуть менее, чем полностью, написана на фортране. Все, чем сегодня все пользуются,не подозревая об этом в силу недалекости своей, написано лет полста назад, а то и более. И каждые десять-пятнадцать лет появляются гордые умники, не желающие читать ничего кроме мурзилок, и пытающиеся хоть что-то переписать из математики. Сначала они пытались это сделать на си, потом на си++, вот теперь на расте. Никому это не удалось -- те, кто смог бы это сделать, не переписывают, потому что им не нужно -- они знают и используют фортран, а те, кому это нужно, не могут, поскольку не знают не только фортрана, но и самой математики.
Вот не могу понять, зачем все это переписывать -- есть же готовые библиотеки, свободные от ошибок. Бери и пользуйся -- просто линкуй со своим кодом. Быстрее, чем код из-под фортрана, все равно не получится.
  • +0.07 / 6
  • АУ
ivrom
 
united_states_of_america
Las Vegas
53 года
Слушатель
Карма: +8.32
Регистрация: 16.03.2017
Сообщений: 576
Читатели: 4
Цитата: ivan2 от 07.11.2024 22:58:43Если это про С и С++, то прямо в дырочку. НО с другой стороны на С сделано всё самое прекрасное.

  Не только, но в частности - да. Я уже и не припомню, когда в моих собственных программах встретился висячий указатель. А вот неопытные или просто ленивые программисты запросто могут убить программу по сегментации памяти. Всё же массовый программист нуждается во встроенных механизмах защиты памяти, как минимум. Умные указатели пришлись в пору. Аппаратных замедлений 0, плюс какая-никакая защита от дурака появилась. Но дурак-то лазейку найдёт.

Кстати, вопреки жалобам на распухший стандарт С++, начиная с С++14, а в особенности двух последних дополнений в стандарт, они делают жизнь программистов всё более простой и удобной.

А вот нормальной поддержки асинхронности и сети не хватает. Одну только поддержку сети (увы, на основе Asio) уже даже не припомню сколько лет стандартизировать пытаются. Впрочем, понимаю,почему не получается. Питон 2.х никому более не нужен в перспективе.
  • +0.00 / 0
  • АУ
ps_
 
Слушатель
Карма: +11.56
Регистрация: 04.04.2009
Сообщений: 3,803
Читатели: 2
Цитата: GrinF от 07.11.2024 22:38:22Агде менше то...ВОхьми программирование любой панели(HMI интерфейм)  700-800... Вохьми программирование ПЛК - страниц 400 это кодесис старый, страниц 800 новый...Возьбми любой стандарт IEC - полкевую шину, чрп,opc uaю ьам вообще счет идет га тысячи страниц (иной раз по 20 часте1 и в каждо1 по 200 стоаниц)... Это то что мне пришлось за лето полистать и почитать.. Да любое RFC более менее занимает 50-100 страниц...

Документация, документации рознь.
Я тут увлекся разработкой PCB в качестве хобби и там надо читать сотни страниц registry map, чтобы чип заработал.
Но это совсем другое.
В современном с++ из-за все большего усложнения языка, он стал совершенно не интуитивный.
Понятна причина этого. Как говорят в Америке:  Design by committee и пожимают плечами
  • +0.03 / 1
  • АУ
ps_
 
Слушатель
Карма: +11.56
Регистрация: 04.04.2009
Сообщений: 3,803
Читатели: 2
Цитата: ivrom от 07.11.2024 23:33:05Не только, но в частности - да. Я уже и не припомню, когда в моих собственных программах встретился висячий указатель. А вот неопытные или просто ленивые программисты запросто могут убить программу по сегментации памяти. Всё же массовый программист нуждается во встроенных механизмах защиты памяти, как минимум.

Так я про это и говорю.
Вот сижу я и пишу на с++ с классами и все у меня работает. Но я не один в группе. И есть еще много других групп.
Раз в год появляется студент, идет на курсы продвинутого с++, приходит обратно и под лозунгом "я вас научу ретрограды на современном с++ писать", начинает использовать все эти продвинутые шаблоны и typedecl. А я потом сижу и пытаюсь понять, почему сервер рухнул.Плачущий
Не надо давать ВОЗМОЖНОСТИ использовать всякие хитрые конструкции при написании обычного кода.
В том же rust все эти бесконечные проверки можно отключить при компиляции или внутри специального блока. И разработчики библиотек этим пользуются. Но они знают, что делают. А в нормальной ситуации они помогают писать правильный код
  • +0.00 / 0
  • АУ
Сейчас на ветке: 4, Модераторов: 0, Пользователей: 0, Гостей: 0, Ботов: 4