Почему Си - хорошо, а Си++ - плохо
Модератор: Duncon
На c++ можно писать всё тоже самое, что и на c и с не меньшей эффективностью, так как весь ООП-нутый синтаксис - надстройка над тем же c. Но при этом:
1. Удобнее.
2. Безопаснее.
А вот если ты из-за многочисленных неудобств потратишь усилия на борьбу с компилятором, то об эффективности c-замены виртуальных функций от c-замены безымянных экземпляров полиморфных классов можешь сразу забыть даже в сравнении с каким нибудь гипотетическим бейсик-подобным интерпретируемым ООП-нутым языком твоего же изобретения и с интерпретатором на том же c писанном. На c++ же она давно реализована оптимальным образом и отлажена. И это не единственный пример.
1. Удобнее.
2. Безопаснее.
А вот если ты из-за многочисленных неудобств потратишь усилия на борьбу с компилятором, то об эффективности c-замены виртуальных функций от c-замены безымянных экземпляров полиморфных классов можешь сразу забыть даже в сравнении с каким нибудь гипотетическим бейсик-подобным интерпретируемым ООП-нутым языком твоего же изобретения и с интерпретатором на том же c писанном. На c++ же она давно реализована оптимальным образом и отлажена. И это не единственный пример.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Бред. Низкоуровневый язык - это паскаль, а c - язык высокого уровня. не веришь - попробуй на c помимо встроенного ассемблера вызывать программное прерывание, записать, или прочитать регистр процессора. Это не возможно. Попробуй хотя бы любую другую процессорную операцию, гарантированно на любой архитектуре выполняемую именно за одну операцию процессора.iprog писал(а):Итак, Си - это язык низкоуровневого программирования,
Код: Выделить всё
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.
1. На c++ нет ничего, что не работало бы на какой либо платформе.iprog писал(а):Ну, про "объектно-ориентированность" я напишу как-нибудь потом, это отдельный разговор, а в целом получили следующее: в язык введены неявные скрытые механизмы, которые не работают одинаково на разных платформах, портируемые программы писать невозможно, и в то
2. На c++ нет вообще ничего неявного, а если это слово не по назначению использовать для обозначения того факта, что одной закорючке на высоком уровне может соответствовать несколько операций низкого уровня, то гарантированно всех архитектурах густо нафаршированы "неявными" операциями все циклы, условные операторы и операторы множественного ветвления (switch/case), вызов функций с параметрами, возврат из функций любого значения, кроме void и много чего ещё в первую очередь именно на c, не говоря уж о структурах, а тем более непосредственно не адресуемых ни на одной архитектуре битовых полях.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
И строки на чистом c такие не казистые не потому, что нет ничего неявного вроде проверки на выход за пределы строки, а потому, что если паскаль-строку в "лоб" расширить снятием ограничений на количество символов, то она не будет вполне портируема из-за того, что на разных платформах может не совпадать как разрядность size_t, так и порядок байт, а переворачивание в какой либо стандартный порядок означает снижение эффективности в том случае, если строка как есть на другие платформы ни в файлах, ни по сети не переносится. А нуль-терминальная строка универсальна.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Удаляется, так будет правильней. Макрокоманды не знают ни типов, ни границ полей, хоть битовых, хоть обычных, ни количества параметров каждой конкретной процедуры, ни даже соглашений о вызовах и устроены предельно тупо. Это синтаксический сахар, сокращающий запись часто используемых последовательностей команд, не более того. Например, вместоsomewhere писал(а):Современные асматики пишут на масме, стиль написания на котором приближается к высокоуровневым языкам из-за частого использования макрокоманд.
Код: Выделить всё
DEC CX
JNC Loop
Код: Выделить всё
if (i<n) goto Loop;
Код: Выделить всё
if (*p=='\0') goto Loop;
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Заглянул во флудилку и даже пожалел. Сионист, ты в своём репертуаре. Единственное, что делаешь, это придираешься к отдельным словам, вместо того, чтобы осознать пост целиком и увидеть в нём истину или хотя бы то, что человек им хотел донести. Ты просто сюда спорить ходишь? Время больше нечем занять?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
К словам здесь придираетесь Вы. Я, в отличие от Вас, читаю как раз целиком.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Кстати, всякими там vcl, mfc и тому подобными не пользуюсь и пользоваться не собираюсь. Пишу на c++. Что я делаю не так? Или имеются ввиду стандартные классы вроде ofstream, ostream, wstringstrim? Ну та на c тоже есть функции ввода-вывода. Ради них стоит юзать язык? Не ради потоковых классов юзают c++, а сами потоковые классы юзают потому, что пишут на c++.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Трансляция программы целиком до её исполнения называется компиляцией не зависимо от целевого языка, то есть от языка, на который транслятор переводит программу с другого языка. Интерпретацией называется пооператорная трансляция в процессе исполнения, поэтому при интерпретации целевой язык неизбежно непосрядственно исполняемый. Язык c таким не является. Значит интерпретировать на c нельзя. В натив процессора можно, а на c нельзя. При этом результат интерпретации ещё и не существует целиком и не существует в течении сколь нибудь продолжительного времени. Он фрагментарен и существует в процессе исполнения конкретного оператора. Так какой же вид трансляции имелся ввиду? Остаётся как раз компиляция. Но можно и наоборот с языка c скомпилировать на паскаль, было бы чем. Или на бейсик. Результат будет хуже исходной c-программы? Эйси. Но заниматься такими глупостями ни что принципиально не мешает, мешает лишь тот факт, что ни кто не стал тратить время на разработку такого компилятора. Но пока не стал. Есть принцип, а есть вопрос реализации. Принципиальная же возможность компилировать с обоих языков друг на друга говорит о том, что возможность компиляции в определённом направлении - ещё не признак уровня языка. Уровень определяется абстракцией, а не тем, что фактически нет компилятора с чужых опкодов на c, сразу сшивающего программу сразу с эмулятором другого процессора, для которого те опкоды - натив.Изначально создатели языка Си и системы Unix предполагали, что возникнут другие языки, более удобные для программистов (каждый язык со своей специализацией). Для каждого такого языка, на Си будет написан транслятор (не компилятор), который транслирует исходник с этого языка опять же на Си, а не в исполняемый код. И уже этот промежуточный Си-текст транслируется Си-компилятором в бинарный исполняемый файл. Такова была изначальная философия системы Unix: все программы портируемы и все языки надстраиваются над базовым языком Си.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ложьiprog писал(а):Итак, Си - это язык низкоуровневого программирования,
Не возможно в принципе.iprog писал(а):язык низкоуровневого программирования, предназначенный для создания портируемых программ и библиотек функций.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.