к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog

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

Существует множество критериев, по которым можно классифицировать языки программирования. Частые варианты классификации включают:

Чёткой классификации не существует, по той простой причине, что существуют буквально тысячи ЯП, и в любой категории классификации обнаруживается практически непрерывный спектр.

По системе типов

Наиболее категоричное разделение ЯП по системе типов на типизированные и нетипизированные.

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

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

Типизированные языки определяют типы данных, с которыми работает любая операция. Например, операция деления работает над числами – для строк эта операция не определена.

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

По моменту проверки типов ЯП делятся на статически и динамически типизированные (или просто, статические и динамические).

Статически типизированные языки

При статической типизации, типы всех выражений точно определены до выполнения программы, и обычно проверяются при компиляции. Языки со статической типизацией, в свою очередь могут быть явно типизированными (manifestly typed) или типовыводящими (type-inferred).

Явно типизированные языки

требуют явного указания типов. К ним относятся, например, C, C++, C#, Java.

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

Надо заметить, что многие явно типизированные языки умеют выводить типы в некоторых случаях (например, auto в С++11), поэтому чёткую грань здесь провести можно не всегда.

Динамически типизированные языки

производят проверку типов на этапе выполнения. Иначе говоря, типы связаны со значением при выполнении, а не с текстовым выражением. Как и типовыводящие языки, динамически типизированные не требуют указания типов выражений. Помимо прочего, это позволяет одной переменной иметь значения разных типов в разные моменты исполнения программы. Однако, ошибки типов не могут быть автоматически обнаружены, пока фрагмент кода не будет выполнен. Это усложняет отладку и несколько подрывает идею типобезопасности в целом. Примерами динамически типизированных языков являются Lisp, Perl, Python, JavaScript и Ruby.

По строгости типизации языки делятся на сильно и слабо типизированные.

Слабо типизированные языки

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

Сильно типизированные языки

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

В целом, чёткую грань провести оказывается опять-таки достаточно сложно, поскольку неявное преобразование типов в той или иной мере производится в большинстве языков. Однозначно к слабо типизированным относят Perl, JavaScript и C (в силу свободной конверсии void* ). К сильно типизированным относят C++, Java, Haskell, и другие.

По уровню абстракции

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

Языки по-настоящему низкого уровня – это машинный код и языки ассемблера, все остальные – в некотором смысле языки высокого уровня. Тем не менее, многие сейчас считают C и C++ языками низкого уровня.

Java, Python, Ruby и т.п. сейчас общепринято считаются языками высокого уровня.

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

По модели исполнения

ЯП может быть компилируемым, транс-компилируемым или интерпретируемым.

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

Интерпретируемые языки: PHP, Perl, Bash, Python, JavaScript

Компилируемый язык компилируется, т.е. переводится в исполнимую форму до выполнения.

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

Компилируемые языки (машинный код): С, С++, Algol, Fortran, Haskell Компилируемые языки (байт-код): Python, Java

Транс-компилируемые языки – это языки, которые для компиляции или выполнения транслируются в другой язык. Частой целью для транс-компилируемых языков является C. Также последнее время популярной целью является JavaScript (как единственный язык, исполняемый в браузере).

Транс-компилируемые языки: C++ (исторически, в C), Haskell (исторически, в С), Fortran (иногда, в С), Fay (в JavaScript)

Линии сильно размыты, поскольку существуют компиляторы для традиционно интерпретируемых языков, и, напротив, интерпретаторы для традиционно компилируемых.

Классификация по “поколению”

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

Языки первого поколения

1GL – это машинные языки. Исторически, программы на этих языках вводились при помощи переключателей на передней панели ЭВМ, либо “писались” на перфокартах и позже перфолентах. Программа на 1GL состоит из 0 и 1 и сильно привязана к конкретному железу, на котором она должна исполняться.

Языки второго поколения

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

Языки третьего поколения

