Holywar/ru

From Lazarus wiki
Jump to navigationJump to search

English (en) русский (ru)

Эта страница посвящена рассмотрению преимуществ и недостатков языка Паскаль, с точки зрения других языков программирования. Исторически сложилось точка зрения, что Паскаль является учебным языком, пригодным лишь для обучения информатике. Очень часта эта точка зрения, используется пользователями других языков программирования.

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

Почему Мы используем Pascal

(Если вы сами не используете Object Pascal (или один из его диалектов), пожалуйста не пишите сюда ничего)

Каждый разработчик свободен выбирать свои средства разработки. "Паскалисты" выбрали этот язык, потому что:

  • Современный Object Pascal один из наиболее продуктивных языков, пригодный для решения огромного количества совершенно разных задач. Вот списки известных приложений, использовавших один из диалектов паскаля:
  • Паскаль язык модульный-структурированный, что облегчает организацию исходников и переиспользования кода из проекта в проект;
  • Синтаксис языка чистый и ясный. Предупреждает разработчика от возможных ошибок. Отлично подходит для командной разработки;
  • Быстрое время компилирования, компилятору не нужны сторонние средства, чтобы определить какие модули требуют перекомпиляции, а какие нет;
  • В Object Pascal одна из лучших реализаций ООП и интерфейсов;
  • Компилятор FPC, создаёт нативный код, для большого количества платформ, что даёт преимущество в скорости над интерпретируемыми языками;

Q&A

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

A: Строгость обеспечивает безопасность и понимаемость кода.


Q: Паскаль не разрешает описывать сложные типы одним объявлением. Например: "массив указателей на функцию, принимающую 2 целочисленных параметра, и возвращающую указатель на функцию, возвращающую вещественный тип", в языке Си можно описать так: <c> float (*(*a[10])(int, int))() </c>

A: А есть ли реальное преимущество у такой возможности? Выше указанное объявление может прочитать человек с большим опытом программирования на языке Си. Тогда как нижепреведённое объявление на Паскале может понять даже новичок. Кроме того, использование промежуточного типа (в данном случае TFloatRetFunc), очень помогает при внесении изменений в этот тип.

type
  TFloatRetFunc = function : single; 
  TSomeArray = array [0..9] of function (a, b: Integer): TFloatRetFunc;

Q: синтаксис C99, Ады\VDHL содержит т.н "Array initialization designators" - позволяющий инициировать константы массивов с явным указанием индексов [диапазонов] ячеек массива... т.е. можно безопасно описывать константы больших массивов

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

Q: C позволяет создавать в структурах анонимные подструктуры, доступ к полям которых осуществляется как к полям структуры-владельца.

А: А есть ли реальное преимущество у такой возможности? Использование неанонимного промежуточного типа (подструктуры) очень помогает при внесении изменений в этот тип и делает его назначение более понятным.

преимущества над языками C/C++

  • в паскале нет препроцессора (проще читать и понимать, исключён целый ряд ошибок, связанный с макросами и их конструкциями)
  • в паскале нет библиотеки основанной на шаблонах (типа STL). Не шаблонный код быстрее компилируется и его проще отлаживать (например, для понимания сообщений об ошибках компиляции не требуется специальных утилит, как в С++).
  • встроенный в компилятор строковый тип (String). При этом возможность работы с Null-terminated строками так же есть.
  • поддержка модулей (раздельных единиц компиляции). В C\C++ она отсутствует, эмулируется средствами препроцессора (#include).
  • в паскале у объектов есть свойства(properties), а в C++ их надо реализовывать вручную "изобретая велосипед" или использовать специфические для компилятора расширения.