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

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 09 мар 2014, 12:29

Olej писал(а): P.S. Возможно (если будет время, здоровье и желание ;-) ) проделаю то же самое ещё не каких-то языках из числа: Haskell, haXe, Zimbu, X10, Chapel, ...
По Haskell только-только выложена автором очень классная книга:
Денис Шевченко
О Haskell по-человечески для обыкновенных программистов
март 2014
В частности, в отношении Haskell бытует мнение о чрезвычайной, пря­мо-таки фантастической сложности его освоения. И всё-таки я повторю: в этом
языке меня поразила его простота. Но простота эта особенная, и скоро вы пой­мёте, что я имею в виду.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 09 мар 2014, 13:56

Olej писал(а):Здесь бывали (обсуждали) на форуме кто-то из преподавателей ВУЗ-овских... Вот можете взять этот материал за основу, и сделать начальный курс обучения программистов - внешний такой взгляд (по верхам) на языки программирования.
Я как вижу, интерес хотя бы на "посмотреть" к разным и экзотическим языкам есть: примеры, которые я показывал скачаны от 4-х и до 20-ти раз ... где-то большая экзотика, где-то меньшая.

И пока - лирическое отступление чуть в сторону ... для практиков ... или от практика (я с C++ работаю в реальных проектах плотно ... года с 1995-го ... не помню точно):

- очень многие работающие над практическими проектами разработчики (не научные изыскатели и не преподаватели, а "от сохи") через какое-то (серьёзно продолжительное время - 7, 10 и более лет) начинают говорить, писать ... я не раз слышал это от людей в обсуждениях, что начинает утомлять суетность и перегруженность мелочами громоздкие решения, монстры, такие как C++ (C++ это только пример, не он один) - там и всё есть, но ... мельчит оно под ногами ...

- и тогда практики начинают присматривать "что-то ещё такое" ... не обязательно как полный заменитель традиционных своих инструметов, а в дополнение, скажем, к ним (так, Python, скажем, замечательно сочетается с C/C++ ... хотя, казалось бы, "смесь бульдога с носорогом")

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

- наверное, вот это ощущение "мой язык", красоты языка - оно, кажется, индивидуально, и будет у разных людей по-разному ... хотя мне просто невозможно себе представить, чтобы кто-то был очарован Visual Basic, Delphi, или C# (бр-р-р-р :oops: ) ... и кроме того, вот такой набор подкупающих языков будет явно (!) зависеть от порядка их освоения: какой после какого...

- я могу только назвать те языки, где мне показалось, что "здесь легко дышится" ... из тех, что попадали в руки за последние несколько лет: Python, Go, Scala ... - это совершенно не утверждение, это субъективное ощущение, кому-то вполне придётся Ruby ...

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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 13 мар 2014, 17:37

Olej писал(а): 2. ещё то же самое на 4-х более экзртических языках программирования:
- Go
- Scheme
- Scala
- Ocaml
Теперь ещё один - Haskell

Haskell — стандартизованный чистый функциональный язык программирования общего назначения.
Если языки Ocaml или даже Scala — считаются смешанными языками, помимо функционального поддерживающие и императивный стиль вычислений, то Haskell вообще не допускает императивного программирования (за исключением ввода-вывода, но и там это очень специфично и ограничено).
Но и это ещё не всё... :lol:
Типизация языка Haskell строгая, статическая, с автоматическим выводом типов. Т.е. если какой объект (чаще функция) получил тип (параметры, результат), то дальше они будут совершенно неизменными всё время существования программы.
В Haskell вообще нет оператора присваивания!

Порог вхождения в программирование на Haskell высокий. Во-первых, из-за его происхождения из кругов абстрактных математиков и из-за формулирования его понятий в терминах понятий из абстрактной математики (теории категорий). Другая причина, связанная с предыдущей, из-за которых и сложилось устойчивое ложное представление о колоссальной сложности языка Haskell — это отсутствие внятных описаний и руководств. А официальная документация Haskell выкладывается также в виде строгих формальных определений, на изучение которых могут уйти месяцы. Например, одно из важных понятий и терминов в языке — «монада» (от греческого μονάς, «единица»), пришедшие в Haskell именно из теории категорий. Вслушаемся, как звучит его определение в официальной документации (даже в переводе на русский язык):
Монада может быть определена через общее понятие моноида в моноидальной категории. Монада над категорией K — это моноид в моноидальной категории эндофункторов End(K).
С таким же успехом это определение можно было бы перевести на китайский! Тем не менее, описать монады «на пальцах» можно достаточно просто, а пользоваться ними может любой средний практик, слегка освоившись с их применением. Но на сегодня есть уже некоторое количество руководств, относительно пригодных для начального освоения языка.

С другой стороны, Haskell является языком, строго организующим мышление программиста. В ряде ведущих университетов мира (MIT ! и др.) именно Haskell выбран как первый язык обучения «искусству программирования» (Д.Кнутт) студентов 1-го курса.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 13 мар 2014, 17:51

Olej писал(а): Теперь ещё один - Haskell
А теперь пишу приложение...
Для Haskell я отойду от принятой выше техники, как для других языков программирования...
Haskell — это целая своеобразная технология, и в этой технологии есть ещё такая штука как cabal (Common Architecture for Building Applications and Libraries). Говорят, что это нечто типа make в мире C/C++ (я бы сравнил скорее с Cmake) — построитель проектов Haskell.
Но cabal придётся устанавливать отдельно: Haskell

Конечно, можно то, что у меня получилось в итоге (код задачи) переименовать в triangle.hs, а затем его просто компилировать в командной строке.
Но я создам проект в духе Haskell:

1.

Код: Выделить всё

$ mkdir triangle
$ cd triangle
$ mkdir src
$ cd src
$ touch Main.hs
$ cd ..
$ tree
.
└── src
    └── Main.hs
Вот, собственно, в простейшем виде и вся иерархия проекта. Файл Main.hs может называться по-любому, Main.hs у меня - это только дань привычке ;-) .

2. Дальше нужно построить проект (в диалоге определить параметры):

Код: Выделить всё

$ cabal init
Package name? [default: triangle]
Package version? [default: 0.1.0.0]
Please choose a license:
 * 1) (none)
   2) GPL-2
   3) GPL-3
   4) LGPL-2.1
   5) LGPL-3
   6) BSD3
   7) MIT
   8) Apache-2.0
   9) PublicDomain
  10) AllRightsReserved
  11) Other (specify)
Your choice? [default: (none)] 7
Author name?
Maintainer email?
Project homepage URL?
Project synopsis?
Project category:
 * 1) (none)
   2) Codec
   3) Concurrency
   4) Control
   5) Data
   6) Database
   7) Development
   8) Distribution
   9) Game
  10) Graphics
  11) Language
  12) Math
  13) Network
  14) Sound
  15) System
  15) System
  16) Testing
  17) Text
  18) Web
  19) Other (specify)
Your choice? [default: (none)]
What does the package build:
   1) Library
   2) Executable
Your choice? 2
Include documentation on what each field means (y/n)? [default: n]

Guessing dependencies...

Generating LICENSE...
Warning: unknown license type, you must put a copy in LICENSE yourself.
Generating Setup.hs...
Generating triangle.cabal...

Warning: no synopsis given. You should edit the .cabal file and add one.
You may want to edit the .cabal file and add a Description field.
$ tree
.
├── Setup.hs
├── src
│   └── Main.hs
└── triangle.cabal
3. Появилось 2 новых файла: Setup.hs нас не интересует, и файл конфигурации проекта triangle.cabal, в котором мы будем неоднократно редактировать строки по ходу развития проекта (сами параметры строк уже записаны в файл в виде комментариев, нам предстоит раскомментировать их вписать им значения).

Код: Выделить всё

...
executable triangle
  ghc-options:         -W
  main-is:             Main.hs
- определение включить вывод предупреждений компиляции, не только ошибок;
- определить файл Main.hs как стартовый (на самом деле имена файлов кода могут быть произвольными);
- описать импорт дополнительных стандартных пакетов (библиотек): в данном случае пакет haskell98 содержит модуль Complex для работы с комплексными числами, а пакет exceptions — обработку исключений;

4. Теперь нам осталось сконфигурировать проект под наши правки (конфигурацию лучше делать каждый раз после редактирования triangle.cabal):

Код: Выделить всё

$ cabal configure
Resolving dependencies...
Configuring triangle-0.1.0.0...
Warning: The 'license-file' field refers to the file 'LICENSE' which does not
 exist.
Всё! Проект готов. Дальше нам предстоит наполнять смыслом файлы исходного кода и компилировать проект.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 13 мар 2014, 17:58

Olej писал(а): Конечно, можно то, что у меня получилось в итоге (код задачи) переименовать в triangle.hs, а затем его просто компилировать в командной строке.
А чтоб не быть голословны, я, пока отвлекаясь от проекта, покажу другое приложение Haskell, которое заодно проверит как реализация языка ведёт себя с Unicode, кодировкой UTF-8 и русским текстом ... я всегда это для начала делаю (просто не всегда показываю ;-) ):

Приложение:

Код: Выделить всё

module Main where
import System.Environment

main :: IO ()

-- сама программа
main = do
     args <- getArgs  {- вложенный комментарий -}
     putStrLn( "Привет от Haskell, " ++ args !! 0 )
Компиляция:

Код: Выделить всё

bash-4.2$ ghc -o hello_hs hello_hs.hs
[1 of 1] Compiling Main             ( hello_hs.hs, hello_hs.o )
Linking hello_hs ...


Выполнение:

Код: Выделить всё

bash-4.2$ ./hello_hs Вася
Привет от Haskell, Вася
Вот это и есть ручная компииляция.

(Файлы исходного кода Haskell имеют расширения .hs или .lhs)
Вложения
hello_hs.hs
(232 байт) 595 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 13 мар 2014, 18:22

Olej писал(а):Всё! Проект готов. Дальше нам предстоит наполнять смыслом файлы исходного кода и компилировать проект.
Сразу показываю конечный вид Main.hs, это в упрощённой реализации на Haskell (упрощение касается только форматирования вывода вещественных значений, точности и отсутствия обработки ошибок ввода пользователя — чтобы не перегружать код ... от него и ак голова закружится :lol: ):

Код: Выделить всё

module Main where
import Complex
import Numeric
import IO

{- код проверен для версии: 
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.6.3
-}

type Point = Complex Double       -- синоним координатной точки

get_coord :: String -> Point      -- декодирование строки ввода в координаты x % y
get_coord str =
   f( words str )
   where
      f :: [String] -> Point
      f lst = ( ( read( lst !! 0 ) :: Double ) :+ ( read( lst !! 1 ) :: Double ) )

try_to_input :: IO String         -- ввод строки с ожиданием ^D
try_to_input = do
   line <- hGetLine stdin `catch` (\e -> if IO.isEOFError e then return [] else ioError e)
   return line 

get_shape :: [Point] -> IO [Point]
get_shape shape = do              -- рекурсивный ввод списка вершин
   let pos = length( shape ) + 1
   putStr( "вершина № " ++ show( pos ) ++ " : " )
   hFlush stdout
   line <- try_to_input
   if length( line ) == 0 then return shape else get_shape( get_coord( line ) : shape )

showP = \p -> "[" ++ ( show( realPart( p ) ) ) ++ "," ++ ( show( imagPart( p ) ) ) ++ "] "

show_shape :: [Point] -> String
show_shape (x:xs) =
   if length xs == 0 then showP x else ( showP x ) ++ show_shape( xs ) 

perimeter :: [Point] -> Double
perimeter shape = 
   summa shape 0.0
   where distance = \ p1 p2 -> magnitude( p1 - p2 )
         summa :: [Point] -> Double -> Double
         summa (y:ys) perim       -- локальная функция накопления длин сторон
            | length( ys ) == 0 = ( distance y $ head shape ) + perim
            | otherwise = ( distance y $ head ys ) + summa ys perim 

square :: [Point] -> Double
square (y:ys) = 
   summa y ys 0.0
   where summa :: Point -> [Point] -> Double -> Double
         summa top shape squa     -- локальная функция накопления площади
            | length( tail shape ) == 0 = squa 
            | otherwise = ( triang top shape ) + summa top ( tail shape ) squa 
         triang :: Point -> [Point] -> Double
         triang top (z:zs) =      -- локальная функция площадь треугольника
            ( magnitude side1 ) * ( magnitude side2 ) * 
            ( abs $ sin( phase side1 - phase side2 ) ) * 0.5
            where side1 = z - top
                  side2 = z - head zs

next_shape :: IO ()               -- цикл рассчёта
next_shape = do
   putStrLn( "координаты вершин в формате: X Y" )
   shape <- get_shape []
   putStrLn $ "\rвершин " ++ show( length shape ) ++ " : " ++ show_shape shape
   putStrLn( "периметр = " ++ show( perimeter shape ) )
   putStrLn( "площадь = " ++ show( square shape ) ) 
   putStrLn $ "---------------------------------" 
   next_shape

main :: IO ()
main = do next_shape              -- запуск цикла программы
Исходный код на Haskell не является форматно независимым: его смысл зависит от отступов новых строк, переносов строк и других вещей, связанных с размещением кода (поменяйте где-то число пробелов-отступов в строке, и можете получить простыню грубейших ошибок). Это достаточно редкий случай для языков программирования, и здесь (только в написании) Haskell близок с Python.

Компиляция проекта:

Код: Выделить всё

$ cabal build
Building triangle-0.1.0.0...
Preprocessing executable 'triangle' for triangle-0.1.0.0...
[1 of 1] Compiling Main             ( src/Main.hs, dist/build/triangle/triangle-tmp/Main.o )

src/Main.hs:3:1: Warning:
    The import of `Numeric' is redundant
      except perhaps to import instances from `Numeric'
    To import instances alone, use: import Numeric()
...
Там будет несколько Warning, подобных показанному, все в сопоставлении с образцом ... это разберитесь сами, я думаю, что все они используют синтаксические конструкции, заимствованные из описаний прежних версий (Haskell 98). А очень свежий компилятор (Haskell 2010) хотел бы более современных определений образцов.

После компиляции дерево проекта:

Код: Выделить всё

$ tree
.
├── dist
│   ├── build
│   │   ├── autogen
│   │   │   ├── cabal_macros.h
│   │   │   └── Paths_triangle.hs
│   │   └── triangle
│   │       ├── triangle
│   │       └── triangle-tmp
│   │           ├── Main.hi
│   │           └── Main.o
│   ├── package.conf.inplace
│   └── setup-config
├── Setup.hs
├── src
│   └── Main.hs
└── triangle.cabal
Здесь поддерево dist и есть, собственно, каталогом сборки. Запускать откомпилированное приложение на тестирование мы можем прямо из каталога проекта:

Код: Выделить всё

$ ./dist/build/triangle/triangle
координаты вершин в формате: X Y
вершина № 1 : 1 1
вершина № 2 : 1 2
вершина № 3 : 2 1
вершин 3 : [2.0,1.0] [1.0,2.0] [1.0,1.0] 
периметр = 3.414213562373095
площадь = 0.5
---------------------------------
координаты вершин в формате: X Y
вершина № 1 : ^C
Вложения
triangle.hs.tgz
(1.74 КБ) 574 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 28 мар 2014, 11:06

В завершение... (если не станетскучно и ещё какой язык в сравнение не вкину).

Мне приходит много отзывов на эту ... публикацию (обобщённо "отзывов": в форумах, по почте, в личных разговорах...).

Большая ошибка читающих в том, что они обращают ключевое внимание на сравнение производительности, скорости.
А большая ошибка пишущего (меня ;-) ) в том, что он вообще включил сравнение производительности в текст.
Производительность во всём этом деле вообще меня не интересовала ... и возникла вообще как побочный эффект любопытства :lol: , на самом последнем этапе... бес попутал. Но все почему-то обратии внимание именно на эту, самую не значащую, сторону... :o

А интересно сравнивать именно философию существующих языков, даже не синтаксис ... хотя синтаксис отчасти разъясняет философию.
15 языков вовсе не обязательны, чтобы на них писать (хотя программист ... или так себя называющий :D ... знающий 1 язык? - это как-то смешно ... "дружные шеренги PHP-программистов равняйсь" - это сильно убого ::)).
"Чужие" языки хороши тем (взгляд на них), что они позволяют перенести их приёмы в свой родной язык.

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

Когда-то ... но это очень давно ;) ... мне было поручено написание специализированной САПР системы, на PL/1 ... в совершенно нереальные, дикие сроки.
А я тогда "зачитался" языком APL ... который никогда, кстати, не был реализован вообще ни в одном виде в русскоязычном пространстве - он требует совершенно специальной клавиатуры.
Но из APL я позаимствовал в PL/1 массивные операции, массивы как элементарный базовый тип проекта + функции высших порядков над ними (редукция и т.п.). Оказалось что в PL/1 это всё выразимо ... только ним так никто не пользуется.
САПР сделали и сдали в совершенно нереальные сроки... в несколько месяцев.
Ним потом, как public-проектом, пользовались не в одном городе России, много лет потом шли отзывы из совершенно неожиданных мест: Ленинград, Новосибирск, Томск, Тырнауз, ... (я уже давно занимался другими вещами и забыл про тот проект).

Вот главный смысл рассмотрения "чужих" языков программирования.

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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 30 мар 2015, 19:55

Olej писал(а): 15 языков вовсе не обязательны, чтобы на них писать ...
"Чужие" языки хороши тем (взгляд на них), что они позволяют перенести их приёмы в свой родной язык.
Вот ещё попалась подборка умозрительных примеров на нескольких десятках языков программирования, Learn X in Y minutes ... с переводом по многим языкам на русский язык, кому привычнее ... хотя что там переводить? комментарии в примерах...

А вот тот же проект на GitHub в развитии: adambard/learnxinyminutes-docs

Всё это - весьма свежий проект, в большинстве своём материалы (как мне показалось) 2015 года.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 30 мар 2015, 20:01

Olej писал(а): Вот ещё попалась подборка умозрительных примеров на нескольких десятках языков программирования, Learn X in Y minutes ... с переводом по многим языкам на русский язык, кому привычнее ... хотя что там переводить? комментарии в примерах...

А вот тот же проект на GitHub в развитии: adambard/learnxinyminutes-docs

Всё это - весьма свежий проект, в большинстве своём материалы (как мне показалось) 2015 года.
Из таких же полезных, сравнительных ресурсов, здесь же продублирую (чтобы в одном месте) сообщение из другой темы форума энциклопедия языков программирования (ресурс progopedia.ru):
Olej писал(а):Энциклопедия языков программирования - это ресурс на манер wiki, краткий справочник по существующим языкам программирования:
Классификация языков осуществляется по поддерживаемым парадигмам и системам типизации данных. Разбиения на языки высокого и низкого уровня нет, так как оно более условно, устаревает со временем, появляются языки сверхвысокого уровня и т.д. Большинство представленных в энциклопедии языков можно считать языками высокого уровня.
По разным оценкам, в настоящее время существует от двух с половиной до десяти тысяч различных языков программирования.
На данный момент в энциклопедии Progopedia.ru описано:
* языков программирования: 166,
* диалектов: 76,
* реализаций: 337,
* версий: 707.
Для начального знакомства, или в качестве справочника - очень даже годится!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 15 авг 2015, 11:26

Свежий и очень обстоятельный обзор Рейтинг языков программирования № 6: новые лошадки на коммерческом рынке.

Статьи · 13 февраля, 9:58 29975 Руслан Шевченко
Руслан Шевченко, Consultant в Lynx Capital Partners

В опросе приняли участие 5905 человек, из которых 92.5 % проживают в Украине; 21 % респондентов принимали участие в наших предыдущих опросах, 59% отвечали в первый раз, а оставшиеся 19% не помнят точно.

Краткая сводка:
— на первом месте по-прежнему Java;
— JavaScript вышел на четвертое место как основной язык программирования;
— Swift и Go вошли в 20-тку реально используемых языков;
— Медианный возраст разработчика на Java — 27 лет, на Basic — 37.
При этом нужно обязательно учесть, что:
- это рейтинги по опросам, участников реальных коммерческих проектов ... которые в проекты вовлечены "волей судьбы", работодателя;
- это рейтинги по офшорным, аутосорсинговым проектам;
- это рейтинги формируемые, в большой массе, программистами подросткового уровня ;-) (junior);

Но, тем не менее, это очень интересно: и по репрезентативности выборки, и по результатам... и по тому, что выборки представлены в хронологии 5-ти лет (2010-2015) - длиннее интервал прихватывал бы устаревшие "исторические" данные, а короче давал бы явно смещённые ("модные") данные.

Я бы от себя добавил, из итогов, что как мне кажется "я вижу" ;-) по картинкам:
- катастрофическое снижение C# (и думаю, всего относящегося к .NET);
- снижение C++ ... при том, что C примерно на тех же позициях: C - это, думаю, Linux/UNIX проекты + embedded, а C++ теряет из-за громоздкости навороченного;
- некоторое снижение java - насыщение ... "наелись".
- радикальный рост JavaScript (я всегда считал, что JavaScript ещё не показал весь свой потенциал);
- рост для новых языков (Scala) в реальных проектах;
- появление в рейтингах и реальных проектах совершенно новых языков: Go & Swift;

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей