Перейти к содержанию
    

Вот например, недавно узнал, что оказывается внутри скобок begin-end нельзя объявлять локальные переменные. То есть, любая временная переменная, которая нужна на протяжении 3-4 строк, должна объявляться в начале функции и жить на всем ее протяжении. Да у меня в каждом цикле объявляются переменные а в конце цикла уничтожаются! А в паскале я должен позаботиться о них в начале функции, придумать им разные имена и т.д.?

Справедливости ради надо сказать что вы переносите свои действия на действия компилятора. А это не так. От того, где вы объявляете или уничтожаете локальную переменную - мало что зависит. Я бы сказал - ничего. Нормальный компилятор Си (ну IAR для AVR смотрел) будет генерить код вне зависимости от этого. А вот от количества локальных переменных будет результирующий код зависеть.

 

То есть синтаксис - имеет второстепенное значение. Эфективность кода зависит от качества компилятора.

 

А приведенный вами пример по Паскалю - принципиален. Это стратегия самого языка.

1) Объявление до использования

2) Запрет неявного преобразования

3) Контроль границ массива.

 

и многое другое... Это не случайные "недоработки". Это стратегия...

 

Для программиста Си сделаны серьёзные послабления в контроле за ним. Я могу сложить символ и целое значение. Или целое значение прибавить к указателю. В Паскале это невозможно. Надо сделать преобразование. Это не ограничение языка. Это делается для того, чтобы программист выполнял такие операции ОСОЗНАНО.

Иными словами Паскаль расчитан на программиста более слабого. Или для программиста, который свободен от ограничений по скорости/размеру.

 

Естественно что контроль за границами массива и границами перечислимых типов (с введением в компилируемую прогу соответствующих обработчиков) приводит к увеличению объёма результирующего кода. Но это не значит что язык не имеет права на жизнь. В таком контексте чисто объектные языки - вообще мёртворожденные. Они ещё медленнее, ещё более раздутые.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Справедливости ради надо сказать что вы переносите свои действия на действия компилятора. А это не так. От того, где вы объявляете или уничтожаете локальную переменную - мало что зависит. Я бы сказал - ничего. Нормальный компилятор Си (ну IAR для AVR смотрел) будет генерить код вне зависимости от этого.

Вы глубоко заблуждаетесь. Как минимум, от этого зависит количество требуемой памяти - если переменная после выхода из блока уничтожается, то это не условность компилятора, а это происходит на самом деле - занимаемые ей регистры могут использоваться для других целей, если она была в стеке, то он сокращается, даже Keil для 8051, который хранит локальные переменные в обычной памяти, использует ее очень эффективно - если в функции имеется несколько блоков и в каждом объявляюся локальные переменные, то для них будут использоваться одни и те же ячейки памяти, более того - он строит дерево вызовов функций, благодаря чему переменные из "параллельных" функций также будут располагаться в одной области памяти, а для 8051 с ее объемом памяти это очень важно. Да и просто для понимания программы гораздо легче, когда действие переменной локализовано, в отличие от паскаля, где все переменные свалены в одну кучу независимо от их назначения, важности и области действия. Не говоря уже о том, что инициализация переменной сразу при объявлении гарантирует, что вы не станете использовать неинициализированную переменную.

То есть синтаксис - имеет второстепенное значение. Эфективность кода зависит от качества компилятора.

На качество компилятора синтаксис языкавлияет самым непосредственным образом.

А приведенный вами пример по Паскалю - принципиален. Это стратегия самого языка.

1) Объявление до использования

2) Запрет неявного преобразования

3) Контроль границ массива.

и многое другое... Это не случайные "недоработки". Это стратегия...

Я знаю. Эта стратегия - крайне неудачная. А контроль границ массива - абсолютно бесполезная фича, которая, однако, имеет сильное эмоциональное воздействие на молодые умы. Но почему-то никому из них не приходит в голову простой вопос: а что будет делать программа, если произойдет выход за пределы массива? Какой код сгенерирует компилятор? А ничего умного она сделать не сможет - она сообщит пользователю об ошибке и аварийно завершится. (Что будет делать она в микроконтроллере - даже не представляю). И чем это принципиально отличается от ошибки по обращению к несуществующей памяти? Контроль границ массива должен осуществлять сам программист - если индекс масива берется из данных, вводимых пользователем или читаемых из файла. Тогда он может выполнить некие осмысленные действия, зависящие от программы. А если индекс ограничивается константой, например, при инициализации массива, типа for(i = 0; i < ARRAY_SIZE; ++i) - то здесь проверять индекс просто глупо, он и так никогда не выйдет за пределы. Однако паскалевский компилятор все равно будет лепить код проверки.

Для программиста Си сделаны серьёзные послабления в контроле за ним. Я могу сложить символ и целое значение. Или целое значение прибавить к указателю. В Паскале это невозможно. Надо сделать преобразование. Это не ограничение языка. Это делается для того, чтобы программист выполнял такие операции ОСОЗНАНО.

Вот и плохо! Это совершенно ординарные операции, которые выполняются сплошь рядом - например, для перевода символа в другой регистр или для продвижения указателя на несколько элементов. С чего Вирт решил, что эти операции какие-то особеные? Они могут вызвать ошибки? Но ошибки могут возникнуть и от сложения целых, если ты ошибся в имени и прибавляешь не ту переменную, которую надо. И даже если ты сделаешь преобразование - никто не гарантирует, что в прибавляемом целом не окажется недопустимое значение и указатель улетит не в ту область. Для этого существуют отладчики и никакие ограничения синтаксиса не помогут.

В таком контексте чисто объектные языки - вообще мёртворожденные. Они ещё медленнее, ещё более раздутые.

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

Изменено пользователем 777777

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если переменная после выхода из блока уничтожается, то это не условность компилятора, а это происходит на самом деле - занимаемые ей регистры могут использоваться для других целей,
В более-менее продвинутых компиляторах происходит несколько иначе - компилятор выделяет память один раз на входе в функцию и освобождает на выходе, а создает/уничтожает переменные "в уме", ибо двигать туда-сюда указатель стека на каждую переменную расточительно. Поэтому даже если все переменные объявлены в начале функции, он вычисляет для себя области использования каждой переменной и размещает непересекающиеся в одном и тот же месте. Т.е. объявление локальных переменных в блоке - это больше для удобства программиста.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

подолью масла в огонь :)

 

с первого дня знакомства с Си и программистами на Си я для себя вывел такое определение: Си - это язык снобов. Благодаря синтаксису, который требует бОльшего напряжения ума, а так же особенностям, которые без такого напряжения порождают массу проблем, Си могли (на первом этапе начала карьеры языка) в достаточной мере освоить достаточно умные люди, число которых было меньше, чем "средних" - это породило вокруг "системщиков" некий ареол продвинутости и элитности, который они радостно подхватили и понесли...

 

теперь, когда Си учат едва ли не в школе, ареол тайны пропал, но "элитность" поддерживается - дескать, если ты настолько туп, чтобы не понять, как работать с указателем на указатель на функцию, возвращающую указатель на символ, то юзай паскаль - он для таких, как ты :)

 

и так оно и есть на самом деле: юниксоиды старательно поддерживают имидж своей крутости тем, что по делу и без дела "колдуют" в консоли, что для виндятников выглядит просто магически :) Сишники пишут виртуозные по всем параметрам коды, которые вызывают благоговейный трепет у паскалистов...

 

в общем, все это похоже на меряние писек взрослыми дядями :)

 

развитие индустрии программирования, как и вообще индустрии компьютеров, давно идет по пути, не имеющего со здравым смыслом ничего общего. поверьте: я с теми же усилиями напишу на Delphi любую программу, которую вы пишите на Си, С++, Java и т.п. (кроме системных драйверов - что правда, то правда). но это вовсе не подтверждает, что Паскаль круче Си или наоборот.

 

Размер не имеет значения :)

 

