Здравствуйте, SomeOne_TT, Вы писали:
SO_>Не соглашусь. На сях пишут совершенно иначе, нежели на плюсах. Я бы сам с удовольствием почитал бы про типовые практики и организацию программ на си. В данный момент единственный мне известный солидный источник знаний — это исходники на гитхабе.
А что там собственно изучать? Там же всё просто как палка. Организация там одна — описываешь данные структурой (ctx) и начинаешь вокруг наворачивать методы с очень_длинными_названиями_описывающие_и_проблему_и_контекст.
Кому букв не подвезли — у того тарабарщина в названиях — dtadrrprf, amg_opt, и т.п. Естественно на комментарий букв им тоже не хватает.
У любителей "мета"-программирования всё работает на макросах из макросов из макросов из макросов...
И кругом ctx, ctx, ctx, ctx...
SVZ>Полиморфизм реализуется вручную при помощи указателей на функции. SVZ>Вот стандартных контейнеров не хватает. SVZ>Макросы вместо шаблонов это жесть.
+1
SVZ>А в остальном жить можно.
На мой взгляд, самая ощутимая проблема C по сравнению с C++ — это невозможность использования RAII.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, sergey2b, Вы писали:
N>>Основное отличие С от С++, это убогость и крайняя устарелость. Собственно не очень понятно, что про него ещё нужно знать.
S>и почему же он тода еще жив S>pascal вот умер и Си живее всех живых
Удачная смесь мумификации и столкгольмского синдрома
Здравствуйте, BadCats, Вы писали:
BC>Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.
Основное отличие С от С++, это убогость и крайняя устарелость. Собственно не очень понятно, что про него ещё нужно знать.
Здравствуйте, Nikе, Вы писали:
N>Здравствуйте, SomeOne_TT, Вы писали:
SO_>>Не соглашусь. На сях пишут совершенно иначе, нежели на плюсах.
N>Пишут так же, только на порядок более многословно, опаснее и нерасширяемей ):
Как человек, четверть века использующий С (правда, последние лет десять больше С++) соглашусь с тем, что
На сях пишут совершенно иначе, нежели на плюсах
и не соглашусь с этим:
только на порядок более многословно, опаснее и нерасширяемей
ООП (с точки зрения практического программирования) — всего лишь технология и, как любая технология,
она имеет свои плюсы и минусы. Я видел элегантный код на С и ужасный на С++, ровно как и наоборот.
Здравствуйте, BadCats, Вы писали:
BC>Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.
Не в языке программирования дело, а в технологиях: Linux/сети/многопоточность/базы данных/драйвера. Их и стоит изучать. Со знанием C++ в C будет мало нового.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Здравствуйте, sergey2b, Вы писали:
S>а можно пример когда такая оазница в коде
Сечас точно не вспомню. Давно это было. Но идея была такой решалось диф.уравнение с автоматическим подбором шага методом Рунге-Кута.
Решение на C++ было примерно в десятки раз длиннее. Хотя на C++ можно было написать так же, но зачем-то были использованы шаблоны, контейнеры и разные прибабахи.
На C просто банально разнотипные состояния сериализовались в один массив и обратно, а массив обрабатывалься тривиальным кодом из десятка строк.
Просто имея очень гибкие возможности C++ можно было шаблонами засунуть состояния и с ними работать, что и было нагорожено.
Но простое преобразование в линейный массив, убирало всю эту чепуху. Код был короче, проще и более того работал быстрее.
Тут дело даже не в C, а в возможности взглянуть на проблему со сторон с разными ограничениями.
И после супер общего решения которое вы считаете винцом человеческой мысли, вам показывают короткий, простой аскетичный код который решает эту же задачу даже лучше это вызывает кучу эмоций.
В целом проблема упирается в комбинаторные взрывы, получающиеся из-за широких языковых возможностей, которые используются не для решения задачи, а потому "так лучше".
В случае ограниченных возможностей вы будете искать оптимальный путь, а в противном случае будете выбирать самый комфортный.
Вообще без насиля на собой хороший код не получается. Это просто физиологическая особенность человеков.
Здравствуйте, sergey2b, Вы писали:
N>>Основное отличие С от С++, это убогость и крайняя устарелость. Собственно не очень понятно, что про него ещё нужно знать.
S>и почему же он тода еще жив S>pascal вот умер и Си живее всех живых
Потому что платформ поддерживает огроменное количество, компилится быстро, по сравнению с с++.
И альтернативы этому "высокоуровневому ассемблеру" пока не видно.
Ну и легаси, куда же без него
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, BadCats, Вы писали:
BC>Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.
По С есть хорошие, а главное нетолстые книжки. Пролистать знакомое будет энергетически выгоднее, чем искать именно то, что ты хочешь имхо.
Здравствуйте, Михaил, Вы писали:
N>>Основное отличие С от С++, это убогость и крайняя устарелость.
М>минималистичность и полный контроль над железом.
C++ — это минималистичность и полный контроль над железом. А С — отстой.
М>то что на нём почти все mcu программируются?q А так же драйвера, системные утилиты и огромное количество кроссплатформенных opensource либ?
Современные драйвера вполне себе на С++ пишут. На С пишут дрова, если нужно в килобайты вместиться.
М>ты сиплюсплюсер?
Я использую тот язык, который оптимален для конкретной задачи.
Здравствуйте, sergey2b, Вы писали:
S>Здравствуйте, kov_serg, Вы писали:
_>>Сразу после C++ писание на С даётся тяжко, чувствуешь себя как со связанными руками. Но со временем приходит понимание что писать можно на чем угодно. Особенно воодушевляют примеры которые при "правильном" написании на C++ занимают десяток страниц, а тоже самое на C десяток строк. Просто топорно не в общем виде, но работает как надо.
S>а можно пример когда такая оазница в коде
Здравствуйте, Nikе, Вы писали:
N>Здравствуйте, Vaynamond, Вы писали:
V>>ООП (с точки зрения практического программирования) — всего лишь технология и, как любая технология, V>>она имеет свои плюсы и минусы. Я видел элегантный код на С и ужасный на С++, ровно как и наоборот.
N>Как человек программировавший вообще всё что угодно за те же четверть века сообщу, что хорошего кода на С не видел. Хорошего в том плане, что его нельзя было бы в разы улучшить переписав на С++.
Программирование, как и любая деятельность, представляет собой компромисс между желаемым результатом и затратами.
Зачастую приходится жертвовать расширяемостью в пользу сокращения времени разработки. И, кстати,
в контексте моей работы такой подход срабатывает примерно в 3/4 задач.
Насчет
Хорошего в том плане, что его нельзя было бы в разы улучшить переписав на С++
Вот прямо-таки в разы ?
И по каким параметрам улучшить ? Производительность ? Читаемость ? Расширяемость ?
Не пробовали оценить затраты на переписывание ? Я, например, пробовал по некоторым своим задачам —
результаты получались не слишком оптимистичные, потому что почти во всех случаях пришлось бы переписывать "с нуля".
Сразу скажу, что речь шла не о "Hello, world!", а о коде порядка миллиона строк.
Здравствуйте, B0FEE664, Вы писали:
N>>>Основное отличие С от С++, это убогость и крайняя устарелость. Собственно не очень понятно, что про него ещё нужно знать. S>>и почему же он тода еще жив S>>pascal вот умер и Си живее всех живых
BFE>Потому, что его используют электронщики. У электронщиков одна программа соответствует одной схеме. Изменение схемы == изменение программы. С++ им не нужен.
Электронщики у нас схемы рисуют и разводят. А прогают прогеры-эмбеддеры, и я в том числе. Схема-то в комплексе конечно одна уникальная, но компоненты — датчики всякие — вполне типовые, и набор схемных решений тоже типовые. Всё уже давно упаковано в плюсовые либы, и вся разработка сводится к набивке main'а нужными объектами. Обычно новый девайс за неделю-другую целиком поднимается, и тормозят проблемы в основном с железом — то электронщики накосячат, то монтажники
Здравствуйте, lpd, Вы писали:
lpd>Не в языке программирования дело, а в технологиях: Linux/сети/многопоточность/базы данных/драйвера. Их и стоит изучать. Со знанием C++ в C будет мало нового.
Не соглашусь. На сях пишут совершенно иначе, нежели на плюсах. Я бы сам с удовольствием почитал бы про типовые практики и организацию программ на си. В данный момент единственный мне известный солидный источник знаний — это исходники на гитхабе.
Здравствуйте, BadCats, Вы писали:
BC>Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.
Тоже ищу такую книгу. Везде описание только самого инструмента, но практики его применения и не особенностей его использования, ни карты расположения граблей.
Сразу после C++ писание на С даётся тяжко, чувствуешь себя как со связанными руками. Но со временем приходит понимание что писать можно на чем угодно. Особенно воодушевляют примеры которые при "правильном" написании на C++ занимают десяток страниц, а тоже самое на C десяток строк. Просто топорно не в общем виде, но работает как надо.
И да: настоящий физик может писать фортраном на любом языке.
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Потому что платформ поддерживает огроменное количество, компилится быстро, по сравнению с с++. SVZ>И альтернативы этому "высокоуровневому ассемблеру" пока не видно. SVZ>Ну и легаси, куда же без него
моя версия, потому что
хорошо подходит для написания кода для маломощных платформ
изучаеться за неделю ученным или студентом
хорошая замена ассемблеру
легаси
Здравствуйте, LaptevVV, Вы писали:
S>>и по факту язык умер LVV>Не согласен. LVV>1. Лично мне всегда казалось, что разработка промышленных систем на Паскале — это как из детского конструктора попытаться сделать что-то реальное. LVV>2. По факту разработки велись не на Паскале, а на СИЛЬНО переработанном-доработанном языке. LVV>Который имел офигенную библиотеку поддержки и первую в мире IDE — гениальное изобретение. LVV>Кстати, в Астрахани в начале 90-х видел зарплату, разработанную на Турбо-паскале LVV>3. Повторю: паскаль используется там, для чего и создавался — в обучении.
turbo pascal 3 был прорывов засчет IDE
4 стал поддерживать оверлеи позволяюшие писать например CAD под MSDOS
на 8 мн XT паскаль компилировал примерно 1000 строк в 5 секунд те средяя утилита компилировался за 20 сек в то время как Turbo C или MS C можно было идти на перекур после запуска компляции
в 5.5 язык стал ОО
если в 90 году надо было написать проект под MSDOS скажем в 50 000 строк — Turbo Pascal выглядел бы предпочтительней
более менее строгая типизация появилась в Си примерно в 90 году в Паскале быыла с самого начала
Здравствуйте, Maniacal, Вы писали:
AG>>IMHO: вместо C++-исключений, в чистом Си: setjmp и longjmp — но эти вещи превратят ваш код в страшное "спагетти"
M>Хм. Тогда можно сигналы использовать. Вполне сойдёт как очень кривая реализация исключений.
Не, сигналы точно не сойдут. Стек же не раскрутится. Добавится только геморроя, особенно в многопоточном приложении.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Mystic Artifact, Вы писали:
M>>Т.е. это архив таки? M>>Почему же там нет сжатия? MA> Потому, что файл, содержащий в себе другие файлы — называют архивом вне зависимости от сжатия. MA> Кстати, zip какой-нибудь тоже можно сделать без сжатия.
Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.
Здравствуйте, BadCats, Вы писали:
BC>Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.
Тут достаточно просто: C = C++ — ООП — stdlib — C++ Exceptions — new/delete
От ООП только структуры, вместо стандартных контейнеров — самописные, вместо стандартных функций — платформозависимые в основном, вместо C++-исключений структурные исключения, вместо new/delete — malloc/free
Функции рекомендуется группировать в файлы по объединяющему логическому признаку, т.е. как и в классах, один класс = один заголовочный и один файл исходников. В заголовочном описываются "экспортируемые" прототипы функций и глобальные переменные из исходника в виде "extern".
Здравствуйте, Maniacal, Вы писали:
M>От ООП только структуры, вместо стандартных контейнеров — самописные, вместо стандартных функций — платформозависимые в основном, вместо C++-исключений структурные исключения, вместо new/delete — malloc/free
Полиморфизм реализуется вручную при помощи указателей на функции.
Вот стандартных контейнеров не хватает.
Макросы вместо шаблонов это жесть.
А в остальном жить можно.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Maniacal, Вы писали:
M>Функции рекомендуется группировать в файлы по объединяющему логическому признаку, т.е. как и в классах, один класс = один заголовочный и один файл исходников. В заголовочном описываются "экспортируемые" прототипы функций и глобальные переменные из исходника в виде "extern".
И вместо одной монолитной программы которая умеет всё куча независимы модулей из которых строются большие уже на языках типа bash, python, perl и т.п.
Здравствуйте, kov_serg, Вы писали:
_>Сразу после C++ писание на С даётся тяжко, чувствуешь себя как со связанными руками. Но со временем приходит понимание что писать можно на чем угодно. Особенно воодушевляют примеры которые при "правильном" написании на C++ занимают десяток страниц, а тоже самое на C десяток строк. Просто топорно не в общем виде, но работает как надо.
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, Maniacal, Вы писали:
M>>Функции рекомендуется группировать в файлы по объединяющему логическому признаку, т.е. как и в классах, один класс = один заголовочный и один файл исходников. В заголовочном описываются "экспортируемые" прототипы функций и глобальные переменные из исходника в виде "extern". _>И вместо одной монолитной программы которая умеет всё куча независимы модулей из которых строются большие уже на языках типа bash, python, perl и т.п.
Нет, куча .obj-файлов, которые потом линкуются в одну программу
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, Maniacal, Вы писали:
M>>Функции рекомендуется группировать в файлы по объединяющему логическому признаку, т.е. как и в классах, один класс = один заголовочный и один файл исходников. В заголовочном описываются "экспортируемые" прототипы функций и глобальные переменные из исходника в виде "extern". _>И вместо одной монолитной программы которая умеет всё куча независимы модулей из которых строются большие уже на языках типа bash, python, perl и т.п.
Как слинкуешь, так и будет. Можешь отдельные компоненты сделать, можешь статические или динамические библиотеки, можешь один исполняемый файл сделать. На Си можно всё.
Здравствуйте, SomeOne_TT, Вы писали:
SO_>Здравствуйте, lpd, Вы писали:
lpd>>Не в языке программирования дело, а в технологиях: Linux/сети/многопоточность/базы данных/драйвера. Их и стоит изучать. Со знанием C++ в C будет мало нового.
SO_>Не соглашусь. На сях пишут совершенно иначе, нежели на плюсах.
Конечно также, но иначе. Там есть пара приемов, чтобы занятые ресурсы корректно освобождать, но это выглядит как говно. Поэтому в основном пишут так же красиво, как на плюсах, забивая на всё остальное.
_>>>Сразу после C++ писание на С даётся тяжко, чувствуешь себя как со связанными руками. Но со временем приходит понимание что писать можно на чем угодно. Особенно воодушевляют примеры которые при "правильном" написании на C++ занимают десяток страниц, а тоже самое на C десяток строк. Просто топорно не в общем виде, но работает как надо.
S>>а можно пример когда такая оазница в коде
M>Из бородатого юмора:
Какой-то наверно очень бородатый юмор, года из 90го .. 95го:
#include <iostream>
#include <string>
using namespace std;
string message[] = {"Hello ", "World"};
int i;
int main() {
// your code goes herefor(i = 0; i < 2; ++i)
cout<<message[i];
return 0;
}
Здравствуйте, Stanislav V. Zudin, Вы писали:
M>>От ООП только структуры, вместо стандартных контейнеров — самописные, вместо стандартных функций — платформозависимые в основном, вместо C++-исключений структурные исключения, вместо new/delete — malloc/free
SVZ>Полиморфизм реализуется вручную при помощи указателей на функции.
Я так пробовал в начале нулевых, когда сишечку хотел в одном проекте нативно поддержать. Хорошо, хватило ума отказаться от это бесплодной затеи, и не тратить на это жизнь
Здравствуйте, rg45, Вы писали:
R>На мой взгляд, самая ощутимая проблема C по сравнению с C++ — это невозможность использования RAII.
Там есть, но через одно место. Не могу пример привести, но видел такой код. Это полное гавно, сама логика работы просто незаметна на фоне обеспечения RAII
Здравствуйте, kov_serg, Вы писали:
M>>Функции рекомендуется группировать в файлы по объединяющему логическому признаку, т.е. как и в классах, один класс = один заголовочный и один файл исходников. В заголовочном описываются "экспортируемые" прототипы функций и глобальные переменные из исходника в виде "extern". _>И вместо одной монолитной программы которая умеет всё куча независимы модулей из которых строются большие уже на языках типа bash, python, perl и т.п.
Это ты о чем сейчас?
И почему пайтон ты упомянул в одном ряду с говном типа баша и перла?
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, Maniacal, Вы писали:
M>>Нет, куча .obj-файлов, которые потом линкуются в одну программу _>Для это есть либы
Особенность сишных компиляторов: один файл исходников — один объектный файл. А так да, либа = собранный в один файл набор объекнрых файлов. Либа от исполняемого файла логически только наличием функции main отличается, а физически дополнительно наличием заголовка исполняемого файла.
Здравствуйте, AeroSun, Вы писали:
AS>ну, только в юморе разве что
Как я понял, посыл был в том, что на C++ всегда руки тянутся написать код в "общем" виде, универсальный, который потом можно будет повторно использовать, а на C хочется писать "в лоб", "топорно", код решающий ровно одну задачу.
Здравствуйте, Hobbes, Вы писали:
H>Здравствуйте, Maniacal, Вы писали:
M>>Тут достаточно просто: C = C++ — ООП — stdlib — C++ Exceptions — new/delete
H>Ты ещё шаблоны и overload-полиморфизм забыл.
Шаблоны — да, забыл. А инкапсуляция, наследование и полиморфизм это ООП.
N>>Основное отличие С от С++, это убогость и крайняя устарелость. Собственно не очень понятно, что про него ещё нужно знать. S>и почему же он тода еще жив S>pascal вот умер и Си живее всех живых
Нифига паскаль не умер.
Как использовался для обучения — так ип используется.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
BC>Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.
Книжек таких не встречал.
Можно взять просто книжку по С — Дейтела, например.
Вот: https://my-shop.ru/shop/books/1830518.html?b45=1_1
Или просто Библию Кернигана-Ритчи.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Nikе, Вы писали:
N>Здравствуйте, BadCats, Вы писали:
BC>>Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.
N>Основное отличие С от С++, это убогость и крайняя устарелость.
минималистичность и полный контроль над железом.
N>Собственно не очень понятно, что про него ещё нужно знать.
то что на нём почти все mcu программируются?q А так же драйвера, системные утилиты и огромное количество кроссплатформенных opensource либ?
Здравствуйте, sergey2b, Вы писали:
N>>Основное отличие С от С++, это убогость и крайняя устарелость. Собственно не очень понятно, что про него ещё нужно знать. S>и почему же он тода еще жив S>pascal вот умер и Си живее всех живых
Потому, что его используют электронщики. У электронщиков одна программа соответствует одной схеме. Изменение схемы == изменение программы. С++ им не нужен.
Здравствуйте, Maniacal, Вы писали:
M>>>Нет, куча .obj-файлов, которые потом линкуются в одну программу _>>Для это есть либы
M>Особенность сишных компиляторов: один файл исходников — один объектный файл. А так да, либа = собранный в один файл набор объекнрых файлов. Либа от исполняемого файла логически только наличием функции main отличается, а физически дополнительно наличием заголовка исполняемого файла.
S>мне по Си больше всего вот эта нравиться S>читается за полдня и все что надо с примерами изложено S>Язык программирования Си для персонального компьютера S>Бочков S>Субботин S>https://www.ozon.ru/context/detail/id/138319640/
Хорошая книга — читал в 90-е.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, sergey2b, Вы писали:
N>>Основное отличие С от С++, это убогость и крайняя устарелость. Собственно не очень понятно, что про него ещё нужно знать.
S>и почему же он тода еще жив S>pascal вот умер и Си живее всех живых
Торвальдс его любит. И еще некоторое количество упоротых. У и всякие ниосиляторы в эмбеде.
Ну и уже столько кала наворочено, типа всяких гобжектов, что никто в здравом уме переписывать не будет, да и развивать, кроме владельцев-основателей и некоторых упоротых последователей, никто не берется
У нас тут дядечка до недавнего прошлого под PIC'и на асме всё писал, только полгода назад пересадили его на STM21 и потихонечку крестам обучаем. Пока в основном сишное подмножество. Думаю, такие мамонты и еще есть.
М>то что на нём почти все mcu программируются?q А так же драйвера, системные утилиты и огромное количество кроссплатформенных opensource либ?
Эмбеддеры давно на плюсы перешли. Пятый Keil (armcc) даже 11 стандарт поддерживает (в нем — в Keil'е есть и clang), а на днях JetBrains выкатили CLion для армовских MCU.
Драйвера под винду давно на плюсах пишут, под линупс — да, на сишечке в основном, из-за упоротости отца-основателя
Здравствуйте, LaptevVV, Вы писали:
N>>>Основное отличие С от С++, это убогость и крайняя устарелость. Собственно не очень понятно, что про него ещё нужно знать. S>>и почему же он тода еще жив S>>pascal вот умер и Си живее всех живых LVV>Нифига паскаль не умер. LVV>Как использовался для обучения — так ип используется.
я активно писал на Turbo Pascal c 89 по 93 год (если не ошибась самый большой проект у меня был больше 20 000 строк)
при этом у меня были друзья в компании которых примеррно до 95 года основной язык был pascal и они хорошо зарабатывали и везли много книг и библиотек по Pascal из заграницы
turbo pascal 3 был пожалуй лучшим языком на момент своего выходы (MSDOS, CP/M, Apple II)
и позволял писать большие программы коммерческого качества
не теряя над ними контроль
с 640k RAM и одним дисководом
не случайно первая версия винды писалась на pascal
Аштантейт активно использовало его
TPW for Win был гораздо лучше и удобней С++ и позволял писать на 386 компе под win 3 (что я и мои знакомые делали)
потом что то пошло не так и Си и С++ стали лучше паскаля
потом Borland умер
потом перестали писаться книги уровня Фараонова
Здравствуйте, Vaynamond, Вы писали:
V>ООП (с точки зрения практического программирования) — всего лишь технология и, как любая технология, V>она имеет свои плюсы и минусы. Я видел элегантный код на С и ужасный на С++, ровно как и наоборот.
Как человек программировавший вообще всё что угодно за те же четверть века сообщу, что хорошего кода на С не видел. Хорошего в том плане, что его нельзя было бы в разы улучшить переписав на С++.
LVV>>Нифига паскаль не умер. LVV>>Как использовался для обучения — так ип используется. M>Это и называется — умер, когда только для обучения используется. Непонятно только, зачем над студентами издеваетесь
1. Во-первых, Паскаль для обучения и создавался.
2. Он всегда для обучения использовался. Это фирмы решили, что это промышленный язык и стали выпускать средства разработки
3. Мы-то как раз не издеваемся...
И наша МНОГОЛЕТНЯЯ практика показывает, что С++ для обычных средних программистов — трудноват для освоения.
Поэтому мы сначала учим программированию, а потом уже С++...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
S>и по факту язык умер
Не согласен.
1. Лично мне всегда казалось, что разработка промышленных систем на Паскале — это как из детского конструктора попытаться сделать что-то реальное.
2. По факту разработки велись не на Паскале, а на СИЛЬНО переработанном-доработанном языке.
Который имел офигенную библиотеку поддержки и первую в мире IDE — гениальное изобретение.
Кстати, в Астрахани в начале 90-х видел зарплату, разработанную на Турбо-паскале
3. Повторю: паскаль используется там, для чего и создавался — в обучении.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, sergey2b, Вы писали:
S>моя версия, потому что S>хорошо подходит для написания кода для маломощных платформ
+100500
...для любых платформ: от маломощных, до больших серверных...
S>изучаеться за неделю ученным или студентом
+100500
Для этой категории людей — просто неприлично не знать Си
Здравствуйте, Vaynamond, Вы писали:
V>Программирование, как и любая деятельность, представляет собой компромисс между желаемым результатом и затратами.
И при использовании чистого С этот "компромисс" имеет заметный перекос именно в сторону затрат.
V>Вот прямо-таки в разы ?
Обычно в разы.
V>И по каким параметрам улучшить ? Производительность ? Читаемость ? Расширяемость ?
Плотность ошибок на единицу кода, надежность/хрупкость, стоимость сопровождения. Читаемость, кстати, тоже. Ибо в C читать приходится сильно больше.
V>Не пробовали оценить затраты на переписывание ?
Скорее речь идет о том, что если бы изначаль писали не на чистом C, а на чем-то уровнем повыше.
Да, по поводу:
Я видел элегантный код на С
Можно пару-тройку ссылок на примеры элегантного кода на C? Где-то же он должен же быть, раз так уж много про этот мифический "элегантный С" говорят.
Здравствуйте, sergey2b, Вы писали:
S>Здравствуйте, LaptevVV, Вы писали:
N>>>>Основное отличие С от С++, это убогость и крайняя устарелость. Собственно не очень понятно, что про него ещё нужно знать. S>>>и почему же он тода еще жив S>>>pascal вот умер и Си живее всех живых LVV>>Нифига паскаль не умер. LVV>>Как использовался для обучения — так ип используется.
S>я активно писал на Turbo Pascal c 89 по 93 год (если не ошибась самый большой проект у меня был больше 20 000 строк) S>при этом у меня были друзья в компании которых примеррно до 95 года основной язык был pascal и они хорошо зарабатывали и везли много книг и библиотек по Pascal из заграницы
Кстати, была такая продвинутая оболочка для MS-DOS под названием DOS-Navigator — исходники на Паскале (причем размер под 3 мегабайта).
Мой преподаватель по термеху писал на Паскале (по-моему, 5.5 или, максимум, 6) пакет для моделирования динамических систем с графической
визуализацией (потом к нему еще сопромат прикрутили). Причем пакет не был простой поделкой — на нем рассчитывали динамику раскрытия
солнечных батарей на космических аппаратах и прочие сурьёзные задачи.
Здравствуйте, Nikе, Вы писали: N>Как человек программировавший вообще всё что угодно за те же четверть века сообщу, что хорошего кода на С не видел. Хорошего в том плане, что его нельзя было бы в разы улучшить переписав на С++.
Скажу больше всегда есть ощущение что перепесав чужой код он станет лучше. Особенно если к этому коду прикладывали руки много народу в течении длительного времени.
Вообще хороший код зависит не от языка програмирования, а от способа мышления и дисциплины. И само понятие "хороший" вообще-то контексто-зависимое.
Здравствуйте, kov_serg, Вы писали:
_>Вот например: как улучшить в разы этот код, переписав его на C++
В этом коде, как минимум, следовало бы избавиться от define и длинных списков деклараций переменных без присваивания им начального значения. Ну а где-то и от вот таких бессмысленных конструкций:
result = z / ((1 + 0.5772156649015329 * x) * x);
return result;
Здравствуйте, rg45, Вы писали:
R>Это не код, а донесение итальянского шпиона, составленное при помощи лапши. Здесь только инструкций goto не хватает, для полноты пейзажа.
Ну вообще-то для области вычислительной математики это еще просто чудо насколько хороший код.
Здравствуйте, so5team, Вы писали:
R>>Это не код, а донесение итальянского шпиона, составленное при помощи лапши. Здесь только инструкций goto не хватает, для полноты пейзажа.
S>Ну вообще-то для области вычислительной математики это еще просто чудо насколько хороший код.
Я в разных областях работал, и в области вычислительной математики в том числе. И что такое распределение Стьюдента, я знаю. По моим меркам это говнокод. И язык C здесь не виноват.
Здравствуйте, rg45, Вы писали:
R>По моим меркам это говнокод.
Намек был на то, что в подавляющем большинстве там еще хуже
R>И язык C здесь не виноват.
А это вообще-то С++
int iround(double x) { return int(floor(x+0.5)); } // Приведение типов в стиле C++.double lngamma(double x, double& sgngam) { // Передача аргумента по ссылке. Видимо out-параметр.
Здравствуйте, rg45, Вы писали:
S>>Ну вообще-то для области вычислительной математики это еще просто чудо насколько хороший код.
R>Я в разных областях работал, и в области вычислительной математики в том числе. И что такое распределение Стьюдента, я знаю. По моим меркам это говнокод. И язык C здесь не виноват.
А я бы с удовольствием посмотрел на неговнокод. Так сказать, с целью расширения кругозора.
В идеале — на приведенный выше код, написанный в правильном стиле.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Stanislav V. Zudin, Вы писали: SVZ>А я бы с удовольствием посмотрел на неговнокод. Так сказать, с целью расширения кругозора. SVZ>В идеале — на приведенный выше код, написанный в правильном стиле.
Этим я заниматься не стану, конечно, но общие принципы выражу:
1) Выполнить декомпозицию и структрурирование кода в соответствии с принципом "одна функция — одна задача";
2) Убрать из кода "магические" константы;
3) Исключить использование неинициализированных переменных;
4) Дать всем фунциям и, по возможности, переменным понятные имена.
Да, в области математики, дать вменяемые имена локальным переменным не всегда удается — просто потому, что они чисто исторически обозначаются буквами. Но, как минимум, буквенные обозначения должны соответствовать общепринятым. И важную роль здесь играет декомпозиция кода и сокращение размеров тел функций — когда перед глазами одновременно и переменная, и ее использование, смысл понимается легче, как правило. В моем коде вы не встретите функции, которая бы не умещалась на одном экране.
1) Систематическое использование модификаторов const;
2) Объявление переменных как можно ближе к месту их использования (это, опять же, к вопросу о легкости восприятия имен переменных);
3) Замены (там где это оправдано) монолитных больших функций, классами вычислителями, использующими общий общий набор закрытых переменных, но декомпозированных на более простые функции.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rg45, Вы писали:
SVZ>>А я бы с удовольствием посмотрел на неговнокод. Так сказать, с целью расширения кругозора. SVZ>>В идеале — на приведенный выше код, написанный в правильном стиле.
R>Этим я заниматься не стану, конечно, но общие принципы выражу:
Черт, не сработало
R>1) Выполнить декомпозицию и структрурирование кода в соответствии с принципом "одна функция — одна задача"; R>2) Убрать из кода "магические" константы; R>3) Дать всем фунциям и, по возможности, переменным понятные имена.
Да, это важно, но не всегда можно подобрать краткое говорящее имя.
Декомпозиция с одной стороны важна, а с другой — зело дорогое удовольствие.
Частенько приходится ей жертвовать.
Обычная ситуация: во время вычислений данных для одной задачи можно получить забесплатно данные для второй задачи. Если канонично провести декомпозицию, разделить задачи, то придется запускать вычисления еще раз — это удвоить общее время вычислений, которое и так ощутимо.
R>Да, в области математики, дать вменяемые имена локальным переменным не всегда удается — просто потому, что они чисто исторически обозначаются буквами. Но здесь главную роль должна сыграть декомпозиция кода и сокращение размеров тел функций. В моем коде вы не встретите функции, которая бы не умещалась на одном экране.
Еще одна проблема с декомпозицией — необходимость протаскивания кучи данных, либо повторное их вычисление.
В итоге либо у тебя появляются лямбды, либо вычисленные промежуточные данные складываются в т.н. "контекст", который тащится через все функции.
Постоянно приходится чем-то жертвовать — либо декомпозицией, либо временем исполнения, либо расходом памяти на хранение промежуточных данных.
Короче, эти рекомендации из раздела "мыши, станьте ёжиками".
R>При переходе к C++
R>1) Систематическое использование модификаторов const;
const был в Сях со времен K&R. Почему его избегают —
R>2) Объявление переменных как можно ближе к месту их использования (это, опять же, к вопросу о легкости восприятия имен переменных).
В новых Сях это есть. Но есть нюанс.
Если ограничить применение кода парой-тройкой популярных платформ, то нет нужды переходить на С++, используем свежий С и всё замечательно.
А если надо запускать код на каком-нить zOS, то тут проблема — компилятор С++ там времен 98г. Си — каноничный, времен K&R.
Так что либо пишем на Сях по-древнему, либо переходим на Яву.
Вот такая вот загогулина.
Я в этом коде не нашел чего-то непотребного, видывал код и похуже. Видимо, у меня иммунитет
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, kov_serg, Вы писали:
_>Вот например: как улучшить в разы этот код, переписав его на C++
Там в куче мест вычисление полиномиальной аппроксимации по схеме Горнера с разными коэффициентами. На последних плюсах это имхо вполне себе можно как-то в отдельный класс вынести с нулевыми потерями в риалтайм.
Здравствуйте, AlexGin, Вы писали:
AG>Здравствуйте, Maniacal, Вы писали:
M>>...вместо C++-исключений структурные исключения...
AG>Это MS Specific AG>Вот подробнее: https://docs.microsoft.com/en-us/cpp/cpp/structured-exception-handling-c-cpp?view=vs-2019
AG>IMHO: вместо C++-исключений, в чистом Си: setjmp и longjmp — но эти вещи превратят ваш код в страшное "спагетти"
Хм. Тогда можно сигналы использовать. Вполне сойдёт как очень кривая реализация исключений.
Здравствуйте, Hobbes, Вы писали:
H>Здравствуйте, Maniacal, Вы писали:
M>>Да, пожалуй. Но к C тоже отношения не имеет.
H>Так ведь обсуждаем, чего есть в C++ и нет в C
Здравствуйте, Hobbes, Вы писали:
H>Здравствуйте, sergey2b, Вы писали:
S>>более менее строгая типизация появилась в Си примерно в 90 году в Паскале быыла с самого начала
H>Я что-то задумался... Какие средства есть для строгой типизации в C? Кроме структур ничего не приходит на ум.
после принятия ANSII C
запрет на смещивания указателей и int
прототипы функций
модификатор const
изменились правила приведения типов
возрат функцийе enum
Здравствуйте, LaptevVV, Вы писали:
LVV>>>Нифига паскаль не умер. LVV>>>Как использовался для обучения — так ип используется. M>>Это и называется — умер, когда только для обучения используется. Непонятно только, зачем над студентами издеваетесь LVV>1. Во-первых, Паскаль для обучения и создавался.
А кто решил, что ЭТО лучше остального способствует обучению?
Во времена, когда асм был единственной реальной альтернативой, паскаль был неплох. Но это было овер 30 лет назад
LVV>2. Он всегда для обучения использовался. Это фирмы решили, что это промышленный язык и стали выпускать средства разработки
Это решил борманд, и он обосрался с этим
LVV>И наша МНОГОЛЕТНЯЯ практика показывает, что С++ для обычных средних программистов — трудноват для освоения.
А может, вы учить не умеете?
LVV>Поэтому мы сначала учим программированию, а потом уже С++...
Т.е. метод говна и шоколадки?
В техникуме сортировал гномиков на паскале, после асма Z80 это не было прорывом, но было чуть-чуть немного удобнее, хотя и не всегда; для спектрума уже не помню кто, но кто-то сделал классный асм со средой в стиле турбо вижн, и это было круто.
В институте на первом курсе давали сишечку, и она для меня неплохо зашла
К началу второго курса распробовал сипипишечку, и она тоже зашла хорошо. Для меня не проблема просто взять и налабать што-то на жаве или на шарпе не слишком сложное — такая обычная рутинная задача для плюсовика, что и говорить тащем-то не о чем.
Итого: мне пару-тройку лет скармливали говно, называя это обучением программированию
Здравствуйте, Maniacal, Вы писали:
M>>Не совсем так. Либа — это типа архива объектников
M>Это от компилятора зависит. В gcc (.a) это архив. В VC++, например, нет.
LVV>>1. Во-первых, Паскаль для обучения и создавался. M>А кто решил, что ЭТО лучше остального способствует обучению?
Никлаус Вирт — неужели ты не в курсе? M>Во времена, когда асм был единственной реальной альтернативой, паскаль был неплох. Но это было овер 30 лет назад
Очень ограниченный взгляд на обучение программированию. M>А может, вы учить не умеете?
Поступай, посмотришь... LVV>>Поэтому мы сначала учим программированию, а потом уже С++... M>Т.е. метод говна и шоколадки?
Программирование для тебя говно?
Что ты делаешь в программировании ???
M>В техникуме сортировал гномиков на паскале, после асма Z80 это не было прорывом, но было чуть-чуть немного удобнее, хотя и не всегда; для спектрума уже не помню кто, но кто-то сделал классный асм со средой в стиле турбо вижн, и это было круто.
Ко мне в 1999 году пришел пацан с химического факультета нашего универа.
И скромненько так говорит: я тут написал среду для программирования на ассемблере, вы посмотрите?
Дело было в MSDOS на IBM PC-286...
Конечно, я посмотрел — и он перевелся к нам на кафедру. M>В институте на первом курсе давали сишечку, и она для меня неплохо зашла M>К началу второго курса распробовал сипипишечку, и она тоже зашла хорошо. Для меня не проблема просто взять и налабать што-то на жаве или на шарпе не слишком сложное — такая обычная рутинная задача для плюсовика, что и говорить тащем-то не о чем.
Сишечка и Спипишечка — это только инструменты, а не программирование. M>Итого: мне пару-тройку лет скармливали говно, называя это обучением программированию
Сочувствую — столько говна пришлось жрать...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, sergey2b, Вы писали:
S>после принятия ANSII C
S>запрет на смещивания указателей и int
Ну это прям типизация я вообще не могу.
S>прототипы функций S>модификатор const S>изменились правила приведения типов
Тут я не в курсе, что-то поменялось с 80х годов?
S>возрат функцийе enum
Вот практическая задача — я хочу 2 типа, температура и давление. Оба имеют значение с плавающей точкой. Как сделать, чтобы значения этих типов были несовместимы? Чтобы их было нельзя присваивать, сравнивать, передавать в функцию, если типы не совпадают. Чтобы при попытке написать ошибочное использование получалась ошибка компиляции.
В C++ написать такое как 2 пальца об асфальт. Если это нельзя написать в C, то о какой строгой типизации идёт речь?
V>Кстати, была такая продвинутая оболочка для MS-DOS под названием DOS-Navigator — исходники на Паскале (причем размер под 3 мегабайта).
Кстати Windows начинался на Паскале. V>Мой преподаватель по термеху писал на Паскале (по-моему, 5.5 или, максимум, 6) пакет для моделирования динамических систем с графической V>визуализацией (потом к нему еще сопромат прикрутили). Причем пакет не был простой поделкой — на нем рассчитывали динамику раскрытия V>солнечных батарей на космических аппаратах и прочие сурьёзные задачи.
Это и сейчас пишут — на компонентном паскале.
Поинтересуйся на oberoncore.ru
Там научники, которым не требуется создавать промышленный продукт, свои научные программы пишут в BlackBox на компоентном паскале.
И очень довольны.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Nikе, Вы писали:
N>Здравствуйте, Михaил, Вы писали:
N>>>Основное отличие С от С++, это убогость и крайняя устарелость.
М>>минималистичность и полный контроль над железом.
N>C++ — это минималистичность и полный контроль над железом. А С — отстой.
Нет, сипипи — это раздутый монстр, куда впихнули все, что только возможно было впихнуть (и продолжают это делать).
М>>то что на нём почти все mcu программируются?q А так же драйвера, системные утилиты и огромное количество кроссплатформенных opensource либ?
N>Современные драйвера вполне себе на С++ пишут. На С пишут дрова, если нужно в килобайты вместиться.
Пишут на максимально обрубленном с++, который по сути больше чем «с с классами» трудно назвать.
М>>ты сиплюсплюсер?
N>Я использую тот язык, который оптимален для конкретной задачи.
Ну так какие задачи решаешь? У каждого есть специализация.
Здравствуйте, Marty, Вы писали:
M>Здравствуйте, Михaил, Вы писали:
М>>то что на нём почти все mcu программируются?q А так же драйвера, системные утилиты и огромное количество кроссплатформенных opensource либ?
M>Эмбеддеры давно на плюсы перешли. Пятый Keil (armcc) даже 11 стандарт поддерживает (в нем — в Keil'е есть и clang), а на днях JetBrains выкатили CLion для армовских MCU.
Поддерживает не значит что пишут. Ардуино тоже якобы с++, а на практике там этих плюсов и не видно.
M>Драйвера под винду давно на плюсах пишут, под линупс — да, на сишечке в основном, из-за упоротости отца-основателя
Пишут да. Где от плюсов — наследование, и то урезанное.
Здравствуйте, Михaил, Вы писали:
N>>C++ — это минималистичность и полный контроль над железом. А С — отстой.
М>Нет, сипипи — это раздутый монстр, куда впихнули все, что только возможно было впихнуть (и продолжают это делать).
Не, там нет многого-полезного.
М>Пишут на максимально обрубленном с++, который по сути больше чем «с с классами» трудно назвать.
Всё, кроме исключений.
N>>Я использую тот язык, который оптимален для конкретной задачи.
М>Ну так какие задачи решаешь? У каждого есть специализация.
Я неспециализированный, то тут то там. Делаю сложные проекты, часто приходится решать довольно внезапные задачи. Но С++ это основной бекграунд, конечно.
Здравствуйте, BadCats, Вы писали:
BC>Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.
Здравствуйте, Maniacal, Вы писали:
M>>>Это от компилятора зависит. В gcc (.a) это архив. В VC++, например, нет.
M>>Расскажи за MSVC
M>Что-то я посмотрел .a-файл, там тоже не архив, как и .lib у MSVC. Архив, естественно, в понимании сжатости данных.
Здравствуйте, Stanislav V. Zudin, Вы писали:
R>>2) Объявление переменных как можно ближе к месту их использования (это, опять же, к вопросу о легкости восприятия имен переменных).
SVZ>В новых Сях это есть. Но есть нюанс. SVZ>Если ограничить применение кода парой-тройкой популярных платформ, то нет нужды переходить на С++, используем свежий С и всё замечательно. SVZ>А если надо запускать код на каком-нить zOS, то тут проблема — компилятор С++ там времен 98г. Си — каноничный, времен K&R.
в чем плюс такого объявления ?
ведь искать по все функции какого типа переменная или окинуть взглядом список всех переменных в одном месте
уддобней чем искать эту информациию по всему тексту функции
Здравствуйте, sergey2b, Вы писали:
R>>>2) Объявление переменных как можно ближе к месту их использования (это, опять же, к вопросу о легкости восприятия имен переменных).
S>в чем плюс такого объявления ? S>ведь искать по все функции какого типа переменная или окинуть взглядом список всех переменных в одном месте S>уддобней чем искать эту информациию по всему тексту функции
Уменьшается вероятность ошибки, избавляемся от неинициализированных переменных.
Переменная появляется только там, где она реально нужна — код становится читабельнее.
Не все же функции состоят из пяти строк.
А работая в IDE нам пофигу, в каком месте объявлена переменная — её тип выводится в тултипе.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Marty, Вы писали:
M>Т.е. это архив таки? M>Почему же там нет сжатия?
Потому, что файл, содержащий в себе другие файлы — называют архивом вне зависимости от сжатия.
Кстати, zip какой-нибудь тоже можно сделать без сжатия.
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, Marty, Вы писали:
M>>tar — это архив или нет? _>Название Tape ARchive как бы намекает что это архив для сохранения на магнитную ленту
Ну, у них и МакДоналдс — ресторан. В русском языке это не так.
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, Marty, Вы писали:
M>>tar — это архив или нет? _>Название Tape ARchive как бы намекает что это архив для сохранения на магнитную ленту
Угу. Специальная подготовка файла для архивирования на ленте. А .a и .lib не предархивная подготовка. Это библиотеки. Библиотека и архив почти синонимы, но архив — он для хранения, а библиотека для использования.
Здравствуйте, BadCats, Вы писали:
BC>Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.
Книжек таких не знаю, могу лишь сказать, что главное существенное различие — это разная семантика inline функций, которая в С опасна и может привести к UB. Впрочем, в С++, возможно, тоже может быть UB, как результат нарушения ODR, точно не помню.