Shaos wrote:Andnor wrote:Не, вопрос был именно в том что по-твоему главное, а не что разное вообще.
А я по-моему главное перечислил выше - мало? Одних бегинов и эндов уже достаточно, чтобы закопать язык раз и навсегда...
Мало. И у C тоже есть существенные недостатки по сравнению с Паскалем, которые я упоминал выше:
- Нет строкового типа. Вместо него указатель на char и арифметика указателей, которая замаскирована синтаксическим сахаром в виде [ ].
- Нет массивов. Только указатели.
- Менее строгая типизация, например тип однобайтного целого не отличается от типа содержащего один символ.
- Даже самая простейшая программа Hello World уже содержит множество малопонятных начинающему конструкций. Чтобы их объяснить нужно сразу же погрузиться в указатели и прочие интимные детали машинного кода.
- Нет деления на функции и процедуры. На примере C очень трудно объяснить важнейшее в программирование понятие "побочного эффекта", поскольку фактически всё программирование на C состоит из побочных эффектов. Даже присваивание — это не оператор, а операция.
- Слишком легко написать совершенно нечитаемый код вроде i += i++ + ++i;
- Множество ситуаций где есть undefined behavior, в этом случае написанный и отлаженный на одной системе код внезапно не работает на другой.
- Обязательность ';' везде. Не знаю, как у вас, но у меня это самая частая причина, почему только что написанная программа не компилируется. Что мешало сделать перевод строки терминатор оператора, а ; использовать только как их разделитель если несколько операторов в одной строке совершенно непонятно. В том же бейсике так и сделано, хотя символ (:) выбран неподходящий. В паскале эту точку с запятой хотя бы перед end можно не писать.
Кстати, отсутствие строкового типа — это очень существенный недостаток в современном применении, когда любой символ кроме всего лишь 97 занимает несколько байт и соответсвенно любой символ это уже не char, а string. И строки с терминатором NUL не только служат источником множества уязвимостей, но ещё и не позволяют включить в состав стороки собственно нулевой символ, а это часто нужно. И ладно, программист-то как-то с этим может и справится, например введёт собственный тип состоящий из структуры с длиной строки и собственно областью памяти под char-ы, а что делать пользователю? Например, что если нужно передать строку, содержащую нулевой символ в параметре программы?
В общем C — это язык, написанный хакерами для хакеров. Для хакерства он хорошо подходит, а вот для начального изучения программирования — очень плохо.
Lavr wrote:Andnor wrote:Плюс его в том что функции и процедуры там отдельно, что и правильно, ибо это совершенно разные концептуально штуки, хотя и реализуемые в машинном коде похожим образом.
В этом и есть его неудобство и удалённость от естественного языка.
Это всё равно как говорить в стиле магистра Йоды:
«
Должен быть назван твой страх перед тем, как прогнать его».
В машинном коде как раз всё можно делать более свободно.
Так от естественного языка или от машинного? В естественном языке математическая функция, которая по значению аргументов возвращает результат и процедура, которая что-то делает — это разные вещи.
И уж совсем я перестал уважать Паскаль, когда в него вернули оператор
goto к версии
7.хх...
Это просто позорище! Втюхивать людям про теорему Дейкстры, а потом вернуть оператор
goto.
Это ситхи всё возводят в абсолют. Структурное программирование — это хорошо, а когда для передачи управления в высокоуровневом языке есть
только goto — не очень.
С другой стороны, есть ситуации, когда без goto код получается более громоздким и менее понятным. Например, goto удобен для выхода из нескольких вложенных циклов и если перед завершением функции/процедуры, надо вначале освободить используемые ей ресурсы. Тогда код для освобождения ресурсов можно один раз написать после метки в конце процедуры и при необходимости её завершить из нескольких мест, переходить на него.
А вот в других ситуациях лапша из goto трудночитаема. Не стоит стремиться к чистой структурности или чистой goto-ичности, главное — это читаемость и понятность кода. Обычно (почти всегда) goto её ухудшает, что собственно и заметил Дейкстра, доказав что goto не является обязательным. Но иногда в редких случаях улучшает — тогда почему бы и goto?
Я просто смеюсь, когда хвалят функции и процедуры в Паскале! Это значит, что люди не видели
как шикарно это сделано в
Quick Basic 4.5...
Ничего, значит, не пробовали эти люди слаще морковки!

Ну да, давай теперь сравнивать современный язык программирования общего назначения с древним скриптоязыком для MS-DOS, куда он был включен только от безысходности... Но ради интереса, всё же, что там конкретно так тебя восхитило? Может примеры кода покажешь? А то я хоть как-то на QBasic и писал, но уже забыл всё.