Список языков программирования. Язык программирования a


A+ - Энциклопедия языков программирования

A+ — матричный язык программирования, потомок языка A, который, в свою очередь, был создан как замена APL.

A+ был создан в Morgan Stanley командой разработчиков во главе с Артуром Уитни (Arthur Whitney). В 1988 году Уитни создал язык A; он задумывался как бизнес-ориентированная реализация APL, способная выполняться на SunOS (платформе для распределенных вычислений) и эффективно обрабатывать большие объемы данных. Позднее другие разработчики доработали язык, добавив графический интерфейс пользователя с автоматической синхронизацией переменных и соответствующих виджетов (средств отображения переменных) и ряд других возможностей. В 1992 году новый язык был официально назван A+ (+ в честь главного из добавленных элементов — графического интерфейса).

Особенности языка:

  • A+ использует набор символов APL, поэтому разработка на нем сопряжена с теми же сложностями. Основной средой разработки на A+ является XEmacs с соответствующим расширением и шрифтом kapl. В поставку языка входит схема клавиатуры с нанесенными на нее специальными символами шрифта.
  • Программа на A+ состоит из определений функций, команд присвоения и вызовов функций.
  • В отличие от APL, команды разделяются точкой с запятой, и поэтому могут занимать несколько строк.
  • Функция может принимать до 9 аргументов; если аргументов два, вместо обычного префиксного вызова функции можно использовать инфиксный.
  • Элементарные функции разделяются на три основных типа. Скалярные функции применяются независимо к каждому элементу массива, хотя синтаксис позволяет записывать это как применение функции к массиву в целом; к ним относятся арифметические, логические и некоторые математические функци. Структурные функции определяются в терминах индексов массива, меняя местами или выбирая элементы массива, не изменяя их. Наконец, специализированные функции работают с массивом в целом и изменяют его; к ним относится, например, функция инвертирования матрицы.
  • Большинство структурных функций (Catenate, Take, Drop, Reverse, Rotate, Replicate и Expand) и функции, полученные в результате использования операторов Reduce и Scan, применяются к главной оси правого аргумента; его элементами считаются срезы массива, перпендикулярные этой оси.
  • Понятие главной оси и элемента массива обобщаются для случая m главных осей: массив рассматривается как блок данных (frame) размерности m, содержащий ячейки (cell) размерности n. Функцию f можно модифицировать так, чтобы она применялась ко всем ячейкам размерности n, оператором ранга f@n.
  • Отображаемые файлы — это файлы, представленные как массивы. За счет того, что в физическую память загружаются только используемые части файлов, этот механизм позволяет работать с большими объемами файлов.
  • Механизм зависимостей между переменными позволяет запоминать связи между ними и при изменении некоторой переменной автоматически пересчитывать все зависимые от нее. В частности, это позволяет легко реализовать приложение-электронную таблицу.
  • Механизм обратной связи (callback) реализует обработку асинхронных событий посредством автоматического запуска ассоциированных с ними функций.
  • Контексты позволяют отдельным пакетам и инструментам разделять свои пространства имен.

В наши дни A+ находится в свободном доступе, хотя и не является активно используемым языком.

Примеры:

Hello, World!:

Пример для версий A+ 4.18

Строковые литералы можно заключать как в одинарные, так и в двойные кавычки.

"Hello, World!" 'Hello, World!'

progopedia.ru

Список языков программирования - это... Что такое Список языков программирования?

 Список языков программирования Категории:
  • Списки языков программирования
  • Списки:Компьютеры

Wikimedia Foundation. 2010.

  • Дурак
  • V Всероссийский съезд Советов

Смотреть что такое "Список языков программирования" в других словарях:

  • Список языков программирования по категориям — Списки языков программирования По категориям Хронологический Генеалогический Приведён список языков программирования, сгруппированных по категориям. Некоторые языки попали в несколько категорий. Содержание …   Википедия

  • Генеалогический список языков программирования — Списки языков программирования По категориям Хронологический Генеалогический Приведён генеалогический список языков программирования. Языки классифицируются в соответствии с предшествующими языками, которые оказали сильное влияние на формирование …   Википедия

  • Список языков описания пользовательских интерфейсов — Содержание 1 По производителю или платформе 1.1 Flash 1.2 Java 1.3 Microsof …   Википедия

  • Хронология языков программирования — Списки языков программирования По категориям Хронологический Генеалогический Хронология языков программирования  упорядоченный в хронологическом порядке список языков программирования. Содержание …   Википедия

  • Сравнение языков программирования — Эту статью следует викифицировать. Пожалуйста, оформите её согласно правилам оформления статей.  Условные обозначения  …   Википедия

  • Список .NET-языков — Эта страница информационный список. Языки программирования .NET (Языки с поддержкой CLI или CLI языки)  компьютерные языки программирования, используемые для создания библиотек и программ, удовлетворяющих требованиям Comm …   Википедия

  • Список текстовых редакторов — Основная статья: Текстовый редактор Список текстовых редакторов Windows и таблица сравнения. Содержание 1 Таблица сравнения известных текстовых редакторов …   Википедия

  • Список программ, написанных на C Sharp — Язык программирования C# один из наиболее популярных языков программирования на сегодняшний день. Paint.NET открытое программное обеспечение для обработки растровой графики SharpDevelop открытая IDE для языков C#, Visual Basic .NET (VB.NET), Boo …   Википедия

  • Список пакетов GNU — Это список программного обеспечения, разрабатываемого Free Software Foundation как часть проекта GNU  UNIX подобной операционной системы состоящей целиком из свободного программного обеспечения. Большая часть из этих пакетов также… …   Википедия

  • Список дистрибутивов Linux — Эта статья или раздел нуждается в переработке. Пожалуйста, улучшите статью в соответствии с правилами написания статей …   Википедия

dic.academic.ru

Языки программирования - Энциклопедия языков программирования

Добро пожаловать!

Прогопедия — свободная энциклопедия языков программирования. Все тексты доступны на условиях свободной лицензии GNU Free Documentation License. На данном этапе развития проекта регистрация для доступа в редакторский интерфейс осуществляется по приглашениям.

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

В Прогопедии сведения о языках программирования организованы в виде трехуровневой структуры: "язык" → "реализация" → "версия". Также описаны диалекты языков программирования (хотя вопрос, что считать языком, а что диалектом, является довольно спорным).

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

На данный момент в энциклопедии Progopedia.ru описано:

  • языков программирования: 171,
  • диалектов: 83,
  • реализаций: 349,
  • версий: 734.

Статья недели

Dart — язык программирования для веб-разработки с открытым исходным кодом, созданный Google. Цель создания языка — заменить JavaScript в роли универсального языка веб-разработки.

В настоящее время существует три способа запустить программу на Dart:

  • скомпилировать в JavaScript при помощи dart2js и запустить результат в любом браузере.
  • выполнить код напрямую в Dartium — версии Chromium со встроенной поддержкой Dart.
  • использовать Dart VM — отдельную виртуальную машину, входящую в Dart SDK и позволяющую запускать программы в консольном режиме.

Далее...