Более абстрактные, чем 2GL, это языки, которые перекладывают заботу о непринципиальных деталях с плеч программиста на плечи компьютера. Fortran, ALGOL и COBOL являются первыми 2GL. C, C++, Java, BASIC и Pascal так же могут быть отнесены к 3GL, хотя в общем 3GL подразумевает только структурную парадигму (в то время как C++, Java работают в том числе в ООП)

Языки четвертого поколения

Определение несколько расплывчато, однако в целом сводится к еще более высокому уровню абстракции, чем 3GL. Однако, подобный уровень абстракции часто требует сужения области применения. Так, например, FoxPro, LabView G, SQL, Simulink являются 4GL, однако находят применение в узкой специфической области. Некоторые исследователи считают, что 4GL являются подмножеством DSL (domain specific language, язык, специфичный к области).

Языки пятого поколения

В конце 80-х – начале 90-х была попытка разработать класс языков, которые “пишут программы сами”. По идее, программист должен был описывать как программа должна себя вести, а остальное должен был делать компьютер. К примерам можно отнести Prolog, OPS5, Mercury. Хотя эти языки остаются интересными с теоретической точки зрения, широкого практического применения они не нашли.

Парадигмы программирования

к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog. image 1. к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog фото. к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog-image 1. картинка к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog. картинка image 1. Существует множество критериев, по которым можно классифицировать языки программирования. Частые варианты классификации включают:

Определение

Вообще строгого определения нет, но по сути “парадигма программирования” определяет стиль написания исходного кода программ.

В некоторой степени “стиль” диктует так же способ формализации алгоритмов.

Императивное программирование

Императивное программирование характеризуется в основном:

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

Практически всё аппаратное обеспечение в основе своей императивное.

Неструктурное программирование

Характерно для наиболее ранних языков программирования.

В основном характеризуется:

Характерной особенностью неструктурного программирования является сложность реализации рекурсии.

Структурное программирование

В отличие от неструктурного программирования, характеризуется:

Концепция структурного программирования основана на теореме Бёма-Якопини:

Любая вычислимая функция может быть представлена комбинацией трёх управляющих структур:

Последовательность – это выполнение сначала одной подпрограммы, затем другой.

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

Итерация – это многократное выполнение подпрограммы пока некое булево выражение истинно.

Процедурное программирование

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

Основная идея заключается в том, чтобы сделать подпрограммы более модульными за счёт:

Оба этих пункта реализуются за счёт использования стека вызовов.

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

Объектно-ориентированное программирование основано на концепции “объекта”.

Объекты могут содержать данные (поля, свойства, аттрибуты) и поведение (код, процедуры, методы).

Наиболее популярной формой ООП является ООП на основе классов. В данном подходе, все объекты являются экземплярами классов, и классы определяют так же тип объектов.

Одной из альтернатив является прототипное наследование. Прототипное наследование не использует классов. Вместо этого, одни объекты могут быть объявлены “прототипами” других объектов – при этом методы и поля прототипа становятся доступны как методы и поля нового объекта (если, конечно, новый объект их не переопределяет)

Декларативное программирование

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

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

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

“Чисто декларативные” компьютерные языки зачастую не полны по Тьюрингу — примерами служат SQL и HTML — так как теоретически не всегда возможно порождение исполняемого кода по декларативному описанию. Это иногда приводит к спорам о корректности термина “декларативное программирование”.

Функциональное программирование

Основано на лямбда-исчислении

Аппликативное

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

Комбинаторное

Комбинаторное программирование (англ. function-level programming) — парадигма программирования, использующая принципы комбинаторной логики.

Является особой разновидностью функционального программирования, но, в отличие от основного его направления, комбинаторное программирование не использует λ-абстракцию.

На практике это выливается в отсутствие “переменных”, содержащих данные.

Логическое программирование

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

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

Источник

Cat, Mouse и Brainfuck: сколько языков программирования существует в мире

