Как я нашел лучший в мире язык программирования. Часть 2. Язык программирования чяо


Большой список 256-ти языков программирования / Хабр

Скоро лето, и каникулы или отпуск — не за горами. Для тех, у кого появится свободное время, Роберт Диана вместо обычного бездельничества предлагает выучить новый язык программирования.

Роберт собрал 256 языков программирования с соответствующими ссылками на статьи в Википедии. Список представлен в алфавитном порядке. Извиняйте за раритеты и экзотику.

  1. 4th Dimension/4D
  2. ABAP
  3. ABC
  4. ActionScript
  5. Ada
  6. Agilent VEE
  7. Algol
  8. Alice
  9. Angelscript
  10. Apex
  11. APL
  12. AppleScript
  13. Arc
  14. Arduino
  15. ASP
  16. AspectJ
  17. Assembly
  18. ATLAS
  19. Augeas
  20. AutoHotkey
  21. AutoIt
  22. AutoLISP
  23. Automator
  24. Avenue
  25. Awk
  26. Bash
  27. (Visual) Basic
  28. bc
  29. BCPL
  30. BETA
  31. BlitzMax
  32. Boo
  33. Bourne Shell
  34. Bro
  35. C
  36. C Shell
  37. C#
  38. C++
  39. C++/CLI
  40. C-Omega
  41. Caml
  42. Ceylon
  43. CFML
  44. cg
  45. Ch
  46. CHILL
  47. CIL
  48. CL (OS/400)
  49. Clarion
  50. Clean
  51. Clipper
  52. Clojure
  53. CLU
  54. COBOL
  55. Cobra
  56. CoffeeScript
  57. ColdFusion
  58. COMAL
  59. Common Lisp
  60. Coq
  61. cT
  62. Curl
  63. D
  64. Dart
  65. DCL
  66. DCPU-16 ASM
  67. Delphi/Object Pascal
  68. DiBOL
  69. Dylan
  70. E
  71. eC
  72. Ecl
  73. ECMAScript
  74. EGL
  75. Eiffel
  76. Elixir
  77. Emacs Lisp
  78. Erlang
  79. Etoys
  80. Euphoria
  81. EXEC
  82. F#
  83. Factor
  84. Falcon
  85. Fancy
  86. Fantom
  87. Felix
  88. Forth
  89. Fortran
  90. Fortress
  91. (Visual) FoxPro
  92. Gambas
  93. GNU Octave
  94. Go
  95. Google AppsScript
  96. Gosu
  97. Groovy
  98. Haskell
  99. haXe
  100. Heron
  101. HPL
  102. HyperTalk
  103. Icon
  104. IDL
  105. Inform
  106. Informix-4GL
  107. INTERCAL
  108. Io
  109. Ioke
  110. J
  111. J#
  112. JADE
  113. Java
  114. Java FX Script
  115. JavaScript
  116. JScript
  117. JScript.NET
  118. Julia
  119. Korn Shell
  120. Kotlin
  121. LabVIEW
  122. Ladder Logic
  123. Lasso
  124. Limbo
  125. Lingo
  126. Lisp
  127. Logo
  128. Logtalk
  129. LotusScript
  130. LPC
  131. Lua
  132. Lustre
  133. M4
  134. MAD
  135. Magic
  136. Magik
  137. Malbolge
  138. MANTIS
  139. Maple
  140. Mathematica
  141. MATLAB
  142. Max/MSP
  143. MAXScript
  144. MEL
  145. Mercury
  146. Mirah
  147. Miva
  148. ML
  149. Monkey
  150. Modula-2
  151. Modula-3
  152. MOO
  153. Moto
  154. MS-DOS Batch
  155. MUMPS
  156. NATURAL
  157. Nemerle
  158. Nimrod
  159. NQC
  160. NSIS
  161. Nu
  162. NXT-G
  163. Oberon
  164. Object Rexx
  165. Objective-C
  166. Objective-J
  167. OCaml
  168. Occam
  169. ooc
  170. Opa
  171. OpenCL
  172. OpenEdge ABL
  173. OPL
  174. Oz
  175. Paradox
  176. Parrot
  177. Pascal
  178. Perl
  179. PHP
  180. Pike
  181. PILOT
  182. PL/I
  183. PL/SQL
  184. Pliant
  185. PostScript
  186. POV-Ray
  187. PowerBasic
  188. PowerScript
  189. PowerShell
  190. Processing
  191. Prolog
  192. Puppet
  193. Pure Data
  194. Python
  195. Q
  196. R
  197. Racket
  198. REALBasic
  199. REBOL
  200. Revolution
  201. REXX
  202. RPG (OS/400)
  203. Ruby
  204. Rust
  205. S
  206. S-PLUS
  207. SAS
  208. Sather
  209. Scala
  210. Scheme
  211. Scilab
  212. Scratch
  213. sed
  214. Seed7
  215. Self
  216. Shell
  217. SIGNAL
  218. Simula
  219. Simulink
  220. Slate
  221. Smalltalk
  222. Smarty
  223. SPARK
  224. SPSS
  225. SQR
  226. Squeak
  227. Squirrel
  228. Standard ML
  229. Suneido
  230. SuperCollider
  231. TACL
  232. Tcl
  233. Tex
  234. thinBasic
  235. TOM
  236. Transact-SQL
  237. Turing
  238. TypeScript
  239. Vala/Genie
  240. VBScript
  241. Verilog
  242. VHDL
  243. VimL
  244. Visual Basic .NET
  245. WebDNA
  246. Whitespace
  247. X10
  248. xBase
  249. XBase++
  250. Xen
  251. XPL
  252. XSLT
  253. XQuery
  254. yacc
  255. Yorick
  256. Z shell

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

via

Update от bazzilic: полный список 668-ми языков программирования на Википедии.

Update2: если у кого затруднения с открытием всех 256-ти/668-ми ссылок, недавно писал как эту проблему можно автоматизировать.

habr.com

Язык программирования — ПИЭ.Wiki

Материал из ПИЭ.Wiki

Язык программирования (programming language) - формализованный язык, предназначенный для описания программ и алгоритмов решения задач на ЭВМ. Языки программирования являются искусственными; в них синтаксис и семантика строго определены, поэтому они не допускают свободного толкования выражения, что характерно для естественного языка. Языки программирования разделяются на две основные категории: языки высокого уровня и языки низкого уровня.

Эволюция языков программирования

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

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

Поколения Языки программирования Характеристика
Первое Языки машинных команд (ЯМК) Ориентированы на использование в конкретной ЭВМ, сложны в освоении, требуют хорошего знания архитектуры ЭВМ
Второе Ассемблеры, Макроассемблеры Более удобны для использования, но по-прежнему машинно-зависимы
Третье Языки высокого уровня Мобильные, человеко-ориентированные, проще в освоении
Четвертое Непроцедурные, объектно-ориентированные, языки запросов, параллельные Ориентированы на непрофессионального пользователя и на ЭВМ с параллельной архитектурой
Пятое Языки искусственного интеллекта, экспертных систем и баз знаний, естественные языки Ориентированы на повышение интеллектуального уровня ЭВМ и интерфейса с языками

ЯП первого поколения представляли собой набор машинных команд в двоичном (бинарном) или восьмеричном формате, который определялся архитектурой конкретной ЭВМ. Каждый тип ЭВМ имел свой ЯП, программы на котором были пригодны только для данного типа ЭВМ. От программиста при этом требовалось хорошее знание не только машинного языка, но и архитектуры ЭВМ.

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

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

Третье поколение ЯП начинается с появления в 1956 г. первого языка высокого уровня - Fortran, разработанного под руководством Дж. Бэкуса в фирме IBM. За короткое время Fortran становится основным ЯП при решении инженерно-технических и научных задач. Первоначально Fortran обладал весьма ограниченными средствами обеспечения работы с символьной информацией и с системой ввода-вывода. Однако постоянное развитие языка сделало его одним из самых распространенных ЯВУ на ЭВМ всех классов - от микро- до супер-ЭВМ, а его версии используются и для вычислительных средств нетрадиционной параллельной архитектуры.

Вскоре после языка Fortran появились такие ныне широко известные языки, как Algol, Cobol, Basic, PL/1, Pascal, APL, ADA, C, Forth, Lisp, Modula и др. В настоящее время насчитывается свыше 2000 различных языков высокого уровня.

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

Второй тенденцией развития ЯП четвертого поколения являются объектно-ориентированные языки, базирующиеся на понятии программного объекта, впервые использованного в языке Simula-67 и составившего впоследствии основу известного языка SmallTalk. Программный объект состоит из структур данных и алгоритмов, при этом каждый объект знает, как выполнять операции со своими собственными данными. На самом деле, различные объекты могут пользоваться совершенно разными алгоритмами при выполнении действий, определенных одним и тем же ключевым словом (так называемое свойство полиморфизма). Например, объект с комплексными числами и массивами в качестве данных будет использовать различные алгоритмы для выполнения операции умножения. Такими свойствами обладают объектно-ориентированные Pascal, Basic, C++, SmallTalk, Simula, Actor и ряд других языков программирования.

Третьим направлением развития языков четвертого поколения можно считать языки запросов, позволяющих пользователю получать информацию из баз данных. Языки запросов имеют свой особый синтаксис, который должен соблюдаться, как и в традиционных ЯП третьего поколения, но при этом проще в использовании. Среди языков запросов фактическим стандартом стал язык SQL (Structured Query Language).

Четвертым направлением развития являются языки параллельного программирования (модификация ЯВУ Fortran, языки Occam, SISAL, FP и др.), которые ориентированы на создание программного обеспечения для вычислительных средств параллельной архитектуры (многомашинные, мультипроцессорные среды и др.), в отличие от языков третьего поколения, ориентированных на традиционную однопроцессорную архитектуру.

К интенсивно развивающемуся в настоящее время пятому поколению относятся языки искусственного интеллекта, экспертных систем, баз знаний (InterLisp, ExpertList, IQLisp, SAIL и др.), а также естественные языки, не требующие освоения какого-либо специального синтаксиса (в настоящее время успешно используются естественные ЯП с ограниченными возможностями - Clout, Q&A, HAL и др.).

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

Задача Примеры языков
Задачи искусственного интеллекта Lisp, Prolog, Multilisp, Commonlisp, Рефал, Planner, QA4, FRL, KRL, QLisp
Параллельные вычисления Fun, Apl, Alfl, PARAlfl, ML, SML, PPL/1, Hope, Miranda, Occam, PFOR, Glypnir, Actus, параллельный Cobol, ОВС-ЛЯПИС, ОВС-Мнемокод, ОВС-Алгол, ОВС-Фортран, PA(1), PA(G)
Задачи вычислительной математики и физики Occam, PFOR, Glypnir, Actus,параллельный Cobol, ОВС-ЛЯПИС, ОВС-Мнемокод, ОВС-Алгол, ОВС-Фортран, PA(1), PA(G)
Разработка интерфейса Forth, c, C++, Ассемблер, Макроассемблер, Simula-67, OAK, Smalltalk, Java, РПГ
Разработка программ-оболочек, разработка систем Forth, c, C++, Ассемблер, Макроассемблер, Simula-67, OAK, Smalltalk, Java, РПГ
Задачи вычислительного характера Algol, Fortran, Cobol, Ada, PL/1, Фокал, Basic, Pascal
Оформление документов, обработка больших текстовых файлов, организация виртуальных трехмерных интерфейсов в Интернете, разработка баз данных Perl, Tcl/Tk, VRML, SQL, PL/SCL, Informix 4GL, Natural, DDL, DSDL, SEQUEL, QBE, ISBL

Литература

  1. Воройский Ф.С. Информатика. Новый систематизированный толковый словарь-справочник (Введение в современные информационные и телекоммуникационные технологии в терминах и фактах). - 3-е изд., перераб. и доп. - М.: ФИЗМАТЛИТ, 2003. - 760 с. ISBN 5-9221-0426-8
  2. Голицына О.Л., Попов И.И. Основы алгоритмизации и программирования: Учеб. пособие. - М.:ФОРУМ: ИНФРА-М. 2004. - 432 с. - (серия "Профессиональное образование") ISBN 5-8199-0046-4 (ФОРУМ), ISBN 5-16-000992-2 (ИНФРА-М)

wiki.mvtom.ru

Qi (язык программирования) — Циклопедия

Логотип языка программирования Qi

Qi (произносится «чи») — функциональный язык программирования, близкий к Common Lisp, но отличающийся от него возможностью использовать статическую типизацию (как в Haskell или C++), сопоставление с образцом и другие преимущества современных декларативных языков.

Qi написан на Лиспе и поверх него (используя его богатые возможности метапрограммирования)[1] и разрешает использовать функции базового языка[2].

Язык принципиально разрабатывается как экспериментально-образовательный, создатель языка не прилагает никаких особых усилий к его популяризации, в следствие чего уступает, к примеру, такому «новому лиспу» как Clojure[3].

[править] Наименование и логотип

Наменование Qi — это английское написание того, то известно у нас как жизненная сила Ци (气,氣). Логотип Qi в 2007 году разработал Ли Ша (англ. Xah Lee, настоящее имя Ли Шаван, 李杀网). По его собственным словам он основывался на традициях китайской каллиграфии. Лямбда окрашена в цвет тёмной киновари, традиционный цвет даосских храмов. Авторские права на логотип переданы создателю языка Qi Марку Треверу[4].

Автор языка — Марк Тарвер, в настоящее время — профессор в отставке. Qi был создан им как часть проекта L21, цель которого — улучшение Лиспа для решения проблем 21 века. В своём докладе[5] Тарвер излагает проблемы Лиспа, которые, как он утверждает, наносят ущерб широкому распространению языка. Конкретно, он обозначает отсутствие в Common Lisp паттерн матчинга, несоответствия с теорией лямбда-исчисления и отсутствие статической типизации. Эти недостатки, по утверждению Тарвера, привели к отказу от Лиспа при обучении в университетах и, как следствие, к отсутствию Лисп-программистов.

Язык был представлен сообществу в Апреле 2005 года. Первая версия распространялась под лицензией GPL. В конце 2008 года была выпущена пересмотренная версия Qi II. Лицензия GPL была заменена двойной лицензией, позволяющей как Open Source, так и закрытое коммерческое использование[6]. Среди нововведений Qi II можно, в частности, отметить ленивое вычисление (по требованию)[7].

В августе 2009 года Марк объявил, что он прощается с программированием и уезжает в Индию заниматься йогой[8]. Однако в декабре того же года он вернулся в Англию и заявил, что «фаза путешествий закончилась».

[править] Shen

Логотип языка программирования Shen

В том же году Тарвер на европейской лисп-конференции (European Conference on Lisp) представил доклад «The Next Lisp»[9]. В качестве основной проблемы языка Qi им была названа зависимость от Коммон Лиспа. Поэтому следующая версия языка, появившаяся в ноябре 2011 года, названная уже Shen (что по-китайски означает «душа») реализована уже поверх минималистиного виртуального лиспа, подобного Lisp 1.5, разработанному Джоном МакКарти. Этот минимальный лисп сначала назывался Kernel Lisp а затем получил название KLambda.

Shen был портирован на CLisp, SBCL, ECL, Scheme, Clojure, JavaScript и Java. Лицензия Shen является копилефтной и позволяет свободно использовать и модифицировать код языка, до тех пор, пока спецификация языка остаётся неизменной, не допускается распространять производные копии, которые не соответствуют стандарту Shen и/или имеют другие названия[10]. Одним из важных нововведений этого языка стало появление собственной макросистемы[11].

Ядро Qi — это основано на Лиспе. Для функции также используется префиксная запись. Hello World на Qi выглядит так:

(output "Hello, world~%")

Списки создаются при помощи квадратных скобок [ … ] с пробелами, разделяющими элементы.

[76 trombones]

Функция вычисления факториала с использованием сопоставления с образцом:

(define factorial 0 -> 1 N -> (* N (factorial (- N 1))))

Лямбда функция, умножающая аргумент на 2:

(/. X (* X 2))

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

(define member _ [] -> false X [X | _] -> true X [_ | Y] -> (member X Y))

В состав языка также включена полноценная реализация Пролога Qi Prolog, реализованная как библиотека на Qi.

В языке Shen сопоставление с образцом возможно также для строк и векторов[12].

Функция, использующая охрану при нахождении первого числа, большего чем N, в списке:

(define find_greater N [] -> (error "no number greater than ~A.~%" N) N [M | _] -> M where (> M N) N [_ | Ns] -> (find_greater N Ns))

[править] Статическая типизация

Статическая типизация необязательна и включается командой (tc +), а выключается (tc -). Система типов распознает знаки, переменные, строки, логические значения, числа и символы в качестве примитивных типов. Операторы примитивных типов: списки, *(умножение), --> и массивы.

cyclowiki.org

Как я нашел лучший в мире язык программирования. Часть 2 / Хабр

Первая часть здесь. Продолжение:

Семь долбаных лет я ждал язык, который хоть как то ответит части моих желаний. За это время, и в фоновом режиме я препробывал всё. Всё — означает, всю херню общего назначения, и всю херню не совсем общего назначения. Нельзя прочувствовать язык только что-то прочитав про него и написав Hello World. Чтобы понять — надо хоть немного попрограммировать — написать какую нить вещь. И вот все это время, я в минуты отчаянья качал какой-нить “замечательный язык”, и пытался что-то написать. Какие-то вещи даже до сих пор крутятся в конторе (или крутились).

Clojure

Делал всякую мелочевку, типа REST-сервер лицензий на Clojure, которую после отложил. Вердикт: Clojure — функциональный PHP. Чувства (эмоции) при программировании такие же как при программировании на PHP. Иногда положительные (особенно в начале), ровно как от многих языков с динамической типизацией: хоп-хоп и в продакшен, все красиво и работает, код довольно элегантный, если глаза натренировать на распознавание скобочек. В общем отношение у меня сформировалось такое же как к PHP, если мне нужно нахерачить какую нить страничку на сервере, показывающую что-нибудь коллегам из БД — я возьму PHP, нет ничего лучше решить такую задачу быстро и надежно. Что-то более сложное — кранты. Требует большой головы, какой-то культуры производства, инструментов/процессов и так далее. А далее все хуже и хуже.

Я ни в коем случае не скажу что Clojure — плохо. Rich Hickey (создатель Clojure) — голова, концепции в Clojure (PDS, STM) просто прекрасны, но они мало имеют отношения к языку и могут быть реализованы везде. Ну а отбросив концепции — это Lisp, и у меня к счастью нет бороды писать на Lisp в 2015 году. Некоторые на Clojure как и на PHP пишут действительно большие, сложные, а на Clojure и восхитительные вещи (один Datomic чего стоит), но опять же, динамическая типизация мне не интересна. Это все для людей с большим модулем памяти в башке. Короче новая модель Фольксваген Жук — можно съездить в клуб, но для Camel Trophy бесполезен.

Scala

Scala — к ней я возвращался несколько раз и несколько раз бросал. Я прекрасно понимаю чем Scala привлекает неопытную молодежь (а она в основном и хочет Scala). Привлекает несколькими вещами:

  • Ореолом элитности: действительно прогресс в Scala делают умнейшие ребята, типа дураки на Scala не пишут, и если ты пишешь на Scala, то типа ты умный. Оп, ребята, программирование — это не учеба в университете, ты не будешь более “умным” программистом, чем сложнее заморочку ты решишь.
  • Сложностью: наверно многие из Scala-фанатов и любителей не осознают, да и не способны сформулировать что их привлекает в сложности. Подсознательно кто-то думает, что сложность == мощь. Типа чем сложнее тем мощнее. Это естественно для обывателя (а я сейчас пишу в основном про класс программистов-обывателей). Тех кто еще толком ничего в своей жизни не напрограммировал (да и показать нечего). Естественная реакция взять какой нить инопланетный автомат с сотней рычагов и кнопок, как в кино — такая штука походу должна замочить всех вокруг, с их примитивным оружием. Беда в том что обывателю не сказали, о том что это типа-оружие сделано было не для того чтобы замочить всех вокруг, а для того чтобы там все как внутри элегантно и красиво двигалось/цеплялось, да по науке. Но вообще направление мысли верное: любому математику известно, что абсолютная сложность задачи не меняется, а вот решение может быть как простым так и сложным, простое решение сложной задачи (в одну строчку) может быть когда мы перекладываем сложность задачи на уже решенные вещи (теоремы). То есть очень сложную задачу можно просто решить переиспользуя сложные решения. В нашем случае компилятор должен брать на себя как можно больше сложности упрощая решение. Компилятор Scala безусловно сложен, но есть проблема — язык в котором эта сложность выражается. Пользоваться таким языком безумно сложно (я сейчас далеко не про тот кейс, когда Scala пользуют как “улучшенную” Java — эта в раздел ореол элитности).

Что далеко ходить, последний раз я возвращался к Scala неделю назад. Язык мне надо было выбрать “еще вчера”, и я, каюсь, решил что Scala была бы минимальным злом. Наличие ScalaJS и относительно богатые возможность метапрограммирования (читай макросы), дали мне надежду что можно вырулить. К тому же какой то хипстер из EPFL начал за меня решать некоторые проблемы c off-heap data structures, озвученные в первой части статьи.

В общем я глубоко вздохнул и сказал коллеге: “Короче, походу будем мы писать Next Big Thing на Scala. Вот ребята то охереют — я тут годами на Scala гнал а сейчас такой опаньки: концепция изменилась…”. Настроившись на позитив, начал пытаться что-нибудь напрограммировать. Сразу скажу знаний Scala и опыта у меня близко к нулю, что я компенсирую знаниями и опытом по-жизни. Сразу было понятно что мне нужны Type Classes, ну и я давай глядеть в Интернет. Сразу натыкаюсь на некую, да простят меня фанаты Scala, либу shapeless, от Miles Sabin.

Кратенько отступая, этого типа Майлза я не люблю с момента нашей первой и последней встречи. Дело было на EclipseCon 2009 (or so). Стою я нажратый пивом на стенде, тут подходит этот перец, я тут типа Miles Sabin, пишу Eclipse-based IDE для Scala, хочу значит перетереть с программистами DLTK за пацанские вещи (а он в своей Scala IDE JDT нагибал, в общем какой то странной херней маялся, и IDE у него была — гавно. Как я понимаю TypeSafe свою потом написал — но я ее не глядел). Ну так вот, говорит мне этот Miles типа где тут программисты? Я ему ну я программист, можешь со мной поговорить. А я как бы в те времена выглядил так что на программиста совсем не был похож, скорее на подсобного рабочего. Ну и вот Miles говорит, типа ты мне не нужен, программистов давай. Сука :) Но я не стал ему объяснять что типа я DLTK Project Lead, и более того в курсе того что он никогда свою IDE нормально не сделает потому как не туда полез, но не стал. Отправил его Лехе Панченко, и пошел дальше бухать с пацанами… В общем мир тесен.

Ну вот, нагугливаю я, значит, этот shapeless (а нужны мне type classes). Документации, как и полагается элите у них нет, и в первом абзаце сразу ссылки на четыре научные статьи. Дальше написано как им помочь, куда контрибутить и как скомпилячить. И пипец. Ну давай я дальше гуглить — есть видосы от этого Miles где он про свое чудо рассказывает. По 40-45 минут, про то, что в основе shapeless лежит его волшебное изобретение под названием HList. И это типа главная фишка, которую он мутил последние годы, и она почти заработала, а потом в Scala добавили макросы и он свою фишку (HList) переделал и теперь этот HList более кайфов, чем старый HList. Мутил он ее реально долго, с хЕровой тучей кода, который в основном выглядит вот так:

object IsHCons1 { type Aux[L[_], FH[_[_]], FT[_[_]], H0[_], T0[_] <: HList] = IsHCons1[L, FH, FT] { type H[t] = H0[t] ; type T[t] = T0[t] } def apply[L[_], FH[_[_]], FT[_[_]]](implicit tc: IsHCons1[L, FH, FT]): Aux[L, FH, FT, tc.H, tc.T] = tc implicit def mkIsHCons1[L[_], FH[_[_]], FT[_[_]]]: IsHCons1[L, FH, FT] = macro IsHCons1Macros.mkIsHCons1Impl[L, FH, FT] } Это вообще чо? Это для кого? Это для людей или нет? Не предлагаете ли вы мне вот такое писать каждый день, да сотнями строк и остаться в здравом уме, или это для илиты, а мы, приземленные практики будем это ваше пользовать?

Что делать дальше, после того как слушатель познал HList он рассказать все три раза не успевает, отсылая к его воркшопам, видосам и курсам, которые мы все можем приобрести за деньги. Я вообще не против приобрести знания за деньги, но:

Чувак убил годы на то, чтобы люди убивали недели и месяцы чтобы сука сослаться на тип, и понять тип значения в рантайме, ну и при желании что-то там намутить на стадии комплияции (типа узнать размер коллекции), причем для того чтобы это сделать, нужно хорошо так вынести себе мозг, и нахерачить код типа того что я привел выше. Я конечно глубоко не вникал, может этот shapeless на который надо убить тучу времени (и который видимо далеко не самая навороченная библиотека Scala мира) делает что то там еще полезное, но у меня нет слов — люди делают про это какие-то толки на конфах, воркшопы, презы на 56 страниц типа Demystifying Shapeless. И все это зачем? Чтобы выковырять тип значения во время компиляции, братан.

Бебать, да я в 95 программировал на Delpi и у меня все это сразу было. Я ничего не знал про Polymorphic typed λ-calculus, да и сейчас ничего не знаю, но вот цимус в том что и без знаний любой школьник на дельфи, напишет такой HList за 10 минут, и тип в рантайме познает, и сошлется на него, и сравнит и хрен знает что еще. И даже не задумается как все это сделать. Если бы в Delph были макросы, и генерики — я уверен в том, что школьники писали бы точно такие же либы как и вся эта элита пишет на Scala, но только на порядки быстрее, чем эти дяди, и даже не задумывались, о том что им нужны structural refinement types и прочая лабуду (правда что-ли нужны?). Жизнь мне это подтвердила, о чем позже. Да, кстати работал бы этот школьный код в продакшене тоже на порядки быстрее — старая школа в Borland умела делать вещи.

В общем резюме по Scala такое — чуваки решили скрыть в инструменте сложность решаемых задач, заменив ее сложностью использования инструмента. Что в результате оказалось сложнее — хер его знает, по мне так сложность программирования на Scala сильно превышает бенефиты от ее использования. По аналогии с машинами — это первая версия Google-мобиля. Провода, вся херня, камеры надо развесить, пропатчить все нахер, ну и иногда можно отпустить руль, но с приборов глаз не спускать. А если что-то сломалось, то пока за день не разберешься чтобы поехать дальше. Ага, и глохнет когда красный шар видит. В топку.

Прощай любимый мир JVM, я не нашел чего искал

Короче в JVM-based историях я порылся, любимый мной Fantom меня не устраивал по ряду причин, периодически заглядывал в Ceylon и Kotlin. Все истории с динамической типизацией тоже отметаем (только не советуйте мне core.typed). Опять же от разочарования задумывался глянуть TeaVM, что расширило бы список кандидатов но не дошел, поскольку кандидатов не видел. Короче все это вещи одного класса — такие Ford Focus языков программирования, ездят в пробках хорошо, но вау не скажешь.

Не найдя ничего в JVM мире я пустился во все тяжкие. Потрогал сука все, что хоть как то на слуху и даже то что совсем не на слуху. Из понравившихся мне малоизвестных — Clay. У него был потенциал, как мне кажется. Достойный язык — такая статически типизированная версия Julia. Создатели язык забросили, как я понял один из авторов сейчас в Apple и имеет какое то отношение к Swift.

Но сегодня написать про это я не успеваю. До следующей части.

habr.com

10 языков программирования, которые больше никому не нужны

Зарождением языков программирования принято считать девятнадцатый век. Тогда английский математик Ада Лавлейс описала алгоритм первой в мире программы для вычисления чисел Бернулли на аналитической машине Чарльза Бэббиджа. В случае успешной реализации этого алгоритма на практике мы бы получили первый компьютер на паровом двигателе уже в 1840-х годах, однако история повернулась несколько по-другому.

С тех пор компьютеры стали работать на электричестве, а чтобы написать первый в мире высокоуровневый язык программирования, потребовалась без малого сотня лет - мы говорим о языке “Планкалкюль”, компилятор к которому появился лишь через полвека. 

Сейчас языки развиваются гораздо быстрее: то, что было популярно в среде программирования 20-30-40 лет назад, сейчас абсолютно устарело. Мы хотим вспомнить самые известные языки, которые сейчас утратили свою популярность.

Fortran

Fortran (Formula Translator) был самым первым высокоуровневым языком программирования, успешно применяемым на практике - вышеупомянутый “Планкалкюль” на момент появления Фортрана еще не имел собственного транслятора.

Очень быстро Fortran стал популярен среди научного сообщества, поэтому за несколько лет были созданы пакеты по вычислениям во многих математических дисциплинах. Именно поэтому в ученой среде этот язык популярен и до сих пор. В СССР о нем узнали немногим позже, но зато именно здесь разработали графическое расширение ГРАФОР, а советский популяризатор науки А. Зарецкий опубликовал “Энциклопедию профессора Фортрана”, объяснявшую детям основы компьютерной грамотности.

Язык до сих пор обновляется и обзаводится современными стандартами. Так, например, у Фортрана появилась поддержка ООП и совместимость с языком С.

Algol

Algol (Algoritmic Language) стал этаким европейским конкурентом Фортрана. В Америке на тот момент не было нормальных компиляторов Алгола - производитель компьютеров IBM тратил огромное количество ресурсов на продвижение Fortran.

Разработчики никак не могли условиться с синтаксисом: в США разделителем целого и дробного числа была точка, а в Европе - запятая. Зато в СССР с Algol было все замечательно. Были и собственные трансляторы, и широкое признание во многих организациях на советском пространстве. Именно в Алголе появилась блочная структура данных, предполагающая наличия основной программы и второстепенных подпрограмм. Так или иначе, Algol и его модификации оказали большое влияние на разработку последующих языков программирования, в том числе и очень популярного Pascal.

Basic

