|
|
  |
С/С++, Почему до сих пор все сидят на древних языках вроде С и С++ |
|
|
|
Sep 3 2014, 20:45
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(Major @ Sep 3 2014, 05:59)  По медиане - написано просто страшно, так делать нельзя. Это говнокод (и это не оскорбление). Нормальный код. Код как код. Цитата(Major @ Sep 3 2014, 05:59)  По коду, в конце недели (суббота) могу выложить, если есть практический интерес. Могу переписать медиану, так чтобы был использован std::nth_element. Сравним. А зачем? Зачем использовать 64 битный суперкомп где справится 8битник? Человек живет не для того, чтобы есть, а ест для того чтобы жить. А то как в анекдоте: купил автомобиль и сколько всего успел: и колеса переобуть и масло сменить и на автобазар слетать за свечами.. Суета это.
Сообщение отредактировал A. Fig Lee - Sep 3 2014, 20:45
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Sep 4 2014, 01:22
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(AlexandrY @ Sep 3 2014, 14:26)  Я ща википедию открою и еще больше лабуды из C++ перечислю.  какой лабуды? У с++ спектор шире си. На нём можно и для 8-битного процесора написать код не хуже чем на си, и для всяких монстров под управением Linux, Windows. На си конечно тоже можно для монстров писать, но для монстров и на асме можно слобать код. В таком же ключе можно поспорить си vs асм, что асм - это единственный нормальный язык, а СИ - это корявость, и что выстрелить в ногу в си, и приплесть сюда что русский древний, поэтому на асме нужно остаться, бла бла бла.
|
|
|
|
|
Sep 4 2014, 10:45
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Начинающие в программировании зачастую проявляют непонимание, для чего в программе нужны for-циклы, удивляясь необходимости повторять "оно и тоже" по многу раз. Мол, зачем вычислять по второму разу, если в первый раз это уже вычислили?  Затем приходит понимание того, что в цикле "одно и тоже" делается над разными данными, обычно хранящимися в массивах, чтобы в цикле было удобно их вызывать по порядковому номеру. Однако этот механизм вынуждает работать с однородными данными, которые, будучи положенными на ленту конвейера, в дальнейшим подвергались бы одной и той же процедуре обработки. Однако в реальных задачах, как и в жизни, не всегда так бывает. Скажем, конвейер идеально подходит, чтобы затыкать пивные бутылки пробками  , но не вполне подходит, когда пациенты выстроили в очередь на прием к врачу. Понятно, что врач в данной ситуации не может работать, как цикл for, назначая всем пациентам одно и то же лечение. Разбираться внутри цикла с тем, кому какое лечение требуется, в случае врача можно, но в программировании этому мешает как раз та самая однородность данных, которые хранятся в массивах. Т.е. в последнем случае элемент данных не проявляет достаточной индивидуальности, чтобы по ней выбрать специфику его обработки. Коротко говоря, специфика и однородность являются в данном случае противоположностями. Конечно, и на обычном C можно попытаться решать подобные задачи. Например, работая не с массивом чисел, а с массивом структур, в которых, помимо числа, содержится некий признак того, как это число надо обрабатывать. Именно отсюда и вырос язык C++, взявшись снять требование однородности данных внутри цикла. И пусть достичь этой цели в полной мере ему не удалось (т.к. сама эта цель едва ли достижима), но сделано в этом направлении очень многое. По меньшей мере, пришло понимание того, что предмет обработки это не просто число, а целый объект, с вытекающими отсюда последствиями. А к тому времени, когда объекты, более крупные, чем число, расплодились в таком множестве, когда их прямое перечисление (без цикла) стало затруднительным, вот тут-то C++ и получил свою популярность. По праву.
|
|
|
|
|
Sep 4 2014, 12:09
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (Xenia @ Sep 4 2014, 17:45)  Именно отсюда и вырос язык C++<...> Позволю себе не согласиться. С++ вырос совсем не отсюда, а от скрещевания низкоуровневого языка С и концепции классов языка Simula (см "Дизайн и эволюция С++" Б.Страуструпа), что позволило иметь возможность писать быстрый, эффективный код (это и сейчас во многих случаях актуально, а тогда было жизненно необходимо) и при этом оперировать программными объектами, отмапливая их на объекты реального мира, т.е. сделать процесс разработки ПО более тесно и нативно связанным с целевой областью. А отсюда если что и выросло, так это контейнеры, итераторы, алгоритмы, в общем, STL.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Sep 4 2014, 12:14
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(juvf @ Sep 4 2014, 04:22)  какой лабуды? У с++ спектор шире си. На нём можно и для 8-битного процесора написать код не хуже чем на си, и для всяких монстров под управением Linux, Windows. На си конечно тоже можно для монстров писать, но для монстров и на асме можно слобать код. В таком же ключе можно поспорить си vs асм, что асм - это единственный нормальный язык, а СИ - это корявость, и что выстрелить в ногу в си, и приплесть сюда что русский древний, поэтому на асме нужно остаться, бла бла бла. Некорректные аналогии. С-и сократил писанину в несколько раз по сравнению с asm и был прорывом. А С++ ее не сократил, а даже снова раздул. Это уже деградация, декаданс. И это понятно, цикл старого всегда кончается деградацией.
|
|
|
|
|
Sep 4 2014, 13:32
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (AlexandrY @ Sep 4 2014, 19:14)  Некорректные аналогии. С-и сократил писанину в несколько раз по сравнению с asm и был прорывом. А С++ ее не сократил, а даже снова раздул. Это уже деградация, декаданс. Да, раздул. Например, эти пресловутые виртуальные функции. Ведь же целое слово ключевое придумали - virtual! И теперь такое объявление функции записывается длиннее, чем простое в С. Ну, правда, на С придётся для реализации того же функционала написать тучу кода с таблицами указателей на функции, проинициализровать их (а ещё объявления прототипов функций там надо вначале написать), и всё руками, и всё аккуратно - недайбох ошибиться, оченно подлые косяки получаются при некорректной работе с указателями и массивами, а особенно массивами указателей... Ну, да это фигня, настоящему С-кодеру это семечки, зато не придётся развозить эту писанину с virtual... Ну, а про STL вообще чего говорить - сплошная лишняя писанина, на голом С это делается в три строчки само собой и без ошибок.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Sep 4 2014, 17:08
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(dxp @ Sep 4 2014, 17:32)  Да, раздул. Например, эти пресловутые виртуальные функции. Ведь же целое слово ключевое придумали - virtual! И теперь такое объявление функции записывается длиннее, чем Ну, правда, на С придётся для реализации того же функционала написать тучу кода с таблицами указателей на функции, проинициализровать их (а ещё объявления прототипов функций там надо вначале написать), и всё руками, и всё аккуратно - недайбох ошибиться, оченно подлые косяки получаются при некорректной работе с указателями и массивами, а особенно массивами указателей... Ну, да это фигня, настоящему С-кодеру это семечки, ... Интересный (для меня) вопрос вы затронули. Хочу спросить, известно ли вам, как на простом C это может быть реализовано? Сама хотела бы вставить функции во внутрь структуры, то C этого не ест. Можно, конечно, как вы сказали, вместо функций указатели туда прописать, но тогда им инициализация нужна, и вызовы таких функций будут "косвенными", путем разыменовывания указателей на функцию. Но если поглядеть на то, как родной C++ компилирует, то там вызовы функций-членов класса прямые (конечно, если перед этим они не были объявлены виртуальными). Как такое удается сделать, если С++ считать "надстройкой" над C, которая может быть транслирована на C препроцессором? В ведь именно так оно и было, по крайней мере, раньше. P.S. Сама я C++ обожаю, но при программировании МК стараюсь его избегать - отпугивает излишний "динамизм", когда многое неявным образом заводится в куче. А я привыкла к спартанским ресурсам, когда под кучу памяти жалко, и хотелось бы всё по максимуму держать в статике.
|
|
|
|
|
Sep 5 2014, 04:56
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (Xenia @ Sep 5 2014, 00:08)  Интересный (для меня) вопрос вы затронули. Хочу спросить, известно ли вам, как на простом C это может быть реализовано? Сама хотела бы вставить функции во внутрь структуры, то C этого не ест. Можно, конечно, как вы сказали, вместо функций указатели туда прописать, но тогда им инициализация нужна, и вызовы таких функций будут "косвенными", путем разыменовывания указателей на функцию. Реализовать можно по той же схеме, которую использует компилятор С++. Только толку от этого будет мало - всё - определение таблиц указателей на функции, указатели на эти таблицы, инициализацию таблиц и указателя, объявление прототипов и т.д. - придётся делать руками. А профиту ноль. Ведь рулез от виртуальных функций (методов) именно в том, что программисту не нужно заморачиваться на контроле соответствия объектов и их функций - всё работает само. В С уже тот факт, что нельзя отнаследовать одну структуру от другой, сводит почти все плюсы технологии к нулю. Но руками всё это можно делать, это будет своего рода паттерн проектирования. В плюсах это реализовывается так. В каждом классе, где объявлена хотя бы одна виртуальная функция (метод), создаётся служебный указатель vtbl - это указатель на таблицу указателей на виртуальные функции объектов этого класса. Эта таблица создаётся отдельно и инициализирутся адресами виртуальных фукнций класса. При виртуальном вызове происходит не прямой вызов функции, а (vtbl->vtable[<offset>])(), т.е. по указателю vtbl производится обращение к таблице указателей, берётся адрес требуемой функции (по смещению <offset>) и уже по этому адресу производится вызов функции. В реальности, например, на MSP430 виртуальный вызов выливается в дополнительные две регистровые однотактовые команды. Описанный подход гарантирует, что на рантайме будет вызван метод класса, к объекту которого применяется вызов функции. Ну, собсно, это основа динамического полиморфизма, позволяет строить иерархии классов, у каждого из которых свои методы. Следует отметить, что при всей мощи, красоте и эффективности подхода не надо его применять везде. У него своя "ниша". Например, он отлично ложится на реализацию GUI или его удобно использовать в парсерах коммуникационных протоколов и их стеках. Это просто средство. Которое рулит там, где оно эффективно. Очень часто начинающие по неопытности пытаются всё делать на методах, в результате получают сложные перекрёстные зависимости, оверхед и прочие проблемы. QUOTE (Xenia @ Sep 5 2014, 00:08)  Но если поглядеть на то, как родной C++ компилирует, то там вызовы функций-членов класса прямые (конечно, если перед этим они не были объявлены виртуальными). Как такое удается сделать, если С++ считать "надстройкой" над C, которая может быть транслирована на C препроцессором? В ведь именно так оно и было, по крайней мере, раньше. То, что С++ является надстройкой над С - глубокое заблуждение. С++ является надмножеством С, но это совершенно самостоятельный язык и его конструкции не могут быть "странслированы на С препроцессором". И компилятор С++ - совершенно отдельная программа, работающая по своим правилам. Из С++ на С странслировать код технически несложно, но это ни разу не препроцессор. И просто такая задача давно уже никому не нужна. Такой компилятор в истории был, он был написан самим Б.Страуструпом на начальном этапе разработке С++ и назывался "С с классами". Страуструпу было удобно использовать уже имеющиеся С компиляторы - это избавляло его от написания back-end и позволяло сосредоточиться на отработке правил нового языка. QUOTE (Xenia @ Sep 5 2014, 00:08)  P.S. Сама я C++ обожаю, но при программировании МК стараюсь его избегать - отпугивает излишний "динамизм", когда многое неявным образом заводится в куче. А я привыкла к спартанским ресурсам, когда под кучу памяти жалко, и хотелось бы всё по максимуму держать в статике. Напрасно опасаетесь. С++ - язык со строгой статической типизацией, ориентированный на разработку критичного к быстродействию и потреблению ресурсов кода. Он не заставляет программиста использовать механизмы, которые не подходят к задаче или с которыми программист недостаточно хорошо знаком. "Динамизм" в вашей программе на С++ может появится только по вашей воле. Попробуйте начать с простого - замените какую-нибудь структуру классом, это позволит технически связать данные и функции, которые в программе на С были связаны только логически. Посмотрите кодогенерацию, вы увидите, что по эффективности кода это будет ровно то же самое (если не лучше). По мере использования этого подхода вы почувствуете удобства инкапсуляции и абстрации, когда ваши объекты будут недоступны извне для любого использования, а только лишь для такого, которое определено в интерфейсах классов (открытые функции-члены). Попробуйте привязать логически классы к объектам реального мира - это занимательная вещь - разложить объект реального мира на составляющие, с целью определить, что является для него интерфейсом, а что представлением. И таким образом, процесс разработки программы преобразуется в новый подход, в котором будет присутствовать явный этап проектирования. При некотором опыте вы сможете начинать разработку программы с рисования структурной схемы, где прямоугольники будут обозначать объекты, а стрелки связи между ними - открытые функции-члены (т.е. интерфейс классов). Это позволит сразу исключить некоторые логические ошибки и заложить правильную архитектуру программы - "скелет". Потом останется только разработать представление классов (закрытую часть). На деле, конечно, это всё не так просто, нужен опыт, но при желании он приходит очень быстро. После этого возвращаться к одному только процедурному программированию уже не захочется. К слову, процедурного программирования в С++ остаётся вдоволь - практически вся реализация функций - это оно и есть, т.ч. любителям С скучать не придётся.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Sep 5 2014, 06:23
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(dxp @ Sep 5 2014, 07:56)  У него своя "ниша". Например, он отлично ложится на реализацию GUI или его удобно использовать в парсерах коммуникационных протоколов и их стеках. Но пока мы даже скриншоты вашего эпического GUI не видели. Если C++ такой мощный, то и GUI видать должно превосходить по изобразительным возможностям какую-нибудь uC/GUI многократно? Цитата(Xenia @ Sep 4 2014, 20:08)  P.S. Сама я C++ обожаю, но при программировании МК стараюсь его избегать - отпугивает излишний "динамизм", когда многое неявным образом заводится в куче. А я привыкла к спартанским ресурсам, когда под кучу памяти жалко, и хотелось бы всё по максимуму держать в статике. Вот он! Голос народа! "обожаю, но" .. "стараюсь его избегать" - лучше не скажешь. Предположу что это интуиция наработанная годами. Я бы сказал C++ отторгается всей embedded экосистемой.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|