Мы задались вопросом, сколько языков программирования есть в мире и чем они отличаются друг от друга. Даем развернутый ответ.

к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog. c447a769021d7014569e7c1dd4fe7eb1. к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog фото. к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog-c447a769021d7014569e7c1dd4fe7eb1. картинка к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog. картинка c447a769021d7014569e7c1dd4fe7eb1. Существует множество критериев, по которым можно классифицировать языки программирования. Частые варианты классификации включают:

к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog. 97fe058357dc0c113c96b54d580c8268. к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog фото. к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog-97fe058357dc0c113c96b54d580c8268. картинка к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog. картинка 97fe058357dc0c113c96b54d580c8268. Существует множество критериев, по которым можно классифицировать языки программирования. Частые варианты классификации включают:

Язык программирования — это система семантических, лексических и синтаксических правил, придуманная человеком для написания программ, которые выполняет компьютер.

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

к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog. 42e2a13d515dc433d5a1355be98d2e2d314829fa. к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog фото. к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog-42e2a13d515dc433d5a1355be98d2e2d314829fa. картинка к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog. картинка 42e2a13d515dc433d5a1355be98d2e2d314829fa. Существует множество критериев, по которым можно классифицировать языки программирования. Частые варианты классификации включают:

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

Низкоуровневые и высокоуровневые

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

к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog. cc85b8a0db36085a71681091e7fa60bb4a050e70. к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog фото. к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog-cc85b8a0db36085a71681091e7fa60bb4a050e70. картинка к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog. картинка cc85b8a0db36085a71681091e7fa60bb4a050e70. Существует множество критериев, по которым можно классифицировать языки программирования. Частые варианты классификации включают:

Усложнение программ привело к тому, что люди уже не могли эффективно писать их на устаревшем языке ассемблера. В 1970-е годы разработчики создали первый высокоуровневый язык, многим известный Fortran, который используется и сейчас — в основном в научных разработках и вычислениях. В третьем и четвертом поколениях оформилось структурное программирование и появились функциональные языки: это, например, C, Pascal, Lisp, Scala, Erlang, F#, Haskell и другие.

Сегодня говорят уже о сверхвысокоуровневых языках, для которых характерен еще больший градус абстракции, чем в предыдущих. К этой группе относят Python, Ruby, Haskell, Perl.

Интерпретируемые и компилируемые

к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog. 92fe3d49a2663d3451f40e3cb3eb41df23307629. к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog фото. к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog-92fe3d49a2663d3451f40e3cb3eb41df23307629. картинка к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog. картинка 92fe3d49a2663d3451f40e3cb3eb41df23307629. Существует множество критериев, по которым можно классифицировать языки программирования. Частые варианты классификации включают:

Интерпретация — это выполнение кода непосредственно и построчно, то есть команда за командой. В этом случае программа не может быть запущена без интерпретатора. К языкам такого типа относятся PHP, JavaScript, Python, Lava, MATLAB, Perl и другие.

к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog. d04cb8aa369907a8dca000a86c667afc3f21752a. к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog фото. к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog-d04cb8aa369907a8dca000a86c667afc3f21752a. картинка к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog. картинка d04cb8aa369907a8dca000a86c667afc3f21752a. Существует множество критериев, по которым можно классифицировать языки программирования. Частые варианты классификации включают:

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

Со статической и динамической типизацией

Еще один вариант классификации — по мощности и строгости типов того или иного языка. Динамическая типизация означает, что переменная получает свой тип не при ее объявлении, а в момент присвоения ей значения. Динамически типизированные языки — это PHP, JavaScript, Ruby, Python, Objective-C, Lisp, Perl, Erlang, Visual Basic, Smalltalk.

Статическая типизация — противоположный прием: переменная получает свой тип при ее объявлении, и он не может быть изменен позже. Примеры статически типизированных языков: Java, Pascal, C++, C#, Ada.