Изображение недели

Логотип Miranda

Интересные факты

Примеры программ

Языки программирования, диалекты, реализации и версии

  • 01_
  • A+
  • A++
  • ABAP
  • Abundance
  • Action!
  • Ada (диалекты: Ada 2005, Ada 2012, Ada 83, Ada 95, SPARK)
  • Agda
  • Alef
  • ALGOL (диалекты: ALGOL 58, Algol 60)
  • Amiga-E
  • AMMORIA
  • APL
  • APLAN
  • ARIBAS
  • AS/400 CL
  • Assembler
  • AWK
  • Axum
  • B
  • Baltie
  • BARSIC
  • Basic (диалекты: Applesoft BASIC, Commodore BASIC, GW-BASIC, MSX BASIC, Microsoft BASIC, Turbo BASIC, Visual Basic)
  • bc
  • BCPL
  • Befunge
  • BitBitJump
  • Boo
  • Brainfuck (диалекты: Blub, Boolfuck, BrainSub, Braincopter, Brainfork, Brainloller, COW, Ook!, Pi, Smallfuck, Spoon, Unary, pbrain)
  • C (диалекты: ANSI C, C11, C99, K&R C)
  • C# (диалекты: Cω, ECMA-334, ISO/IEC 23270:2003, Polyphonic C#)
  • C++ (диалекты: C++03, C++11, C++98)
  • Cat
  • Ceylon
  • Chef
  • CHIP-8
  • Clarion (диалекты: Clarion, Clarion for DOS, Clarion#)
  • CMS-2
  • COBOL
  • Comment
  • Cool
  • CPL
  • Cyclone
  • D
  • D4
  • Dart
  • DASL
  • Dierickx D
  • Dylan
  • E
  • ECMAScript (диалекты: ActionScript, JavaScript)
  • Eiffel
  • Entropy
  • Erlang
  • Euphoria (диалекты: orac)
  • EXEC 2
  • F#
  • Factor
  • Falcon
  • FALSE
  • FOCAL
  • Foma
  • Forth (диалекты: Toka)
  • FORTRAN (диалекты: F, FORTRAN 66, FORTRAN 77, Fortran 2003, Fortran 2008, Fortran 90, Fortran 95, High Performance Fortran)
  • FP
  • Funky
  • G
  • G-code
  • GAP
  • Genius Extension Language
  • gnuplot
  • Go
  • Grocery List
  • Groovy
  • Hack VM
  • Hanoi Love
  • Haskell (диалекты: Haskell 98, O'Haskell)
  • HQ9+
  • Icon (диалекты: Extended Icon)
  • IDL
  • Instruction List
  • INTERCAL
  • Io
  • ISWIM
  • J
  • Java
  • K
  • KRC
  • LabVIEW
  • Ladder Diagram
  • Limbo
  • Lisp (диалекты: Clojure, Common Lisp, Lisp Machine Lisp, Scheme)
  • Logo
  • LOLCODE
  • Lua
  • LUX
  • Malbolge
  • MATLAB
  • Mercury
  • Mesa
  • Miranda
  • ML (диалекты: CAML, Standard ML)
  • Modula (диалекты: Modula-2, Modula-2+, Modula-3, Objective Modula-2)
  • Nemerle
  • Nesla
  • Nimrod
  • Oberon (диалекты: Active Oberon, Component Pascal, Oberon, Oberon-2, Zonnon)
  • Objeck
  • Objective-C
  • Omgrofl
  • Onyx
  • Opa
  • Oz (диалекты: Mozart)
  • Pascal (диалекты: Extended Pascal, Object Pascal, PASCAL-XSC, Standard Pascal)
  • Perl
  • PHP
  • Picat
  • Piet
  • Pike
  • PL-11
  • PL-516
  • PL/0
  • PL/65
  • PL/B
  • PL/C
  • PL/I
  • PL/M
  • Plankalkül
  • POP-11
  • PowerShell
  • Processing
  • Prolog (диалекты: Edinburgh Prolog, ISO Prolog, Strawberry Prolog)
  • Python
  • R
  • REFAL
  • REXX
  • Roco
  • RPL
  • Ruby
  • Rust
  • S-lang
  • Sanscript
  • SASL
  • Scala
  • Scratch
  • Seed7
  • Shakespeare
  • Simula (диалекты: Simula-67)
  • Smalltalk (диалекты: Smalltalk-80)
  • SNOBOL
  • Sparkel
  • SQL (диалекты: T-SQL)
  • Squirrel
  • STAF/STAX
  • Tcl
  • TermWare
  • TeX
  • Unix shell (диалекты: Bourne shell)
  • Unlambda
  • Vala
  • VHDL
  • Whirl
  • Whitespace
  • Wolfram Mathematica
  • X10
  • XC
  • Аналитик
  • Глагол
  • ДССП
  • ПРОФТ
  • РАПИРА

progopedia.ru

Ответы@Mail.Ru: Какие языки программирования существуют?

низкого уровня один Асемблер высокого уровня С++ делфи Паскаль вижуал бейсик кобол пхп лисп и тд их оч много

их более 2000 тысяч . Но самых популярных примерно 10 .

<a rel="nofollow" href="http://ru.wikipedia.org/wiki/Список_языков_программирования" target="_blank">http://ru.wikipedia.org/wiki/Список_языков_программирования</a>

их очень много: Си, Бейсик, Паскаль, Ассемблер, а так же их разновидности, и еще многие другие

Visiol Basik, Pascal, C++, Delpie....

<a rel="nofollow" href="http://progopedia.ru/" target="_blank" >ЭНЦИКЛОПЕДИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ</a> Основные языки программирования <img src="//content.foto.my.mail.ru/mail/jimmyxp/_answers/i-59.jpg" >

Языки, которые требуют использование компиляторов, включают: • BASIC • C • C++ • C# • Fortran • Java • Pascal Для написания текста любой компьютерной программы используют один из многочисленных языков программирования. Все они представляют собой наборы определенных команд – операторов, а также описаний. Как правило, основой этих команд являются английские слова, поэтому, если вы знаете английский язык, читая текст программы вы даже сможете понять, что будет делать компьютер по той или иной команде. Впрочем, компьютер английского языка, в отличие от вас, не знает – чтобы он понял их, на машинный язык эти команды «переводит» компилятор. Для каждого из языков программирования существует свой компилятор. Первые языки программирования, в том числе: ADA, Basic, Algol, Fortran и прочие, бывшие популярными в 60-70 г. г., уже давно не используются, а вот С++, например, созданный в 1983 году, остается и сегодня востребованным, многие специальные программные продукты написаны на нем. По-прежнему востребован Basic, появившийся в 1991 году; а также Pascal (среда разработки Delphi), Java, JavaScript и Ruby, созданные в 1995 году. Из новых можно назвать ActionScript и Nemerle, которые появились в 1998 и 2006 году, соответственно. Перечисленные языки программирования по-прежнему актуальны, поскольку они постоянно модифицируются, и новые их версии адаптируются к тем потребностям, которые существуют на сегодняшний день. Это в первую очередь относится к языку С++. Несмотря на то что в некоторых случаях программный код, скомпилированный на этом языке, получается довольно громоздким, использование готовых шаблонов помогает решить эту проблему, значительно улучшая быстродействие программных продуктов. Среда разработки Visual Basic, разработанная знаменитой Microsoft, также используется большинством программистов, позволяя не только создавать компактный программный код на языке Basic, но и использовать удобный встроенный конструктор для пользовательского интерфейса. А вот для создания веб-сайтов программисты используют язык РНР, считающийся универсальным и работающий с любыми операционными системами. Его применяют и как конструктор пользовательского интерфейса. Однако к существенным недостаткам этого языка можно отнести то, что код, написанный в более ранних версиях, поддерживаться новыми не будет. Java также способен работать на любой платформе, но для написания программ на этом языке необходимо пользоваться тем его диалектом, который предназначен для данного типа программных продуктов. Многофункциональностью, универсальностью и простотой отличаются языки программирования Pascal и JavaScript. Первый чаще используется для создания программных продуктов под ОС, например Total Commander и QIP, а на втором написана большая часть современных браузеров. Источник: <a rel="nofollow" href="https://www.kakprosto.ru/kak-863542-kakie-est-yazyki-programmirovaniya" target="_blank">https://www.kakprosto.ru/kak-863542-kakie-est-yazyki-programmirovaniya</a>

Их несколько тысяч, но очень популярных: 10-15. Например: Для создания сайтов -JS,PHP Для создания игр и приложений- С# или С++

Язык APL оказал влияние на функциональное программирование и стал первым языком, поддерживавшим обработку массивов [9]. Язык ПЛ/1 (NPL) был разработан в 1960-х годах как объединение лучших черт Фортрана и Кобола. Язык Snobol, разработанный и совершенствуемый в течение 1960-х годов, ориентированный на обработку текстов, ввёл в число базовых операций языков программирования сопоставление с образцом [10][11][12]. Язык Симула, появившийся примерно в это же время, впервые включал поддержку объектно-ориентированного программирования. В середине 1970-х группа специалистов представила язык Smalltalk, который был уже всецело объектно-ориентированным.

touch.otvet.mail.ru

10 языков программирования, которые могут перевернуть мир IT

Эти передовые языки программирования обладают уникальной способностью изменить будущее разработки ПО

Действительно ли нам нужны новые языки программирования? Безусловно, на данный момент их вполне достаточно. Среди разнообразия императивных, функциональных, объектно-ориентированных, динамических, компилируемых, интерпретируемых и скриптовых языков ни один разработчик не сможет познать все доступные на сегодняшний день возможности.

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

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

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

Исследуемый язык программирования №1: Dart

JavaScript хорош для добавления базовых элементов интерактивности веб-страницам, но когда код ваших веб-приложений состоит из тысяч строк, слабые места этого языка становятся заметны. Вот почему Google создала Dart - язык, который, как полагает компания, станет новым "родным" языком веб-программирования.

Как и в JavaScript, в Dart используются синтаксисы и ключевые слова, похожие на те, которые используются в языке C. Однако одним существенным различием является то, что в то время как JavaScript основывается на прототипах, объекты в Dart определяются с помощью классов и интерфейсов, как в C++ или Java. Также Dart позволяет программистам дополнительно задавать переменные со статическими типами. Идея заключается в том, чтобы сделать Dart таким же привычным, динамичным и гибким языком, как и JavaScript, который в то же время позволяет разработчикам писать коды, быстрые и лёгкие в выполнении, и в которых сложно сделать труднонаходимые ошибки.

Сегодня Dart мало где можно использовать. Он разработан для запуска либо на клиенте, либо на сервере (а-ля Node.js), но единственным способом запустить клиентскую версию Dart-кода является его кросскомпиляция в JavaScript. Однако и после этого он не будет запускаться во всех браузерах. Но так как Dart выпускается по бесплатной лицензии типа BSD, то любой продавец, который согласен с условиями Google, может свободно использовать этот язык в своих продуктах. Всё, что осталось сделать Google, - это убедить всю индустрию.

Исследуемый язык программирования №2: Ceylon

Гэвин Кинг (Gavin King) отрицает тот факт, что Ceylon, разрабатываемый им язык в Red Hat, должен стать "убийцей Java". Кинг хорошо известен как создатель фреймворка объектно-реляционного отображения Hibernate для Java. Ему нравится Java, но он считает, что в нём ещё многое нужно улучшить.

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

Кинг и его команда не планируют заново изобретать колесо. Никакой виртуальной Ceylon-машины не будет, Ceylon-компилятор будет выдавать java-байткод, который можно запустить на JVM. Но Ceylon будет больше, чем просто компилятор. Стратегической целью данного проекта является создание нового комплекта разработчика для Ceylon, который заменит Java, являющегося, по словам Кинга, "разбухшим", неуклюжим и до сих пор тщательно не модернизированным.

Это трудная задача, и пока что Red Hat не выпустил никаких утилит для Ceylon. Кинг говорит, что компилятор должен выйти в этом году. Но в ближайшее время не ждите какого-либо ПО, написанного на "100% чистом Ceylon".

Исследуемый язык программирования №3: Go

Интерпретаторы, виртуальные машины, а также управляемые коды сегодня очень популярны. Неужели нам действительно нужен ещё один старомодный язык, который компилирует в "родные" двоичные коды? Команда инженеров Google - под руководством Роберта Гризмера (Robert Griesemer) и легенд Bell Labs Кена Томпсона (Ken Thompson) и Роба Пайка (Rob Pike) - говорит "да".

Go - язык программирования общего назначения, который подходит для всего: начиная от разработки приложений и заканчивая программированием систем. В этом смысле он больше похож на C или C++, чем на Java или C#. Однако как и последние языки, Go включает в себя такие современные функции, как очистка памяти от ненужных данных, отражение текущих процессов выполнения и поддержку параллельности.

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

Над Go ещё работают, и спецификация языка ещё может быть изменена. Тем не менее, работать с ним можно уже сейчас. Google создала утилиты и компиляторы, к которым прилагается подробная документация. К примеру, в учебном руководстве Effective Go хорошо показаны отличия Go от предыдущих языков.

Исследуемый язык программирования №4: F#

Функциональное программирование давно пользуется популярностью у программистов и академиков, но чисто функциональные языки, такие как Lisp и Haskell, часто считаются непригодными для разработки реального ПО. Одной из наиболее распространённых причин является то, что код функционального вида очень сложно сочетать с кодом и библиотеками, написанными на императивных языках, к примеру, на C++ или Java.

Знакомьтесь, F# (произносится "Эф-шарп") - язык, разработанный Microsoft с целью объединения в себе функциональности и практичности. Так как F# является языком первого класса на виртуальной машине .Net CLR, он может поддерживать такие же библиотеки и функции, как и другие CLR языки, например, как C# и Visual Basic.

Код F# чем-то похож на код OCaml, но содержит свой собственный интересный синтаксис. Например, для облегчения проведения научных расчётов числовыми типами данных в F# могут являться единицы измерения. Также в F# имеются конструкции для облегчения асинхронных вводов/выводов, параллелизации ЦПУ и вывода процессов на графический процессор.

После длительного периода созревания в Microsoft Research, на сегодняшний день F# поставляется вместе с Visual Studio 2010. Что ещё лучше, но не характерно для корпорации, Microsoft создала F# компилятор и корневую библиотеку, доступную по открытой лицензии Apache. Вы можете начать работу с ним бесплатно и даже использовать его на системах Mac и Linux (с помощью Mono runtime).

Исследуемый язык программирования №5: Opa

Веб-программирование - дело очень сложное. Даже самые простые веб-приложения состоят из бесконечных строк, написанных на нескольких языках: HTML и JavaScript для клиента, Java или PHP для сервера, SQL для базы данных и т.д.

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

Это достигается с помощью комбинации фреймворков со стороны клиента и сервера. Компилятор Opa решает, где должна быть запущена данная программа (на клиенте, сервере либо же и там, и там), и затем выполняет её код. Для клиентских программ он переводит Opa на соответствующий JavaScript код, в том числе и AJAX вызовы.

Естественно, с такого рода интегрированной системой в конце должно получиться что-то волшебное. Среда выполнения Opa объединяет собственный веб-сервер и систему управления базой данных, которые не могут быть заменены самостоятельными альтернативами. Как бы то ни было, это может быть не так уж и важно, учитывая возможность разработки современных веб-приложений, управляемых данными, с помощью всего лишь нескольких десятков строк кода. Opa поставляется бесплатно и на данный момент доступен для 64-х битных Linux и Mac OS X платформ, другие же порты пока разрабатываются.

Исследуемый язык программирования №6: Fantom

Хотите создавать приложения для Java или .Net? Если Вы пишите на Fantom, то можете сделать выбор, а потом даже поменять платформы. Всё потому, что Fantom с самого начала создавался для кросс-платформенной мобильности. Проект Fantom состоит не только из компилятора, который может выводить байткод как для JVM или .Net CLI, но также из набора API, которые отделяют API Java и .Net и создают дополнительный уровень мобильности.

Планируется ещё больше увеличить мобильность Fantom. Уже доступен компилятор из Fantom в JavaScript, а в следующие цели могут входить проект компилятора LLVM, Parrot VM и Objective-C для iOS.

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

Fantom распространяется бесплатно в соответствии с Academic Free License 3.0 и доступен для Windows и Unix-подобных платформ (в том числе и Mac OS X).

Исследуемый язык программирования №7: Zimbu

Большинство языков программирования заимствуют функции и синтаксис из ранее существовавших языков. Zimbu взял по кусочку почти из каждого. Детище Брэма Мооленаара (Bram Moolenaar), создателя текстового редактора Vim, Zimbu намерен стать быстрым, точным, портативным и лёгким для чтения языком, который может быть использован для разработки чего угодно: от GUI-приложений до ядер ОС.

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

Единственной проблемой является портативность. Хотя Zimbu и является компилируемым языком, его компилятор выдаёт ANSI C код, а двоичные файлы могут быть созданы лишь на платформах со встроенным C-компилятором.

К сожалению, проект Zimbu находится на стадии разработки. Компилятор и несколько программ-примеров могут быть созданы самостоятельно, но не весь действительный Zimbu-код будет компилироваться и выполняться должным образом. Не все заявленные функции ещё разработаны, а некоторые из уже представленных работают некорректно. Спецификация языка также, возможно, со временем изменится: по мере необходимости добавятся ключевые слова, типы и синтаксис. Следовательно, документация также ещё неполная. Однако если Вы хотите попробовать, предварительные утилиты уже доступны по лицензии Apache.

Исследуемый язык программирования №8: X10

Когда-то параллельная обработка данных была специализированной нишей разработки ПО, но с распространением многоядерных процессоров и распределённых вычислений, параллелизм обрёл популярность. К сожалению, нынешние языки программирования не успевают за этой тенденцией. Именно поэтому IBM Research создаёт X10 - язык, созданный специально для современных параллельных архитектур, который нацелен на увеличение производительности разработчиков "в десять раз".

Параллелизм в X10 возможен благодаря PGAS модели программирования (модели разделённого глобального адресного пространства). Код и данные выделяются в блоки и распределяются по разным "пространствам", тем самым облегчая шкалирование программы от однопотокового прототипа (одно пространство) до многопотокового, выполняемого на одном или более многоядерном процессоре (несколько пространств) в высокопроизводительном кластере.

Код X10 больше всего похож на Java. По сути, среда выполнения X10 доступна как в качестве встроенных исполнимых файлов, так и как классовые файлы для JVM. Компилятор X10 может выдавать исходные коды либо на C++, либо на Java. В будущем планируется разработать прямую совместимость с Java.

А пока язык развивается, хотя он уже довольно разработан. Компилятор и среда выполнения доступны для различных платформ, в том числе Linux, Mac OS X и Windows. В качестве дополнительных утилит выступают интерактивная среда разработки (IDE), основанная на Eclipse, и отладчик, которые распространяются по лицензии Eclipse Public License.

Исследуемый язык программирования №9: haXe

Многие языки можно использовать для написания переносимого кода. C-компиляторы доступны практически для всех ЦПУ архитектур, а Java-байткод будет выполняться везде, где есть JVM. Но haXe (произносится как "хекс") является более чем просто переносимым. Это мультиплатформенный язык, который может использоваться в различных операционных средах, начиная от встроенных двоичных систем до интерпретаторов и виртуальных машин.

На данный момент разработчики могут писать программы на haXe, затем компилировать их в объектный код, JavaScript, PHP, Flash/ActionScript или байткод NekoVM. Дополнительные модули для компилирования C# и Java находятся в разработке. Дополнением к базовому языку является стандартная библиотека haXe, которая одинаково работает с любым объектом, а также специализированные библиотеки для выполнения характерных функций каждой из платформ.

Синтаксис haXe похож на C и обладает богатым набором функций. Главным преимуществом является способность устранения проблем, свойственных каждой из платформ. К примеру, в haXe строгая типизация используется там, где она не используется в JavaScript; к ActionScript добавляются параметры настройки и выведение типа; также полностью исключается плохо разработанный, непродуманный синтаксис PHP.

Несмотря на то, что haXe всё ещё находится в разработке, он уже используется в коммерческих целях своим создателем, игровой студией Motion Twin, так что всё серьёзно. Он доступен для Linux, Mac OS X и Windows по комбинации бесплатных лицензий.

Исследуемый язык программирования №10: Chapel

В мире высокопроизводительных вычислений редкие имена звучат громче, чем Cray. Никого не должно удивлять то, что Chapel, первый язык программирования, созданный Cray, был разработан с учётом суперкомпьютерных вычислений и кластеризации.

Chapel является частью программы Cray Cascade Program, масштабного проекта по высокопроизводительным вычислениям, частично профинансированного американским Управлением перспективных исследовательских программ в области обороны (DARPA). Среди целей данного проекта находятся отделение алгоритмов параллельной обработки от используемого оборудования, улучшение их производительности на архитектурах и увеличение портативности параллельных программ.

Синтаксис Chapel составлен из синтаксисов нескольких языков. В дополнение к наиболее часто используемым (C, C++, Java), в нём заимствованы понятия из таких языков научного программирования, как Fortran и Matlab. На его функции параллельной обработки данных повлияли ZPL и High-Performance Fortran, а также предыдущие проекты Cray.

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

Работа над Chapel продолжается. На данный момент он может быть запущен на суперкомпьютерах Cray и различных высокопроизводительных кластерах, но его можно портировать на большинство систем типа Unix (в том числе на Mac OS X и Windows с помощью Cygwin). Исходный код доступен по бесплатной лицензии типа BSD.

Neil McALLISTER,InfoWorld

www.kv.by

Язык программирования J, введение. - Записки К.Л.М.

Предлагаю вашему вниманию краткое введение в язык программирования J, которое я написал на протяжении последних выходных. Познакомился я с этим языком чуть больше месяца назад, когда искал способ удобного программирования на КПК. Весь этот месяц в свободное время я читал книги и статьи по J, K и APL. Игрался с чужими программами, писал свои, тривиальные и написал недавно свою первую, нетривиальную (которая в этом введении разобрана и улучшена). Мое общее впечатление от J -- восхищение.

Так что читайте, комментируйте... если найдете ошибки или неясности -- говорите.

Язык программирования J, введение.

&copy 2004 Константин Л. Метлов <[email protected]>All rights reserved.

Эволюционные ветви.

В наше время всеобщей компьютерной грамотности сложно найти активного человека, который не имел бы представления о языках программирования, позволяющих управлять работой компьютера. Но даже среди специалистов можно услышать мнение -- "все языки похожи." И действительно, среди популярных языков (таких как С, С++, Java, Python), произошедших от Fortran-а, спор идет разве-что о деталях реализации и синтаксиса. При всем отличии этих деталей, программа, написанная на одном из этих языков, как правило, легко читабельна человеком, знакомым с любым другим...

В основе этого подобия лежит историческая постановка программирования, как задачи о перемещении (с обработкой) данных из одиних ячеек оперативной памяти компьютера в другие, причем, перемещение поэлементное. Ассемблер (в противоположность программированию в машинном коде) дал возможность называть ячейки и их группы символическими именами. В Fortran-е над именованными ячейками были введены платформно и архитектурно-независимые операции. Потом, язык С предоставил еще бОльший архитектурно-независимый доступ к ресурсам компьютера, позволив непосредственно оперировать ссылками и указателями на ячейки в линейной оперативной памяти. Даже в языках C++ и Java программа -- всего-лишь линейная (с разветвлениями и циклами) инструкция по перемещению (с обработкой) данных, расположенных в линейной-же памяти, а языки эти -- всего-лишь варианты языка линейной машины Алана Тьюринга (которому и принадлежит, упомянутая в начале этого абзаца историческая постановка), где операторы представляют из себя комбинации тьюригновских команд. Эволюция этих языков шла в направлении сокрытия различий между различными реализациями тьюринговских машин, тем не менее, предоставляя как можно более прямой доступ к тому, что, собственно, между этими машинами общего (тоесть к тьюринговским одномерным "ленте-памяти" и "ленте-программе" с пронумерованными командами для осуществления переходов). Апофеозом этой эволюции являются, наверное, языки для виртуальных машин Python и Java, где межплатформные различия сглажены наиболее сильно, но все равно программы выглядят и читаются как Fortran.

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

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

Параллельно с описанной ветвью развивалась и другая. Ее отсчет, наверное, следует начать с книги "A Programming Language" Кена Иверсона (Kenneth E. Iverson, 1961), где автор описал язык APL. За создание и работу над этим языком Иверсон получил, впоследствии, премию Тьюринга. Его тьюринговская лекция (Kenneth E. Iverson: Notation as a Tool of Thought. Commun. ACM 23(8): 444-465(1980)) утверждает основные принципы, положенные в основу APL, главным из которых, с моей точки зрения, является отказ следовать при разработке языка за тонкостями реализации тьюринговских машин (предоставив это разработчикам компиляторов и интерпретаторов), а сделать язык программирования отражением математических идей и обьектов по аналогии с математической записью, сделать его настолько компактным, чтобы с его помощью можно было не только управлять вычислениями компьютера, но и думать...

Язык APL был реализован на больших ЭВМ (тех самых, что занимали когда-то этажи и подвалы некоторых зданий), использовался в областях, требующих эффективную обработку больших обьемов данных (прежде всего в банках и на биржах), но широкой популярности "в народе" не получил. Причин тут несколько: во-первых, народные компьютеры, начиная с оснащенных процессорами Z80 были абсолютно скалярными; во-вторых, большие обьемы данных (где, собственно, и проявлялась сила APL) в эти компьютеры не помещались в принципе; а кроме того, в APL широко использовались нестандартные символы (не попавшие в ASCII), отсутствующие на "обычных" клавиатурах и в стандартных, прошитых в ПЗУ "народных" знакогенераторов шрифтах. За нестандартные символы ныне седеющие злые языки прозвали APL "китайским бейсиком". ;-) Язык этот, хоть жив и поныне, оказался обречен на существование (хоть далеко и небезуспешное) в рамках отдельно взятых элитарных клубов.

Но история на этом не закончилась, вмешались закон Мура и интернет. В силу первого, мощность "домашних" процессоров возросла на порядки, в них (как, например, в процессоры серии i386) даже начали добавлять векторные инструкции. В силу второго (а так-же гигантского прорыва в области магнитной записи, приведшему к появлению в городских супермаркетах терабайтных жестких дисков), каждому стали доступны те самые "гигантские" обьемы данных, для обработки которых так удобен APL. Казалось-бы, APL должен пережить второе рождение, но его символы так и не вошли в стандартные кодировки, затрудняя обмен программами в интернете, а значит и широкое распространение языка. Барьер входа оказался очень высок.

Видя и предвидя, в 1980-е годы Иверсон, вместе с коллегами, из которых я упомяну здесь Роджера Хуи (Roger Hui) и Артура Уитни (Arthur Whitney)), начали проэкт по разработки новой версии языка APL, окончательно получившей название J. В этом языке, официально ведущем свою историю с 1990-го (впервые упомянут в статье R. K. W. Hui, K. E. Iverson, E. E. McDonnell, and A. T. Whitney, "APL/?," APL90 Conference Proceedings, APL Quote Quad 20, No. 4, ACM, New York 1990, описан в книге Kenneth E. Iverson: J Introduction and Dictionary. Iverson Software, Toronto, Canada, 1991), был учтен опыт APL во многих областях. В частности, были систематически введены векторные операции над многомерными массивами (используя "ранг" оператора и "k-ячейки"). Алфавитом этого языка стал, наконец, ASCII. Разницу между APL и J можно, наверное, сравнить с разницей между Fortran-ом и C (или даже с C++, если учесть, что J поддерживает обьектно-ориентированное программирование).

Однако история и тут оказалась нелинейной (см. Kenneth E. Iverson: A Personal View of APL, IBM Systems Journal, Vol. 30 No. 4 1991 на английском). В начале разработки J от группы отделился Артур Уитни и занялся разработкой собственного языка, который он назвал K. Одним из разногласий (ни в коем случае не личного характера) между Уитни и Иверсоном было чрезмерное (по мнению Уитни) усложнение языка J понятиями ранга (в K операторы просто действуют поэлементно), а так-же избыток возможностей (комплексные числа, трехмерная графика). Хотя, кстати, центральная идея о рангах принадлежит именно Уитни, который представил ее Иверсону в 1982-м на конференции по APL в Гейдельберге, заметив, что свертка массива вдоль одной из осей (+/[I] A) может быть записана при помощи оператора присвоения ранга (+/"I A), такая вот запутанная история. Тем не менее, в K ранга нет. Язык K получился проще, компактнее, и оказался отлично приспособлен к сфере баз данных. Компания Уитни (Kx Systems) разработала на этом языке реляционную базу данных под названием kdb, являющуюся на сегодняшний день продуктом-лидером в этой области и превосходящую, в частности, широко разрекламированный Oracle по скорости на тестах TPC. Ходят слухи, что исходники базы данных kdb (поддерживающей SQL, ODBC, JDBC, удаленный доступ по http и множество других функций, стандартных в этой области) хранятся в 26-ти, названных однобуквенными именами, текстовых файлах, содержащих, каждый, примерно один полный стандартный экран кода, просмотреть который можно без скроллинга. Еще говорят, что в kdb нет ни одного цикла. Может быть эти слухи и неправда, но то, что дистрибутив kdb полностью (вместе с интерпретатором K, примерами), занимает (всего !) 200 килобайт -- это доступный независимой проверке факт. И все-же, дальше мы будем говорить о языке J, который реально предоставляет больше возможностей чем K для широкого не специализированного круга задач. Продолжая натянутые аналогии, скажу, что разница между J и K примерно как между C и Pascal-ем (ну, или C++ и обьектным Паскалем, поскольку в K тоже можно программировать с обьектами).

Итак, давайте-же засучим рукава и начнем баловаться...

Для баловства нам понадобятся: установленная последняя версия интерпретатора J, ссылки на словарь и разговорник (включены в дистрибутив).

Выпуклая оболочка (convex hull)

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

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

Что такое выпуклая оболочка ? Представьте себе, что плоскость -- кусок резины, а в нее мы случайным образом натыкали булавок (это будут наши точки), если мы теперь возьмем нитку и затянем ее вокруг всех булавок, то она коснется только некоторых (внешних), а форма ее как раз и будет соответствовать "выпуклой оболочке". Задачей нашего алгоритма будет -- найти и перечислить по порядку булавки, которых коснется нитка.

Взляните на картинку:

^ | 5+ [*] | 4+ [*] | 3+ | 2+ [*] | 1+ [*] | --[*]--+---+---+---+---+---+---+---+---+---+---*---+---+----> -2 -1 0| 1 2 3 4 5 6 7 8 9 10 11 -1+ [*] | -2+ [*] [*] | -3+ | -4+ [*] | -5+ | -6+ [*] |

Выпуклой оболочкой этого множества будут (в порядке обхода против часовой стрелки) точки с координатами (-2,0), (1,-6), (5,-4), (10,-1), (8,5), (2,4). Теперь нам нужно написать программу, которая так-же легко решила-бы эту задачу... а так-же и любую другую, подобную, в которой точек был-бы хоть миллион...

Что делать ?

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

Алгоритм этот заключается в том, чтобы отсортировать (время сортировки N log N) точки по углам, относительно самой левой из них (которая по определению принадлежит оболочке). А потом, пройдя по образовавшемуся звездообразному контуру последовательно (за время ~N), начиная с левой точки, удалить все, угол при которых (относительно внутренности многоугольника) выгнут наружу (>180ˆ). Те точки, что останутся, будут образовывать вогнутые углы, а значит оболочка получится выпуклой.

Давайте теперь с Вами запустим интерпретатор J и займемся решением поставленной задачи. Установили ? Запустили ?

Когда Вы запустите интерпретатор перед вами в окошке появится мерцающий курсор, отстоящий от левого края окна ровно на 3 пробела. Это поле для ввода. Если набрать что-нибудь, а потом нажать <ВВОД> выражение будет вычислено, а в следующей строке появится ответ. Давайте-ка что-нибудь наберем ! Например:

2+2 4

О ! Работает !

В языке J отрицательные числа отмечаются знаком подчеркивания (_) вместо минуса (-) как в других языках. Это позволяет легко отличить минусы, которые являются частью определения констант, от минусов, являющихся операциями. В частности:

2-4 _2

Тоесть минус 2. Вообще, примитивные операции в J (глаголы, verbs, как назвали их создатели языка, подчеркивая, что они обозначают действие) кодируются комбинациями символов из ASCII, одиночными и парными. Причем, операция, обозначаемая одной и той-же комбинацией символов, зависит от количества переданных глаголу аргументов. Аргументов этих может быть либо два (справа и слева от глагола), тогда мы имеем дело с диадным случаем глагола; либо один (справа), тогда перед нами монадный случай. Вот например, только что мы использовали глагол "-" (минус) в диадном случае, когда он обозначает "вычитание". В монадном случае "-" (минус) обозначает "отрицание".

-_2 2

Тут все просто. Усложним векторами, все-таки J -- векторный язык. Вот, например вектор из трех чисел

1 2 3 1 2 3

При вводе, элементы вектора отделяются просто пробелами. Монадные операции действуют на одномерные векторы поэлементно (с многомерными все сложнее, но пока нам это не нужно).

-_2 1 2 3 2 _1 _2 _3

Смотрим разговорник... Вот есть глагол "%:", который в монадном случае соответствует операции извлечения квадратного корня.

%: 4 2 2 1.41421

А теперь так:

%: _1 0j1

О ! J, оказывается, поддерживает комплексные числа !!! Квадратный корень из минус единицы -- есть мнимая единица. Вооот значит как эти числа тут обозначаются ! Попробуем теперь вот так

0j1 * 0j_1 1

Тоесть мнимая единица, умноженная на сопряженную (т.е с мнимой частью обратного знака) мнимую единицу дает просто единицу, тоесть модуль мнимой единицы, тоесть совершенно верно... Если мы глянем в разговорник, то увидим, что операция "+" в монадном варианте соответствует комплексному сопряжению. Тоесть, действительные числа она не меняет,

+1 1

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

+ 0j1 0j_1

Воот... А ведь комплексные числа -- очень естественная форма для того, чтобы представить координаты точек на плоскости. Мы умеем вводить комплексные числа, умеем составлять списки... Ну-ка составим список наших точек, да назовем его

points=: 1j_6 5j_4 7j_2 4j_2 10j_1 _2j0 9j0 5j1 7j2 2j4 8j5

Заметьте, что здесь J ничего не выводит, но это не главное... Главное, в отличие от C (например), что в J мы не переменной (месту в памяти) присваиваем значение, а значению присваиваем имя. Тоесть points -- это не переменная, это имя для массива наших точек. Мы можем вызвать этот массив по имени

points 1j_6 5j_4 7j_2 4j_2 10j_1 _2 9 5j1 7j2 2j4 8j5

А можем и присвоить это имя какому-нибудь другому значению, но, до тех пор пока не присвоили, значение имени поменять нельзя (тоесть никто, ни по какому коварному указателю, не может влезть и поменять даже одну из точек в списке points, даже только ее мнимую или действительную часть). По терминологии J, операция -- это глагол (verb), а операнд -- существительное (noun). Наше имя "points" -- местоимение (pronoun), не называющее предмет, а указывающее на него, отсылая к существительному (предмету), упомянутому ранее.

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

Смотрим разговорник... В J, оказывается, операция сортировки массива является встроенной, и обозначается как "/:" (сортировка по возрастанию), и "\:" (сортировка по убыванию). Причем, при сортировке комплексных чисел, сравниваются их действительные части. Тоесть, мы можем наши точки отсортировать

/: points 5 0 9 3 1 7 2 8 10 6 4

результатом монадного применения глагола "/:" (сортировать) является перестановка индексов внутрь сортируемого массива. Получить собственно отсортированный массив можно, применив диадную версию глагола сортировки.

points /: points _2 1j_6 2j4 4j_2 5j_4 5j1 7j_2 7j2 8j5 9 10j_1

Теперь самая левая из точек идет первой в массиве, а самая правая -- последней. Запись только получилась длинновата. Избежать написания слова points дважды нам помогут наречия (adverbs). Наречия изменяют действие глагола, стоящего слева от них, и образуют, таким образом, новый, производный, глагол. В частности, есть наречие отражения "~", оно превращает диадный глагол в монадный по правилу: "u~ x" -> "x u x", как-бы "окружая" глагол u существительными. Например "2*2" можно записать, при помощи этого наречия как "*~2", а нашу сортировку сделать командой

/:~ points _2 1j_6 2j4 4j_2 5j_4 5j1 7j_2 7j2 8j5 9 10j_1

Тоесть, возвращаясь к алгоритму Грехема, самая левая точка, относительно которой нам нужно будет сортировать все остальные по углам, определяется выражением

{./:~ points _2

где "{." в монадном применении всего-лишь берет первый элемент из списка, стоящего справа (т.е. нашего отсортированного списка). Эффективно-ли сортировать весь массив для того, чтобы выбрать только один, минимальный, элемент ? Сортировать не эффективно, но ничто не мешает интерпретатору распознать сочетание глаголов "{./:~" и заменить его просто вычислением минимума, без сортировки. Не знаю -- распознает ли эту комбинацию текущая версия интерпретатора J, но она распознает многие другие, перечисленные в приложении к словарю (J Dictionary).

Итак, мы нашли самую левую точку. Теперь нам нужно отсортировать остальные по углам вокруг этой. Что для этого нужно ? Правильно, нужно поместить начало координат в найденную нами точку, тоесть вычесть ее из остальных points - {./:~ points 3j_6 7j_4 9j_2 6j_2 12j_1 0 11 7j1 9j2 4j4 10j5

И снова у нас points упоминается дважды. Это, конечно, не плохо, но было-бы красивее иметь один простой монадный глагол (наш собственный), ведь у проведенного нами вычисления всего один аргумент -- точки, значит и глагол, по идее, должен быть монадным. Чтобы записать такой глагол, нужно воспользоваться крючком (hook). Крючок возникает если два глагола идут в выражении подряд "(u v) y", где u и v -- глаголы, а y -- существительное. Заметьте, что в отсутствии скобок крючка нет, а есть просто последовательное применение глаголов u и v к y. Т.е. "u v y" -> "u(v y)" или, с использованием связки (conjunction) "@" ("поверх", см. разговорник), "u v y" -> "(u @ v) y" -> "u(v y)", как мы до сих пор и делали. Выражение с крючком вычисляется, однако, совсем по-другому, в монадном "(u v) y" и диадном "x (u v) y" случае крючок проще всего представить в виде следующих диаграмм:

монада диада u u / \ / \ y v x v | | y y

отсюда сразу видно, что если "u" -> "-", "v"->"{.@/:~" (заметьте здесь, связку "@", обьединяющую два глагола в один, соответствующий последовательному применению исходных), а "y"->"points" монадный крючок эквивалентен нашему последнему выражению.

(- {.@/:~) points 3j_6 7j_4 9j_2 6j_2 12j_1 0 11 7j1 9j2 4j4 10j5

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

centerleft =: -{.@/:~

и использовать его

centerleft points 3j_6 7j_4 9j_2 6j_2 12j_1 0 11 7j1 9j2 4j4 10j5

в таком-же виде нам нужно будет оформить и окончательный глагол, вычисляющий выпуклую оболочку. Может показаться, что мы идем к этому черепашьими шагами... Да, действительно, но это только потому, что построение оболочки не есть нашей основной целью. Цель в том, чтобы заострить внимание на встречающихся нам по ходу особенностях программирования на языке J. И прошли мы уже немало. Мы умеем вводить и называть данные, в т.ч. в комплексном виде, умеем их сортировать, освоили крючки, и написали программу из 7-ми символов (!), центрирующую точки на плоскости вокруг самой левой из них.

Но, едем дальше. Теперь нам нужно эти точки отсортировать по углам, а углы нужно сначала вычислить. Для вычисления аргумента комплексного числа, а так-же других КРУГОВЫХ функций в J есть диадная операция, обозначаемая (как ни парадокасально ;-) "o.". Левый аргумент диады o. -- целое число, определяющее тип вычисляемой функции. Вычислению аргумента комплексного числа "y" соответствует диада "12 o. y".

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

Введем временное имя для отсортированного по X массива

spoints=: /:~points spoints _2 1j_6 2j4 4j_2 5j_4 5j1 7j_2 7j2 8j5 9 10j_1

тогда отсортированный список без первой точки будет (см разговорник для "}.")

}. spoints 1j_6 2j4 4j_2 5j_4 5j1 7j_2 7j2 8j5 9 10j_1

первая точка

{. spoints _2

массив с помещенной в начало системы координат и выколотой первой точкой

(}. spoints) - ({. spoints) 3j_6 4j4 6j_2 7j_4 7j1 9j_2 9j2 10j5 11 12j_1

Для сокращения этой записи воспользуемся вилкой (fork). Вилка работает примерно так-же как крючок (hook), только немного сложнее, поскольку состоит она не из двух, а из трех, следующих друг за другом, глаголов. Диадный "x (u w v) y" и монадный "(u w v) y" случаи применения вилки иллюстрируются диаграммой

монада диада w w / \ / \ u v u v | | / \ / \ y y x y x y

тоесть, вилка

(}. - {.) spoints 3j_6 4j4 6j_2 7j_4 7j1 9j_2 9j2 10j5 11 12j_1

воспроизводит нужный нам результат. Теперь вычислим углы

(12"_ o. }. - {.) spoints _1.10715 0.785398 _0.321751 _0.519146 0.141897 _0.218669 0.218669 0.463648 0 _0.0831412

где мы воспользовались цепочкой глаголо

dr-klm.livejournal.com

R (язык программирования) - это... Что такое R (язык программирования)?

У этого термина существуют и другие значения, см. R.

R — язык программирования для статистической обработки данных и работы с графикой, а также свободная программная среда вычислений с открытым исходным кодом в рамках проекта GNU. Язык создавался как аналогичный языку S, разработанному в Bell Labs и является его альтернативной реализацией, хотя между языками есть существенные отличия, но в большинстве своём код на языке S работает в среде R. Изначально R был разработан сотрудниками статистического факультета Оклендского университета Россом Айхэкой (англ. Ross Ihaka) и Робертом Джентлменом (англ. Robert Gentleman) (первая буква их имён — R), на момент 2011 года язык и среда поддерживаются и развиваются организацией R Foundation.

R широко используется как статистическое программное обеспечение для анализа данных и фактически стал стандартом для статистических программ[2].

R доступен под лицензией GNU GPL. Распространяется в виде исходных кодов, а также откомпилированных приложений под ряд операционных систем: FreeBSD, Solaris[3] и другие дистрибутивы Unix и Linux, Microsoft Windows, Mac OS X.

В R используется интерфейс командной строки, хотя доступны и несколько графических интерфейсов пользователя, например пакет R Commander, RKWard, RStudio, Weka, Rapid Miner, KNIME, а также средства интеграции в офисные пакеты.

В 2010 году R вошёл в список победителей конкурса журнала InfoWorld в номинации на лучшее открытое программное обеспечение для разработки приложений[4].

Особенности

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

Ещё одной особенностью R являются графические возможности, заключающиеся в возможности создания качественной графики, которая может включать математические символы.

Примеры

Средний балл выпускника вуза

# В переменную a поместить список всех оценок: a <- c(4,3,3,3,3,4,4,4,4,4,5,4,4,4,5,5,5,5,+ 3,5,5,4,4,3,3,4,4,3,5,5,4,3,3,4,4,3,3,5,4,5,5) # В переменную n поместить количество оценок: length(a) -> n # Средний балл: m <- mean(a) # Таблица (горизонтальная) с подсчётом количества оценок: t <- table(a) # Преобразование в более удобный формат данных (вертикальную таблицу): f <- as.data.frame(t) # Вычисление процентной доли и запись её в третий столбец: mapply(function(r) r*100/n, f[,2]) -> f[,3] # Заголовки столбцов: colnames(f) <- c("Оценка", "Кол-во", "%") # Вывод результатов: a n m f

Результат:

[1] 4 3 3 3 3 4 4 4 4 4 5 4 4 4 5 5 5 5 3 5 5 4 4 3 3 4 4 3 5 5 4 3 3 4 4 3 3 5 [39] 4 5 5 [1] 41 [1] 4 Оценка Кол-во % 1 3 12 29.26829 2 4 17 41.46341 3 5 12 29.26829

Полезные инструменты

Для удобства работы с R разработан ряд графических интерфейсов, в том числе:

Кроме того, в ряде текстовых и кодовых редакторов предусмотренные специальные режимы для работы с R, в частности:

Доступ к функциям и среде выполнения R возможен из Python с использованием пакета RPy[12].

Коммерциализация

Компания Revolution Analytics, основанная в 2007 году, целиком свой бизнес посвящает коммерциализации языка программирования R, в её коммерческом пакете Revolution R примечательны такие компоненты (не распространяемые со свободной версией языка), как ParallelR (поддержка многопоточности среды выполнения), R Productivity Environment (интегрированная среда разработки), RevoScaleR (поддержка массово-параллельной обработки в рамках концепции «больших данных»), RevoDeployR, библиотеки по интеграции с веб-службами, поддержка форматов статистических пакетов корпорации SAS Institute[13].

В октябре 2011 года корпорация Oracle выпустила аппаратно-программный комплекс Big Data Appliance — NoSQL-кластер серверов массово-параллельной обработки, с интегрированным программными средствами на основе языка R и Apache Hadoop[14][15], а в феврале 2012 года язык встроен в Oracle Database[16]. Также массово-параллельный анализ средствами R поддержан в аппаратно-программных комплексах Netezza корпорации IBM[17][18].

Также язык R поддерживают коммерческие программные среды Tibco Spotfire[19], SPSS (начиная с версии 16.0)[20], Statistica (начиная с версии 9.0)[21], Platform Symphony[22], SAS[23].

CRAN

R и дополнительные пакеты распространяются через CRAN (акроним Comprehensive R Archive Network). В настоящее время в мире доступны более 60 зеркал CRAN. Головной узел — (http://cran.r-project.org/) расположен в Вене (Австрия).

Информационный бюллетень R

Два-три раза в год выходит свободно-распространяемый информационный журнал R Journal[24]. Он содержит информацию по статистической обработке данных и разработке, что может быть интересно как пользователям, так и разработчикам R. С января 2001 г. по октябрь 2008 г. он выходил в качестве бюллетеня R News[25].

Примечания

  1. ↑ A Brief History R: Past and Future History, Ross Ihaka, Statistics Department, The University of Auckland, Auckland, New Zealand, available from the CRAN website
  2. ↑ Teaching-with-R.pdf (англ.)
  3. ↑ R-Project on Solaris
  4. ↑ InfoWorld Bossie Awards 2010
  5. ↑ SciViews
  6. ↑ Togaware: Rattle: Gnome Cross Platform GUI for Data Mining using R
  7. ↑ R syntax — jEdit Community
  8. ↑ http://www.kate-editor.org/syntax/2.5/r.xml
  9. ↑ http://syn.sourceforge.net/
  10. ↑ Tinn-R | Download Tinn-R software for free at SourceForge.net
  11. ↑ WalWare — Homepage
  12. ↑ http://rpy.sourceforge.net RPy on SourceForge
  13. ↑ 'Red Hat for stats' goes toe-to-toe with SAS
  14. ↑ Oracle Unveils the Oracle Big Data Appliance
  15. ↑ Oracle rolls its own NoSQL and Hadoop
  16. ↑ Prickett Morgan, Timothy Oracle tucks R stats language into database  (англ.). The Register (10 February 2012). Архивировано из первоисточника 3 июня 2012. Проверено 10 февраля 2012.
  17. ↑ Harris, Derrick. IBM Creates Big Data Frankenstein With Netezza-R Fusion  (англ.), The New York Times (2011-03-141). Проверено 19 ноября 2011.
  18. ↑ Rosenberg, Dave Open-source 'R' gets Hadoop integration  (англ.). CNet. CBS. Архивировано из первоисточника 17 февраля 2012. Проверено 19 ноября 2011.
  19. ↑ Spotfire Integration with S+ and R
  20. ↑ RSS Matters
  21. ↑ R Language Platform | StatSoft
  22. ↑ R" integrated with Symphony
  23. ↑ Calling Functions in the R Language (SAS/IML)
  24. ↑ R Journal
  25. ↑ CRAN: R News

Ссылки

dikc.academic.ru