Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Классификация языков программирования (Основные парадигмы программирования)

Содержание:

ВВЕДЕНИЕ

Выбор парадигмы программирования, определяющей успешность реализации программного продукта, и соответствующего ей языка программирования имеет решающее значение для специалиста в области информационных технологий и программирования. За последние 50 лет появились сотни языков, поддерживающих различные парадигмы, некоторые из них используют несколько парадигм (такие языки называют мультипарадигменными). Однако, несмотря на большое количество языков программирования, существует несколько действительно важных концепций программирования, и не так много языков, которые были бы актуальны на протяжении более десяти лет. Именно парадигмы программирования определяют общий способ проектирования прикладных программ. Парадигмой программирования называют используемый различными языками подход к программированию, то есть, проще говоря, набор идей и понятий, определяющих стиль написания программ. Среди основных парадигм программирования выделяют объектно-ориентированную, процедурную, функциональную и логическую. Большинство языков программирования, активно используемых в современной разработке прикладных программ, являются мультипарадигменными.

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

Целью данной курсовой работы является выявление критериев, позволяющих выбрать язык программирования и соответствующую ему среду разработки для обучения программированию. Исходя из цели курсовой работы, были поставлены следующие задачи:

  1. Получить общее представление о парадигмах программирования и классификации языков в соответствии с ними;
  2. Подробно рассмотреть основные парадигмы программирования, изучить их ключевые понятия;
  3. Выполнить анализ существующей литературы, выявляющей и анализирующей некоторые критерии выбора того или иного языка программирования и интегрированной среды разработки программ;
  4. Представить основные критерии выбора, рассмотреть их практическую применимость.

1. Классификация языков программирования

1.1 Основные парадигмы программирования

Современное значение термина «парадигма» было введено американским историком и философом Томасом Куном. Согласно Куну, парадигма – это устоявшаяся система научных взглядов, способная объединить членов научного сообщества [1.]. В этом смысле парадигмой можно назвать взгляды Аристотеля или механику Ньютона, причем в процессе развития науки может произойти смена парадигмы (как, например, гелиоцентрическая система Коперника пришла на смену геоцентрической модели мира, предложенной Птолемеем). Поскольку сторонники старой парадигмы могут быть не готовы принять новую, она может еще некоторое время существовать и даже развиваться.

Определение термина «парадигма программирования», обозначающее его совокупное содержание, не является универсальным. В соответствии с различными определениями, которые могут быть найдены в технической литературе, парадигма программирования как исходная концептуальная схема постановки проблем и их решения является инструментом грамматического описания фактов, событий, явлений и процессов, возможно, не существующих одновременно, но интуитивно объединяемых в общее понятие. Термин «парадигма программирования» впервые применил в 1978 году Роберт Флойд в своей лекции лауреата премии Тьюринга. Флойд отмечал [2.], что в программировании можно наблюдать явление, подобное парадигмам Куна, но, в отличие от них, парадигмы программирования не являются взаимоисключающими и могут сочетаться, обогащая инструментарий программиста. Эту особенность использовали мультипарадигменные языки, появившиеся в результате развития идеологий, представленных в ранних, низкоуровневых языках.

Инструкции первых языков программирования, появившихся в начале 50-х годов XX века и ориентированных на конкретный компьютер, записывались в исходном коде и выполнялись последовательно. Данные, полученные при выполнении предыдущих инструкций, могли быть считаны из памяти или записаны в нее. Таким образом, программы представляли собой последовательность команд, которые должен был выполнить компьютер. Языки программирования, использующие этот подход (прежде всего, это машинные инструкции и язык ассемблера), образовали императивную парадигму программирования. В отличие от декларативного подхода, при котором задается спецификация решения задачи, в императивном широко используются операторы присваивания. Ранние императивные языки сложны для понимания и решения прикладных задач.

Развитие вычислительных устройств и компьютерной техники привело к появлению процедурных языков. Процедурные языки программирования, первые реализации которых относятся к концу 50-х годов, позволили разбивать задачи на шаги и решать их за шагом, причем возможность определять каждый шаг в процессе решения задачи была предоставлена программисту. Эти языки использовали императивный подход, но последовательно выполняемые операторы могли быть собраны в подпрограммы, то есть более крупные целостные единицы кода, с помощью самого языка. Согласно некоторым классификациям, такой подход выделяется в самостоятельную парадигму, получившую название процедурной. К процедурным языкам программирования относятся, например, Паскаль, Си, Алгол, КОБОЛ и Фортран.

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

Теоретические основы функционального подхода впервые были реализованы на практике с появлением языка программирования Лисп, созданного Джоном Маккарти в конце 1950-х годов. Несмотря на то, что его первые версии, реализованные первоначально для компьютеров серии IBM 700/7000, не были полностью функциональными (хотя при этом поддерживали несколько парадигм), Лисп породил целое семейство функциональных языков, многие из которых активно используются и по сей день. Дальнейшим развитием Лиспа стали такие языки, как Scheme и Dylan. Одним из самых популярных функциональных языков программирования стал Haskell.

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

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

Объектно-ориентированный подход получил свое развитие в результате решения проблемы концептуальной близости текста программы и описания задачи – построения расширяемого языка, содержащего небольшое ядро и допускающего расширение, дополняющее язык типами данных и операторами, отражающими концептуальную сущность конкретного класса задач. Первыми языками-ядрами были Симула и Алгол-68.

Объектно-ориентированный подход к программированию оказался эффективным в тех случаях, когда некоторый реально существующий предмет характеризуется очень большим числом параметров. Тогда подпрограммы, описывающие алгоритмы обработки или функционирования такого предмета, имеют настолько большое число формальных параметров, что программирование их вызовов слишком трудоемко и сопряжено с большим количеством ошибок. Эффективным методом программирования таких задач является создания в программе объекта, соответствующего предмету. Этот объект будет включать в себя данные, соответствующие параметрам предмета, и подпрограммы (в Си++ функции), описывающие алгоритмы обработки или функционирования предмета. Данные объекта должными являться по умолчанию доступными для алгоритмов объекта (как бы быть глобальными для этих алгоритмов) и не включаться в списки параметров соответствующих подпрограмм. Таким образом, количество параметров подпрограмм существенно уменьшится.

Итак, вычисления в парадигме объектно-ориентированного программирования рассматриваются как моделирование сущностей реального мира. Самыми популярными языками программирования в этой парадигме являются C++, C# и Java. В дальнейшем объектно-ориентированная и функциональная парадигмы рассматриваются более подробно.

1.2 Объектно-ориентированная парадигма

Основными компонентами объектно-ориентированных методологий являются «объекты и классы», «абстракция и инкапсуляция данных», «наследование» и «полиморфизм» [3.].

Объект – это предмет реального мира, который имеет некоторые характеристики, называемые состоянием, и некоторые виды поведения. Состояние объекта представляет собой всю информацию, содержащуюся в нем, а поведение объекта – это набор действий, которые он может выполнять для изменения своего состояния. Характеристики объектов представлены данными-членами класса, а характеристики поведения представлены функциями-членами класса. То есть набором переменных, называемых полями, представляющими свойства конкретного физического или концептуального объекта, а также набором заданных разработчиком операций, называемых методами, для наблюдения и изменения полей этого объекта. Никакой код, за исключением заданных операций, не может получить доступ к полям или методам объекта.

Объекты одного и того же типа могут быть сгруппированы вместе, чтобы сформировать класс. Класс служит своего рода прототипом. Программист должен указать весь набор данных и функций для различных операций над данными объекта как пользовательский тип в виде класса. Другими словами, программист определяет формат объекта и поведение, определяя класс. Компилятор языка программирования не знает об этом определяемом пользователем типе данных. Программист должен определить данные и функциональные возможности, связанные с ним, разработав класс. Таким образом, класс – это набор объектов одного и того же типа. Например, в группе граждан каждый отдельный гражданин является объектом и принадлежит к классу граждан.

Абстракция подразумевает представление более значимых признаков наряду с игнорированием менее значимых с целью отделить объекты / функции от других объектов / функций. В объектно-ориентированном подходе классы используют концепцию абстракции данных. С абстракцией данных можно использовать структуры данных, не заботясь о точных деталях реализации. Это означает, что программист знает только о различных операциях, которые могут быть выполнены с этими типами данных, но то, как эти операции выполняются аппаратным или программным обеспечением, скрыто от программиста. Аналогично в объектно-ориентированном подходе классы действуют как абстрактные типы данных. Классы определены как набор атрибутов и функций для работы с этими атрибутами. Они инкапсулируют все существенные свойства объектов, которые должны быть созданы [5.].

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

Наследование – это процесс, посредством которого объекты одного класса приобретают свойства объектов другого класса в иерархии. Новые классы могут быть построены из существующих классов. Это означает, что можно добавить дополнительные функции в существующий класс, не изменяя его. Новый класс называется производным классом или подклассом, а исходный класс называется базовым классом или суперклассом. Следовательно, концепция наследования обеспечивает идею повторного использования. Механизм наследования позволяет программисту повторно использовать класс, который сделан почти аналогичным требуемому, добавив в него еще несколько функций.

Полиморфизм является одной из фундаментальных особенностей объектно-ориентированной парадигмы. Слово полиморфизм состоит из двух греческих слов «поли» и «морфизм». Слово «поли» означает «много», а «морфизм» – «формы», поэтому полиморфизм подразумевает множество форм. В объектно-ориентированной парадигме это означает способность функции-члена обрабатывать данные разных типов. Это свойство, которое позволяет использовать один интерфейс для общего класса действий. В данном случае точное действие определяется деталями конкретной ситуации.

Объектно-ориентированная парадигма предоставляет несколько значимых преимуществ как разработчику программы, так и пользователю. Новая технология обеспечивает большую производительность программиста, лучшее качество программного обеспечения и меньшие затраты на обслуживание. Основными преимуществами являются [5.]:

  • Простота разделения задач – поскольку можно сопоставить объекты проблемной области с объектами в программе, работу можно легко упростить, основываясь на свойствах объектов;
  • Уменьшение сложности – сложность программного обеспечения может легко управляться;
  • Обеспечение расширяемости – объектно-ориентированные системы могут быть легко модернизированы, и, таким образом, легко перейти с небольшой на большую систему;
  • Устранение избыточности – с помощью наследования можно устранить избыточный код и расширить использование существующих классов;
  • Уменьшение времени разработки и повышение производительность – вместо того, чтобы писать код с нуля, решения можно построить с использованием стандартных рабочих модулей;
  • Позволяет создавать безопасные программы – функция сокрытия данных помогает программисту создавать безопасные программы, к которым нет доступа из кода в других частях программы;
  • Позволяет создавать более простые интерфейсы – методы передачи сообщений между объектами позволяют упростить описание интерфейса с внешними системами.

1.3 Функциональная парадигма

Отличие императивного понятия «функции» от функции в математическом смысле состоит в том, что императивные функции способны опираться на состояние внешних по отношению к функции переменных и менять их, выполняя побочные эффекты. Это означает, что при вызове одной и той же функции с одинаковыми параметрами в императивном программировании из-за влияния состояния переменных на функцию на разных этапах выполнения алгоритма можно получить разные данные на выходе, в то время как в функциональном языке результат всегда одинаков: выходные данные зависят только от входных [6.]. Благодаря этому свойству среды выполнения программ на функциональных языках могут сохранять результаты функций в памяти и вызывать их в порядке, не определяемом алгоритмом.

Теория, положенная в основу императивного программирования, родилась в 20-х – 30-х годах прошлого столетия благодаря работам Алана Тьюринга и Джона Фон Неймана. Функциональное программирование появилось примерно в то же время. Его математические основы в виде комбинаторной логики были разработаны Моисеем Шейнфинкелем (его ранние работы малоизвестны, поскольку далеки по времени от работ, непосредственно связанных с функциональным подходом). Категориальная комбинаторная логика, предложенная Хаскеллом Карри (в честь него назван язык программирования Haskell), позволила выполнить построение абстрактной машины, выполняющей моделирование среды вычислений. Попытки формализации и анализа понятия вычислимости Алонзо Черча легли в основу лямбда-исчисления, которое представляет собой формальную систему, то есть совокупность абстрактных объектов, в которой используются правила оперирования множеством символов без учета смыслового содержания (семантики), но в строго синтаксической трактовке. Лямбда-исчисление нашло применение во многих современных языках программирования в виде механизма так называемых «анонимных функций» – функций, которые могут быть определены в том месте, где они используются, и которые имеют доступ к локальным переменным текущей функции. Многие функциональные языки можно рассматривать как «надстройку» над лямбда-исчислением [7.].

1960-е ознаменовались появлением различных специфических языков, использующих элементы функционального подхода [8.]. Одним из них был оптимизированный для работы с массивами язык APL, предшественник современных научных вычислительных сред, таких как Matlab, а также языков J и K, применяемых в финансовом анализе. APL оказал значительное влияние на появившиеся впоследствии специфические языки, нашедших различное применение в индустрии: R (статистика), Wolfram (символьная математика), XSLT и XML (языки разметки). Распространенные декларативные языки SQL и Lex / Yacc тоже содержат элементы функционального программирования, поскольку не используют аналоги переменных в императивных языках. Языки, используемые при работе с электронными таблицами, также можно рассматривать как функциональные, потому что функции, задаваемые в ячейках таблиц, зависят только от других ячеек, а моделирование переменных осуществляется при помощи языка макросов, который является императивным.

Модели функциональных языков, разработанные в конце 70-х – начале 80-х годов прошлого века, включали в себя поддержку таких механизмов, как абстракция данных и полиморфизм. Фундаментальная идея абстракции состоит в разделении несущественных деталей реализации программы и характеристик, существенных для ее корректного использования, полиморфизмом называется способность функции обрабатывать данные разных типов. Эти нововведения дали мощный толчок к появлению множества типизированных функциональных языков и различных диалектов. Однако их дальнейшее распространение затруднялось тем, что каждая группа, занимающаяся функциональным программированием, использовала собственный язык. Попытки объединенной группы ведущих исследователей соединить множество идей, накопленных в процессе становления функционального программирования, привели к реализации нового универсального языка Haskell [9.]. Первая версия языка появилась в начале 90-х годов.

Дальнейшие совершенствования функциональных языков связаны с унификацией и обобщением функциональной парадигмы и объектно-ориентированной парадигмы, основанной на представлении программы в виде множества объектов, каждый из которых является экземпляром определенного класса, совокупность которых образует иерархию наследования. Основные технические новшества языка Scala, который появился в 2003-м году, представляли собой сплав этих парадигм программирования. Кроме того, использование механизмов абстракции, композиции и декомпозиции, пришедшее на смену введению большого количества примитивов, добавило возможность с помощью одних и тех же концепций описать как маленькие, так и большие программные части. Типобезопасность и масштабируемость Scala и возможность его интеграции с Java, откуда были заимствованы основные синтаксические соглашения и некоторые концепции, позволяют активно использовать язык в промышленной разработке.

Несмотря на то, что ключевые концепции, специфичные для функциональной парадигмы, могут быть чужды императивной, многие современные языки являются мультипарадигменными и используют некоторые из этих концепций [8.]:

  • Краткость и простота;

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

Листинг 1. Функция быстрой сортировки Хоара на языке программирования Си

void quickSort (int a[], int l, int r)  

{  

   int i = l;  

   int j = r;  

   int x = a[(l + r) / 2];  

     do  

     {  

         while (a[i] < x) i++;  

         while (x < a[j]) j--;  

         if (i <= j)  

         {  

             int temp = a[i];  

             a[i++] = a[j];  

             a[j--] = temp;  

         }  

} while (i <= j);  

    if (l < j) quickSort (a, l, j);  

    if (i < r) quickSort (a, i, r); 

}  

Пример быстрой сортировки Хоара на абстрактном функциональном языке приведен в листинге 2.

Листинг 2. Пример быстрой сортировки Хоара на абстрактном функциональном языке программирования

quickSort ([]) = []  

quickSort ([h : t]) = quickSort (n | n ∈ t, n <= h) + [h] + quickSort (n | n ∈ t, n > h)

Этот пример читается так:

Если список пуст, то результатом работы алгоритма также будет пустой список.

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

Как видно даже на таком простом примере, функциональный стиль написания программ имеет преимущество перед императивным с точки зрения лаконичности и элегантности написанного кода. В отличие от императивного стиля, описывающего шаги, ведущие к достижению цели, функциональный описывает математические отношения между данными и целью.

  • Использование функций высших порядков;

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

  • Отсутствие побочных эффектов;

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

  • Модульность;

Механизм модульности позволяет разделять программы на несколько независимых частей, облегчая процесс проектирования и дальнейшей поддержки больших программных систем. Несмотря на то, что модульность не является исключительным свойством функциональных языков, она поддерживается большинством таковых.

  • Подход к вычислению аргументов;

Во многих императивных языках вызов функции приводит к вычислению всех аргументов. Однако вычисление некоторых аргументов может быть излишним. Например, оператор конъюнкции может не вычислять значение второго аргумента в том случае, когда первый оказывается ложным. Функциональные языки могут быть классифицированы по способу обработки аргументов функции в процессе вычисления. При строгом порядке вычисления заранее подсчитываются значения всех аргументов перед вычислением самой функции, при нестрогом – значения аргументов вообще не вычисляются до тех пор, пока их значение не понадобится при вычислении функции. Нестрогое вычисление используется по умолчанию в несколько чисто функциональных языках, в том числе Miranda, Clean и Haskell.

  • Рекурсия;