Эзотерические языки

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

Некоторые из них созданы на основе литературного синтаксиса, например, шекспировских пьес, кулинарных рецептов, японских стихотворений хайку. И даже на основе вымышленной инопланетной логики клингонов из сериала “Star Trek” — язык Var’Aq.

Один из широко известных эзотерических языков — Brainfuck («вынос мозга»), созданный в 1993 году Урбаном Мюллером. В нем всего восемь команд, и каждая записывается одним символом. Несмотря на свой минимализм, Brainfuck обладает тьюринг-полнотой — то есть на нем определенно можно реализовать любую вычислимую функцию. Следуя его концепции, многие разработчики написали свой игрушечный язык наподобие Brainfuck.

к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog. 187d53692003389f509a689846483b2ea7a55f43. к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog фото. к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog-187d53692003389f509a689846483b2ea7a55f43. картинка к какой группе языков программирования относятся такие языки как ruby и haskell perl prolog. картинка 187d53692003389f509a689846483b2ea7a55f43. Существует множество критериев, по которым можно классифицировать языки программирования. Частые варианты классификации включают:

Специальные языки

Их создавали для решения каких-то очень узких специфических задач. Например, язык Mouse был разработан для управления цифровыми и аналоговыми устройствами в электронной музыкальной студии. Его элементы состоят из единичных символов, и в нем всего 26 переменных, ограниченных буквами латинского алфавита от A до Z. Вот пример небольшой программы на нем:

Источник

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

Язык программирования – это искуственный язык, созданный для взаимодействия с машиной, в частности, с компьютером. ЯП используются для написания программ, которые управляют машиной и/или выражают алгоритмы.

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

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

Некоторые языки определяются стандартом (C,C++,Haskell, и др.). Другие не имеют формального описания, и наиболее широко распространенная реализация используется в качестве эталона.

Описание ЯП обычно делится на две части: синтаксис, т.е. форма, и семантика, т.е. значение.

Семантика в свою очередь подразделяется на лексику и грамматику.

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

Не все синтаксически корректные программы являются семантически корректными. Например:

Семантика же подразделяется на статическую, динамическую, и систему типов.

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

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

определяет каким образом ЯП классифицирует значения и выражения, как эти типы взаимодействуют и каким образом ЯП может манипулировать ими. Система типов является практическим приложением теории категорий. Цель системы типов – проверка программы на корректность (до какой-то степени). Любая система типов, отвергая некорректные программы, будет так же отвергать некоторый процент коррекнтых (хотя необычных) программ. Чтобы обойти это ограничение, ЯП обычно имеют некие механизмы для выхода из ограничений системы типов. В большинстве случаев, указание корректных типов ложится на совесть программиста. Однако некоторые ЯП (обычно функциональные) умеют выводить типы исходя из семантики, и таким образом освобождают программиста от необходимости явно указывать типы.

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

Существует множество критериев, по которым можно классифицировать языки программирования. Частые варианты классификации включают:

Четкой классификации не существует, по той простой причине, что существуют буквально тысячи ЯП, и в любой категории классификации обнаруживается практически непрерывный спектр.

По системе типов

Наиболее категоричное разделение ЯП по системе типов на типизированные и нетипизированные.

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

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

Типизированные языки определяют типы данных, с которыми работает любая операция. Например, операция деления работает над числами – для строк эта операция не определена.

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

По моменту проверки типов ЯП делятся на статически и динамически типизированные (или просто, статические и динамические).

Статически типизированные языки

При статической типизации, типы всех выражений точно определены до выполнения программы, и обычно проверяются при компиляции. Языки со статической типизацией, в свою очередь могут быть явно типизированными (manifestly typed) или типовыводящими (type-inferred).

Явно типизированные языки

требуют явного указания типов. К ним относятся, например, C, C++, C#, Java.

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

Надо заметить, что многие явно типизированные языки умеют выводить типы в некоторых случаях (например, auto в С++11), поэтому четкую грань здесь провести можно не всегда.

Динамически типизированные языки

производят проверку типов на этапе выполнения. Иначе говоря, типы связаны со значением при выполнении, а не с текстовым выражением. Как и типовыводящие языки, динамически типизированные не требуют указания типов выражений. Помимо прочего, это позволяет одной переменной иметь значения разных типов в разные моменты исполнения программы. Однако, ошибки типов не могут быть автоматически обнаружены, пока фрагмент кода не будет выполнен. Это усложняет отладку и несколько подрывает идею типобезопасности в целом. Примерами динамически типизированных языков являются Lisp, Perl, Python, JavaScript и Ruby.

По строгости типизации языки делятся на сильно и слабо типизированные.

Слабо типизированные языки

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

Сильно типизированные языки

не позволяют неявную конверсию, и требуют явной.

В целом, четкую грань провести оказывается достаточно сложно, поскольку неявное преобразование типов в той или иной мере производится в большинстве языков. Однозначно к слабо типизированным относят Perl, JavaScript и C (в силу свободной конверсии void* ). К сильно типизированным относят C++, Java, Haskell, и другие.

По уровню абстракции

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

Языки по-настоящему низкого уровня – это машинный код и языки ассемблера, все остальные – в некотором смысле языки высокого уровня. Тем не менее, многие сейчас считают C и C++ языками низкого уровня.

Java, Python, Ruby и т.п. сейчас общепринято считаются языками высокого уровня.

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

По модели исполнения

ЯП может быть компилируемым, транс-компилируемым или интерпретируемым.

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

Интерпретируемые языки: PHP, Perl, Bash, Python, JavaScript, Haskell

Компилируемый язык компилируется, т.е. переводится в исполнимую форму до выполнения.

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

Компилируемые языки (машинный код): ASM, С, С++, Algol, Fortran Компилируемые языки (байт-код): Python, Java

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

Транс-компилируемые языки: C, C++, Haskell, Fortran

Линии сильно размыты, поскольку существуют компиляторы для традиционно интерпретируемых языков, и, напротив, интерпретаторы для традиционно компилируемых.

Классификация по “поколению”

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

Языки первого поколения

1GL – это машинные языки. Исторически, программы на этих языках вводились при помощи переключателей на передней панели ЭВМ, либо “писались” на перфокартах и позже перфолентах. Программа на 1GL состоит из 0 и 1 и сильно привязана к конкретному железу, на котором она должна исполняться.

Языки второго поколения

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

Языки третьего поколения

Более абстрактные, чем 2GL, это языки, которые перекладывают заботу о непринципиальных деталях с плеч программиста на плечи компьютера. Fortran, ALGOL и COBOL являются первыми 2GL. C, C++, Java, BASIC и Pascal так же могут быть отнесены к 3GL, хотя в общем 3GL подразумевает только структурную парадигму (в то время как C++, Java работают в том числе в ООП)

Языки четвертого поколения

Определение несколько расплывчато, однако в целом сводится к еще более высокому уровню абстракции, чем 3GL. Однако, подобный уровень абстракции часто требует сужения области применения. Так, например, FoxPro, LabView G, SQL, Simulink являются 4GL, однако находят применение в узкой специфической области. Некоторые исследователи считают, что 4GL являются подмножеством DSL (domain specific language, язык, специфичный к области).

Языки пятого поколения

В конце 80-х – начале 90-х была попытка разработать класс языков, которые “пишут программы сами”. По идее, программист должен был описывать как программа должна себя вести, а остальное должен был делать компьютер. К примерам можно отнести Prolog, OPS5, Mercury. К добру или худу, но эта затея провалилась, поскольку создание эффективного алгоритма для решения конкретной проблемы – само по себе весьма нетривиальная задача, и часто для ее решения требуются человеческая смекалка и интуиция.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *