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

Современные языки программирования (Теоретические основы языков программированияя)

Содержание:

Введение

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

В настоящее время интерес к созданию новых языков программирования снизился (и в мире, и в России), а круг используемых языков стабилизировался. Наступил момент для анализа использования современных языков программирования. 

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

Цель работы – изучить современные языки программирования.

Достижение указанной цели определило постановку и решение следующих задач:

  • исследовать понятие и виды языков программирования;
  • просмотреть историю создания языков программирования;
  • провести обзор современных языков программирования;

Предметом исследования можно назвать три языка программирования C++

Объектом исследования являются современные языки программирования.

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

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

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

Глава 1. Теоретические основы языков программирования

1.1. Содержание понятия и классификация языков программирования

Сегодня практически все программы создаются с помощью языков программирования. Теоретически программу можно написать и на естественном языке (говорят: программирование на метаязыке), но из-за неоднозначности естественного языка автоматически перевести такую программу в машинный код пока невозможно.

Языки программирования — это формальные искусственные языки. Как и естественные языки, они имеют алфавит, словарный запас, грамматику и синтаксис, а также семантику.

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

Синтаксис — система правил, определяющих допустимые конструкции языка программирования из букв алфавита[1].

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

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

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

Языком самого низкого уровня является Assambler. Программа, написанная на нем, представляет последовательность команд машинных кодов, но записанных с помощью символьных мнемоник. С помощью языков низкого уровня создаются компактные оптимальные программы, так как программист получает доступ ко всем возможностям процессора. С другой стороны, при этом требуется хорошо понимать устройство компьютера, а использование такой программы на компьютере с процессором другого типа невозможно. Такие языки программирования используются для написания небольших системных приложений, драйверов устройств, модулей стыковки с нестандартным оборудованием, когда важнее компактность, быстродействие, прямой доступ к аппаратным ресурсам. Также к низкоуровневым языкам программирования относятся C, C++[3].

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

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

Среднеуровневые языки часто используются для первых шагов в «мир программирования», так как они довольно несложны в изучении, но уже могут использоваться для каких-либо реальных проектов. К среднеуровневым языкам относятся язык JAVA, С#[4].

Плюсы:

  • Необязательно париться насчет памяти.
  • Обширные «родные» библиотеки, но при желании можно подключить сторонние.
  • Компиляция происходит в «байт-код», подходящий для взаимодействия с другими языками.
  • Хорошо служит несложным вводом в структуру программы.

Минусы:

  • Требуется дополнительно установленная среда для выполнения байт-кода (Java Runtime Environment для Java); сложно для освоения новичку, так как надо понимать, как устроена память, сборка мусора;
  • Абстракций стало ненамного меньше.

Языки программирования, имитирующие естественные, обладающие укрупненными командами, ориентированные «на человека», называют языками высокого уровня. Чем выше уровень языка, тем
ближе структуры данных и конструкции, использующиеся в программе, к понятиям исходной задачи. Особенности конкретных компьютерных архитектур в них не учитываются, поэтому исходные тексты программ легко переносимы на другие платформы, имеющие
трансляторы этого языка. Разрабатывать программы на языках высокого уровня с помощью понятных и мощных команд значительно проще, число ошибок, допускаемых в процессе программирования,
намного меньше. В настоящее время насчитывается несколько сотен таких языков (без учета их диалектов). Самыми известными являются PHP, Python, Ruby, Javascript.

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

Минусы: Сравнительно низкая производительность; Страдает архитектура (изменения могут вноситься в любом месте кода, а не там, где это действительно нужно).

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

Языки программирования могут быть реализованы как компилируемые и интерпретируемые.

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

К примеру, код, выводящий на экран фразу “Hello, world!”, написанный на Java[5]:

public class HelloWorld {

public static void main(String[] args) {

System.out.println("Hello, world!");

}

}

 И то же самое на машинном коде для процессора архитектуры х86:

BB 11 01 B9 0D 00 B4 0E 8A 07 43 CD 10 E2 F9 CD 20 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21

Исходный код, вместо компиляции в машинный код, исполняется специальной программой интерпретатором.

Главными плюсами таких языков являются кроссплатформенность (один и тот же код будет работать на разных операционных системах) и динамическая типизация (переменная связывается с типом – число, строка, указатель - в момент присваивания данных, а не в момент ее объявления)

http://moeobrazovanie.ru/data/ckfinder/images/programming028.jpeg

Рис. 1. Программа написанная с использованием интерпретируемых языков

Также программы, написанные с использованием интерпретируемых языков, можно запускать сразу же после изменений в коде, что облегчает разработку. К таким языкам относятся Python, Ruby, Perl, PHP.

1.2. История создания языков программирования

На первый взгляд это может показаться странным, но программирование старше, чем языки программирования.

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

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

Хотя к этому времени (40-е годы XX столетия) уже была известна модель хранимой программы фон Неймана, элементная база еще не позволяла создавать оперативные запоминающие устройства достаточного объема для хранения кодов инструкций, их едва хватало для хранения данных (память размером в 1000 машинных слов считалась огромной и стоила астрономическую сумму). Поэтому между теорией и практическим ее воплощением прошло несколько лет, пока, наконец, не появились действительно универсальные цифровые ЭВМ, позволяющие быстро менять программы путем загрузки их в оперативную память. Громоздкие коммутационные панели, опутанные клубками проводов, исчезли, их заменили массивы кодов инструкций, загружаемых с различных устройств хранения информации: перфолент и перфокарт, магнитных лент, барабанов.

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

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

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

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

  • формирование кода команды;
  • вычисление физических адресов ячеек с данными;
  • вычисление смещений для команд условного и безусловного ветвлений.

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

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

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

- языками ассемблера, или, кратко, тоже ассемблерами.

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

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

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

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

FORTRAN был первым успешно реализованным языком программирования высокого уровня. Разрабатывался он во времена жесточайшего дефицита оперативной памяти, который ставил под сомнение саму возможность практической реализации компилятора какого-либо из языков высокого уровня (ЯВУ).

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

Несмотря на отсутствие опыта (откуда же ему было взяться у разработчиков первого компилятора, когда даже теория компиляции еще не была разработана), эта задача была решена разработчиками блестяще: компилятор FORTRAN I для мэйнфреймов IBM удерживал рекорд по степени оптимизации кода в течение 20 лет! Хотя этому меньше удивляешься, узнав, что во главе разработки стоял гениальный Джон Бэкус, а в его команду входили Ш. Бест, Х. Геррик, П. Шеридан, Р. Натт, Р. Нельсон, И. Зиллер, Р. Голдберг, Л. Хейбт и Д. Сейр. Немалую роль сыграла и поддержка коллектива руководством IBM, даже несмотря на то, что проект потребовал куда больше ресурсов, чем первоначально планировалось.

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

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

Наконец, в 1961 г. был выпущен FORTRAN IV, который представлял собой рафинированный вариант FORTRAN II, лишенный некоторых аномалий и машинно-зависимых особенностей. Именно эта версия получила наибольшее распространение среди ученых и инженеров и служила им верой и правдой более 30 лет, будучи реализованной практически на всех мэйнфреймах, мини-ЭВМ и персональных компьютерах, с которыми мне когда-либо доводилось иметь дело.

С мая 1962 г. началась работа по стандартизации языка, результатом которой стал FORTRAN 66 - первый в мире стандарт на ЯВУ. Язык заслуженно получил очередной титул "первый".

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

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

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

На этом эволюция языка-долгожителя не остановилась, и в 1990 г. увидел свет очередной стандарт, FORTRAN 90. Впрочем, он слишком опоздал со своим появлением, дав приличную фору по времени своим конкурентам, главным из которых явился, безусловно, C++. Несмотря на очевидные усовершенствования языка, FORTRAN 90 не получил такого ошеломляющего успеха, как его знаменитые предшественники, и удовольствовался весьма скромной нишей. Не прибавило ему популярности и появление следующего стандарта, FORTRAN 95. Новое поколение программистов ориентировано на C++, Java и C#, и старому доброму FORTRANу, увы, нечего им противопоставить[6].

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

Как и в большинстве других языков программирования, программа на Algolе состоит из главной программы и набора подпрограмм. При их построении используются блоки - наборы описаний и последовательности операторов, ограниченные "скобками" begin и end. Структуры данных, созданные внутри блока, локальны в его пределах и при выходе из блока уничтожаются. Таким образом можно управлять временем жизни данных и областью видимости их идентификаторов.

Четвертое поколение представлено языками поддержки сложных структур данных. Ярким примером можно назвать язык SQL.

Язык SQL был разработан в конце 70-х годов в компании IBM и был впервые реализован в реляционной СУБД IBM System R. В дальнейшем, благодаря своей элегантности, независимости от специфики компьютера и поддержке лидерами в области технологии реляционных баз данных, SQL стал и в обозримом будущем останется стандартом "де-факто" для всех реляционных систем обработки данных.

Первый международный стандарт языка SQL был принят в 1989 году ANSI. Этот стандарт называют SQL/89. Подавляющее большинство СУБД поддерживают этот стандарт полностью. В связи с развитием информационных технологий через некоторое время возникла необходимость расширения стандарта. В 1992 году был принят новый стандарт SQL/92. Затем в 1999 году был принят стандарт SQL/99 и, наконец, самый последний стандарт языка SQL был принят в 2003 году и носит название SQL/2003. Стоит, правда, сказать о том, что не все СУБД ограничиваются полной поддержкой стандарта и часто добавляют в язык SQL какие-то специфичные возможности с целью повышения конкурентоспособности СУБД.

Следующее поколение – это языки искусственного интеллекта.

Когда-то в 60-х годах очень бурно развивалась теория автоматического доказательства теорем и Робинсоном был предложен алгоритм резолюций, который позволял доказать любую верную теорему (вывести из аксиом) за конечное время (за какое не известно). Как оказалось позже, это наилучшее решение общей задачи, невозможно доказать теорему за ограниченное число операций. Простыми словами, алгоритм представляет собой обход (в общем случае бесконечного) графа в ширину, естественно, что предсказуемость работы алгоритма практически равно 0, соответственно для Языка Программирования — это абсолютно не подходит. И в этот момент Кальмэроу нашел блестящее сужение задачи, благодаря которому доказательство некоторых теорем выглядело как процедурное исполнение программы. Стоит отметить, что класс доказуемых теорем достаточно широк и очень хорошо применим для класса программируемых задач. Вот так в 1972 году появился Prolog.

В 1977 году в Эдинбурге Уоррен и Перейра создали очень эффективный компилятор языка Пролог для ЭВМ DEC–10, который послужил прототипом для многих последующих реализаций Пролога. Что интересно, компилятор был написан на самом Прологе. Эта реализация Пролога, известная как "эдинбургская версия", фактически стала первым и единственным стандартом языка. Алгоритм, использованный при его реализации, послужил прототипом для многих последующих реализаций языка. Как правило, если современная Пролог-система и не поддерживает эдинбургский Пролог, то в ее состав входит подсистема, переводящая прологовскую программу в "эдинбургский" вид. Имеется, конечно, стандарт ISO/IEC 13211– 1:1995, но его поддерживают далеко не все Прологсистемы.

В 1980 году Кларк и Маккейб в Великобритании разработали версию Пролога для персональных ЭВМ.

В 1981 году стартовал вышеупомянутый проект Института по разработке методов создания компьютеров нового поколения.

На сегодня существует довольно много реализаций Пролога. Наиболее известные из них следующие: BinProlog, AMZI-Prolog, Arity Prolog, CProlog, Micro Prolog, МПролог, Prolog-2, Quintus Prolog, SICTUS Prolog, Silogic Knowledge Workbench, Strawberry Prolog, SWI Prolog, UNSW Prolog и т. д.

В нашей стране были разработаны такие версии Пролога как Пролог-Д (Сергей Григорьев), Акторный Пролог (Алексей Морозов), а также Флэнг (А Манцивода, Вячеслав Петухин).

Следующее поколение – это языки нейронных сетей (самообучающиеся языки). Исследовательские работы в этой области начались в середине 80-х годов XX века.

Выводы по Главе 1

Язык программирования — формализованный язык для описания программ и алгоритмов решения задач на ЭВМ. Языки программирования являются искусственными; в них синтаксис и семантика строго определены, они не допускают свободного толкования выражения, что характерно для естественного языка. Языки программирования разделяются на три основные категории: языки высокого уровня, языки среднего уровня и языки низкого уровня.

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

Первое поколение: Машинные языки. Появились в середине 40-х годов XX века.

Второе поколение: Ассемблеры. Фактически это те же машинные языки, но более красиво "обернутые". Появились в конце 50-х годов XX века

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

Четвертое поколение: Языки поддержки сложных структур данных (например, SQL). Появились в конце 60-х годов XX века.

Пятое поколение: Языки искусственного интеллекта (например, Prolog). Появились в начале 70-х годов XX века.

Шестое поколение: Языки нейронных сетей (самообучающиеся языки). Исследовательские работы в этой области начались в середине 80-х годов XX века.

Глава 2. Современные языки программирования

2.1. Анализ современных языков программирования

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

Язык программирования – система обозначений для описания алгоритмов и структур данных, определенная искусственная формальная система, средствами которой можно выражать алгоритмы[7].

В настоящее время ежегодно число языков программирования пополняется новыми. На сегодняшний день известно более двух с половиной тысяч языков программирования. Ниже рассматриваются несколько самых передовых языков программирования, каждый из которых решает свою определенную работу. Язык Dart, разработанный компанией Google, как один из языков веб-программирования. Как и в JavaScript, в Dart используются синтаксисы и ключевые слова, похожие на те, которые используются в языке C. Однако одним существенным различием является то, что в то время как JavaScript основывается на прототипах, объекты в Dart определяются с помощью классов и интерфейсов, как в C++ или Java[8].

Идея его создания основана на том, чтобы сделать язык таким же привычным, гибким и динамичным как JavaScript. Но пока, что этот язык мало где возможно использовать потому, что разработан для запуска на клиенте, либо на сервере. Следующим новым языком программирования, разработанный компанией Google является Go. Этот язык общего назначения, создан для легкого программирования, подходящий для всего – от разработки приложений до программирования систем. Язык больше похож на C или C++, чем на Java или C#. Однако, как и последние языки, Go включает в себя такие современные функции, как очистка памяти от ненужных данных, отражение текущих процессов выполнения и поддержку параллельности[9].

В языке Go понятия классов, конструкторов и деструкторов совершенно отсутствуют. Однако в нем присутствуют структуры, заимствованные из языка C, к которым возможна привязка функций, в связи с этим на языке Go можно создавать программы базирующихся на объектно-ориентированном программировании. Наличие функции очищение памяти от ненужных данных упрощает работу, по сравнению с C и C++. Язык Go еще в разработке, но тем не менее с ним можно уже работать. Веб-программирование сложно тем, что для клиента, сервера, баз данных и т. д. свои отдельные языки программирования. Инженеры разработали новый язык Opa. Этот язык созданный с идеей того, чтобы связать в себя интерфейс пользователя, логику сервера и базу данных ввода-вывода.

Компилятор самостоятельно решает, где запушена программа и выполняет написанный код. Среда выполнения Opa объединяет собственный веб-сервер и систему управления базой данных, которые не могут быть заменены самостоятельными альтернативами. Opa поставляется бесплатно и на данный момент доступен для 64-х битных Linux и Mac OS X платформ, другие же порты пока разрабатываются. С другой стороны в каждом языке существуют свои недостатки, которые ставят созданную на этом языке систему менее безопасной.

Для решения этой проблемы ученые нашли способ защиты такой, что позволяет защитить и веб-сайты, и компьютеры пользователей, разработав систему позволяющую использовать несколько языков программирования при создании одой программы. Система Wyvern является чем-то вроде компилятора одного мета-языка, в состав которого входят все известные и популярные языки программирования. Эта система позволяет программистам разрабатывать веб-страницы и приложения, используя напрямую все возможности С, PHP, HTML, CSS, JavaScript и других языков, и избегая необходимости использования некоторых искусственных приемов, которые являются источниками потенциальной опасности[10].

Данная система не единственная, примерами подобных программ являются – Scheme, ProteaJ, Spoofax и OJ. Они также решают вышеперечисленные задачи. В продолжение темы, был разработан новый язык программирования под названием Sketch. Особенность языка в том, что он позволяет при написании программ опускать некоторые участки кода, заполняя эти промежутки самостоятельно при этом оптимизируя получившиеся конструкции. Основной идеей, реализованной в виде компилятора языка Sketch, является метод поиска оптимального решения определенной задачи. Известно, что любая логическая и математическая задача может быть решена несколькими путями, количество которых, в некоторых случаях, может стремиться к бесконечности[11].

Еще одним новым языком программирования стал – язык Wolfram Alpha. Wolfram Language является языком, основанным на обширной базе знаний при помощи которой можно создавать достаточно сложные приложения, не прибегая к процессу традиционного программирования. Wolfram Language является языком, опирающимся на огромную базу знаний, в которой заключены все типовые вычислительные операции[12].

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

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

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

Заметим, что по рейтингу TIOBE вовсе нельзя судить о качестве или универсальности для изучения языка программирования, главный критерий отбора индекса заключается в количестве поисковых запросов по каждому конкретному языку. То есть, чем больше через самые популярные в мире поисковые системы (Google, Yahoo!, Baidu, Wikipedia, YouTube) ищется тот или иной язык программирования, тем выше он будет находиться в рейтинге.

TIOBE ориентируется на полные по Тьюрингу языки, поэтому популярность, к примеру, XML, HTML или базовый SQL не исследуется. Кроме Тьюринг-полноты, авторы индекса требуют от исследуемого языка наличие статьи в Википедии, в которой было бы чётко указано, что язык является языком программирования. По этому критерию в индекс не были включены Ruby on Rails, Excel, Android, Boost, Cocoa, ASP, AJAX[13]. Рассмотри таблицу рейтингов от ресурса TIOBE[14].

Таблица 1

Рейтинг языков программирования за 2017 гг. по данным ресурса TIOBE

Язык программирования

Рейтинг

Java

16,384%

С

7,742%

С++

5,184%

C#

4,409%

Python

3,919%

Visual Basic.NET

3,174%

PHP

3,009%

JavaScript

2,667%

Delphi/Object Pascal

2,544%

Swift

2,268%

Второй способ составления рейтинга языков программирования основан на подсчете количества поисковых запросов по конкретному языку – чем чаще пользователи ищут руководство по тому или иному языку, тем выше его рейтинг (ресурс PopularitY of Programming Languages (PYPL) от команды разработчиков GitHub). А теперь рассмотрим рейтинг языков программирования от ресурса PYPL[15].

Таблица 2

Рейтинг языков программирования за 2017 гг. по данным ресурса PYPL

Язык программирования

Рейтинг

Java

22,7%

Python

15,0%

PHP

9,3%

C#

8,3%

JavaScript

7,7%

С++

6,9%

С

6,9%

Objective-C

4,1%

R

3,5%

Swift

2,9%

Как мы видим, лидером по данным ресурса TIOBE и PYPL является язык программирования Java (см. табл. 1 и табл. 2).

Рассмотрим особенности этого языка. Java-высокоуровневый объектноориентированный язык программирования разработанный в 1995 г. За более чем 20 летнюю историю данный язык выбился в лидеры и активно держит свои позиции за счет таких качеств как кроссплатформенность и универсальность. Да, в современных реалиях, программы, написанные по средствам данного языка, уступают в быстродействии и оптимизации некоторым другим популярным языкам, но за счет своей универсальности и надежности он крепко держится в лидерах. Примером продуктов написанных на данном языке можно назвать любые Android-приложения, программные средства Eclipse, IntelliJ Idea и Netbeans IDE, серверные приложения в сфере финансовых услуг.

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

Но главным фактором является то, что язык Си своим появлением оказал существенное влияние на развитие индустрии программного обеспечения. Он упростил создание любого ПО и зарекомендовал себя одним из лучших языков программирования. Сейчас он уже не так популярен, но его синтаксис и структура положили основу почти всем популярным на данный момент языкам, таким как: C++, C#, Java, Objective-C, Python и другие. В современном мире на чистом языке Си не пишется полностью готовых приложений, но примерами продуктов написанных с использованием данного языка являются любые операционные системы, браузеры, месенджеры, средства работы с документами и многое другое[16].

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

2.2.Сопоставление современных языков программирования

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

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

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

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

Координаты вершин будут выражаться как комплексное значение — это естественно для физического мира, так как комплексные величины это и есть отображение точек 2D-плоскости. Но самое главное, что такой подход с самого начала потребует работы со структурными объектами (2-х компонентные комплексные значения). А геометрическая фигура (треугольник) естественным образом подталкивает к использованию понятий класса и объекта. Есть где разгуляться!

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

z = real + i * imagine - где real — это вещественная часть числа, а imagine — мнимая его часть (real и imagine здесь конкретный числовые, вещественные значения для данного конкретного комплексного числа).

На вещественной плоскости (2D) число z отображается точкой, для котрой: real — это координата точки по горизонтали (ось X), а imagine — это координата точки по вертикали (ось Y). Также каждое комплексное число имеют другую форму представления, так называемую экспоненциальную, вида:

z = abs * exp( i * arg ) - здесь abs — это длина вектора z (от точки 0,0), а arg — фазовый угол наклона вектора относительно оси X (выраженный в радианах).

Эти две формы представления описывают одну и ту же точку плоскости, и между ними существуют взаимно однозначные соответствия. Они связаны соотношениями (все показанные математические функции присутствуют в библиотеке любого языка программирования):

real = abs * cos( arg )

imagine = abs * sin( arg )

abs = sqrt( real2 + imagine2 )

arg = atan2( imagine, real )

z = abs * exp( i * arg ) = abs * ( cos( arg ) + i * sin( arg ) )

http://www.ibm.com/developerworks/ru/library/os-many_lang_1/img.pngZ1 = 0. + 0. * i

z2 = -3. + 0 * i

z3 = 2. + 0 * i

z5 = 0 - sqrt( 3. ) * i

z6 = 0 + 4 * i

z7 = 2. + 3. * i

z8 = -4 + i

z9 = -3 - 3 * i

z10 = sqrt( 2. ) - i

Математические библиотеки манипуляции с комплексными числами содержат встроенные функции преобразования из одной формы в другую. Например, для показанных на рисунке некоторых чисел (векторов) имеет место (угол arg показан в радианах, долях π и в угловых градусах для наглядности — это одно и то же значение):

z1 = ( +2.0 , + 3.0i ) <=> abs = 3.606 , arg = 0.983 = 0.31*π = 56°

z5 = ( -0.0 , -1.7i ) <=> abs = 1.732 , arg = -1.571 = -0.50*π = -90°

z8 = ( -4.0 , +1.0i ) <=> abs = 4.123 , arg = 2.897 = 0.92*π = 166°

z9 = ( -3.0 , -3.0i ) <=> abs = 4.243 , arg = -2.356 = -0.75*π = -135°

z10 = ( +1.4 , -1.0i ) <=> abs = 1.732 , arg = -0.615 = -0.20*π = -35°

Зачем нам такие сложности? А затем, что дальше всё становится очень просто:

вектор, замыкающий точки z9 и z8 будет вычисляться просто как ( z8 - z9 );

его длина (нужная нам как составляющая периметра) — как abs( z8 - z9 );

а площадь треугольника, построенного на сторонах z9 и z8 будет вычисляться как:

abs( z8 ) * abs( z9 ) * sin( arg( z8 ) - arg( z9 ) ) / 2.

Показанного вполне достаточно для всех наших последующих рассмотрений.

Язык С.

Листинг 1. Реализация C (файл triangle.c):

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <complex.h>

#include <string.h>

#define NODES 3 // число вершин

typedef double complex triangle_t [ NODES ]; // тип треугольника

static double perimeter( triangle_t pts ) {

double summa = 0.0;

int i, j;

for( i = 0; i < NODES; i++ ) {

j = NODES - 1 == i ? 0 : i + 1;

summa += cabs( pts[ i ] - pts[ j ] );

}

return summa;

}

static double square( triangle_t pts ) {

double complex side1 = pts[ 1 ] - pts[ 0 ],

side2 = pts[ 2 ] - pts[ 0 ];

return cabs( side1 ) * cabs( side2 ) *

fabs( sin( carg( side1 ) - carg( side2 ) ) ) / 2.;

}

#define INLEN 40

int main( int argc, char **argv, char **envp ) {

while( 1 ) {

int i = 0;

triangle_t polygon;

printf( "координаты вершин в формате: X Y\n" );

while( i < NODES ) {

float x, y;

printf( "вершина № %d: ", i + 1 );

fflush( stdout );

char s[ INLEN ], e[ INLEN ];

if( !fgets( s, sizeof( s ) - 1, stdin ) ) // строка ввода

printf( "завершение\n" ), exit( EXIT_SUCCESS );

s[ strlen( s ) - 1 ] = '\0'; // удалить EOL

while( ' ' == s[ strlen( s ) - 1 ] ) // удалить хвостовые пробелы

s[ strlen( s ) - 1 ] = '\0';

if( sscanf( s, "%f%*c%f%s", &x, &y, (char*)&e ) != 2 ) {

printf( "ошибка ввода!\n" );

continue;

}

polygon[ i++ ] = x + I * y;

}

printf( "вершин %d : ", NODES );

for( i = 0; i < NODES; i++ )

printf( "[%.2f,%.2f] ",

creal( polygon[ i ] ), cimag( polygon[ i ] ) );

printf( "\nпериметр = %.2f\nплощадь = %.2f\n"

"---------------------------------\n",

perimeter( polygon ), square( polygon ) );

}

}

Код выдержан в духе структурности, никакой объектной модели язык C не предлагает. Для описания геометрических фигур «треугольник» определяется новый тип triangle_t, но это не более чем синтаксический трюк, позволяющий сократить и упростить запись кода.

Непереносимость языка C между операционными системами обусловлена, главным образом, несовместимостью используемых библиотек (API), а не различиями в толкованиях синтаксиса и семантики языка различными компиляторами. Для ликвидации такой несовместимости было реализовано несколько проектов API программных обёрток, независимых от платформы. Одним из таких проектов является, например, Apache Portable Runtime (APR) — эти библиотеки использованы в таких крупных проектах Voice-IP программных коммутаторах как Asterisk и FreeSWITH.

А вот как выполняется только что собранное нами приложение:

$ ./triangle_c

координаты вершин в формате: X Y

вершина № 1: 1. 1.

вершина № 2: 2. 1.

вершина № 3: 1. 2.

вершин 3 : [1.00,1.00] [2.00,1.00] [1.00,2.00]

периметр = 3.41

площадь = 0.50

---------------------------------

координаты вершин в формате: X Y

вершина № 1: завершение работы

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

Язык C++ намного шире своего прародителя, включает различные новые независимые парадигмы, такие как: строгая статическая именная типизация; классы, объекты и наследования; переопределения функций и операций, шаблоны (template), пространства имён... (легче перечислить то что осталось, чем то, что добавилось). Но там, где появляется широта возможностей, возникают и сложность и громоздкость.

Реализация описываемой задачи на C++ может выглядеть так:

Листинг 2. Реализация C++ (файл triangle.cc):

#include <stdlib.h>

#include <complex>

#include <iostream>

using namespace std;

class point : public complex<double> { // класс вершины наследуемый от complex

private:

bool bGood;

protected:

point( void ) : bGood( true ) {

*(complex<double>*)this = complex<double>( 0.0, 0.0 );

}

point( double re, double im ) : bGood( true ) {

*(complex<double>*)this = complex<double>( re, im );

}

point( const complex<double>& c ) : bGood( true ) {

*(complex<double>*)this = c;

}

public:

friend class triangle;

inline bool bOK( void ) { return bGood; };

friend ostream& operator << ( ostream& stream, point& obj );

friend istream& operator >> ( istream& stream, point& obj );

};

inline ostream& operator << ( ostream& stream, point& obj ) {

stream << "[" << obj.real() << "," << obj.imag() << "]";

return stream;

};

inline istream& operator >> ( istream& stream, point& obj ) {

double x, y;

string s;

obj.bGood = false; // ошибка при неправильном вводе

if( ( cin >> x ).eof() ) return stream; // ввод real

if( cin.rdstate() & ios::failbit ) {

cerr << "ошибка ввода!" << endl;

cin.clear();

getline( cin, s );

return stream;

}

if( ( cin >> y ).eof() ) return stream; // ввод image

if( cin.rdstate() & ios::failbit ) {

cerr << "ошибка ввода!" << endl;

cin.clear();

getline( cin, s );

return stream;

}

getline( cin, s );

if( !s.empty() ) { // если введено больше 2-значений

basic_string<char>::iterator i;

for( i = s.begin(); i != s.end() && *i == ' '; i++ );

if( i != s.end() ) { // если там непробельные символы

cerr << "ошибка ввода: " << s << endl;

return stream;

}

}

obj = point( complex<double>( x, y ) );

return stream;

};

class triangle { // класс треугольник производный от point

public:

static const int NODES = 3; // число вершин

protected:

point pt[ NODES ]; // координаты вершин

public:

double perimeter( void ) {

double summa = 0.0;

int i, j;

for( i = 0; i < NODES; i++ ) {

j = NODES - 1 == i ? 0 : i + 1;

summa += abs( pt[ i ] - pt[ j ] );

}

return summa;

}

double square( void ) {

complex<double> side1 = pt[ 1 ] - pt[ 0 ],

side2 = pt[ 2 ] - pt[ 0 ];

return abs( side1 ) * abs( side2 ) *

fabs( sin( arg( side1 ) - arg( side2 ) ) ) / 2.;

}

inline point& operator [] ( int i ) { return pt[ i ]; }

friend istream& operator >> ( istream& stream, triangle& obj ) {

int i = 0;

while( i < NODES ) {

cout << "вершина № " << i + 1 << " : " << flush;

stream >> obj.pt[ i ];

if( stream.eof() ) return stream;

if( !obj.pt[ i ].bOK() ) continue;

i++;

}

return stream;

}

};

int main( int argc, char **argv, char **envp ) {

int i = 0;

cout.precision( 3 );

while( 1 ) {

triangle polygon;

cout << "координаты вершин в формате: X Y" << endl;

if( ( cin >> polygon ).eof() )

cout << "завершение" << endl, exit( EXIT_SUCCESS );

cout << "вершин " << triangle::NODES << " : ";

for( i = 0; i < triangle::NODES; i++ )

cout << polygon[ i ] << " ";

cout << endl << "периметр = " << polygon.perimeter() << endl

<< "площадь = " << polygon.square() << endl

<< "---------------------------------" << endl;

}

}

Код этой реализации умышленно несколько усложнён (например, при обработке ошибок ввода), но в таком варианте он позволяет увидеть (хотя бы по написанию) основные нововведения C++ относительно классического C: классы и объекты, шаблонные (template) классы, использование итераторов шаблонных классов, потоковые операции ввода и вывода (cin, cout).

Сборка такого приложения:

$ g++ -Wall -lm triangle.c -o triangle_c

Теперь, после сборки C++ приложения, мы можем кратко коснуться того вопроса, почему C код будет всегда компилироваться и собираться в среде C++. Дело в том, что C++ приложение всегда будет компоноваться со стандартной разделяемой библиотекой C (libc.so), в дополнение к своей собственной стандартной библиотеке (libstdc++.so):

$ ldd triangle_c

linux-gate.so.1 => (0xb76eb000)

libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb76a8000)

libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb755a000)

/lib/ld-linux.so.2 (0xb76ec000)

$ ldd triangle_cc

linux-gate.so.1 => (0xb7797000)

libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb768e000)

libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb7668000)

libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb764a000)

libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74fc000)

/lib/ld-linux.so.2 (0xb7798000)

Стандартная библиотека C (libc.so) является интерфейсом к системным вызовам, предоставляемым операционной системой. А стандартная библиотека C++ является только интерфейсом к библиотечным вызовам, предоставляемым библиотекой C. В повседневной практике, зачастую, непонимание этих связей не влечёт последствий. Но в малых и встраиваемых системах, когда библиотеки могут компоноваться к приложениям статически, эквивалентное приложение, скомпилирванное в среде C++ может оказаться значительно объёмнее.

И выполнение собранного приложения:

$ ./triangle_cc

координаты вершин в формате: X Y

вершина № 1 : 1 1

вершина № 2 : 2 1

вершина № 3 : 1 2

вершин 3 : [1,1] [2,1] [1,2]

периметр = 3.41

площадь = 0.5

---------------------------------

координаты вершин в формате: X Y

вершина № 1 : завершение работы

Неизменно тот же код приложения может быть собран и новым компилятором Clang (из проектаLLVM):

$ clang++ triangle.cc -o triangle_cc

Показанные выше сборки приложений (как для языка C, так и для C++) предполагают 2 последовательных фазы: компиляции с последующим связыванием с другими объектными файлами или библиотеками. Важнейшей, в контексте нашего текущего рассмотрения, фазой являтся компиляция. Во всех рассмотренных выше случаях компиляция производится в «нативный» код используемого процессора и с учётом особенностей (форматов) операционной системы. Это означает, что для переноса такого приложения в другую среду (отличный процессор, операционная система) исходный программный код такого приложения должен быть перекомпилирован.

Если говорить в два слова о целевом предназначении, то язык C++ больше подходит для крупных целевых (прикладных) проектов: графика, визуализация, финансы, системы автоматизированного управления и автоматизированного проектирования... Для задач собственно системного программирования (утилиты, библиотеки, протоколы, …) более подходящим представляется классический C.

Java — объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems (в настоящее время купленной компанией Oracle). Дата официального выпуска — 23 мая 1995 года.

Приложения Java компилируется не в бинарную форму, а в специальный стандартизованный байт-код (файлы .class и их архивы .jar). Поэтому такие программы могут работать на любой виртуальной Java-машине (JVM) вне зависимости от процессорной платформы, операционной системы, локального или удалённого хоста. Примерами самых известных на сегодня JVM, из числа используемых на разных платформах, могут служить:

    • Оригинальный JDK (Sun Java Development Kit, на сегодня Oracle JDK) — класическая первоначальная реализация Java, используется в Windows, Solaris, Linux и других системах.
    • OpenJDK, входящий в стандартный комплект Linux, и немногим уступающий JDK.
    • Dalvik Virtual Machine — Java виртуальная машина для системы Android, байт-код которой отличается от стандартного для JDK, но существуют программы трансформеры для их взаимного преобразования.

Для нашего приложения, в Java, в её стандартных библиотеках, нет комплексной математики. В таких случаях мы можем (здесь и для других языков тоже) поступать на выбор двумя способами:

  1. Написать достаточно простой набор необходимых приложению комплексных функций. Это очень несложная работа.
  2. Разыскать (в Интернете) модуль, реализующий интересующую нас функциональность (а таких представлено достаточно много).

Я выбираю (для примера Java) именно этот вариант от David Eck and Richard Palais.

Теперь всё готово для создания ещё одного приложения:

Листинг 3. Реализация Java (файл triangle.java):

import java.io.*;

import java.util.StringTokenizer;

import java.lang.Double.*;

class Tric { // класс треугольник

public static final int nodes = 3;

Complex [] pt = new Complex[ nodes ];

public String toString() {

String ret = "";

for( int i = 0; i < nodes; i++ )

ret += "[" + ( new Double( pt[ i ].re ) ).toString() + "," +

( new Double( pt[ i ].im ) ).toString() + "] ";

return ret;

}

public double perimeter() {

double summa = 0.0;

for( int i = 0; i < nodes; i++ )

summa += pt[ i ].minus( pt[ nodes - 1 == i ? 0 : i + 1 ] ).r();

return summa;

}

public double square() {

Complex side1 = pt[ 1 ].minus( pt[ 0 ] ),

side2 = pt[ 2 ].minus( pt[ 0 ] );

return side1.r() * side2.r() *

Math.abs( Math.sin( side1.theta() - side2.theta() ) ) / 2.;

}

}

public class triangle {

public static void main( String[] args ) {

Console cons = System.console();

while( true ) {

String szStr = "";

Tric polygon = new Tric();

System.out.println( "координаты вершин в формате: X Y" );

for( int i = 0; i < Tric.nodes; ) {

szStr = cons.readLine( "%s%d%s", "вершина № ", i + 1, " : " );

if( null == szStr ) { // ^D

System.out.println( "завершение работы" );

System.exit( 0 );

}

StringTokenizer st = new StringTokenizer( szStr, " \r\n" );

try {

double x = ( new Double( (String)st.nextElement() ) ).doubleValue(),

y = ( new Double( (String)st.nextElement() ) ).doubleValue();

polygon.pt[ i ] = new Complex( x, y );

}

catch( java.util.NoSuchElementException ex ) {

System.out.println( "ошибка ввода!: " + ex.toString() );

continue;

}

catch( java.lang.NumberFormatException ex ) {

System.out.println( "ошибка ввода!: " + ex.toString() );

continue;

}

i++;

}

System.out.println( "вершин " + Tric.nodes + " : " + polygon.toString() );

System.out.println( "периметр = " + polygon.perimeter() );

System.out.println( "площадь = " + polygon.square() );

System.out.println( "---------------------------------" );

}

}

}

Компиляция в байт-код формата .class:

$ javac triangle_java.java

$ ls *.class

Complex.class triangle.class Tric.class

Независимо от того, помещены ли коды классов в один файл (как triangle и Tric) или импортируются из раздельных файлов как модули (как Complex), для каждого класса создаётся свой файл байт-кода.

Java существенно более объектный язык, чем рассмотренный ранее C++: здесь всё обязано быть классом, или не быть вовсе. Именно поэтому для запуска приложения Java мы обязаны создать фиктивный стартовый класс triangle, по существу не нужный.

$ java triangle

координаты вершин в формате: X Y

вершина № 1 : 1 1

вершина № 2 : 2 1

вершина № 3 : 1 2

вершин 3 : [1.0,1.0] [2.0,1.0] [1.0,2.0]

периметр = 3.414213562373095

площадь = 0.5

---------------------------------

координаты вершин в формате: X Y

вершина № 1 : 1

ошибка ввода!: java.util.NoSuchElementException

вершина № 1 : 1 2 3

вершина № 2 : 1 ff

ошибка ввода!: java.lang.NumberFormatException: For input string: "ff"

вершина № 2 : завершение работы

Выводы по Главе 2

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

Из всех охваченных в обзоре языков только два языка — C и C++ используют технику «нативной» компиляции в машинный код используемой платформы. Все же остальные, в той или иной мере и технике, используют виртуальную исполняющую машину (среду выполнения). Это, очевидно, становится тенденцией последнего десятилетия. Все ранние проекты языков программирования (Algol, FORTRAN, COBOL, Pascal) предполагали компиляцию именно в исполнимый машинный код. Требование наличия исполняющей виртуальной машины может показаться, на первый взгляд, некоторым ограничивающим фактором. Но и чисто компилирующие реализации (C, C++) давно уже не исполняются как абсолютный бинарный код — невозможно перенести файл .exe из Windows в Linux, или наоборот, файл ELF-формата из Linux в Windows. Так что, с некоторой натяжкой, ядро операционной системы можно также считать исполняющей виртуальной машиной для бинарных форматов (ещё до недавнего времени ядро Linux содержало код для непосредственного запуска и выполнения файлов .class бит-кода Java, что было позже устранено за ненадобностью).

Заключение

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

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

Рассмотрены так же реализации одной и той же задачи в совершенно различных языках программирования. В обзор включены практически все широко используемые языки, по крайне мере, на платформе операционной системы Linux. Сюда вошли 5 языков, во всех рейтингах называемые в числе наиболее используемых в реальных проектах: C, C++, Java, C#, Python.

Языков программирования в наше время великое множество. Мы рассмотрели лишь самые популярные из них.

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

Список литературы

  1. Java. Методы программирования / под ред. Блинов И. Н., Романчик В. С. М. Четыре четверти, 2013. 34 с
  2. Афонин В.В., Никулин В.В. Методы моделирования и оптимизации с параметрами на языке С/С++ и MATLAB: в 2 ч. Саранск: Изд-во Мордов. ун-та, 2015. 184 с

Брайан У. Язык программирования C. 2-е издание. Пер. с англ. / Брайан У., Керниган, Деннис М., Ритчи. – М.: Издательский дом «Вильямс», 2009. – 304 с.

  1. Магамедова А.З, Дадаев А.М. Применение базовых алгоритмов обработки массивов в задачах по программированию на С++ // Информатизация образования и науки. 2016. № 1(29). С. 156. 161.
  2. Неклюдова С.А., Балса А.Р. Парадигмы программирования как инструменты разработ- чика программных систем // Информационные технологии и системы : межвузовский сбор- ник научных трудов. Выпуск 1 (12). – СПб., 2014.
  3. Пирс Б. Типы в языках программирования. М.: Лямбда пресс; Добросвет, 2012. 656 с.
  4. Серебряков В.А. Теория и реализация языков программирования / В.А. Серебряков. – М.: Физматлит, 2012. – 236 c.
  5. Крупнейший в Европе ресурс для IT-специалистов. [Электронный ресурс]. Режим доступа: https://habrahabr.ru/company/hh/blog/318450/ (дата обращения: 07.11.2017).

McALLISTER N. InfoWorld. «10 языков программирования, которые могут перевернуть мир IT» // Компьютерные вести [Электронный ресурс]. URL: http://www.kv.by/content/325498-10-yazykovprogrammirovaniya-kotorye-mogut-perevernut-mir-it (дата обращения: 08.11.2017).

PYPL Index [Электронный ресурс]. – Режим доступа: https://pypl.github.io/PYPL.html. (дата обращения: 09.11.2017).

Sketch – новый язык программирования, способный самостоятельно оптимизировать и завершать незаконченные участки кода // DailyTechInfo [Электронный ресурс]. URL: http://www. dailytechinfo.org/infotech/5691-sketch-novyy-yazyk-programmirovaniya-sposobnyy-samostoyatelnooptimizirovat-i-zavershat-nezakonchennye-uchastki-koda.html (дата обращения: 09.11.2017).

TIOBE Index [Электронный ресурс]. – Режим доступа: https://www.tiobe.com/tiobe-index//.(дата обращения: 09.11.2017).

Wyvern – новая система, позволяющая использовать несколько разных языков программирования при создании одной программы // DailyTechInfo [Электронный ресурс]. URL: http://www.dailytechinfo.org/infotech/6167-wyvern-novaya-sistema-pozvolyayuschaya-ispolzovat-neskolko- raznyh-yazykov-programmirovaniya-pri-sozdanii-odnoy-programmy.html (дата обращения: 08.11.2017).

Индекс TIOBE [Электронный ресурс]. – Режим доступа: https://ru.wikipedia.org/wiki/Индекс_TIOB. (дата обращения: 09.11.2017).

  1. Язык Wolfram Alpha – революция в области программирования // DailyTechInfo [Электронный ресурс]. URL: http://www.dailytechinfo.org/infotech/5709-yazyk-wolfram-alpha-revolyuciya-voblasti-programmirovaniya.html (дата обращения: 09.11.2017).

  1. Неклюдова С.А., Балса А.Р. Парадигмы программирования как инструменты разработ- чика программных систем // Информационные технологии и системы : межвузовский сбор- ник научных трудов. Выпуск 1 (12). – СПб., 2014.

  2. Пирс Б. Типы в языках программирования. М.: Лямбда пресс; Добросвет, 2012. 656 с.

  3. Афонин В.В., Никулин В.В. Методы моделирования и оптимизации с параметрами на языке С/С++ и MATLAB: в 2 ч. Саранск: Изд-во Мордов. ун-та, 2015. 184 с

  4. Крупнейший в Европе ресурс для IT-специалистов. [Электронный ресурс]. Режим доступа: https://habrahabr.ru/company/hh/blog/318450/ (дата обращения: 07.11.2017).

  5. Java. Методы программирования / под ред. Блинов И. Н., Романчик В. С. М. Четыре четверти, 2013. 34 с

  6. Магамедова А.З, Дадаев А.М. Применение базовых алгоритмов обработки массивов в задачах по программированию на С++ // Информатизация образования и науки. 2016. № 1(29). С. 156. 161.

  7. Языки программирования [Электронный ресурс]. URL: http://life-prog.ru (дата обращения: 08.11.2017).

  8. McALLISTER N. InfoWorld. «10 языков программирования, которые могут перевернуть мир IT» // Компьютерные вести [Электронный ресурс]. URL: http://www.kv.by/content/325498-10-yazykovprogrammirovaniya-kotorye-mogut-perevernut-mir-it (дата обращения: 08.11.2017).

  9. McALLISTER N. InfoWorld. «10 языков программирования, которые могут перевернуть мир IT» // Компьютерные вести [Электронный ресурс]. URL: http://www.kv.by/content/325498-10-yazykovprogrammirovaniya-kotorye-mogut-perevernut-mir-it (дата обращения: 08.11.2017).

  10. Wyvern – новая система, позволяющая использовать несколько разных языков программирования при создании одной программы // DailyTechInfo [Электронный ресурс]. URL: http://www.dailytechinfo.org/infotech/6167-wyvern-novaya-sistema-pozvolyayuschaya-ispolzovat-neskolko- raznyh-yazykov-programmirovaniya-pri-sozdanii-odnoy-programmy.html (дата обращения: 08.11.2017).

  11. Sketch – новый язык программирования, способный самостоятельно оптимизировать и завершать незаконченные участки кода // DailyTechInfo [Электронный ресурс]. URL: http://www. dailytechinfo.org/infotech/5691-sketch-novyy-yazyk-programmirovaniya-sposobnyy-samostoyatelnooptimizirovat-i-zavershat-nezakonchennye-uchastki-koda.html (дата обращения: 09.11.2017).

  12. Язык Wolfram Alpha – революция в области программирования // DailyTechInfo [Электронный ресурс]. URL: http://www.dailytechinfo.org/infotech/5709-yazyk-wolfram-alpha-revolyuciya-voblasti-programmirovaniya.html (дата обращения: 09.11.2017).

  13. Индекс TIOBE [Электронный ресурс]. – Режим доступа: https://ru.wikipedia.org/wiki/Индекс_TIOB.

  14. TIOBE Index [Электронный ресурс]. – Режим доступа: https://www.tiobe.com/tiobe-index//.

  15. PYPL Index [Электронный ресурс]. – Режим доступа: https://pypl.github.io/PYPL.html.

  16. Брайан У. Язык программирования C. 2-е издание. Пер. с англ. / Брайан У., Керниган, Деннис М., Ритчи. – М.: Издательский дом «Вильямс», 2009. – 304 с.