phantom-84 писал(а):
В нормальной литературе пишут, что Си немного более низкоуровневый язык, чем языки, подобные Паскалю. Я согласен с таким утверждением. Все названные тобой недостатки Си имеют место быть, но часть из них можно рассматривать не как его недостатки, а как достоинства в сравнении с другими высокоуровневыми языками.
Ну, я не соглашусь ни с тем, ни с другим, но здесь уже изрядную роль играет субъективная оценка, а не только объективная сторона вопроса.
Например, Си имеет настолько плохую типизацию и контроль за соблюдением типов, что в первом приближении можно считать, что её вовсе нет (так, типы char, int, long int -- по сути, одно и то же, только занимает разные объёмы памяти). Соответственно, данные разных типов можно произвольно смешивать в выражениях, присваивать и т.д. и т.п. В Аде же даже два вроде бы одинаковых типа могут считаться разными. Например:
Код:
type A is new Integer;
type B is new Integer;
Оба типа объявлены совершенно одинаково, а посему с технической точки зрения тоже, естественно, абсолютно одинаковы. Но компилятор пошлёт куда подальше при попытке смешать значения переменных этих типов. Про типы разных размеров я вообще молчу. Обойти эти ограничения можно, но только явным образом используя приведение типов. Спрашивается, чей подход лучше -- Ады или Си?
Крайне жёсткая типизация Ады позволяет сильно снизить число не только совершенно случайных ошибок (описок), но -- при грамотном использовании -- и ошибок, связанных с некоторым недомыслием программиста (например, попытка присвоить переменной типа "температура воздуха" значение переменной типа "температура воды" приведёт к ошибке компиляции, если нет явного приведения типов, и это, вообще говоря, вполне обоснованно). В то же время и ежу понятно, что гора привидений типов не способствует улучшению читабельности программы, а также затрудняет набор её исходного текста, ну а чтобы этого избежать, приходится хорошо продумывать систему типов для конкретного приложения и строго её придерживаться, т.е. в Аде не проходит модель разработки "чего тут думать? кодировать надо!". Лично я однозначно выбираю "адскую строгость": лучше я буду предварительно тратить время на проектирование, а во время кодирования иногда использовать приведение типов, но зато не буду иметь никаких проблем с ошибками из-за описок или ещё чего в этом роде, чем резко сокращу время отладки (которое, как известно, составляет основную часть временных затрат на создание крупной программы). В то же время было бы глупым отрицать, что простую программу обычно легче и быстрей написать на Си, в том числе благодаря отсутствию сколько-нибудь вменяемой типизации (что, думаю, является самым главным недостатком этого языка): преимущества Ады начинают заметно проявляться лишь на достаточно крупных программах (скажем, от 2-3 тысяч строк).
Что же до уровня языка, то лично я считаю, что у Паскаля и Си уровень одинаков: реализуемый в них набор абстракций и возможностей не имеет принципиальных различий (какая разница, пишется do...while или repeat...until?), просто у Паскаля есть весьма строгая типизация, а у Си она отсутствует. Вот Объект Паскаль (Дельфи) имеет более высокий уровень, чем и обычный Паскаль, и Си. Ада тоже имеет более высокий уровень; в частности, это единственный язык, включающий поддержку многозадачности (точней, многопоточности, если пользоваться терминологией Винды) на уровне исходного текста программы. (Хотя, с другой стороны, в Аде есть и низкоуровневые средства, чётко определённые стандартом языка, а не реализуемые, как разработчику в голову взбредёт: например, можно явным образом указать размер типа в битах, расположение полей записи с точностью до бита и т.д.). Но это, как уже говорил, достаточно субъективная вещь -- в отличие от сравнения уровней у ассемблера и Си, между которыми имеется принципиальная и совершенно объективная разница.