Функциональная парадигма программирования, в отличие от императивной, не имеет такого понятия, как цикл. Функциональные языки реализуют цикл в виде рекурсии: для повторения операции функции могут вызывать себя рекурсивно. Поскольку рекурсивные вызовы требуют больших затрат по памяти, для их накапливания необходим большой аппаратный стек. Функциональные языки позволяют избежать дополнительных расходов за счет использования хвостовой рекурсии, распознавание и оптимизация которой в код возлагается на компилятор. Код, получаемый в результате подобной операции, аналогичен итерации, используемой в императивном языке программирования. Кроме того, рекурсивные функции могут быть обобщены с помощью ФВП. Понятия «свертки» и «развертки» играют роль цикла в императивных языках программирования.

  • Повышение надежности кода.

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

2. Критерии выбора среды и языка разработки программ

2.1 Выбор первого языка для разработки программ

Язык программирования, используемый при обучении вводному курсу программирования, может оказать большое влияние на то, как преподается курс, а также на его эффективность. Выбор языка долгое время был сложным и неструктурированным процессом. Последние проблемы в мире разработки программного обеспечения являются такими же стратегическими, политическими и спорными, как и выбор языка программирования [10.]. На протяжении многих лет различные языки рассматривались в качестве претендентов на основные языки программирования в вузовских программах обучения компьютерным наукам. Выбор языка программирования в таких программах, как правило, определяется серией совещаний преподавателей, посвященных неформальной оценке языка, дебатам и возможному консенсусу. Учитывая разнообразие доступных языков программирования высокого уровня, выбор «правильного» языка для учебной программы или курса, ориентированных на вычислительную технику, может вызывать недоумение. По мере роста числа преподавателей, студентов и языковых возможностей выбор языка становится все более сложным. Кроме того, процесс выбора в настоящее время не имеет структуры и поэтому не может быть легко воспроизведен. Поскольку процесс выбора часто повторяется каждые два-три года, разработка и документирование набора критериев отбора, а также процесс применения этих критериев приведут к процессу, который будет легче повторяться в будущем. Структурированный подход к выбору языка программирования позволит более тщательно оценить доступные варианты и сделать выбор более простым.

При выборе языка программирования необходимо учитывать несколько факторов, и, поскольку в различных учебных программах акценты делаются на разные факторы, необходимо учитывать их все. В этой ситуации особенно важно разработать всеобъемлющий набор критериев отбора и процесс применения этих критериев для оценки языков программирования, которые будут использоваться при обучении. Критерии отбора должны учитывать особенности программирования каждого рассматриваемого языка, пригодность каждой из этих особенностей для начальных (и, возможно, продвинутых) курсов программирования, настоящее и будущее признание каждого языка рынком, наличие и качество учебных пособий и онлайн-курсов, а также затраты, связанные с возможным принятием каждого языка.

МакАйвер [11.] указывает, что, несмотря на существование большого количества рекомендаций для выбора первого языка программирования, существует недостаток в оценочных исследованиях языков или сред разработки для целесообразности их использования в вводных курсах. Кроме того, не хватает эмпирических тестов, сравнивающих разные языки. Уилсон [12.] соглашается с тем, что, хотя споры об относительных достоинствах различных языков программирования довольно распространены, было проведено сравнительно мало экспериментальных сравнений удобства использования различных языков программирования.

Уилсон в своей работе смог найти только одно такое исследование – эксперимент Шафрона и Шеффера [13.] для измерения применимости систем параллельного программирования. В другом исследовании, проведенном Муртагом и Гамильтоном [14.], было проведено однозначное сравнение влияния двух языков на успех учащихся во вводном курсе программирования, но для их подхода требуется инструктор, хорошо владеющий обоими языками, и он фактически не распространяется на более чем два языка одновременно. Различные аргументы были сделаны для использования определенного языка или конкретной парадигмы при обучении программированию. Тем не менее, МакАйвер также указывает, что, хотя неподтвержденные данные из вводных курсов по программированию широко доступны, а отдельные языковые особенности были изучены с когнитивной точки зрения, определение того, какой язык следует использовать для обучения программированию, остается спорным вопросом.

Одним из объяснений недостатка исследований является то, что различия между программистами делают любое исследование бессмысленным. Другое заключается в том, что различия между предметными областями слишком велики для проведения значимого исследования. Уилсон [12.] не согласен с предпосылкой, что такие исследования невозможны, но в то же время он не предлагает никаких решений. Сравнение языков является сложной задачей, особенно когда языки не имеют одинаковую парадигму [11.]. Установить надлежащие критерии для сравнения сложно не только потому, что существует вопрос о том, что измерять, но и потому, что критерии могут отдавать предпочтение одному языку над другим. МакАйвер [11.] указывает, что в образовательных учреждениях требования различных курсов и учебных программ делают проблематичным, если не невозможным, сравнение разных языков. Кроме того, разные курсы обычно имеют достаточно разные цели, что делает языковые сравнения практически бессмысленными.

Как отмечалось ранее, многие факторы должны быть рассмотрены до начала процесса выбора языка. Хотя эти факторы в конечном итоге могут быть включены в критерии оценки, они также могут быть использованы для сужения области выбора. Например, отбор почти наверняка будет зависеть от методики или парадигмы, которую преподают, и количества языков, которые будут использоваться в плане изучения программирования.

Выбор парадигмы программирования, которая определяет, что следует учить, должен предшествовать выбору первого языка, который влияет на то, как его учить. Парадигма определяет рамки изучения конкретного языка. Боуман [15.] утверждает, что при рассмотрении вводных курсов по программированию главное внимание должно уделяться не языкам, а выбору теории или методологии программирования для преподавания. Вольц [16.] утверждает, что «фокус на языке вводит в заблуждение, потому что он делает акцент на механике выражения ключевых идей, а не на самих ключевых идеях». Дополнительные соображения включают в себя то, следует ли изучать языковые конструкции отдельно от проекта программы или одновременно с ним, как определить надлежащий баланс между программированием в целом и программированием в деталях, и следует ли изучать один язык на протяжении всего курса программирования, либо изучать несколько языков.

