Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 11
Текст из файла (страница 11)
Зто свойство мы называем концентугыьной целостностью. Синтаксис языка влияет иа удобство и простоту написания и тестирования программы, а в дальнейшем способствует ее пониманию и модификации. Центральным моментом здесь является удобочитаемость программы. Слишком лаконичный синтаксис может оказаться удобным при написании программ (особенно для опытного программиста), однако, когда такую программу нужно модифицировать, в ней оказывается нелегко разобраться. Программы на АР1 обычно настолько непонятны, что даже их разработчики спустя несколько месяцев после завершения работы затрудняются их расшифровать.
Многие языки содержат такие синтаксические конструкции, которые сами подталкивают к неправильному восприятию программ, поскольку два почти одинаковых оператора па самом деле имеют кардинально различные значения. Например, появление пробела в операторе языка о.чОВОИ может полностью изменить его смысл. Хороший язык харакгеризуется тем, что конструкциии, обозначающие различные г| опят и я, долж ны и выглядеть совершенно по-разному, то есть семантические отличия должны отражаться в синтаксисе. 2.
Ортоголальность. Термин «ортогональность» означает, что любые возможныс комбинации различных языковых конструкций будут осмысленными. Например, предположим, что язык позволяет задать выражение, которос вычисляет численное значение, а также задать условный оператор, в котором вычисляется выражение, с единственной целью — получить булево значение истина или ложь. Зти две языковые конструкции (выражение и условный оператор) ортогональны, если любое выражение можно использовать (и вычислять) внутри условного оператора. Когда конструкции языка ортогональны, язык легче выучить и на нем легче писать и рограммьп поскольку в пем меньше исключений и специальных случаев, требующих запоминания.
Отрицательной стороной ортогональности является то, что программа никогда нс будет выдавать ошибки при компи- 1.3. Роль языков программирования 39 ляции, даже если она содержит комбинацию возможностей, которые логи- чески не сог ласованы или крайне неэффективны при выполнении. 3. Естественность для приложений. Язык должен иметь такой синтаксис, ко торый при правильном использовании позволяет отражать в самон структуре программы лежащие в основе реализуемого ею алгоритма логические структуры.
В идеале должна существовать возможность прямого перевода эскиза такой программы в подходящие программные операторы, отражающие структуру алгоритма. Последовательный, параллельный, логический и другие алгоритмы имеют различ ныс естественные структуры, которые представлены в программах, написанных на языках, предназначенных для реализации этих алгоритмов. Язык должен предоставлять соответствующие решаемой задаче структуры данных, операции, структуры управления и естественный синтаксис. Одной нз важнейших причин распространения того или иного языка является его естественность. Язык, соответствующий определенному классу приложений, может сильно облегчить создание отдельных программ в этой области.
В качестве примера языков с очевидной направленностью на решение конкретных классов задач можно привести Рго!ой с уклоном в сторону дедукции и С+.ь, предназначенный для объектно-ориентированных разработок. 4. Поддержка абстракций. Даже в наиболее естественном для дап пой предмет ной области языке программирования остается некоторый существенный пробел. Это пробел между абстрактными структурами данных и операциями, которые характеризуют решение задачи, и конкретными базовыми структурам и данных и операциями, встроенными в язык. Например, язык С вполне может подойти для составления расписания занятий в университете, хотя в нем напрямую не существует естественных для этого приложения абстрактных структур данных, таких как студент, курс лекций, преподавагпель, аудитория, и таких абстрактных операций, как определить студента в группу и назначить аудиторию для группы.
Важной частью работы программиста является разработка конкретных абстракций для решения задачи и их последующая реализация с использованием базовых возможностей реального языка программирования. В идеале, язык должен позволять определять структуры данных, типы данных и операции и поддерживать их как самодостаточные абстракции. В этом случае программист сможет использовать их в других частях программы, зная только их абстрактные свойства и не вникая в их фактическую реализацию. Как Лба, так н С++ были разработаны именно по причине отсутствия этой возможности в более ранних языках, таких как Разов! и С соответственно.
5. Удобство верификации программы. Основным требованием является надсж ность программы, написанной на том или ином языке. Существует множество технологий для проверки правильности выполнения программой своих функций. 11равильность программы можно доказать с помощью формальных методов верификации 1см. раздел 4.2), проверкой без выполнения !путем чтения текста программы и исправления ошибок), также она может быть протестирована путем ее выполнения с тестовыми входными данными и 40 Глава 1.
Проблемы разработки языка проверкой выходных результатов в соответствии с ее спецификацией и т.д. Для проверки больших программ обычно используется некая комбинация всех этих методов. Даже если язык обеспечивает на первый взгляд много возможностей для облегчения программирования, но проверка написанных на нем программ затруднительна, он менее надежен, чем язык, поддерживающий и упрощающий проверку программы. Основной фактор, влияющий на упрощение проверки программы, — простота семантики и синтаксических структур.
6, Среда лрогроммироваггия. Наличие в языке программирования технически развитых конструкций и структур (выражений, структур управления, типов данных и структур данных) — это только один аспект, влияющий на широту его использования. Наличие подходящей среды программирования может сделать технически слабый язык более легким в применении, нежели сильный язьпс при незначительной внешней поддержке. Можно составить длинный список разнообразных определяющих факторов, которым должна удовлетворять среда программирования, но возглавляет его, несомненно, требование наличия в ней надежной, эффективной и хорошо документированной реализации языка программирования.
Специализированные текстовые редакторы и тестирующие пакеты, которые отражают специфику языка и работы с ним, могут сильно ускорить написание и тестирование программ. Средства для поддержки и модификации нескольких версий программы могут облегчить разработку больших программ. Из языков, описанных в данной книге, только БшаПэаПг был специально разработан под конкретную среду программирования, состоящую из окон, меню, возможностей ввода данных с помощью мыши и набора средств, позволяющих оперировать с программой, написанной на БшаПгайц 7. Переносимость лрогр м. Одним из важных критериев для многих программных проектов является переносиэюсть разработанных программ с компьютера, на котором они были написаны, на другие компьютерные системы.
Удобным средством создания переносимых программ являются широкодоступные языки, определение которых не зависит от возможностсй различных машин. Такие языки, как Лг(а, ГОПТПЛМ, С и Раэса1 имеют стандартные определения, позволяющие реализовывать переносимые приложения. Другие языки (например, М1.) происходят от единственной централизованной реализации (гйп8!е-эоцгсс ппр1ешепгаиоп), позволяя разработчику языка осуществлять некоторый контроль над свойствами, определяющими его переносимость. 8.
Стоимость использования. Коварный критерий стоимости был оставлен напоследок. Стоимость использования, конечно, является существенным компонентом оценки языка программирования и складывается из нескольких составляющих: + Стоимость вьтапшвия программы. Назаре компьютерных вычислений стоимость связывалась в основном только с выполнением программы. Большое значение имели исследования по разработке оптимизирующих компиляторов, эффективного использования регистров и механизмов 1.3. Роль языков программирования 41 эффективного выполнения программ.
Хотя стоилзззсть выполнения программы учитывается и в процессе разработки языка, но в первую очередь она важна для болыпих производственных программ, которые мно гократно выполняются. Однако на сегодняшний день для болыпинства приложений вопрос скорости выполнения не является первостепенным. Если речь идет об улучшении диагностики или упрощении контроля в процессе разработки н сопровождения программы, то при использовании настольных компьютеров, выполняющих много миллионов операций в секунду и большую часть времени находящихся в режиме ожидания, увеличение времени выполнения на 10 илп 20 % является допустимым. + Стоимость трансляции програчлзы.
Когда такие языки, как ГОггтггА1ч или С используются в процессе обучения, первостепенным может оказаться вопрос эффективной трансляции (компиляции), а не эффективного выполнения. Как правило, в процессе отладки студенческие программы многократно транслируются, а выполняются всего несколько раз. В этом случае важнее иметь быстрый и эффективный компилятор, а не компилятор, создающий эффективный код. + Сгпоимость создания, тестирования и использования програмлзы.
Этот аспект стоимости может быть проиллюстрирован на примере языков зпза!!га!к и Рег1. Для определенного класса задач решение может быть разработано,закодировано, протестировано, изменено и использовано с минимальными затратами времени и спл программиста. зпза11га1к и Рег1 являются примерами эффективных в смысле стоимости языков программирования.
И зто объясняется тем, что в них минимизировано общее время и объем усилий, требующихся программисту на решение на компьютере какой-либо задачи, даже если время выпоя пения программы может быть больше, чем для других языков, + Стоимость сопровождения программы. Многочисленные исследования показали, что самую большую часть стоимости программы, используемой в течение нескольких лет, составляет нс стоимость начального создания, кодирования и тестирования программы, а стоимость полного жизненного цикла программы, куда входит стоимость как разработки, так и сопровождения программы.