P.S. Во времена популярности Turbo C и Turbo Pascal неоднократно раскручивал "Сишников" (я тогда был студентом-адептом паскаля) на тест: экзешник хелловорда на паскале всегда получался на 12-15 килобайт меньше, чем на паскале :) а заполнение экрана посимвольно всегда завершалось быстрее, чем при сишной реализации. и это повергало Сишников (стаж работы годы против моих студенческих дней) в уныние, которое они "обоснованно" (при помощи Тurbo Debugger-а) доказывали тем, что printf Cи использует "стандартную" функцию MS DOS для вывода на дисплей, а "нестандартный паскаль" напрямую через прерывание BIOS действует. :) не правда ли, все это вызывает смех сейчас, когда хелловорд на любом языке перевалил за сотню килобайт и на трехгигагерцовом пне запускается порой 1,5 секунды :)

Изменено пользователем ARV

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

кстати, многословность, строгий синтаксис, повышенные требования к объявлениям переменных, параметров функций - характеристика языков, на которых пишутся большие, высоконадежные системы - Ada, Eiffel, Java.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

:bb-offtopic:

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

Вот например, недавно узнал, что оказывается внутри скобок begin-end нельзя объявлять локальные переменные. ....

Если дальше почитаете по языку паскаль, то найдете еще и другие отличия. :)

С чего Вирт решил, что...

Это Вам бы надо спросить непосредственно, а заодно наставить его на путь истинный, что и как надо делать. :biggrin:

... :) не правда ли, все это вызывает смех сейчас, когда хелловорд на любом языке перевалил за сотню килобайт ... :)

Не совсем так, на Delphi7 - 42 496 байт, на Delphi2009 - 87 552 байт, так что прогресс на лицо. :) :bb-offtopic:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Паскаль не является под(над)множеством языка СИ, это другой язык программирования
спорное утверждение.

lisp, prolog, forth и т.д. - другие, эти - практически одно и то же.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Справедливости ради надо сказать что вы переносите свои действия на действия компилятора. А это не так. От того, где вы объявляете или уничтожаете локальную переменную - мало что зависит.

Это ПОДСКАЗКА компилятору. Идеальный компилятор, естественно, в подсказках не нуждается :), а реальным очень не помешает. Особенно, когда register похерен :(

и многое другое... Это не случайные "недоработки". Это стратегия...

Ага, напоминает "'это не баг, это фича" :(.... игра в слова, когда понятие "Жопа" никуда не девается а слово "Жопа" из словоря исключается, дабы случайно не сказали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Ну да, разумеется, и подходы эти крайне неудачные.

Если дальше почитаете по языку паскаль, то найдете еще и другие отличия. :)

Отличия? :) Хм... Это не отличие, и не "другой подход". Это способ облегчить жизнь разработчикам компилятра - им так гораздо удобнее. А про удобство пользователей автор почему-то не подумал. Он создал его для машины, а не для человека. И если вы хвалитесь тем, что можете на нем написать все то, что другие пишут на С - значит ваше сознание уже потеряло гибкость и закостенело до такой степени, что ограничений паскаля вы даже не замечаете. Вы просто не догадываетесь, что за их пределы можно выйти, что там есть другой мир.

Это Вам бы надо спросить непосредственно, а заодно наставить его на путь истинный, что и как надо делать. :biggrin:

Как он делает - это его право. А мое право - непользоваться его поделками.

Вообще же, Вирт - типичный лузер. Он давно поиграл конкурентную борьбу, но все пыжится, пытясь протолкнуть свой паскаль под разными соусами - добавляя в него модные нововведения, типа ООП, а чтобы показать свою "крутость", добавляет туда виртуальные конструкторы - не догадываясь при этом, что тем самым демонстрирует свое полное незнание основ ООП.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И если вы хвалитесь тем, что можете на нем написать все то, что другие пишут на С - значит ваше сознание уже потеряло гибкость и закостенело до такой степени, что ограничений паскаля вы даже не замечаете. Вы просто не догадываетесь, что за их пределы можно выйти, что там есть другой мир.

О как! какая-то логическая нестыковочка... если есть ограничения - то как получается делать то же самое? И, если можно, позвольте попросить вас огласить весь список ограничений (только не надо, пожалуйста, про объявление переменных внутри циклов и т.п. - это не ограничения, это смех просто). существенные ограничения, действительно делающие невозможным решение каких-то задач.

Как он делает - это его право. А мое Вообще же, Вирт - типичный лузер. Он давно поиграл конкурентную борьбу, но все пыжится, пытясь протолкнуть свой паскаль под разными соусами - добавляя в него модные нововведения, типа ООП, а чтобы показать свою "крутость", добавляет туда виртуальные конструкторы - не догадываясь при этом, что тем самым демонстрирует свое полное незнание основ ООП.
О как в квадрате! :) Очевидно, вы в ООП гораздо лучше Вирта разбираетесь, что так его критикуете... гм... позвольте вас попросить второй раз: огласите, пожалуйста, весь список нарушений основ ООП, допущенных Виртом (а он ли, кстати, автор объект-паскаля?) в объект-паскале, ну, и соответственно, правильное альтернативное решение С++

 

P.S. Не посчитайте мои просьбы разжиганием холивара - я хотел бы на самом деле узнать то, чего про паскаль еще не знаю. заодно и про С... мало ли - я не Вирт однозначно, и не Страуструп и тем более не Керниган... многого не знаю...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

слово "Жопа" из словоря исключается, дабы случайно не сказали.

Аналогия паскаля с новоязом уже проводилась в другой теме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

О как! какая-то логическая нестыковочка... если есть ограничения - то как получается делать то же самое?

Как? Через жопу.

И, если можно, позвольте попросить вас огласить весь список ограничений (только не надо, пожалуйста, про объявление переменных внутри циклов и т.п. - это не ограничения, это смех просто).

А зачем вам непременно весь? Если одно пропущу - то не будет считаться?

Про объявление переменных - это никакой не смех, а очень серьезно. Это приводит к мешание, когда важные переменные путаются с временными, нарушается читабельность.

Если хотите еще - прочитайте эту тему с самого начала. Например, почему переменная цикла for должна быть целой и меняться только на единицу, и сравниваться только с другой переменной (или только с константой? не знаю, я не настолько большой знаток паскаля), и почему она вообще должна быть? Какие такие свойства языка этого требуют?

Вот в Си в цикле for есть три выражения, разделенный точкой с запятой. Первое вызывается в начале цикла, второе - условное выражение - перед каждой итерацией для проверки на окончание, а третье в конце каждой итерации. Все, больше никаких ограничений на них не накладывается, они могут быть какими угодно сложными, включать в себя вызовы функций - короче всё, что входит в понятие "выражение", а понятия переменной цикла там вообще нет - вы лишь можете ее ввести если надо. Вот объясните мне, почему такую гибкость вы считаете вредной и почему ее надо так зверски ограничивать.

существенные ограничения, действительно делающие невозможным решение каких-то задач.

Любые задачи можно решить на любом языке, хоть на фортране. Вопрос лишь в том, какие усилия придется на это затратить.

О как в квадрате! :) Очевидно, вы в ООП гораздо лучше Вирта разбираетесь, что так его критикуете... гм... позвольте вас попросить второй раз: огласите, пожалуйста, весь список нарушений основ ООП

А можно мне тоже второй раз поинтересоваться: а зачем вам именно весь список? Одного пункта не достаточно? :)

<...> хотел бы на самом деле узнать то, чего про паскаль еще не знаю. заодно и про С... мало ли - я не Вирт однозначно, и не Страуструп и тем более не Керниган... многого не знаю...

Про паскаль я вряд ли что расскажу - не специалист. Сам периодически узнаю что-то новое и ужасаюсь. А если хочешь узнать про Си - читай книжки. Но предупреждаю: перед этим тебе придется заставить себя тщательно забыть паскаль, иначе, например, прочитав про цикл for, тебе покажется, что там все так же, как в паскале. Ведь его изучение не проходит бесследно для организма.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как? Через жопу.

типичный ответ. думаю, если бы вас спросил в личной беседе - вы бы мне просто в глаз дали, да? это удивительно убедительный аргумент. :)

Про объявление переменных - это никакой не смех, а очень серьезно. Это приводит к мешание, когда важные переменные путаются с временными, нарушается читабельность.

ошибаетесь. ранее было сказано на счет того, что серьезные, критически важные системы разрабатываются на языках с "избыточным" (по мнению сишников) многословием. дело в том, что это многословие на самом деле дисциплинирует. а синтаксис Си в общем слечае допускает расхлябанность.

так вот, отсутствие путаницы обеспечивается не размещением объявления локальных переменных где ни попадя, а интуитивно понятныими именами этих переменных. и это куда более важно, нежели 5 переменных с ничего не значащим именем i в 5 разных "локальных" местах, особенно если функция состоит из сотни строк.

 

Однако, все-таки это "ограничение паскаля" вовсе не критичное - оно совершенно не мешает программированию. Т.е. не соответствует моей просьбе указать именно ограничивающие возможности програмиста требования языка.

Например, почему переменная цикла for должна быть целой и меняться только на единицу, и сравниваться только с другой переменной (или только с константой? не знаю, я не настолько большой знаток паскаля), и почему она вообще должна быть? Какие такие свойства языка этого требуют?
интересно, а почему трамвай ездит по рельсам. а самолет - по небу летает? тут ответ лишь один - потому. В английском и немецком есть артикли - в русском нет. Почему? Без них разве нельзя? русским - можно. немцам - нельзя. это не ограничение. это синтаксис языка. Надо без переменной? используйте while или repeat-until, паскаль дает вам такую возможность :)

Вот объясните мне, почему такую гибкость вы считаете вредной и почему ее надо так зверски ограничивать.

я не считаю вредной гибкость Си. Я ее вполне уважаю. но я так же уважаю паскаль - не меньше Си. И обратите внимание - я ни слова критики в адрес Си не сказал. Я считаю, что утверждение "паскаль плохо, Си - хорошо" неверно. а уж вы, как знаток Си, разберитесь в логическом выражении: из-за значения какой его части получается FALSE а не TRUE :)

Любые задачи можно решить на любом языке, хоть на фортране. Вопрос лишь в том, какие усилия придется на это затратить.

принципиально - такие же. условие только одно - уровень программиста должен быть одинаковым. если вы на Си работаете 10 лет - то и сравнивайте себя с паскалистом такого же стажа (и, желательно, той же направленности). на счет фортрана - если я не ошибаюсь, такой математической библиотеки функций, как для фортрана, нет ни в одном языке до сих пор. и на фортране до сих пор делают массу научных вычислений во всем мире (если я не путаю).

Про паскаль я вряд ли что расскажу - не специалист. Сам периодически узнаю что-то новое и ужасаюсь. А если хочешь узнать про Си - читай книжки. Но предупреждаю: перед этим тебе придется заставить себя тщательно забыть паскаль, иначе, например, прочитав про цикл for, тебе покажется, что там все так же, как в паскале. Ведь его изучение не проходит бесследно для организма.
вот в том-то и беда, что не зная ничегошеньки про паскаль, вы яро его ругаете, голосоловно - ни одного убедительного аргумента своего негативизма не представили, но твердо стоите на своем. скорее, ограниченность мышления, неспособность даже задуматься над мнением собеседника/оппонента присуща вам (не прошло бесследно изучение Си? ;) ) я свободно работаю с паскалем и с Си, вполне справляюсь с Java, не говоря о всяких VB. я прекрасно чувствую разницу в циклах for и абсолютно не разделяю ваших восторгов по этому поводу. уж если есть в Си какие-то занятные изюминки, то уж никак не в циклах :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нежели 5 переменных с ничего не значащим именем i в 5 разных "локальных" местах, особенно если функция состоит из сотни строк.

По традиции соложившейся с Фортрановских времен i,j,k значат очень многое - больше чем некие длинные "осмысленные" имена.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По традиции соложившейся с Фортрановских времен i,j,k значат очень многое - больше чем некие длинные "осмысленные" имена.

возможно. особенно если учесть (согласно ранее высказанному мнению), что во внешнем цикле i может быть типа char, а во вложенном - типа double :)

 

не будем доводить все до абсурда - я уже говорил, что место объявления локальных переменных не является действительно критически важным - ни на что, кроме личных пристрастий программиста это не влияет. и наперед скажу - компилятору так же по барабану, если оптимизатор у него нормальный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...