Независимо от парадигмы, необходимо сделать выбор между языками профессионального уровня и учебными. Профессиональный язык используется в индустрии и преподается полностью (за исключением очень продвинутых функций) через коммерчески доступную среду. Профессиональный язык, такой как Java или C++, предоставляет студентам опыт работы в реальной среде. Учебный язык – это язык, разработанный специально для учебных целей. Учебные языки, такие как Haskell и Eiffel, отделяют обучение программированию от изучения деталей конкретного языка, сводя к минимуму технические проблемы, которые могут отвлекать от процесса обучения. Как только студенты изучат основы, они смогут применить свои знания программирования на любом языке [17.].

Некоторые преподаватели наивно полагают, что смена языка программирования обойдется для них легко, и что это не приведет к серьезным последствиям, если первоначальное решение окажется неудачным. Ли и Филлипс [18.] отмечают, однако, что значительные затраты возникают при освоении определенного языка, включая подготовку лекционных материалов, разработку проектов и упражнений для учащихся, изучение среды разработки и установку выбранного языка, а также обучение персонала. Такие накладные расходы указывают на то, что при выборе языка следует соблюдать осторожность, поскольку этот выбор может влиять на преподавателя в течение нескольких лет.

2.2 Критерии выбора языка и среды разработки для обучения программированию

Ниже перечислены основные критерии выбора языка программирования и интегрированной среды разработки. Вот они:

  • Разумная финансовая стоимость;

Этот критерий относится к цене за приобретение языка программирования или среды разработки. Для экономии расходов может помочь академическая скидка для образовательных учреждений, кроме того, загружаемое программное обеспечение может быть бесплатным. Стоимость часто включается в накладные расходы, связанные с принятием определенного языка в качестве основного языка разработки программ. Лоулис [19.] перечисляет различные виды затрат, которые могут быть связаны с выбором продуктов для разработки, включая цену покупки, затраты на обучение, затраты на установку, стоимость дополнительного оборудования и стоимость необходимых дополнительных сотрудников. Ли и Филлипс [18.] расширяют определение затрат, чтобы включить все накладные расходы со стороны учебных заведений, связанные с принятием определенного языка, включая подготовку лекционных материалов, разработку проектов и заданий для студентов, установку и изучение среды разработки, запрос учебников и обучение персонала.

  • Наличие студенческой / академической версии;

Хотя наличие студенческой или академической версии не упоминается во многих исследованиях, оно всегда является проблемой при выборе языка программирования. Если версия для студента недоступна, и учебное заведение использует доступную только ему версию, то студенты могут быть вынуждены выполнять свои задания в компьютерных аудиториях, ограниченных часами работы, доступностью транспорта и т.д. Если академическая версия урезана, тогда польза для студентов может быть не такой большой, но этот фактор следует хотя бы оценить.

  • Наличие учебных пособий;

На доступность учебников может повлиять множество дополнительных факторов. Стадия жизненного цикла языка влияет на доступность учебников, особенно когда язык относительно новый. Когда Visual Basic.NET был впервые выпущен, существовало малое количество качественных учебников, но по мере развития языка было опубликовано больше. Академическое признание языка также играет большую роль в доступности учебников, потому что существует больший потенциальный рынок для издаваемого текста, который имеет дело с более широко используемым языком. Наконец, доступность учебника может также зависеть от используемого подхода к обучению. Необходимо также учитывать наличие справочников. Ватт [20.] включает доступность учебников в качестве одной из проблем, требующих рассмотрения, в то время как МакАйвер [11.] включает оценку качества учебников в качестве одного из обычных соображений при оценке потенциальных языков. Легко найти подходящий текст – это один из критериев выбора языка.

  • Стадия в жизненном цикле;

Как отмечалось выше, также следует учитывать стадию языка программирования в жизненном цикле языка программирования (не путать с жизненным циклом разработки программы). Помимо влияния на доступность учебников, это также может повлиять на широкое использование языка как в индустрии, так и в научных кругах. Университеты могут предпочесть язык, который все еще находится на ранних стадиях развития, а не устаревший язык, такой как COBOL или FORTRAN, которые находятся в упадке. Жизненный цикл языка программирования, описанный Шарпом [21.], основан на естественных принципах роста, созревания и распада. Процессы естественного преимущества и эволюции действуют в мире языков программирования так же, как они действуют в биологической области. Новые языки конкурируют со старыми языками. Если язык является универсальным, функциональным, выразительным и представленным на рынке, он, скорее всего, будет принят в качестве приоритетного. После принятия рынок приложений стимулирует эволюцию языка. Жизненный цикл языка программирования начинается с этапа концепции, когда язык задуман так, чтобы восполнить недостатки, не встречающиеся в существующих языках. Затем следует фаза принятия, поскольку программисты понимают, что язык повысит их эффективность. Поскольку язык стабилизируется и обнаруживает меньше дефектов, появляется общее признание. Стадия полного развития характеризуется большей потребностью в функциональности, чем в эффективности, что приводит к стадии неэффективности, характеризующейся расширенной функциональностью, а также рынком, фрагментированным несопоставимым внедрением стандартов поставщиком. Закат продолжается на стадии возражения, когда разработка становится более дорогостоящей, а неэффективность ведет к рассмотрению альтернатив. Наконец, на стадии затухания на сцене появляются новые языки, в которых отсутствуют некоторые функции, но они работают быстрее и эффективнее и вытесняют своих предшественников.

  • Системные требования;

Системные требования часто играют роль в процессе выбора языка программирования. Они включают в себя требования к оборудованию и операционной системе. Количество места на жестком диске, необходимое для установки программного обеспечения, требуемая операционная система и память для запуска программного обеспечения – все это влияет на принятие решения. Например, некоторые требования платформы .NET включают Windows NT 4.0 или более позднюю версию, процессор Pentium II 450 МГц (минимум), 3,5 ГБ свободного дискового пространства и минимум 160 МБ ОЗУ для Windows XP Professional.

  • Зависимость от операционной системы;

Этот критерий относится к зависимости языка от конкретной платформы операционной системы, которую часто называют переносимостью. Например, любой из языков, поддерживаемых платформой .NET, включая Visual Basic, C++, C# и т.д. зависит от операционной системы Windows. Другие языки, такие как Java, не зависят от платформы, и можно найти среды разработки для Java для различных операционных систем. Это может быть также важнейшим фактором, если есть строгая необходимость не привязываться к конкретной операционной системе.

  • Проприетарный или открытый исходный код;

Этот критерий относится к сущности, которая управляет развитием языка и связанной с ним среды разработки. Например, Microsoft несет ответственность за добавления, удаления или изменения на любом из языков, поддерживаемых платформой .NET Framework. На противоположном конце спектра PHP является языком с открытым исходным кодом и может быть легко реализован любым членом сообщества. И Стивенсон [22.], и Райли [23.] включают в свои критерии открытый исходный код.

  • Академическое признание;

Академическое признание относится к популярности языка в других учебных заведениях. Это можно оценить по текущему или прогнозируемому использованию в других учреждениях. Например, рост популярности объектно-ориентированного программирования в начале нулевых и решение Совета колледжей о переводе программы Advanced Placement Computer Science на Java привели к тому, что все больше университетов, колледжей и средних школ США приняли Java в качестве языка программирования для своих вводных курсов программирования.

  • Признание в отрасли;

Этот критерий относится к проникновению на рынок определенного языка, то есть использованию языка в бизнесе и промышленности. Стивенсон [22.] утверждает, что этот фактор оказывает наибольшее влияние на выбор языка, на что указывают 23,5% школ, которые участвовали в его исследовании. Признание отрасли влияет на другой связанный критерий – конкурентоспособность.

  • Ликвидность;

Выбор языка часто определяется спросом на рабочем месте, то есть тем, что хотят работодатели. Мало того, что рыночные навыки важны для будущей возможности трудоустройства, но и студенты с большим энтузиазмом относятся к изучению языка, который, по их мнению, повысит их возможности трудоустройства.

Эмиг [24.] указывает на предостережение, которое необходимо учитывать при оценке приемлемости отрасли и конкурентоспособности. Как правило, между началом учебной программы и достижением должности с использованием навыков программирования проходит от четырех до пяти лет. Даже если учебная программа учит более новому языку программирования, нет никакой гарантии, что работодатели все равно будут выбирать этот язык, когда студент поступит на работу.

  • Среда разработки;

Среда разработки является виртуальной рабочей средой программиста и может повысить или снизить производительность. Среды разработки варьируются от простых текстовых редакторов и компиляторов командной строки до полностью интерактивных и интегрированных сред разработки (IDE). Келлинг [25.] отмечает, что среда должна быть простой в использовании, чтобы учащиеся могли сосредоточиться на изучении концепций программирования, а не на самой среде. Эйзенштадт и Льюис [26.] делают еще один шаг вперед, ссылаясь на доказательства того, что хорошо разработанные среды программирования помогают учащимся учиться программировать.

Хотя МакАйвер [11.] указывает, что было мало оценочных исследований сред разработки для обучения программированию, они все же упоминаются в нескольких исследованиях как критерий выбора языка. Ли и Филлипс [18.] утверждают, что оценка различных сред является одной из накладных расходов при оценке языка. Эмиг [24.] перечисляет необходимость среды разработки в качестве одного из своих критериев и отмечает, что по мере того, как языки профессионального уровня становятся все более сложными и комплексными, среды разработки становятся все более пугающими.

  • Легкость изучения фундаментальных понятий;

Кривая обучения, связанная с каждым языком или средой разработки, сильно различается в зависимости от языка. Наиболее очевидный пример – это резкое увеличение кривой обучения с Visual Basic 6 до Visual Basic.NET. Основные понятия включают структуры управления последовательностью, выбором и итерацией, а также массивы, процедуры, базовый ввод / вывод и работу с файлами. Келлинг [25] обращает внимание, что язык должен поддерживать чистые, простые и четко определенные концепции; он должен иметь легко читаемый, согласованный синтаксис.

  • Сценарный или полнофункциональный язык;

Программисты также должны выбирать между полнофункциональными и менее сложными языками. Причельт [28] называет их обычными языками программирования и языками сценариев. Некоторые преподаватели курсов по программированию предпочитают языки сценариев, такие как Python, потому что они предлагают достаточное разнообразие, чтобы покрыть большинство требований вводного курса, одновременно уменьшая сложность среды разработки и избегая многих других проблем реализации. Уотт [20] утверждает, что JavaScript обладает «достаточным богатством, чтобы охватить большую часть того, что требуется в начальном курсе, и это настоящий язык с непосредственным применением для студента». Далее он отмечает, что JavaScript также использует простую среду редактирования, уменьшает сложность языка и улучшает согласованность. Полнофункциональные языки, однако, предлагают более полный набор языковых функций, которые преподаватель может захотеть включить. Некоторые из этих вопросов могут быть связаны со следующим критерием, выбором между обучением основным понятиям и обучением конкретному языку.

  • Поддержка учебного подхода;

Как отмечалось выше, этот критерий относится к оценке того, насколько хорошо язык поддерживает подход преподавания, предпочтительный для факультета. МакАйвер [11.] утверждает, что разногласия по поводу того, должны ли курсы программирования концентрироваться на базовых концепциях программирования в отличие от конкретного языка, являются одной из фундаментальных причин разнообразия курсов и учебников по программированию.

