Лекция 1
1. Введение
В данном разделе представлен ряд вводных замечаний, касающихся языков программирования. Во-первых, приводятся соображения, согласно которым не только студенты, но и профессиональные разработчики программного обеспечения (ПО) должны изучать общие концепции языков. Во-вторых, рассматриваются области применения программирования, поскольку предметная область оказывает существенное влияние на выбор используемого языка. Затем представляются критерии, по которым могут приниматься решения о таком выборе.
Обсуждаются два основных фактора, влияющих на структуру языка: архитектура ЭВМ и методология разработки программ. Рассматриваются некоторые направления, изучение которых необходимо при разработке языка. Кроме того, в разделе содержится обзор наиболее общих подходов к реализации языков программирования. В заключение приводится несколько примеров сред программирования и обсуждается их влияние на процесс производства программного обеспечения.
1.1. Зачем изучать концепции языков программирования
В компьютерных науках существует множество предметов, заслуживающих серьезного изучения. Почему же стоит тратить время на изучение общих концепций языков программирования? Может быть, достаточно ограничиться знанием 1-2 конкретных языков? Ниже приводится перечень потенциальных выгод изучения языковых концепций.
Больше возможностей для выражения идеи.
Распространенным является мнение, что на глубину мыслей человека влияет выразительная сила языка, на котором он эти мысли выражает. Людям сложно осмыслить структуры, которые они не могут описать. С подобным явлением сталкиваются и программисты при разработке ПО. Язык программирования налагает ограничения на виды управляющих структур, структур данных и абстракций, которые они могут использовать; следовательно, число форм алгоритмов, которые могут создать программисты, также ограничено.
Изучение новых языковых конструкций помогает программистам повысить мастерство. Часто средства одного языка могут быть воспроизведены в других языках, непосредственно их не поддерживающих. Изучение концепций языков программирования позволяет разобраться в разнообразных языковых возможностях и поощряет программистов к их использованию.
Более обоснованный выбор подходящего языка.
Некоторые программисты прошли формальное обучение в далеком прошлом. Изучавшиеся ими языки уже практически не используются, а многие свойства, доступные в современных языках программирования, известны не очень широко. Так случилось, например, с появлением ООП. В результате, многие программисты продолжают использовать привычный язык, даже если он совсем не подходит для работы над новым проектом. Если бы они знали другие языки программирования, в частности их особые возможности, то выбор рабочего языка был бы более осознанным.
Повышаются способности к изучению новых языков.
Методологии, средства разработки программного обеспечения и языки программирования все еще находятся в состоянии развития. Это делает разработку программного обеспечения интересным занятием, подразумевающим необходимость непрерывного обучения. Процесс изучения новых языков программирования может быть длительным и трудным, особенно для программиста, уверенно себя чувствующего только с одним-двумя языками и никогда не изучавшего концепций языков программирования в целом. Досконально разобравшись в общих концепциях, можно понять, как эти концепции реализованы в структуре изучаемого нового языка программирования.
Это относится и к естественным языкам. Чем лучше знание грамматики родного языка, тем легче дастся изучение второго языка. Более того, положительным побочным эффектом изучения второго языка станет лучшее понимание первого.
Углубляется понимание реализации.
При изучении концепций языков программирования необходимо затрагивать вопросы их реализации. Разобравшись в этом, можно понять, почему язык разработан именно таким образом. Это позволит более рационально его использовать. Программист может значительно повысить мастерство, если научится правильно выбирать конструкции языков программирования и оценивать последствия своего выбора.
Некоторые виды ошибок в программах могут найти и устранить только программисты, знающие соответствующие детали реализации языка.
Кроме того, понимание проблем, связанных с реализацией, позволяет представлять, каким образом компьютер выполняет различные языковые конструкции. В свою очередь, это дает возможность точнее оценить относительную эффективность альтернативных конструкций, которые могут быть выбраны при разработке программы. Например, программисты, не разбирающиеся в реализации рекурсии, не знают, что рекурсивные алгоритмы, как правило, медленнее эквивалентных итеративных.
Повышаются способности к разработке новых языков.
Необходимость создания нового языка программирования в наше время может показаться нереальной. Однако экспертам приходится разрабатывать различные языки программирования. Например, большинство программных систем требует взаимодействия с пользователем, хотя бы для ввода данных и команд. В простых ситуациях вводится несколько значений, а результаты выдаются в тривиальном формате. Чаще же пользователь бывает вынужден проходить по нескольким уровням меню и вводить большое количество разнообразных команд. В таких случаях разработка интерфейса пользователя – непростая задача. Форма этого интерфейса проектируется разработчиком системы, а критерии его оценки весьма похожи на критерии оценки языка программирования. Ведь интерфейс пользователя можно считать языком виртуальной машины. Критический разбор языков программирования поможет при конструировании таких систем.
Понимание новых технологий.
Со временем появляются новые парадигмы программирования. Для наилучшего использования концепций объектно-ориентированного, логического или параллельного программирования необходимо понимание конкретных языков, в которых эти концепции реализованы. Новые технологии, такие как Интернет (Internet) и Всемирная паутина (World Wide Web), в корне меняют природу программирования. Создание методов программирования, оптимально отвечающих этим новым условиям, требует достаточно глубокого понимания существа языков программирования.
1.2. Области применения программирования
Компьютеры применяются во множестве различных областей – как для управления атомными электростанциями, так и хранения записей о личных чековых книжках. Из-за такого разнообразия разработка языков программирования также ведется в различных направлениях. Здесь мы кратко рассмотрим несколько областей применения компьютеров и укажем использующиеся в этих областях языки программирования.
1.2.1. Научные вычисления
Первые цифровые компьютеры (1940-е годы) создавались и использовались для научных целей. Научные приложения (особенно того времени) имеют дело с простыми структурами данных и значительным количеством арифметических вычислений, выполняемых над числами с плавающей точкой. Наиболее часто употребляемыми структурами данных являются массивы и матрицы; из управляющих структур чаще других используются циклы со счетчиком и условные операторы. Языки программирования высокого уровня, созданные для применения в научных исследованиях, разрабатывались именно для удовлетворения таких потребностей. Первым из таковых можно считать FORTRAN. Язык ALGOL 60 и большинство его потомков также предназначались для подобных целей, хотя при этом они могли использоваться и в других родственных областях. Однако для научных приложений особенно важна эффективность, и ни один из языков в этом плане не оказался лучше чем FORTRAN.