Понимаю, вопрос немного бредовый, но он навязан недавней беседой с одним человеком. Его тезисы таковы: С++ уже давно не является надстройкой над С, и что С++ и С можно строго разграничивать, т.е. для "тру" программирования на плюсах зазорно использовать либы или функции от С. Я, сразу скажу, не являюсь серьезным специалистом по С\С++, и, возможно, сильно отстал от трендов, но является ли такая точка зрения имеющей право на существования в рамках нынешнего положения дел?
Это разные языки и С++ это не Си с классами. Собственно, и ваш вопрос в заголовке абсолютно некорректен. Он звучит примерно так же, как и "Можно ли разграничить Java и JavaScript".
zedxxx, С++ - это надмножество С (начиная с C99 нестрогое надмножество). И вы в лёгкую можете из кода С++ использовать Сишный код, а в сишном коде манипулировать VMT объекта написанного на C++. А любой программист на плюсах может запросто писать на Сях. Java же и JavaScript реально имеют общего только 4 буквы в названии.
Сергей Горностаев, то, что вы можете это делать, не значит, что это нужно делать.
Синтаксис C++ унаследован от языка C. Одним из принципов разработки было сохранение совместимости с C. Тем не менее, C++ не является в строгом смысле надмножеством C; множество программ, которые могут одинаково успешно транслироваться как компиляторами C, так и компиляторами C++, довольно велико, но не включает все возможные программы на C.
А любой программист на плюсах может запросто писать на Сях
.
Ох, вы сильно ошибаетесь. Какой-то код они безусловно написать смогут, как и любой другой профессиональный программист. Но вот качество кода наверняка будет вызывать вопросы.
И ещё, Objective-C так же является некоторым надмножеством Си, т.е. этот язык находится в том же отношении с Си, что и С++. Но ведь никому и в голову не приходит, называть их одним языком. Это всё разные языки, хоть и довольно родственные.
Question_man, Deprecated - код, который в будущих релизах может быть удалён. Исходя из этого определения, нет, нельзя так сказать. Совместимость с Си из С++ никто выпиливать не собирается. Но можно сказать так: если вы пишите на С++, то вам никогда не стоит использовать функции malloc/free, а всегда использовать new/delete.
zedxxx, и опять же, программист на js не сможет без дополнительной подготовки написать на Java никакого кода, ни плохого, ни хорошего. Так же как джавист на Го, а питонист на Хаскеле. Языки разные.
Не знаю. Я вот недавно открыл в себе способность с ходу говнокодить на любом даже ранее невиданном до этого языке. Конечно не зная нюансов красиво и правильно писать не получится. Но работать будет. И думаю такая способность не уникальна. Наверно у каждого второго программиста. Просто объясняется она тем, что скорее всего у всех этих языков предположительно общий предок. Плюс во время развития они друг у друга многое перенимали.
RabraBabr,
"Я вот недавно открыл в себе способность с ходу говнокодить на любом даже ранее невиданном до этого языке."
Как насчет сходу наговнокодить на brainfuck или ассемблере? =)
RabraBabr, я полиглот, у меня мозги заточены на быстрое освоение новых языков, но мне всё равно надо хотя бы несколько часов на изучение документации. Сразу же написать рабочую программу на языке, который вижу первый раз в жизни я не смогу.
Сергей Горностаев, ну почитать гайды это святое, я же не настолько буквально имел в виду, что прям сел и давай выдавать тонны кода на гора, получая инфу через третий глаз, напрямую из высшего разума. Я думал, что под дополнительной подготовкой имелось ввиду, что то серьезнее.
RabraBabr, я про то, что программисту C++ вообще никакая подготовка не нужна, чтобы сразу написать рабочую программу на C. Вообще. Она может не быть образцом эффективности, может не соблюдать best practice и нарушать style guide, но она сразу скомпилится и будет работать.
RabraBabr, сходу физз-базз написать не выйдет. Придется долго мучаться.
А про ассемблер не упомянули, потому что сходу на нем вообще не выйдет. Нужно изучать архитектуру.
В общем легко освоить можно схожие языки, несхожие нужно учить
Saboteur, если задаться целью то можно наверное. Другое дело, что на asm'e законченную программу я писал еще в прошлом тысячелетии. Сейчас он мне может понадобиться только в контексте у меня где то frame rate просел, прошёлся профилировщиком, нашел узкое место в render'е не связанное с GPU, стал думать, что там поменять. Вот двадцать раз подумал, сотню раз погуглил, пообщался с товарищами, потом еще десяток раз подумал. Ну не могу ничего сделать. Ну что же повздыхал и полез смотреть, что за код компилятор выдает и что с этим можно сделать в этом конкретном месте. А писать какие то сложные программы на asm'e... Может инструмент с чуть большим уровнем абстракции надо взять.
Сергей Горностаев, > Грубо говоря, не стоит в плюсах использовать printf и malloc. В этом ваш собеседник прав.
почему нет? дело ведь не в том что используешь, а как.
Есть даже "направление" где берут С++, выкидывают монструозные шаблонные конструкции и т.п. и кодят чистый код С + С++, типа С с плюшками от С++ (классы, исключения и пр.)...
1 Scope
1 This document specifies requirements for implementations of the C++ programming language. The first such
requirement is that they implement the language, so this document also defines C++. Other requirements
and relaxations of the first requirement appear at various places within this document. 2 C++ is a general purpose programming language based on the C programming language as described in
ISO/IEC 9899:2011 Programming languages — C (hereinafter referred to as the C standard) . In addition to
the facilities provided by C, C++ provides additional data types, classes, templates, exceptions, namespaces,
operator overloading, function name overloading, references, free store management operators, and additional
library facilities.
Исходя из последней ссылки (по большей части из 1 пункта) следует, то вполне нормально смешивать С и С++, если знать, что это может привести к некоторым ошибкам, которые можно решить, используя материал данного сайта. Поправьте меня, если я сделал неправильный вывод.
In the strict mathematical sense, C isn’t a subset of C++. There are programs that are valid C but not valid C++ and even a few ways of writing code that has a different meaning in C and C++
Технически C++ - это всё ещё Си с плюсами, но фактически он очень сильно ушёл от первоисточника и на сегодняшний день стили и подходы к программированию на этих языках существенно отличаются.
Денис Загаевский, это значит, что например в GCC у cc1 и cc1plus большое перекрытие кодовой базы, а в Visual C++ для компиляции сишного и плюсового кода вовсе используется один код. Ну, и в рантайме плюсовый объект - это всего лишь структура со ссылками на функции. Компиляторы по больше части не способны отличить сишный код от плюсового, а рантайм неспособен отличать плюсовый код от сишного.
Сергей Горностаев,
Выше в комментариях цитировали "In the strict mathematical sense, C isn’t a subset of C++. There are programs that are valid C but not valid C++ and even a few ways of writing code that has a different meaning in C and C++".
Насчёт рантайм - кажется, это справедливо для любого языка, компилируемого в нативный код с совместимым ABI. А структуры в явном виде в рантайм вообще не существуют. В том смысле, что они неотличимы от просто куска памяти, коим, собственно, они и являются.
Денис Загаевский, я честно говоря, каждый раз когда доказываю, что это почти один язык, не уверен несу ли благо. Молодые начитаются, а потом смотришь в код из лютой смеси сишного и плюсового кота и хочется срочно выпить.