у паскаля возможностей же меньше
Столько же. В чём-то меньше, в чём-то больше. Я имею в виду дельфи, т.к. в древнем паскале не вижу смысла (вот тут не надо вспоминать про другие реализации паскаля и про то, что язык в дельфях называется Object Pascal, сегодня он официально называется Дельфи). Директивы препроцессора есть. ОО примочки есть, видимость членов, class var, class procedure, проперти, методы структур, метаклассы, интерфейсы, перегрузка, шаблоны, полиморфизм и дры и дры, короче, хватает. Есть свои особенности у дельфей и у сей, но я с дельфями не испытывал проблем типа "вот такой фишки катастрофически не хватает". А вот пропертей мне не хватало в сях, я нашёл где-то огромный макрос для их имитации, но компилятор VC сильно ругался, выдавая какую-то
внутреннюю ошибку (т.е. его конкретно клинило), пока я не понял, что его замыкает именно из-за этих макросов. Правда, в BC проперти были, но мне нужен был VC.
Просто дело в том, что си изначально позиционируется как "серьёзный язык", поэтому его курс изучения более обширный, чем паскалевский. Типа если взялся за си, изучай всё сразу. В сях те же директивы препроцессора считаются обычным делом, поэтому их включают в стандартный курс по изучению языка. Разбивка на интерфейс и реализацию в
разных файлах (правда, формально это правильно). Постоянная возня со ссылками и указателями - тоже обычное дело, поэтому их тоже включают в курс. Но это не значит, что в дельфях этого нет. Кому надо, тот может использовать ссылки на переменные, записать что угодно по адресу любой переменной. Массивы как параметры функций (я имею в виду, когда параметр объявлен как array of, без размерности, тогда можно использовать любые индексы, но фактически передаётся адрес этого массива или того индекса, с которого надо начинать, который ты укажешь при вызове функции (массив как бы сдвигается на нужную позицию). При этом не надо заморачиваться ни с какими звёздочками и другими закорючками или постоянно помнить, что идентификатор массива в сях = его нулевой элемент).
Пример:
function sum( const a : array of integer ) : integer;
begin
Result := a[ 0 ] + a[ 1 ];
end;
var
dyn_mas : array of integer;
stat_mas : array[ 1..5 ] of integer;
begin
sum( dyn_mas );
sum( dyn_mas[ 3 ] );
sum( stat_mas );
end;
Или так:
function sum( const a : array of integer ) : integer;
var
i : integer;
begin
Result := 0;
for i := low( a ) to high( a ) do inc( Result, a[ i ] );
end;
begin
sum( [ 1 ] ); //
sum( [ 2, 4, 9, 3 ] ); //
end;
А те возможности, которых нет... А так ли они вообще нужны? Например, множественное наследование. Я уверен, что если тебе вдруг доведётся сопровождать чужой код, в котором много множественного наследования, ты начнёшь его проклинать.
И вообще, как я уже сказал, возможности нарастить можно любые. Но синтаксис языка останется.
Можешь также вызывать указатель на класс без ->.
(*obj).one;
Один хрен лишние символы и различный синтаксис для классов и структур. Во-первых, зачем я должен постоянно помнить об этих различиях? А во-вторых, если я вдруг поменяю класс на структуру или наоборот (в дельфях запросто), мне теперь все обращения менять?
Это зависит не от языка, а от выбора программиста.
От языка тоже зависит. Есть пример из Фортрана, где запятая или точка в коде меняет смысл этого кода. Надо понимать, что люди не машины, поэтому синтаксис должен быть составлен так, чтобы облегчить жизнь людям. В сях он не очень дружественный.