Как сравнить языки
За карьеру программисту приходится изучать большое количество языков, зачем их столько?
Ответить на такой в общем то наивный вопрос подчас затрудняются даже опытные специалисты. Ведь действительно, языков более — менее популярных насчитывается около пяти тысяч. И чем все они отличаются? Статья задумана автором как ответ
Какая разница на сколько один язык отличается от другого: нужно и выучил. Так — да не так. Программируя на разных языках человек совершает очевидно и разные ошибки. Но зачем нужна одна и та же программа, написанная множество раз? Есть области, где ошибка недопустима. При создании ПО для атомных электростанций, химического производстве, военных роботов, медицины малейший сбой может привести к необратимым последствиям.
Поэтому поступают так:
- Создают управляющую программу на разных языках программирования, возможно разными командами разработчиков.
- Сравнивают команды подаваемые программой и решают что же делать.
- Решающая программа называется арбитром.
- Подход уменьшения ошибок с помощью многих версий программ — диверсностью.
Как же сравнить языки?
Существует много подходов, есть даже сравнение языков по энергоэффективности. Ну там коровки пукают, загрязняют атмосферу метаном и поэтому разработчики должны обратить внимание на сохранение окружающей среды — как можно меньше греть атмосферу своими богомерзкими компьютерами. Да-да я от сумасшедших зеленых. Но это не наш метод! Языки мы будем сравнивать по парадигме — совокупности идей и понятий, определяющих стиль написания компьютерных программ. Понятно, что один язык может поддерживать несколько парадигм, к примеру быть функциональным и объектно ориентированным.
Парадигмы для сравнения
Сложность их выбора в том, что большинство современных языков общего назначения поддерживают основные парадигмы в том, или ином виде. Язык Lisp мультипарадигменный, поскольку создатели языков уже 65 лет черпают в нем идеи. Поэтому мы будем сравнивать только то, что входит в стандарт, без библиотек и фреймворков.
Способ выполнения программы
Языки подразделяются на четыре типа: интерпретаторы, компиляторы, транслируемые в байт-код выполняемый виртуальной машиной и транслируемые в другой язык программирования.
Интерпретаторы.
Интерпретацией называется построчный анализ, обработка и выполнение исходного кода программы или запроса. Примеры Lua[4], GNU Lisp[5] Примечание, GNU Lisp является примером мультипарадигменного по методу исполнения языка, поскольку поддерживает интерпретацию и трансляцию в язык Си.
Компиляторы
Транслируют программный код в программу, выполняемую непосредственно операционной системой. Пример С++[5], Delphi[6]. Языки подобного рода хорошо известны большинству программистов
Языки с виртуальной машиной
Транслируются в бинарный код(так называемый байт-код) который выполняется специальной программой называемой «виртуальная машина». Примеры Java[7], C#[8]. Таким образом преимущества компилируемого языка совмещаются с кроссплатформенностью, поскольку виртуальные машины существуют для всех популярных операционных систем.
Языки транслируемые в другие
Иногда дизайн базового языка программирования не устраивает разработчика ввиду различных причин. Например, JavaScript. Это же ужас! Но как перейти, если интерпретаторы других языков вытеснены из большинства браузеров? Есть выход:сделать более удобный язык и транслировать его в JavaScript, так TypeScript появился. Ещё пример GNU Lisp, он транслируется в язык Си.
Типы ООП
Языки подразделяются на три основных типа: без ООП совсем(пример, язык Си), без ООП в классическом понимании, но с возможностью его эмуляции (Lua, JavaScript[10] и классические языки ООП. Пример: Java[11], C++[5], Scala[12]
Разница между языками без ООП и с эмуляцией ООП является в значительной степени условной, поэтому разница между ними определяется практикой применения.
Кроме того, есть языки с поддержкой наследования интерфейсов(Java) и множественными предками(С++, Python), а также собственные типы наследования(некоторые библиотеки поддержки ООП в LISP)
Типизация
Как известно тип данных это характеристика набора данных, которая определяет диапазон его возможных значений, список допустимых операций, а также способ хранения набора данных[13]. Типизация бывает статической(когда тип переменной или метода объявляется при объявлении класса) и динамической(тип фиксируется при инициализации). Иными словами, статическая компиляция означает, что проверка на совместимость типов выполняется на этапе компиляции/проверки ошибок, динамическая — на этапе выполнения.
Также система типов может быть слабой и сильной. Система типов называется «сильной», если она исключает возможность возникновения ошибки согласования типов времени выполнения, иными словами, обеспечивающей типобезопасность (отсутствие неконтролируемых ошибок приведения типов времени выполнения) на уровне языках[14]. Соответственно язык может поддерживать
- Статическая(Java[11], C++[5], C#[15]), или динамическая(Python[16] PHP[17]), типизация.
- Сильная(Java[11], Python[16]) или слабая(С[18], JavaScript[10]) типизация
Функциональное программирование
Парадигма программирования[19], в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании).
Противопоставляется парадигме императивного программирования описывающей процесс вычислений как последовательное изменение состояний (в значении, подобно таковому в теории автоматов). При необходимости, в функциональном программировании вся совокупность последовательных состояний вычислительного процесса представляется явным образом, например, как список.
Центральным понятием в литературе о функциональных языках являются чистые функции — только возвращающие значение, без побочных эффектов. Однако их можно создать во всех языках программирования поддерживающих функции в принципе. Поэтому предлагаются следующие критерии принадлежности к функциональной парадигме
- Наличие функционального типа: Java 8 и старше[20], TypeScript [21];
- Наличие свёрток над данными Scala[12], Common Lisp.
Многопоточное программирование
По многопоточности языки можно разделить на четыре типа:
- Не поддерживающие многопоточность(однако с возможностью эмуляции многопоточности, например по событиям таймера) ActionScript3; [21]
- Поддерживающие базовые возможности многопоточности:Pascal, Java 6;
- Развитые библиотеки работы с многопоточностью (Java 8 и старше);
- Языки поддерживающие shared memory (Clojure). [22]
Макросы
Делим языки на поддерживающие и не поддерживающие макросы
Языки логического программирования
То есть, языки поддерживающие либо не поддерживающие процедуры логического вывода[23]
Как будем сравнивать?
Мы введем анкету и попросим программистов приписать свойству языка вес — получится бинарный вектор признаков отсортированный по средней важности, или бинарное число. Разница между языками — модуль разницы векторов.
❗️ А вот и она — проголосуйте, пожалуйста
Что почитать
- Comparative Studies of 10 Programming Languages within 10 Diverse Criteria. Jiang Li. Mingzhi Liu. Yuanwei Lai. Concordia University.
- On the problem of computer language classiаcation. I. S. Anureev, E. V. Bodin, L. V. Gorodnyaya, A. G. Marchuk, F. A. Murzin, N. V. Shilov
- Ranking programming languages by energy efficiency. Rui Pereiraa, Marco Coutoc, FranciscoRibeiroc, Rui Ruac, Jácome Cunhac, João PauloFernandesd, João Saraivac
- www.lua.org/about.html
- Бьёрн Страуструп. Язык программирования C++ = The C++ Programming Language
- Курс практического программирования в Delphi. Е. Санников
- A Formal Introduction to the Compilation of Java, Stephan Diehl, «Software — Practice and Experience», Vol. 28(3), pages
297–327, March 1998. - Build Your Own .NET Language and Compiler Softcover reprint of the original 1st ed. Edition
- www.eclipse.org/xtend
- javascript. Шаблоны
- Язык программирования Java Джеймс Гослинг, Кен Арнольд
- Scala. Профессиональное программирование.
5-е изд Мартин Одерски - Пирс. Типы в языках программирования
- Typeful Programming Luca Cardelli Digital Equipment Corporation, Systems Research Center. 130 Lytton Avenue, Palo Alto, CA 94301
- CLR via C#. Программирование на платформе Microsoft .NET Framework 4.5 на языке C#.
4-е изд. Дж. Рихтер - Python tutorial Guido Van Rossum
- PHP In Action: Objects, Design, Agility. Daginn Reiersol, Chris Shiflett, and Marcus Baker
- ЯЗЫК С Б.В. Керниган, Д.М. Ритчи.
- А. Филд П. Харрисон. Функциональное программирование
- Современный язык Java. Лямбда-выражения, потоки и функциональное программирование Рауль-Габриэль Урма, Алан Майкрофт, Марио Фуско
- ActionScript 3.0 Cookbook by Joey Lott, Darron Schall, Keith Peters Released October 2006
- Seven Concurrency Models in Seven Weeks: When Threads Unravel (The Pragmatic Programmers) 1st Edition by Paul Butcher
- Алгоритмы искусственного интеллекта на языке PROLOG Третье издание ИВАН БРАТКО
32 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів