пятница, 21 февраля 2014 г.

Языки программирования: скорость

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

Конечно, такое сравнение очень условно, оно зависит: от класса и конкретного вида решаемой задачи, реализации языкового инструмента (компилятора, интерпретатора), версии этой реализации, степени используемой оптимизации (для компиляции) и т.д. Но это и не есть сравнение скоростей, это есть сравнение порядков скоростей, которые могут отличаться, как увидим, на 2-3 порядка.

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

Полученные результаты описываются в тексте. Пока в сравнении охвачены языки:

  • C
  • C++ (GCC)
  • C++ (Clang, LLVM)
  • Java
  • Perl
  • Python
  • Ruby
  • JavaScript
  • PHP
  • Lua
  • bash
  • Go
  • Ocaml
  • PureBasic
  • Scheme
  • Haskell

Ну вот пока и всё...
Текст и архив примеров кодов можно взять здесь:

- на Google:
Это текст (в формате OpenOffice), и архив к нему. 

- на Yandex:
текст и архив

понедельник, 10 февраля 2014 г.

Сопоставление: 10 языков программирования



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

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

Вот такая сравнительная реализация одной и той же задачи показана в тексте. Сравниваются реализации на 10-ти языках программирования. На сегодня это:
  • C
  • C++
  • Java
  • Perl
  • Python
  • Ruby
  • JavaScript
  • PHP
  • Lua
  • bash
Возможно, позже я добавлю ещё что-то...
Текст достаточно большой (31 страница), а исходный код примеров ещё больше - чтобы размещать это здесь, в блоге. Поэтому даю только ссылки, по которым всё это можно взять:

на Google:
Это текст (в формате OpenOffice), и 
архив кода к нему. 

Мне Yandex кажется удобнее, потому как там текст OpenOffice можно сразу по месту открыть и посмотреть: то ли это что надо, и стоит ли его скачивать?

P.S. 13 марта 2014 г. на дисках были обновлены редакции текста и архивов. Ссылки изменены. Добавлять новую запись в блог не захотелось.
Изменения не радикальные, но всё же...


вторник, 4 февраля 2014 г.

Язык C: заметки на полях

По языку C написано множество руководства и учебных пособий. Ещё одной особенностью C является то, что первоначально исчерпывающие руководства по языку написаны его авторами (Б. Керниган, Д. Ритчи), выдержавшими 34 переиздания в США. Это очень способствовало краткости и однозначности толкований понятий языка, и простоте его освоения.

Есть ли смысл, при такой истории и таком объёме существующих описаний, снова обращаться к деталям языка C? Есть, и на то существует несколько оснований, исходящих из различных точек зрения:
  • За 40 лет язык претерпел несколько модернизаций, последние действующие стандарты (C89, C99) вносят ряд существенных нововведений (самый яркий пример чему — комплексная арифметика), не отображаемых в "классической" литературе по C, которая писалась, как правило, много лет назад.
  • Язык C изначально разрабатывался как язык системного программирования систем принадлежащих к классу UNIX. С широким распространением операционной системы Linux, основным "полигоном" использования C стали проекты GNU и другие свободные проекты для этой системы. Они все рассчитаны на использование компилятора GCC, который имеет ряд собственных расширений языка.
  • Поддержка символьных представлений UNICODE, и способ кодирования UTF-8 для них, которая стала единственной поддерживаемой по умолчанию всеми дистрибутивами Linux. Поддержка широких символов (описана в <wchar.h>) слабо освещена в литературе, потому, что для англоязычных авторов она не есть особенно актуальной, а русскоязычные авторы во многом обходят эту часть языка стороной.
  • Помимо компилятора GCC, в последние годы начинает широко практиковаться использование компилятора Clang (из проекта LLVM — Low Level Virtual Machine), ряд расширений GCC поддерживается Clang, другие — нет.
  • Есть вещи, которые не являются, собственно, частью самого языка, но есть традицией, сложившейся в практике использования этой языковой среды. Примером этого является, например, использование в ядре Linux циклических двунаправленных списков везде где нужны списочные структуры (вместо односвязных списков, линейных списков и др.), что и будет рассмотрено далее.
     
В любом случае, я даю ссылки на заметки, написанные мною для себя, по итогам практической работы с C протяжённостью в несколько десятилетий. Если кому-то это будет интересно и полезно - пользуйтесь!


- на Google:
Это текст (в формате OpenOffice), и архив примеров к нему.
- на Yandex:
текст и архив примеров

P.S. Варианты на Google и Yandex могут отличаться - они обновляются не синхронно, в разное время. Но эти отличия не могут быть существенными.