Многие исследования подтверждают приоритет понятий над языком. Томблин [28.] утверждает, что в центре внимания курсов программирования должен быть не столько язык, сколько концепции и хорошие практики программирования, которые необходимо преподавать. Келлинг [25.] отмечает, что целью его курсов по программированию является обучение студентов таким образом, чтобы они понимали основополагающие концепции и, таким образом, могли писать хорошие программы на любом языке. Другие исследования обсуждают использование Java с этой точки зрения. Уотт [20.] утверждает, что, хотя многие функции, предлагаемые Java, необходимы для программ рыночного уровня, они являются непростыми для преподавания концепций программирования. Коллинз [29.] обсуждает пригодность Java для демонстрации и передачи концепций, важных в учебной программе программирования.

Другие программы используют альтернативный подход и акцентируют внимание на обучении отдельных языковых функций. Ли и Филлипс [18.] утверждают, что большинство студентов считают обучение на конкретном языке более полезным, чем обучение программированию. Кроме того, Эмиг [24.] отмечает, что многие университеты реагируют на потребность студентов в обучении техническим аспектам конкретного языка, а не концепциям программирования.

  • Средства отладки;

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

  • Поддержка веб-разработки;

Одним из критериев, который может быть неприменим к конкретной программе обучения, но критичен для других, является уровень поддержки веб-разработки, который обеспечивает выбираемый язык. Он не ограничивается языками сценариев, как обсуждалось в предыдущем разделе, поскольку некоторые языки обеспечивают высокий уровень поддержки веб-разработки, но в то же время считаются полнофункциональными. Ван [30.] отмечает, что будущие профессионалы в области компьютерных наук должны приобрести навыки разработки компьютерных приложений в интернет-среде. К счастью, разработка веб-приложений превратилась в использование высокоуровневых инструментов, которые фокусируются на интеграции различных компонентов. Кроме того, существует множество сред разработки и программ, разработанных для создания полезных веб-страниц.

  • Безопасность кода;

Этот критерий можно использовать для оценки двух важных факторов. В первом из них рассматривается, предлагает ли язык такие возможности, как строгая проверка типов и проверка границ массивов, при этом избегая таких функций, как указатели в небезопасном режиме. Келлинг [25.] отмечает, что язык «должен избегать концепций, которые могут привести к ошибочным программам. В частности, он должен иметь безопасную, статически проверяемую (насколько это возможно) систему типов, не иметь явных указателей и не обнаруживаемых неинициализированных переменных». Второй фактор, тесно связанный с первым, – это включение функций безопасности, таких как Java-Sandbox, которая предназначена для ограничения адресов памяти, к которым может обращаться программа на Java. Другой пример, приведенный МакАйвером, указывает на то, что Java-апплеты считаются ненадежными и, следовательно, ограничены в действиях, которые они могут выполнять при выполнении из браузера пользователя. Команда Принстона по безопасному интернет-программированию подробно описывает требования к безопасной системе, включая безопасность типов, модульное программирование и политику безопасности.

  • Расширение возможностей для последующих курсов программирования;

Если в компьютерную программу включено несколько курсов по программированию, вопрос о том, предлагает ли язык программирования адекватные расширенные функции для поддержки продвинутого курса программирования, может представлять собой проблему. В то время как некоторые курсы предпочитают обучать нескольким языкам в своей учебной программе, другие предпочитают предоставлять базовые функции языка программирования во вводном курсе и откладывать расширенные функции языка, такие как многопоточность, на последующий курс.

  • Наличие поддержки;

Этот критерий относится к наличию вспомогательного персонала, включая сотрудников компьютерных классов и / или сетевых администраторов, для поддержки преподавания и администрирования языка в высших учебных заведениях. Ли и Филлипс [18.] и Келлинг [25.] отмечают наличие обученного персонала среди своих критериев отбора. Необходимо также принимать во внимание доступность поддержки через форумы или рассылки в Интернете, а также поддержку поставщиков программного обеспечения.

  • Ожидаемый уровень опыта программирования у начинающих студентов;

Последний критерий не менее важен, поскольку предыдущий опыт и обучение студентов искажают их понимание новых парадигм программирования и языков. Данные, опубликованные Советом колледжей в 2004 году, показывают, что 20% учащихся колледжей США прошли хотя бы один курс по компьютерному программированию в старшей школе. Ли и Филлипс [18.] и Келлинг [25.] обсуждают повышение уровня опыта студентов. Доля студентов, имеющих опыт программирования, значительно увеличилась с течением времени, хотя этого недостаточно, чтобы требовать опыта в качестве предварительного условия для курса.

2.3 Практические аспекты

Несмотря на то что выбор языка очень субъективен, полный список критериев делает возможным процесс объективного выбора. Тем не менее, этот процесс может по-прежнему сильно различаться из-за разницы в культуре, стратегии или даже политике в каждом отдельно взятом учебном учреждении. Следующие шаги обеспечивают системный подход в общем процессе выбора:

  1. Составление списка критериев;

Критерии, предложенные в данной курсовой работе, могут быть адаптированы к потребностям большинства факультетов или программ обучения.

  1. Вычисление значимости каждого из критериев;

Необходимо рассчитать, в зависимости от потребностей факультета, значение важности каждого из критериев. Например, это значение может варьироваться от нуля (незначимый показатель) до десяти (крайне важный).

  1. Определение списка языков-кандидатов;

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

  1. Оценивание языков;

Каждому языку-кандидату должен быть присвоен рейтинг по каждому из критериев. Рейтинг может варьироваться от нуля (чрезвычайно низкий) до десяти (чрезвычайно высокий).

  1. Расчет взвешенной оценки.

Для каждого языка-кандидата можно рассчитать взвешенную оценку, сложив вместе оценку языка, умноженную на показатель значимости, присвоенный каждому критерию. Язык с наивысшим взвешенным баллом является оптимальным выбором на основе всех оценок. Процесс достаточно механический и может быть легко адаптирован к потребностям отдельных факультетов. Лучше начать процесс отбора с краткого введения в процедуру. Может быть сформирован комитет по выбору языка для оценки и адаптации критериев отбора и определения показателя значимости по каждому критерию для факультета.

ЗАКЛЮЧЕНИЕ

В данной работе была проанализирована существующая литература по выбору языка программирования и соответствующей ему среды разработки для использования в вводном курсе программирования, были рассмотрены основные парадигмы программирования, а также получен всеобъемлющий набор критериев, которые будут использоваться при оценке языка программирования. Наконец, предложен процесс, с помощью которого эти критерии могут использоваться для сравнения языков программирования с целью облегчения выбора языка.

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

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

Будущие исследования могут включать уточнение критериев отбора, формализацию процесса отбора и применение процесса в различных условиях. Большое количество критериев отбора было представлено, чтобы разработать наиболее полный инструментарий для необходимого выбора. Некоторые из этих критериев, вероятно, более актуальны, чем другие. Будущие исследования могут отражать относительную важность каждого из этих критериев для разных языков, лиц, принимающих решения, и сред принятия решений. Формализация механизма отбора может опираться на методы, используемые при принятии многокритериальных решений. Наконец, уточненные критерии отбора и процесс могут применяться и оцениваться в различных академических условиях, а результаты – оцениваться для использования при дальнейшей доработке как процесса, так и инструментария выбора.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1. Kuhn, T.S. The Structure of Scientific Revolutions. Chicago University Press, 1962
  2. Floyd, R.W. The Paradigms of Programming. Computer Journal, 22(8):455-460, 1979
  3. Booch, G. Object Oriented Design: With Applications, Benjamin/Cummings Publishers, 1991, ISBN 9780805300918
  4. Martin, J., Odell, J.J. Object Oriented methods – A Foundation, Prentice Hall PTR, 1998, ISBN 9780139055973
  5. Jana, D. C++ and Object Oriented Programming Paradigm, Second Edition, PHI Learning Pvt Ltd, 2003, ISBN 978-81-203-2871-6
  6. Роганова Н.А. Функциональное программирование: Учебное пособие для студентов высших учебных заведений — М.: ГИНФО, 2002. — 260 с.
  7. Филд А., Харрисон П. Функциональное программирование. — М.: Мир, 1993. — 637 с. — ISBN 5-03-001870-0.
  8. Городняя Л. В. Основы функционального программирования. Курс лекций — М.: Интернет-университет информационных технологий, 2004. С. 280. ISBN 5-9556-0008-6
  9. G. Hutton. Programming in Haskell. Cambrige University Press. ISBN 978-0-521-87172-3. ISBN 978-0-521-69269-4
  10. Jensen, C. Choosing a language for .NET development, Borland Developer Network, 20004
  11. McIver, L. Evaluating languages and environments for novice programmers, Proceedings of the Fourteenth Annual Meeting of the Psychology of Programming Interest Group, London, UK, pp.100–110, 2002
  12. Wilson, G.W. Tools, languages, and interacting with machines, Dr. Dobb’s Journal, July, 1997
  13. Szafron, D. and Schaeffer, J. An experiment to measure the usability of parallel programming systems, Concurrency: Practice and Experience, Vol. 8, No. 2, 1997, pp.147–166.
  14. Murtagh, J.L. and Hamilton, J.A. A comparison of Ada and Pascal in an introductory computer science course, Proceedings of the Annual ACM SIGAda International Conference on Ada, Washington, DC, 1998, pp.75–80.
  15. Bowman, H. A perspective on language wars, 2nd All-Ireland Conference on the Teaching of Computing, Dublin, Ireland, 1994
  16. Wolz, U. Language considerations in a goal-centered approach to CS I and II: Java, C, or what?, Journal of Computing in Small Colleges, Vol. 12, No. 5, 1997, pp.12–20.
  17. Esendal, H.T. The selection of first programming language, 2nd All-Ireland Conference on the Teaching of Computing, Dublin, Ireland, 1994
  18. Lee, P.A. and Phillips, C. An assessment of c++ as an introductory teaching language, Technical Report CS-TR: 777, Department of Computing Science, University of Newcastle, 2002
  19. Lawlis, P.K. Guidelines for Choosing a Computer Language: Support for the Visionary Organization, 2nd edition, Ada Information Clearinghouse, 1997
  20. Watt, D.A. Programming languages – trends in education, Proceedings of Simposio Brasileiro de Linguagens de Programacao, Recife, Brazil, 2000
  21. Sharp, R. Programming language lifecycles – where’s Java at?, Software Reality, 2002
  22. Stephenson, C. A report on high school computer science education in five US states, 2000
  23. Riehle, R. SEPR and programming language selection’, CrossTalk – The Journal of Defense Software Engineering, Vol. 16, No. 2, 2003, pp. 13–17
  24. Emigh, K.L. The impact of new programming languages on university curriculum, Proceedings of ISECON 2001, Vol. 18, Cincinnati, Ohio
  25. Kölling, M. Requirements for a first year object oriented teaching language, Proceedings of the Twenty-Sixth SIGCSE Technical Symposium on Computer Science Education, Nashville, Tennessee, 1995, pp.173–177.
  26. Eisenstadt, M. and Lewis, M.W. Errors in an interactive programming environment: causes and cures, in M. Eisenstadt, M.T. Keane, and T. Rajan (Eds.) Novice Programming Environments: Explorations in Human-Computer Interaction and Artificial Intelligence, Hillsdale, NJ: Lawrence Erlbaum Associates, 1992
  27. Prechelt, L. An empirical comparison of C, C++, Java, Perl, Python, Rexx and Tcl, IEEE Computer, Vol. 33, No. 10, 2000
  28. Tomblin, S. Summary of MIS and programming responses, ISWorld Listserv, 19 April, 2000
  29. Collins, D. Java second. The suitability of Java as a first programming language, The Sixth Java and the Internet in the Computing Curriculum Conference Proceedings, London, UK, 2002
  30. Wang, S. An approach to teaching multiple computer languages, Journal of Information Systems Education, Vol. 12, No. 4, 2001, pp.201–211.