Почему Си - хорошо, а Си++ - плохо

Для любителей обсудить что круче Linux или Win32, Java или C#.

Модератор: Duncon

Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

19 авг 2015, 17:34

На c++ можно писать всё тоже самое, что и на c и с не меньшей эффективностью, так как весь ООП-нутый синтаксис - надстройка над тем же c. Но при этом:
1. Удобнее.
2. Безопаснее.
А вот если ты из-за многочисленных неудобств потратишь усилия на борьбу с компилятором, то об эффективности c-замены виртуальных функций от c-замены безымянных экземпляров полиморфных классов можешь сразу забыть даже в сравнении с каким нибудь гипотетическим бейсик-подобным интерпретируемым ООП-нутым языком твоего же изобретения и с интерпретатором на том же c писанном. На c++ же она давно реализована оптимальным образом и отлажена. И это не единственный пример.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

19 авг 2015, 18:11

iprog писал(а):Итак, Си - это язык низкоуровневого программирования,
Бред. Низкоуровневый язык - это паскаль, а c - язык высокого уровня. не веришь - попробуй на c помимо встроенного ассемблера вызывать программное прерывание, записать, или прочитать регистр процессора. Это не возможно. Попробуй хотя бы любую другую процессорную операцию, гарантированно на любой архитектуре выполняемую именно за одну операцию процессора.

Код: Выделить всё

char a=2;
...
a++;
? Не факт, что процессор реализует арифметические операции с отдельными байтами, возможно под этим подразумевается

Код: Выделить всё

PUSH AX
PUSH BX
MOV BX, WORD PTR[a]
MOV AX
INC AX
MOV AH, BH
MOV WORD PTR[a], AX
POP BX
POP AX
.

Код: Выделить всё

short int a=2;
...
++a;
? А не факт, что это не

Код: Выделить всё

MOV A, [a]
INC A
JNC LC
MOV [a], A
MOV A, [a+1]
INC A
MOV [a+1], A
JMP LE
LC:
MOV [a], A
LE:
.

Код: Выделить всё

int *a;
...
*a=2;
? Не факт, что это не

Код: Выделить всё

PUSH A
MOV A,2
MOV [a],A
MOV A,0
MOV [a+1], A
POP A
.

Код: Выделить всё

char *a;
...
*a=2;
? Это может быть

Код: Выделить всё

PUSH AX
PUSH BX
PUSH ESI
MOV ESI [a]
MOV BX, WORD PTR [ESI+1]
MOV AX, 2
MOV WORD PTR[buf], AX
MOV WORD PTR[buf+1], BX
MOV AX, WORD PTR[buf]
MOV WORD PTR[ESI], AX
POP ESI
POP BX
POP AX
. Вообще нет гарантии исполнения именно в одну операцию процессора ни одной операции c. Именно потому он и портируем: любая низкоуровневая операция может не поддерживаться на какой нибудь ахритектуре.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

19 авг 2015, 18:20

iprog писал(а):Ну, про "объектно-ориентированность" я напишу как-нибудь потом, это отдельный разговор, а в целом получили следующее: в язык введены неявные скрытые механизмы, которые не работают одинаково на разных платформах, портируемые программы писать невозможно, и в то
1. На c++ нет ничего, что не работало бы на какой либо платформе.
2. На c++ нет вообще ничего неявного, а если это слово не по назначению использовать для обозначения того факта, что одной закорючке на высоком уровне может соответствовать несколько операций низкого уровня, то гарантированно всех архитектурах густо нафаршированы "неявными" операциями все циклы, условные операторы и операторы множественного ветвления (switch/case), вызов функций с параметрами, возврат из функций любого значения, кроме void и много чего ещё в первую очередь именно на c, не говоря уж о структурах, а тем более непосредственно не адресуемых ни на одной архитектуре битовых полях.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

19 авг 2015, 18:35

И строки на чистом c такие не казистые не потому, что нет ничего неявного вроде проверки на выход за пределы строки, а потому, что если паскаль-строку в "лоб" расширить снятием ограничений на количество символов, то она не будет вполне портируема из-за того, что на разных платформах может не совпадать как разрядность size_t, так и порядок байт, а переворачивание в какой либо стандартный порядок означает снижение эффективности в том случае, если строка как есть на другие платформы ни в файлах, ни по сети не переносится. А нуль-терминальная строка универсальна.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

22 авг 2015, 16:02

somewhere писал(а):Современные асматики пишут на масме, стиль написания на котором приближается к высокоуровневым языкам из-за частого использования макрокоманд.
Удаляется, так будет правильней. Макрокоманды не знают ни типов, ни границ полей, хоть битовых, хоть обычных, ни количества параметров каждой конкретной процедуры, ни даже соглашений о вызовах и устроены предельно тупо. Это синтаксический сахар, сокращающий запись часто используемых последовательностей команд, не более того. Например, вместо

Код: Выделить всё

DEC CX
JNC Loop
можно набрать вроде как одну "мнемонику" с двумя операндами, под которой будут пониматься сразу и DEC, и JNC. А попробуй одной и той же командой заменить даже

Код: Выделить всё

if (i<n) goto Loop;
и

Код: Выделить всё

if (*p=='\0') goto Loop;
. Или, предположим, сложить два целых числа и конкатенировать две строки. Или умножить на -1 и целое число, и комплексное. Есть две процедуры с разным количеством параметров. Вызовите обе так, чтоб сам ассемблер проверил количество параметров и при ошибке подсказал, что вот такую процедуру надо вызывать с тремя параметрами, а не четырьмя. Этими ассемблерами для программирования "почти как на естественном языке" наелся ещё автор фортрана. Удобней оказалось его произведение. Даже его произведение, причём, первая же версия. И выше уровнем.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

22 авг 2015, 19:38

Заглянул во флудилку и даже пожалел. Сионист, ты в своём репертуаре. Единственное, что делаешь, это придираешься к отдельным словам, вместо того, чтобы осознать пост целиком и увидеть в нём истину или хотя бы то, что человек им хотел донести. Ты просто сюда спорить ходишь? Время больше нечем занять?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

22 авг 2015, 20:07

К словам здесь придираетесь Вы. Я, в отличие от Вас, читаю как раз целиком.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

22 авг 2015, 20:10

Кстати, всякими там vcl, mfc и тому подобными не пользуюсь и пользоваться не собираюсь. Пишу на c++. Что я делаю не так? Или имеются ввиду стандартные классы вроде ofstream, ostream, wstringstrim? Ну та на c тоже есть функции ввода-вывода. Ради них стоит юзать язык? Не ради потоковых классов юзают c++, а сами потоковые классы юзают потому, что пишут на c++.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

22 авг 2015, 20:21

Изначально создатели языка Си и системы Unix предполагали, что возникнут другие языки, более удобные для программистов (каждый язык со своей специализацией). Для каждого такого языка, на Си будет написан транслятор (не компилятор), который транслирует исходник с этого языка опять же на Си, а не в исполняемый код. И уже этот промежуточный Си-текст транслируется Си-компилятором в бинарный исполняемый файл. Такова была изначальная философия системы Unix: все программы портируемы и все языки надстраиваются над базовым языком Си.
Трансляция программы целиком до её исполнения называется компиляцией не зависимо от целевого языка, то есть от языка, на который транслятор переводит программу с другого языка. Интерпретацией называется пооператорная трансляция в процессе исполнения, поэтому при интерпретации целевой язык неизбежно непосрядственно исполняемый. Язык c таким не является. Значит интерпретировать на c нельзя. В натив процессора можно, а на c нельзя. При этом результат интерпретации ещё и не существует целиком и не существует в течении сколь нибудь продолжительного времени. Он фрагментарен и существует в процессе исполнения конкретного оператора. Так какой же вид трансляции имелся ввиду? Остаётся как раз компиляция. Но можно и наоборот с языка c скомпилировать на паскаль, было бы чем. Или на бейсик. Результат будет хуже исходной c-программы? Эйси. Но заниматься такими глупостями ни что принципиально не мешает, мешает лишь тот факт, что ни кто не стал тратить время на разработку такого компилятора. Но пока не стал. Есть принцип, а есть вопрос реализации. Принципиальная же возможность компилировать с обоих языков друг на друга говорит о том, что возможность компиляции в определённом направлении - ещё не признак уровня языка. Уровень определяется абстракцией, а не тем, что фактически нет компилятора с чужых опкодов на c, сразу сшивающего программу сразу с эмулятором другого процессора, для которого те опкоды - натив.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

04 апр 2017, 08:18

iprog писал(а):Итак, Си - это язык низкоуровневого программирования,
Ложь
iprog писал(а):язык низкоуровневого программирования, предназначенный для создания портируемых программ и библиотек функций.
Не возможно в принципе.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить