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

Современные языки программирования (Автокоды)

Содержание:

ВВЕДЕНИЕ

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

Первой цели идеально отвечает язык, который настолько "близок к машине", что всеми основными машинными аспектами можно легко и просто оперировать достаточно очевидным для программиста образом. Вто­рой цели идеально отвечает язык, который настолько "близок к решаемой за­даче", чтобы концепции ее решения можно было выражать прямо и коротко. Связь между языком, на котором мы думаем/программируем, и задачами и ре­шениями, которые мы можем представлять в своем воображении, очень близка. По этой причине ограничивать свойства языка только целями исключения ошибок программиста в лучшем случае опасно. Как и в случае с естественными языками, есть огромная польза быть, по крайней мере, двуязычным.

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

Суще­ствует почти столько же разных машинных языков, сколько и компьютеров, но все они суть разновидности одной идей простые операции производятся со ско­ростью молнии на двоичных числах. Персональные компьютеры IBM исполь­зуют машинный язык микропроцессоров семейства 8086, т.к. их аппаратная часть основывается именно на данных микропроцессорах. Можно писать про­граммы непосредственно на машинном языке, хотя это и сложно. На заре ком­пьютеризации(в начале 1950-х г.г.), машинный язык был единственным язы­ком, большего человек к тому времени не придумал. Для спасения программи­стов от сурового машинного языка программирования, были созданы языки вы­сокого уровня (т.е. немашинные языки), которые стали своеобразным связую­щим мостом между человеком и машинным языком компьютера.

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

ГЛАВА 1. КЛАССИФИКАЦИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ

1.1 Машинно-ориентированные языки

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

  • высокое качество создаваемых программ (компактность и скорость

выполнения);

  • возможность использования конкретных аппаратных ресурсов;
  • предсказуемость объектного кода и заказов памяти;
  • для составления эффективных программ необходимо знать систему

команд и особенности функционирования данной ЭВМ;

  • трудоемкость процесса составления программ (особенно на

машинных языках и ЯСК), плохо защищенного от появления

ошибок;

  • низкая скорость программирования;
  • невозможность непосредственного использования программ,

составленных на этих языках, на ЭВМ других типов.

Машинно-ориентированные языки по степени автоматического програм­миро­вания подразделяются на классы.

1.1.1 Машинный язык

Как я уже упоминал, во введении, отдельный компьютер имеет свой опреде­ленный Машинный язык (далее МЯ), ему предписывают выполне­ние указыва­емых операций над определяемыми ими операндами, поэтому МЯ является ко­мандным. Однако, некоторые семейства ЭВМ (например, ЕС ЭВМ, IBM/370/ и др.) имеют единый МЯ для ЭВМ разной мощности. В команде любого из них сообщается информация о местонахождении операндов и типе выполняемой операции.

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

1.1.2 Языки Символического Кодирования

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

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

1.1.3 Автокоды

Есть также языки, включающие в себя все возможности ЯСК, посред­ством расширенного введения макрокоманд - они называются Автокоды.

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

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

Обе указанных системы используют трансляторы с ЯСК и набор макро­команд, которые также являются операторами автокода.

Развитые автокоды получили название Ассемблеры. Сервисные про­граммы и пр., как правило, составлены на языках типа Ассемблер. Более полная инфор­мация о языке Ассемблера см. ниже.

1.1.4 Макрос

Язык, являющийся средством для замены последовательности символов опи­сывающих выполнение требуемых действий ЭВМ на более сжатую форму - называется Макрос (средство замены).

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

Макрос одинаково может работать, как с программами, так и с данными.

1.2 Машинно-независимые языки

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

Подобные языки получили название высокоуровневых языков програм­мирова­ния. Программы, составляемые на таких языках, представляют со­бой последо­вательности операторов, структурированные согласно прави­лам рассматрива­ния языка (задачи, сегменты, блоки и т.д.). Операторы языка описывают дей­ствия, которые должна выполнять система после трансляции программы на МЯ. Таким образом, командные последова­тельности (процедуры, подпро­граммы), часто используемые в машинных программах, представлены в высо­коуровневых языках отдельными опе­раторами. Программист получил возмож­ность не расписывать в деталях вычислительный процесс на уровне машинных команд, а сосредоточиться на основных особенностях алгоритма.

1.2.1 Проблемно – ориентированные языки

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

1.2.2 Универсальные языки

Универсальные языки были созданы для широкого круга задач: коммер­ческих, научных, моделирования и т.д. Первый универсальный язык был разработан фирмой IBM, ставший в последовательности языков Пл/1. Второй по мощности универсальный язык называется Алгол-68. Он поз­воляет работать с символами, разрядами, числами с фиксированной и плавающей запятой. Пл/1 имеет разви­тую систему операторов для управ­ления форматами, для работы с полями пе­ременной длины, с данными организованными в сложные структуры, и для эф­фективного использова­ния каналов связи. Язык учитывает включенные во мно­гие машины воз­можности прерывания и имеет соответствующие операторы. Предусмот­рена возможность параллельного выполнения участков программ.

Программы в Пл/1 компилируются с помощью автоматических процедур. Язык использует многие свойства Фортрана, Алгола, Кобола. Однако он допускает не только динамическое, но и управляемое и статистическое распределения па­мяти.

1.2.3 Диалоговые языки

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

Одним из примеров диалоговых языков является Бейсик.

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

1.2.4 Непроцедурные языки

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

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

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

ГЛАВА 2. ВИДЫ СОВРЕМЕННЫХ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ

2.1 C

C — компилируемый статически типизированный язык программирова­ния общего назначения, разработанный в 1969—1973 годах сотрудником Bell Labs Деннисом Ритчи как развитие языка Би. Первоначально был разработан для реализации операционной системы UNIX, но впоследствии был перенесён на множество других платформ. Согласно дизайну языка Си, его конструкции близко сопоставляются типичным машинным инструкциям, бла­годаря чему он нашёл применение в проектах, для которых был свойстве­нен язык ассемблера, в том числе как в операционных системах, так и в различ­ном прикладном ПО для множества устройств — от суперкомпьютеров до встраиваемых систем. Язык программирования Си оказал существенное влияние на развитие индустрии программного обеспече­ния, а его синтаксис стал основой для таких языков программирования, как C++, C#, Java и Objective-C.

Язык программирования Си отличается минимализмом. Авторы языка хотели, чтобы программы на нём легко компилировались с помощью однопроход­ного компилятора, чтобы каждой элементарной составляющей программы по­сле компиляции соответствовало весьма небольшое число машинных команд, а использование базовых элементов языка не задействовало библиотеку времени выполнения. Однопроходный компилятор компилирует программу, не возвра­щаясь назад к уже обработанному тексту, поэтому использованию функций и переменных должно предшествовать их объявление. Код на Си можно легко писать на низком уровне абстракции, почти как на ассемблере. Иногда Си называют «универсальным ассемблером» или «ассемблером высокого уровня», что отражает различие языков ассемблера для разных платформ и единство стандарта Си, код которого может быть скомпилирован без изменений практи­чески на любой модели компьютера. Си часто называют языком среднего уровня или даже низкого уровня, учитывая то, как близко он работает к реаль­ным устройствам. Однако в строгой классификации он является языком высо­кого уровня.

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

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

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

  • простую языковую базу, из которой вынесены в библиотеки многие суще­ственные возможности, вроде математических функций или функций управления файлами;
  • ориентацию на процедурное программирование, обеспечивающую удоб­ство применения структурного стиля программирования;
  • систему типов, предохраняющую от бессмысленных операций;
  • использование препроцессора для, например, определения макросов и включения файлов с исходным кодом;
  • непосредственный доступ к памяти компьютера через использова­ние указателей;
  • минимальное число ключевых слов;
  • передачу параметров в функцию по значению, а не по ссылке (при этом пе­редача по ссылке эмулируется с помощью указателей);
  • указатели на функции и статические переменные;
  • области действия имён;
  • структуры и объединения — определяемые пользователем собирательные типы данных, которыми можно манипулировать как одним целым;
  • средства объектно-ориентированного программирования;

В то же время в Си отсутствуют:

  • вложенные функции;
  • сопрограммы;
  • средства автоматического управления памятью;
  • средства функционального программирования.

Часть отсутствующих возможностей относительно легко имитируется встроен­ными средствами (например, сопрограммы можно имитировать с помощью функций setjmp и longjmp), часть добавляется с помощью сторонних библиотек (например, для поддержки многозадачности и для сетевых функций можно ис­пользовать библиотеки pthreads, sockets и т. п.; существуют библиотеки для поддержки автоматической сборки мусора, часть реализуется в некоторых ком­пиляторах в виде расширений языка (например, вложенные функции в GCC).

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

Одним из последствий высокой эффективности и переносимости Си стало то, что многие компиляторы, интерпретаторы и библиотеки других языков высо­кого уровня часто написаны на языке Си.

2.2 C++

C++ — компилируемый, статически типизированный язык программирова­ния общего назначения.

Поддерживает такие парадигмы программирования, как процедурное програм­мирование, объектно-ориентированное программирование, обобщённое про­граммирование. Язык имеет богатую стандартную библиотеку, которая вклю­чает в себя распространённые контейнеры и алгоритмы, ввод-вывод, регуляр­ные выражения, поддержку многопоточности и другие возможности. C++ соче­тает свойства как высокоуровневых, так и низкоуровневых языков. В сравнении с его предшественником — языком C, — наибольшее внимание уделено под­держке объектно-ориентированного и обобщённого программирования.

C++ широко используется для разработки программного обеспечения, являясь одним из самых популярных языков программирования. Область его примене­ния включает создание операционных систем, разнообразных прикладных про­грамм, драйверов устройств, приложений для встраиваемых систем, высоко­производительных серверов, а также развлекательных приложений (игр). Су­ществует множество реализаций языка C++, как бесплатных, так и коммерче­ских и для различных платформ. Например, на платформе x86 это GCC, Visual C++, Intel C++ Compiler, Embarcadero (Borland) C++ Builder и другие. C++ ока­зал огромное влияние на другие языки программирования, в первую очередь на Java и C#.

Синтаксис C++ унаследован от языка C. Одним из принципов разработки было сохранение совместимости с C. Тем не менее, C++ не является в строгом смысле надмножеством C; множество программ, которые могут одинаково успешно транслироваться как компиляторами C, так и компиляторами C++, до­вольно велико, но не включает все возможные программы на C.

2.3 C#

C# — объектно-ориентированный язык программирования. Разработан в 1998—2001 годах группой инженеров под руководством Андерса Хейлс­берга в компании Microsoft как язык разработки приложений для плат­формы Microsoft .NET Framework и впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23270.

C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java. Язык имеет статическую типизацию, поддержи­вает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в фор­мате XML.

Переняв многое от своих предшественников — язы­ков C++, Pascal, Модула, Smalltalk и, в особенности, Java — С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем, например, C# в отличие от C++ не поддерживает множественное наследование классов (между тем допускается множественное наследование интерфейсов).

C# разрабатывался как язык программирования прикладного уровня для CLR и, как таковой, зависит, прежде всего, от возможностей самой CLR. Это касается, прежде всего, системы типов C#, которая отражает BCL. Присутствие или от­сутствие тех или иных выразительных особенностей языка диктуется тем, мо­жет ли конкретная языковая особенность быть транслирована в соответствую­щие конструкции CLR. Так, с развитием CLR от версии 1.1 к 2.0 значительно обогатился и сам C#; подобного взаимодействия следует ожидать и в дальней­шем (однако, эта закономерность была нарушена с выходом C# 3.0, представ­ляющего собой расширения языка, не опирающиеся на расширения платформы .NET). CLR предоставляет C#, как и всем другим .NET-ориентированным язы­кам, многие возможности, которых лишены «классические» языки программи­рования. Например, сборка мусора не реализована в самом C#, а производится CLR для программ, написанных на C# точно так же, как это делается для про­грамм на VB.NET, J# и др.

2.4 Java

Java — сильно типизированный объектно-ориентированный язык про­грамми­рования, разработанный компанией Sun Microsystems (в последу­ющем приоб­ретённой компанией Oracle). Приложения Java обычно транслируются в специ­альный байт-код, поэтому они могут рабо­тать на любой компьютерной архи­тектуре, с помощью виртуальной Java-машины. Дата официального выпуска — 23 мая 1995 года. Изначально язык назывался Oak («Дуб»), разрабаты­вался Джеймсом Гослингом для программирования бытовых электронных устройств. Впоследствии он был переименован в Java и стал использоваться для написания клиент­ских приложений и серверного программного обеспече­ния. Назван в честь марки кофе Java, которая, в свою очередь, получила наиме­нование одноимённого острова (Ява), поэтому на официальной эмблеме языка изображена чашка с горячим кофе. Существует и другая версия проис­хождения названия языка, связанная с аллюзией на кофе-машину как пример бытового устройства, для программирования которого изначально язык создавался. В со­ответствии с этимологией в русскоязычной литера­туре с конца двадцатого и до первых лет двадцать первого века название языка нередко переводилось как Ява, а не транскрибировалось, как это стало общепринятым позднее. Про­граммы на Java транслируются в байт-код Java, выполняемый виртуальной ма­шиной Java (JVM) — программой, обрабатывающей байтовый код и передаю­щей инструкции оборудованию как интерпретатор.

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

Часто к недостаткам концепции виртуальной машины относят снижение произ­водительности. Ряд усовершенствований несколько увеличил ско­рость выпол­нения программ на Java:

  • применение технологии трансляции байт-кода в машинный код непосред­ственно во время работы программы (JIT-технология) с воз­можностью сохранения версий класса в машинном коде,
  • широкое использование платформенно-ориентированного кода (native-код) в стандартных библиотеках,
  • аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми про­цессо­рами фирмы ARM).

Для семи разных задач время выпол­нения на Java составляет в среднем в полтора-два раза больше, чем для C/C++, в некоторых случаях Java быстрее, а в отдельных случаях в 7 раз медленнее. С другой стороны, для большинства из них потребление памяти Java-машиной было в 10—30 раз больше, чем программой на C/C++. Также примечательно исследование, проведённое компа­нией Google, согласно которому отмечается существенно более низкая производительность и большее потребление памяти в тестовых примерах на Java в сравнении с аналогичными программами на C++.

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

2.5 JavaScript

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

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

На JavaScript оказали влияние многие языки, при разработке была цель сделать язык похожим на Java, но при этом лёгким для использова­ния непрограммистами. Языком JavaScript не владеет какая-либо компа­ния или организация, что отличает его от ряда языков программирования, используе­мых в веб-разработке.

Название «JavaScript» является зарегистрированным товарным зна­ком компании Oracle Corporation.

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

Несмотря на схожий с Си синтаксис, JavaScript по сравнению с язы­ком Си имеет коренные отличия:

  • объекты с возможностью интроспекции;
  • функции как объекты первого класса;
  • автоматическое приведение типов;
  • автоматическая сборка мусора;
  • анонимные функции.

В языке отсутствуют такие полезные вещи, как:

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

2.6 Python

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

Эталонной реализацией Python является интерпретатор CPython, поддер­жи­вающий большинство активно используемых платформ. Он распро­страня­ется под свободной лицензией Python Software Foundation License, позволя­ющей использовать его без ограничений в любых приложениях, вклю­чая проприетарные. Есть реализации интерпретаторов для JVM (с возможностью компиляции), MSIL (с возможностью компи­ля­ции), LLVM и других. Проект PyPy предлагает реализацию Python с исполь­зованием JIT-компиляции, которая значительно увеличивает ско­рость вы­полнения Python-программ.

Python — активно развивающийся язык программирования, новые версии (с добавлением/изменением языковых свойств) выходят примерно раз в два с по­ловиной года. Вследствие этого и некоторых других причин на Python отсут­ствуют стандарт ANSI, ISO или другие официальные стан­дарты, их роль вы­полняет CPython.

2.7 Ruby

Ruby  - динамический, рефлективный, интерпретируемый высокоуровне­вый язык программирования. Язык обладает независимой от операционной си­стемы реализацией многопоточности, стро­гой динамической типиза­цией, сборщиком мусора и многими другими возможностями. По особенно­стям синтаксиса он близок к язы­кам Perl и Eiffel, по объектно-ориентирован­ному подходу — к Smalltalk. Также некоторые черты языка взяты из Python, Lisp, Dylan и Клу.

Кроссплатформенная реализация интерпретатора языка является полно­стью свободной.

Возможности Ruby:

  • Имеет лаконичный и простой синтаксис, частично разработанный под влиянием Ада, Eiffel и Python.
  • Позволяет обрабатывать исключения в стиле Java и Python.
  • Позволяет переопределять операторы, которые на самом деле явля­ются методами.
  • Полностью объектно-ориентированный язык программирования. Все данные в Ruby являются объектами в понимании Smalltalk. Един­ственное исключение — управляющие конструкции, которые в Ruby, в отличие от Smalltalk, не являются объектами. Например, число «1» — это экземпляр класса Integer. Также поддерживается добавление мето­дов в класс и даже в конкретный экземпляр во время выполнения про­граммы.
  • Не поддерживает множественное наследование, но вместо него мо­жет использоваться концепция «примесей», основанная в данном языке на механизме модулей.
  • Содержит автоматический сборщик мусора. Он работает для всех объ­ек­тов Ruby, в том числе для внешних библиотек.
  • Создавать расширения для Ruby на С очень просто частично из-за сбор­щика мусора, частично из-за несложного и удобного API.
  • Поддерживает замыкания с полной привязкой к переменным.
  • Поддерживает блоки кода (код заключается в { … } или do … end). Блоки могут использоваться в методах или преобразовываться в за­мы­кания.
  • Целые переменные в Ruby автоматически конвертируются между ти­пами Fixnum (32-разрядные) и Bignum (больше 32 разрядов) в за­виси­мости от их значения, что позволяет производить целочислен­ные ма­тематические расчёты со сколь угодно большой точностью.
  • Не требует предварительного объявления переменных, но для интер­пре­татора желательно, чтобы переменным присваивалось пу­стое зна­чение nil (тогда интерпретатор знает, что идентификатор обозначает переменную, а не имя метода). Язык использует про­стые соглашения для обозначения области видимости. Пример: просто var — локальная переменная, @var — переменная экзем­пляра (член или поле объекта класса), @@var — переменная класса, $var — глобальная переменная.
  • В Ruby непосредственно в языке реализованы многие шаблоны проек­ти­рования, так, например, «одиночка» (singleton) может быть (хотя и не обязан) реализован добавлением необходимых методов к одному конкретному объекту.
  • Может динамически загружать расширения, если это позво­ляет операционная система.
  • Имеет независимую от ОС поддержку не вытесняю­щей многопоточности.
  • Перенесён на множество платформ. Он разрабатывался на Linux, но ра­ботает на многих версиях Unix, DOS, Microsoft Windows (в част­но­сти, Win32), Mac OS, BeOS, OS/2 и т. д.

2.8 PHP

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

Язык и его интерпретатор (Zend Engine) разрабатываются группой энтузиастов в рамках проекта с открытым кодом. Проект распространяется под собственной лицензией, несовместимой с GNU GPL.

В области веб-программирования, в частности серверной части, PHP — один из популярных сценарных языков (наряду с JSP, Perl и языками, используемыми в ASP.NET).

Популярность в области построения веб-сайтов определяется наличием боль­шого набора встроенных средств для разработки веб-приложений. Основные из них:

  • автоматическое извлечение POST и GET-параметров, а также перемен­ных окружения веб-сервера в предопределённые массивы;
  • взаимодействие с большим количеством различных систем управления базами данных;
  • автоматизированная отправка HTTP-заголовков;
  • работа с HTTP-авторизацией;
  • работа с cookies и сессиями;
  • работа с локальными и удалёнными файлами, сокетами;
  • обработка файлов, загружаемых на сервер;
  • работа с XForms.
  • В настоящее время PHP используется сотнями тысяч разработчиков. Со­гласно рейтингу корпорации TIOBE, базирующемся на данных по­исковых систем, в мае 2016 года PHP находился на 6 месте среди язы­ков программирования. К крупнейшим сайтам, использующим PHP, относятся Facebook, Wikipedia и др.
  • Входит в LAMP — распространённый набор программного обеспече­ния для создания и хостинга веб-сайтов (Linux, Apache, MySQL, PHP).

2.9 CSS

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

Преимущественно используется как средство описания, оформления внешнего вида веб-страниц, написанных с помощью языков разметки HTML и XHTML, но может также применяться к любым XML-документам, например, к SVG или XUL.

CSS используется создателями веб-страниц для задания цветов, шрифтов, рас­положения отдельных блоков и других аспектов представления внешнего вида этих веб-страниц. Основной целью разработки CSS являлось разделение описа­ния логической структуры веб-страницы (которое производится с помо­щью HTML или других языков разметки) от описания внешнего вида этой веб-страницы (которое теперь производится с помощью формального языка CSS). Такое разделение может увеличить доступность документа, предоставить большую гибкость и возможность управления его представлением, а также уменьшить сложность и повторяемость в структурном содержимом. Кроме того, CSS позволяет представлять один и тот же документ в различных стилях или методах вывода, таких как экранное представление, печатное представле­ние, чтение голосом (специальным голосовым браузером или программой чте­ния с экрана), или при выводе устройствами, использующими шрифт Брайля.

2.10 Go

Go (часто также Golang) — компилируемый многопоточный язык программи­рования, разработанный компанией Google. Первоначальная разработка Go началась в сентябре 2007 года, а его непосредственным проектированием зани­мались Роберт Гризмер, Роб Пайк и Кен Томпсон, занимавшиеся до этого про­ектом разработки операционной системы Inferno. Официально язык был пред­ставлен в ноябре 2009 года. На данный момент его поддержка осуществляется для операционных систем FreeBSD, OpenBSD, Linux, Mac OS X, Windows, начиная с версии 1.3 в язык Go включена экспериментальная под­держка DragonFly BSD, Plan 9 и Solaris, начиная с версии 1.4 — поддержка платформы Android.

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

Основные возможности языка Go:

  • Go — язык со строгой статической типизацией. Доступен автоматический вы­вод типов, для пользовательских типов — «утиная типизация».
  • Полноценная поддержка указателей, но без возможности применять к ним арифметические операции, в отличие от C/C++/D.
  • Строковый тип со встроенной поддержкой юникода.
  • Использование динамических массивов, хэш-таблиц, срезов (слайсов), вариант цикла для обхода коллекции.
  • Средства функционального программирования: неименованные функции, за­мыкания, передача функций в параметрах и возврат функциональных значений.
  • Автоматическое управление памятью со сборщиком мусора.
  • Средства объектно-ориентированного программирования, но без поддержки наследования реализации (наследуются только интерфейсы). По большому счёту, Go является процедурным языком с поддержкой интерфейсов.
  • Средства параллельного программирования: встроенные в язык потоки (go routines), взаимодействие потоков через каналы и другие средства организации многопоточных программ.
  • Достаточно лаконичный и простой синтаксис, основанный на Си, но суще­ственно доработанный, с большим количеством синтаксического сахара.

При этом из языка сознательно исключены:

  • Структурная запись обработчиков исключений. Вместо неё предлага­ется проверка кодов возврата с использованием многозначных функ­ций и использование отложенных (deferred) функций и специального интерфейса error для перехвата исключительных ситуаций.
  • Наследование реализации. В качестве замены предлагается анонимное вложение типов.
  • Обобщённое программирование.
  • Использование утверждений.
  • переопределение методов.

Язык продолжает развиваться, и разработчики рассматривают возможность включения в язык средств обобщённого программирования. В «Часто задавае­мых вопросах» по языку приводятся аргументы против использования утвер­ждений, а наследование без указания типа, наоборот, отстаивается.

2.11 Scala

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

Первые версии языка созданы в 2003 году коллективом лаборатории методов программирования Федеральной политехнической школы Лозанны под руко­водством Мартина Одерски, язык реализован для платформ Java и .Net. По мнению Джеймса Стрэчена , создателя языка программирования Groovy, Scala может стать преемником языка Java.

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

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

Язык допускает внешние расширения компонентов с использованием представ­лений (views). Возможности обобщённого программирования реализуются за счёт поддержки обобщённых функций (generics), в том числе высшего типажа (generics of a higher kind). Кроме различных классических структурных типов данных, в язык включена поддержка экзистенциальных типов.

2.12 Swift

Swift — открытый мультипарадигмальный компилируемый язык программиро­вания общего назначения. Создан компанией Apple в первую очередь для раз­работчиков iOS и macOS. Swift работает с фреймворками Cocoa и Cocoa Touch и совместим с основной кодовой базой Apple, написанной на Objective-C. Swift задумывался как более легкий для чтения и устойчивый к ошибкам про­граммиста язык, нежели предшествовавший ему Objective-C. Программы на Swift компилируются при помощи LLVM, входящей в интегрированную среду разработки Xcode 6 и выше. Swift может использовать рантайм Objective-C, что делает возможным использование обоих языков (а также С) в рамках одной программы. Swift заимствовал довольно многое из Objective-C, однако он опре­деляется не указателями, а типами переменных, которые обрабаты­вает компилятор. По аналогичному принципу работают многие скриптовые языки. В то же время, он предоставляет разработчикам многие функции, кото­рые прежде были доступны в C++ и Java, такие как определяемые наименова­ния, так называемые обобщения и перегрузка операторов.

Часть функций языка выполняется быстрее по сравнению с другими подоб­ными языками. Например, сортировка комплексных объектов выполняется в 3,9 раз быстрее, чем в Python, и почти в 1,5 раза быстрее, чем в Objective-C.

Код, написанный на Swift, может работать вместе с кодом, написанным на язы­ках программирования C и Objective-C в рамках одного и того же проекта.

2.13 TypeScript

TypeScript — язык программирования, представленный Microsoft в 2012 году и позиционируемый как средство разработки веб-приложений, расширяющее возможности JavaScript.

Разработчиком языка TypeScript является Андерс Хейлсберг , создавший ра­нее Turbo Pascal, Delphi и C#.

Спецификации языка открыты и опубликованы в рамках соглашения Open Web Foundation Specification Agreement (OWFa 1.0).

TypeScript является обратно совместимым с JavaScript и компилируется в по­следний. Фактически, после компиляции программу на TypeScript можно вы­полнять в любом современном браузере или использовать совместно с сервер­ной платформой Node.js. Код экспериментального компилятора, транслирую­щего TypeScript в JavaScript, распространяется под лицензией Apache. Его раз­работка ведётся в публичном репозитории через сервис GitHub.

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

ЗАКЛЮЧЕНИЕ

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

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

Но к 20-му веку был изобретён телефон, не требовавший участия человека для преобразования кода в естественный язык. К 1920-м годам от большого числа операторов осталась лишь малая часть, по сравнению с 1890-ми.

Перенесёмся на сотню лет вперёд – и мы окажемся в схожей ситуации, только уже с программистами. Конечно, эта профессия требует больше навыков и ин­теллектуальных возможностей, чем у телеграфного оператора. Но программи­сты сегодня занимают функционально схожую с операторами нишу. Взрывное распространение софта похоже на распространение ранних видов коммуника­ций 19-го века. Спрос на операторов рос пропорционально росту сетей, и спрос на программистов растёт пропорционально росту ПО. Раньше все телеграммы необходимо было транслировать с азбуки Морзе в человеческий язык, а сегодня весь код должен быть написан человеком.

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

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

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

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

Мое личное мнение, резюмируя выше сказанное:

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

Фреймворки растут, но вместе с тем растет и их сложность. Человека с улицы фреймворком не научишь пользоваться за 5 минут. 

А что касается операторов телеграфа — они исчезли потому что люди предпочли телефоны и автоматизацию. 
Умирают профессии, связанные с работой, на которой могут справиться роботы — это рабочие, таксисты, официанты, продавцы, парикмахеры, операторы — и т.д. 
А вот профессии, связанные с исследованиями и разработкой — ученый, исследователь, инженер не умирают уже 1000 лет. Программист — это разновидность инженера, которая если и умрет то только тогда, когда че­ловечество достигнет точки сингулярности прогресса и автоматизации. И это точно не случится в 2060 году. К 2060 году человечество с трудом сможет ИИ официанта воспроизвести, не говоря уж об ИИ программиста — вот увидите.

Вывод: пока ИИ не изобретен — программисты точно нужны, как мини­мум — делать ИИ. Когда ИИ будет изобретен — то люди вообще не нужны бу­дут, не только программисты.

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

1) Родли Джон Создание Java-апплетов .- The Coriolis Group,Inc.,1996, Издательство НИПФ "ДиаСофт Лтд.",1996

2) Эферган Майкл Java: справочник .- QUE Corporation, 1997, Издательство "Питер Ком", 1998

3) Давидов Михаил Изгияевич; Антонов Вадим Геннадьевич “LEX - генератор программ лексического анализа” МОСКВА – 1985;

4) "BASIC Face-off", Justin J.Crom, PC Tech Journal, September 1987, 136 Перевод: ЛопуховВ.Н. (Интегратор Promt98);

5) Керниган Б.В., Ритчи Д., Фьюэр А. “Язык программирования Си.” Русский перевод: Москва: Финансы и Статистика. 1985 г.;

6) Золотарев В.В., “Основы автоматизации” ч.1, 1978 г.;

7) Ваулин А.С., “Языки программирования” кн.5, 1993 г.;

8) Терренс П. “Языки программирования: разработка и реализация”, 1979 г.;

9) Касвандс Э.Г “Введение в программирование на языке Ассемблер” ч.1;

10) Хротко Г., “Языки программирования высокого уровня”, 1982 г.;

11) Малютин Э.А., Малютина Л.В., “Языки программирования”, 1982 г.;

12) Ушкова В.“Новые языки программирования и тенденции их развития”, 1982 г.;

13) Хьювенен Э., Сеппенен Й., “Мир Лиспа” т.1, 1990 г.;

14) Янг С., “Алгоритмические языки реального времени”, 1985 г.

15) wikipedia.org

16) habrahabr.ru

17) geektimes.ru