Basic (Beginner's All-purpose Symbolic Instruction Code) приобрел широкое распространение ввиду своей максимальной простоты. Он предназначался для создания программ для повседневных задач людьми, не имеющими профильного образования - этому способствовал рост доступности компьютеров в 60х годах прошлого века.

Особенно, кстати, этот простой язык пришелся на машине Altair, на которой было очень мало памяти для разработки ПО громоздкими Фортраном или Алголом. С Бейсиком и Альтаиром связано становление компании Microsoft как успешного производителя софта - написанный Биллом Гейтсом и Полом Алленом Altair Basic обеспечил прибыль будущей корпорации вплоть до появления MS-DOS.

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

Turbo Pascal

Паскаль (прототипом которому послужил Алгол) - наиболее известный широкому кругу обывателей язык. В основном благодаря тому, что его изучают на уроках информатики в старших классах средней школы. Turbo Pascal - диалект языка Паскаль производства фирмы Borland, который благодаря отличной рекламной кампании получил массовое распространение и принес огромные доходы разработчику.

Хвалить именно эту среду разработки было за что: профессионалы отмечали крайне привлекательную цену и качественный встроенный компилятор, а новички радовались обширной справочной информации, поставляемой в комплекте. Со временем язык обзавелся процедурными типами и возможностями ООП и довольно быстро перерос в не менее популярное детище Borland - Delphi.

Cobol

В сфере бизнеса и финансов был свой, отдельный язык программирования. Cobol (Common business oriented language) отличался прекрасным инструментарием для работы со структурами данных и файлами - по сути, именно поэтому он долгое время использовался в бизнес-приложениях.

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

Ada

Ada получила свое название в честь той самой Ады Лавлейс, великого математика и первого в мире программиста. Этот язык был создан в конце семидесятых для бортовых систем военных объектов Пентагона. За пределы военной ниши у Ады выбраться не получилось как минимум по двум причинам.

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

Сейчас язык Ада (да, в русском сегменте интернета ходит бородатый анекдот на эту тему) изучается всего в нескольких учебных заведениях России, однако спрос в индустрии на него крайне невелик. Даже несмотря на то, что последние версии этой среды разработки поддерживают современные возможности ООП.

LISP

LISP (List Processor) был создан Массачусетским Технологическим Университетом для решения задач по работе над искусственным интеллектом. Один из его диалектов был использован в весьма успешном, но, увы, тупиковом проекте по созданию разумной машины SHRDLU. Здесь ИИ смог отличать одни блоки от других и определять их содержимое, однако на понимание более сложных задач ресурсов системы не хватало.

Так или иначе, производные LISP используются для автоматизации процессов в AutoCAD, GIMP, а также при создании видеоигр. Для ЛИСП-программ даже были созданы специальные компьютеры, обеспечивающие очень большие вычислительные мощности - однако ПК общего назначения очень быстро догнали и перегнали по функционалу эти некогда перспективные машины.

Prolog

В логическом программировании самым распространенным языком был Prolog (фр. Programmation en Logique). Основная особенность софта на основе этого языка в том, что он производит вычисления в виде значений “истина” или “ложь”, обращаясь при этом к собственной базе данных.

Так, например, Пролог используется в IBM Watson - суперкомпьютере с системой исскуственного интеллекта “вопрос-ответ”, который выиграл главный приз в телевизионной викторине. Впрочем, при создании такой машины использовались еще и Java, и С++, так как Пролог не совсем подходит для создания очень сложных вычислительных систем - как минимум, из-за неудобного контроля результатов промежуточного кода.

PL/1

Долгое время у бухгалтеров был своеобразный стандарт - Cobol, который, пусть и был весьма распространенным языком, но предоставлял недостаточно широкий набор функций для поставленных задач. Так появился PL/1 (Programming Language 1): он содержал такой богатый набор возможностей, что компилятора, который поддерживал бы весь набор функций, до сих пор не существует.

Также PL/1 должен был объединить ученых, использующих Fortran, и финансистов на Cobol вместе, однако это у него не особо получилось. В основном из-за своей необычайной сложности и трудности реализации подходящего компилятора. PL/1 использовался в мейнфреймах многих компаний, однако с развитием Фортрана и Кобола перестал быть популярным - в последних версиях аналогов были реализованы все особенности, ради которых пригодился бы PL/1.

J#

С распространением .NET Framework Microsoft решила перетащить пласт разработчиков Java в свой лагерь - для этой цели и был выпущен J#. Получилась ни рыба ни мясо: J# не был полноценным Java-языком, а лишь имел в наличии похожий синтаксис.

В то же время для поддержки .NET ему требовалось наличие дополнительных “костылей” -  специальных библиотек, что еще больше затрудняло работу с ним. Проще говоря, из-за неполной совместимости языков для перехода на платформу Microsoft разработчикам было удобнее изучить, например, С#.

Неудобств в таком случае было гораздо меньше. Именно поэтому распространение J# плавно сошло на нет, язык был исключен из пакета Visual Studio, а его поддержка полностью заканчивается в следующем году.

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

www.kv.by

Изобретаем язык программирования для тренировки мозгов. Или эзотерический язык программирования за 5 минут

Изучая вики по эзотерическим языкам я наткнулся на интересный язык программирования Piet. Отличительной особенностью которого является графическое представление программы. Например, эта программа выводит «Hello World!» И показалось мне, что данная программа похожа на QR-Code. Только Piet использует цветовую кодировку. А QR-Code использует комбинацию расположения точек. «Да это же готовая программа» подумалось мне. Разбиваем поле на квадраты, так, чтобы в каждом квадрате поместилось 4 точки. Это дает нам 16 комбинаций. Огромное количество по сравнению с тем же Brainfuck!

Раз комбинаций много, то можно не сдерживать себя в выборе команд ЯП. Далее, смотрим на PATH, и видим, что он как нельзя лучше ложится в основу нового языка. Потому как состоит из 15 команд.

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

Словарь языка.
В скобках указан эквивалент языка PATH

(#) — прекратить выполнение программы.

(+) -увеличить на единицу текущую ячейку памяти.

(-) — уменьшить на единицу текущую ячейку памяти.

(}) — перейти к следующей ячейке памяти.

({) — перейти к предыдущей ячейке памяти.

(,) — ввести символ из стандартного ввода в текущую ячейку памяти.

(.) — напечатать символ из текущей ячейки памяти.

(/) — поменять направление движения указателя в зависимости направления движения:

  1. вправо — начинаем идти вверх
  2. вниз — начинаем идти влево
  3. влево — начинаем идти вниз
  4. вверх — начинаем идти вправо
(\) — поменять направление движения указателя в зависимости направления движения:
  1. вправо — начинаем идти вниз
  2. вниз — начинаем идти влево
  3. влево — начинаем идти вверх
  4. вверх — начинаем идти влево
(^) — если текущая ячейка равна нулю начинаем идти вверх.

(<) — если текущая ячейка равна нулю начинаем идти влево.

(>) — если текущая ячейка равна нулю начинаем идти вправо.

(v) — если текущая ячейка равна нулю начинаем идти вниз.

(!) — перепрыгнуть через ячейку.

— команда, которая ничего не делает, но хорошо заполняет пустое место.

Программа размещается в шаблоне QR-code, который представлен на рисунке ниже.

Здесь зеленым квадратом обозначено поле, где можно безопасно вписывать программу. Размер поля, в принципе не ограничен, но лучше использовать стандартные размеры, принятые в стандарте на QR код. Программа начинает выполняться с места, обозначенного красным квадратом. Оставшееся место в поле программы можно заполнить рандомно чтобы было более похоже на QR-Code.

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

Название языка также составим из частей исходных технологий — QR-PATH.

PS. В данный момент это концепт языка. Интерпретатора не существует.

PPS. В качестве основы можно было взять Data-Matrix. Но QR-коды более узнаваемы, поэтому программа на QR-PATH будет производить более неожиданный эффект.

Update. В комментариях просили написать программу, которая выводит одно и тоже как QR-PATH и как QR-code. Решение представлено здесь Здесь привожу только конечный результат. К сожалению, внедрение программы лортит данные в исходном коде.

Update2. Статью заминусовало приличное количество прочитавших ее. А критических замечаний в комментариях нет. Мне вот интересно, что не понравилось минусующим? Оформление, содержание?

habr.com

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

Количество и многообразие применяемых сейчас языков программирования безмерно. Тем не менее, большинство фирм останавливается на небольшой их подгруппе при решении любых задач программирования. Разработчики неизменно пишут код на испытанным Java, C++, JavaScript, PHP и Ruby.

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

Ceylon 1.0.0

Напоминает: Java (но не является его версией)

Язык программирования Ceylon работает на JVM и Node.js и при этом избавлен от множества наболевших проблем Java. Вместо XML он использует сходный с JSON декларативный синтаксис для данных древовидной структуры, обладает статической типизацией и системой модулей, и поддерживает ряд отсутствующих в Java структур - последовательность, пересечение и объединение.

Clojure 1.6

Напоминает: Lisp

Clojure представляет собой Lisp для JVM, так как он работает на JVM и обладает полным доступом к каркасам и библиотекам Java. Создатели Clojure объявляют язык инструментом для функционального программирования, рассчитанным на параллельность, а значит, он хорошо подходит для многоядерных и распределенных приложений. Clojure лучше всего подойдет программистам с математическим или научным образованием. На поскольку растет парадигма функционального программирования, Clojure заслуживает тщательного рассмотрения за пределами вычислительной науки.

Egison 3.3.3

Напоминает: Lisp

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

Groovy 2.2

Напоминает: Java

Его можно назвать "Java плюс", так как Groovy представляет собой синтаксическое расширение Java, работающее на JVM и использующее библиотечные классы Java. Однако Groovy изобилует возможностями, которых нет в Java: статическая и динамическая типизация, перегрузка операторов, встроенная поддержка регулярных выражений и оператор "?", обеспечивающий безопасную проверку пустых объектов без обертывания выражений в массу синтаксического сахара. Groovy используется на сайтах LinkedIn и Wired, и крупнейшие среды разработки, такие как Eclipse и IntelliJ, теперь поддерживают его.

Hack 1.0

Напоминает: PHP

Facebook уже создал собственную среду выполнения для PHP под названием HHVM, так почему бы не создать новый вариант PHP? Hack, придуманный Facebook, сохраняет быстрый цикл разработки и легкость использования PHP, добавляет статическую типизацию объектов и лямбда-выражения и обеспечивает безопасность и надежность. Большинство существующего PHP кода будет работать в Hack, теоретически упрощая переход с PHP на Hack, но сейчас трудно сказать, завоюет ли Hack  такую же популярность, как PHP.

Jeeves

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

Julia 0.2.1

Напоминает: Python

Julia служит для технических и научных расчетов, базирующихся на распараллеленной и распределенной обработке больших объемов числовых данных. Julia компилируется в машинный код с помощью LLVM-компилятора, и по ряду ключевых контрольных показателей он намного опережает Matlab, Mathematica и R, также разработанных для математики и иных наук. Он поддерживает подобную Lisp функцию макросов для расширения функционала языка. Кроме того, Julia может использовать математические и научные библиотеки Python.

Nimrod 0.9.2

Напоминает: Python, Pascal

Nimrod является императивным языком программирования со статическим контролем типов, дающим программисту максимум возможностей и эффективность при выполнении. Nimrod компилируется в C, C++ или Objective-C и не нуждается в виртуальной машине или среде выполнения. Язык предназначен для системного программирования, поскольку способен напрямую обращаться к оборудованию и включает в себя указатели на очищаемую сборщиком мусора и управляемую вручную память. Язык позволяет определять операторы и макросы, и были написаны привязки для большинства популярных библиотек и сторонних приложений: Windows и POSIX API, GTK2, OpenGL и др.

OCaml 4.01

Большая часть языков программирования относится к одной из трех категорий: функциональная (Lisp), императивная (C) или объектно-ориентированная (Java). OCaml умеет все перечисленное, и некоторые недавние проекты OCaml возмутили спокойствие, включая Hack и Mirage OS от Xen Project. Его статическая типизация не привлечет сторонников динамической типизации, но на него определенно стоит обратить внимание, поскольку вслед за ним идут другие языки: к примеру, F# от Microsoft.

Racket 6.0

Напоминает: Lisp, Scheme

Будучи разновидностью Scheme, являющегося вариантом Lisp, Racket применяется и для создания языков, и для прикладного программирования. В отличие от других Lisp-подобных языков, система макрокоманд Scheme включает в себя сам компилятор, поэтому в язык можно добавлять возможности так, словно они являются собственными конструкциями Racket.

advertisingmedia.ru