Цитата(SasaVitebsk @ Dec 10 2008, 03:06)

Справедливости ради надо сказать что вы переносите свои действия на действия компилятора. А это не так. От того, где вы объявляете или уничтожаете локальную переменную - мало что зависит. Я бы сказал - ничего. Нормальный компилятор Си (ну IAR для AVR смотрел) будет генерить код вне зависимости от этого.
Вы глубоко заблуждаетесь. Как минимум, от этого зависит количество требуемой памяти - если переменная после выхода из блока уничтожается, то это не условность компилятора, а это происходит на самом деле - занимаемые ей регистры могут использоваться для других целей, если она была в стеке, то он сокращается, даже Keil для 8051, который хранит локальные переменные в обычной памяти, использует ее очень эффективно - если в функции имеется несколько блоков и в каждом объявляюся локальные переменные, то для них будут использоваться одни и те же ячейки памяти, более того - он строит дерево вызовов функций, благодаря чему переменные из "параллельных" функций также будут располагаться в одной области памяти, а для 8051 с ее объемом памяти это очень важно. Да и просто для понимания программы гораздо легче, когда действие переменной локализовано, в отличие от паскаля, где все переменные свалены в одну кучу независимо от их назначения, важности и области действия. Не говоря уже о том, что инициализация переменной сразу при объявлении гарантирует, что вы не станете использовать неинициализированную переменную.
Цитата(SasaVitebsk @ Dec 10 2008, 03:06)

То есть синтаксис - имеет второстепенное значение. Эфективность кода зависит от качества компилятора.
На качество компилятора синтаксис языкавлияет самым непосредственным образом.
Цитата(SasaVitebsk @ Dec 10 2008, 03:06)

А приведенный вами пример по Паскалю - принципиален. Это стратегия самого языка.
1) Объявление до использования
2) Запрет неявного преобразования
3) Контроль границ массива.
и многое другое... Это не случайные "недоработки". Это стратегия...
Я знаю. Эта стратегия - крайне неудачная. А контроль границ массива - абсолютно бесполезная фича, которая, однако, имеет сильное эмоциональное воздействие на молодые умы. Но почему-то никому из них не приходит в голову простой вопос: а что будет делать программа, если произойдет выход за пределы массива? Какой код сгенерирует компилятор? А ничего умного она сделать не сможет - она сообщит пользователю об ошибке и аварийно завершится. (Что будет делать она в микроконтроллере - даже не представляю). И чем это принципиально отличается от ошибки по обращению к несуществующей памяти? Контроль границ массива должен осуществлять сам программист - если индекс масива берется из данных, вводимых пользователем или читаемых из файла. Тогда он может выполнить некие осмысленные действия, зависящие от программы. А если индекс ограничивается константой, например, при инициализации массива, типа for(i = 0; i < ARRAY_SIZE; ++i) - то здесь проверять индекс просто глупо, он и так никогда не выйдет за пределы. Однако паскалевский компилятор все равно будет лепить код проверки.
Цитата(SasaVitebsk @ Dec 10 2008, 03:06)

Для программиста Си сделаны серьёзные послабления в контроле за ним. Я могу сложить символ и целое значение. Или целое значение прибавить к указателю. В Паскале это невозможно. Надо сделать преобразование. Это не ограничение языка. Это делается для того, чтобы программист выполнял такие операции ОСОЗНАНО.
Вот и плохо! Это совершенно ординарные операции, которые выполняются сплошь рядом - например, для перевода символа в другой регистр или для продвижения указателя на несколько элементов. С чего Вирт решил, что эти операции какие-то особеные? Они могут вызвать ошибки? Но ошибки могут возникнуть и от сложения целых, если ты ошибся в имени и прибавляешь не ту переменную, которую надо. И даже если ты сделаешь преобразование - никто не гарантирует, что в прибавляемом целом не окажется недопустимое значение и указатель улетит не в ту область. Для этого существуют отладчики и никакие ограничения синтаксиса не помогут.
Цитата(SasaVitebsk @ Dec 10 2008, 03:06)

В таком контексте чисто объектные языки - вообще мёртворожденные. Они ещё медленнее, ещё более раздутые.
Если ты про С++ то опять же неправда. Так не запрещается сложение char и int или указателя с целым. А те ограничения, котрые там есть, гораздо более логичны и последовательны, чем паскалевские.