Русские языки программирования – Языки программирования, разработанные российскими и советскими программистами: luckyea77 — LiveJournal

Лучший в мире язык программирования / Habr

У каждого программиста есть мечта — создать свой язык программирования. Самый лучший и самый удобный, конечно же — не то что существующие. Лично для меня идеей-фикс было создание языка, в котором совершенно не будет бойлерплейта, который будет максимально краток, но при этом чрезвычайно красноречив. В течение двух лет я делал попытки добиться желаемого результата, но с чего бы я не начинал, в конце концов после отсечения всего лишнего у меня всегда получался Lisp. И тогда мне в голову пришла гениальная мысль — взять Lisp, и усовершенствовать его в соответствие с моими идеями. В честь первой попавшейся мне на глаза вещи, проект был назван Sova.

Чтобы язык из коробки работал и на сервере, и в вебе, и на мобильных платформах я решил сделать компиляцию в Javascript, который по-моему мнению без шуток является одним из лучше всего спроектированных языков нашего времени и что гораздо более важно обладает мощнейшей экосистемой npm, Node.js, React и React Native.

И перед началом нашего путешествия, чтобы сразу вызвать интерес к дальнейшему прочтению статьи, вот вам пример одного файла Express-приложения на Sova:

=-> './database' database =-> 'express' express = application express () application.get '/' -> (request response) (response.sendStatus 200) application.get '/user/:id' -> (request response) (response.send (database.getUserById request.params.id)) application.listen 8080 -> () (console.log 'Application is listening on port 8080')

Ну что ж, начнем...


Шаг 1: Вырываем с корнем скобочки из Lisp с помощью индентации Python


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

Поэтому первым делом в своем чудесном языке я решил избавится от скобочек. Лучшим решением стала имеющая значение индентация, прямо как в Python. Возьмем, к примеру, такой кусок кода на lisp:

(* 2 (+ 1 2) (- 4 (/ 2 1)))

Конечно, это выражение можно разнести по разным строкам, но от забористости из засоряющих глаз скобочек это нас не избавляет.

(* 2
  (+ 1 2)
  (- 4 (/ 2 1)))

А теперь посмотрим, как элегантно и воздушно можно написать это же выражение на Sova с помощью имеющей значение индентации:

* 2
  + 1 2
  - 4 (/ 2 1)

То есть в Sova выражение a (b c) (d (e f)) равнозначно выражению:

a
  b c
  d
    e f

Шаг 2: Делаем язык лаконичным

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


Объявление констант

Возьмем к примеру объявление константы в Javascript:

const a = 1

Sova — язык исключительно функциональный и в нем все переменные иммутабельны, поэтому не нужно указывать дополнительное ключевое слово const, а пишется все просто:

= a 1

Функции

Основным элементом любого языка являются функции. Вот так минималистично они выглядят в Sova:

= addOne -> number
  + number 1

= doubleAndAddOne -> number
  = doubled (* number 2)
  addOne doubled

console.log (doubleAndAddOne 2) 

Как и в любых функциональных языках последнее выражение в теле функции является возвращаемым. То есть код выше в скомпилированном JavaScript будет выглядеть как:

const addOne = number => {
  return number + 1
}
const doubleAndAddOne = number => {
  const doubled = number * 2
  return addOne(doubled)
}
console.log(doubleAndAddOne(2))

Сравнения и условия

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

console.log
  ? true 1 0

console.log
  ? (> 2 1) 'Greater' 'Less'

console.log
  ? (> 2 1)
    ? (> 1 2) 'x' 'y'
    'z'

А вот тут например в функции checkNumber мы возвращаем значения по условию:

= checkNumber -> number
  ? (=== number 1) (<- 'One')
  ? (=== number 2) (<- 'Two')
  ? (<= number 9) (<- 'From three to nine')
  'Ten or more'

console.log (checkNumber 1)
console.log (checkNumber 4)
console.log (checkNumber 11)

В скомпилированном JavaScipt это выглядит как:

const checkNumber = number => {
    if (number === 1) return 'One'
    if (number === 2) return 'Two'
    if (number <= 9) return 'From three to nine'
    return 'Ten or more'
}
console.log(checkNumber(1))
console.log(checkNumber(4))
console.log(checkNumber(11))

Коллекции


Array

Основной коллекцией любого языка является массив. Вот так объявление и деконструкция массива выглядят в Sova:

= list | 1 2 3 4

console.log list
console.log
  list.map (-> x (+ x 1))

= (| first second) list

console.log first
console.log second

В скомпилированном JavaScript это будет выглядеть как:

const list = [1, 2, 3, 4]
console.log(list)
console.log(list.map(x => x + 1))
const [first, second] = list
console.log(first)
console.log(second)

Object

Второй самой важной коллекцией является хешмапа. В Sova объявление и деконструкция мапы выглядит так:

= map :
  a 1
  b 2
  c :
    d 3
    e 4
  f 'Hello'

console.log map

= (: a (c (: d e))) map

console.log a
console.log d
console.log e

В скомпилированном JavaScript это выглядит так:

const map = { a: 1, b: 2, c: { d: 3, e: 4 }, f: 'Hello' }
console.log(map)
const { a, c: { d, e }} = map
console.log(a)
console.log(d)
console.log(e)

Если мы хотим вызвать у объекта метод, то есть два способа это сделать. Мы можем вызвать его как object.method parameter1 parameter2 либо как .method object parameter1 parameter2. Второй способ позволяет нам создавать цепь вызовов методов.


Импорт и экспорт модулей


Импорт

Импортировать в Sova код можно модули как из других .sv файлов, так и из .js файлов. Например, в данном примере, импортируются два модуля — data/index.js и handler/index.sv:

=-> './data' (: greeting name)
=-> './handler' handle

handle greeting name

В скомпилированном JavaScript это выглядит так:

const { greeting, name } = require('./data')
const handle = require('./handler')
handle(greeting, name)

Импорт как JavaScript, так и Sova модулей дает возможность по чуть-чуть внедрять Sova в существующий Javascript проект.


Экспорт

В данном примере, из модуля экспортируется функция:

<-= -> (greeting name)
  console.log greeting
  console.log name

В скомпилированном JavaScript это выглядит так:

module.exports = (greeting, name) => {
    console.log(greeting)
    console.log(name)
}

Примеры использования

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

=-> 'lodash' _

= people |
  : (name 'Alice') (age 24)
  : (name 'Bob') (age 15)
  : (name 'Chris') (age 46)
  : (name 'Daniel') (age 35)
  : (name 'Elisabeth') (age 29)
  : (name 'Fred') (age 52)

= averageAge /
  .reduce (.map people (-> man man.age))
    -> (x y) (+ x y)
    0
  .length people

= manWithClosestToAverageAge _.minBy
  .map people (-> man (: (name man.name) (distance (Math.abs (- averageAge man.age)))))
  'distance'

console.log averageAge
console.log manWithClosestToAverageAge.name

Благодаря тому что язык компилируется в JavaScript, становится возможной разработка под любые платформы. Например, вот небольшой пример React-приложения под веб-браузеры:

=-> 'react' React
=-> 'react-dom' ReactDOM
=-> './styles' styles

= (: createElement:e) React

= App -> ((: name))
  e 'div' (: (style styles.container))
    e 'div' (: (style styles.hello)) 'Hello'
    e 'div' (: (style styles.name)) name

ReactDOM.render (e App (: (name 'John'))) (document.getElementById 'root')

Так же в репозитории есть примеры Express-сервера и React Native приложения под мобильные платформы.


Заключение

Таким образом, язык Sova вобрал в себя лучшее из нескольких других языков:


  • простота и мощь Lisp
  • чистота индентации Python
  • рантайм и экосистема JavaScript

Код компилятора с примерами использования языка лежит тут https://github.com/sergeyshpadyrev/sova. Буду рад увидеть звезды на репозитории от всех тех, кому понравилась концепция языка и кто хотел бы, чтобы работа над ним продолжилась. Но сразу предупрежу, что пока что это исключительно proof of concept, и даже поиграться с языком из-за отсутствия документации и некоторых возможностей крайне трудно. Например, в языке пока что отсутствует обработка исключений, классы и другие необходимые вещи. И под Windows запустить его вряд ли получится.

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

Изучите все языки программирования / Инфопульс Украина corporate blog / Habr

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

— Что, даже на том нечитаемом эзотерическом языке, где есть всего пара команд, которые едва-едва симулируют машину Тьюринга?
— Да, этот язык называется brainfuck. Я знаю brainfuck.

И это был не трюк — мы проверили. Я называл известный мне язык программирования, он тратил пару минут в Интернете на то, чтобы освежить свои знания по нему — и был способен писать на этом языке работающие алгоритмы. Я никак не мог понять этого. Ему, как и мне, было тогда около 18 лет — как он мог в этом возрасте знать все эти языки?


Интерпретатор brainfuck, написанный на brainfuck

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

Сегодня я советую своим студентам «постараться изучить все языки программирования». Подумайте сами — ведь эта идея лучше, чем все вот эти «В этом году я выучу Go! Ой, нет, теперь говорят что в моде Rust — выучу лучше Rust! Или Swift ...». Просто выучите все — не ошибётесь. А эта статья, возможно, вам в этом немного поможет.

И сразу — отказ от ответственности 🙂


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

Тогда зачем этим заниматься?


Если вы видите какую-то значительную часть своей карьеры связанной с написанием программного обеспечения, то вам неплохо бы быть знакомым с языками программирования:
  • Даже не выбирая каких-то определённых языков программирования (или выбрав всего один) через пару лет работы программистом вы обнаружите, что уже писали (или читали) код на нескольких языках. Так почему-то случается всегда
  • Вы обнаружите, что имея знания о нескольких языках программирования, вам захочется каждый раз иметь возможность выбирать один из них для решения тех или иных задач
  • Языки программирования расцветают и устаревают. Знания нескольких из них дают вам возможность оставаться на острие прогресса, иметь доступ к более интересным проектам или хорошим компаниям
  • Многие важные проекты требуют фундаментального понимания работы компиляторов и знания нескольких языков программирования. Это реализации средств разработки, стандартных библиотек, предметно-ориентированные языки, IDE, браузеры, базы данных, средства статического анализа, и т.д.

Лично мне очень важным кажется именно последний пункт. Ras Bodik хорошо подчеркнул этот момент в своей лекции студентам Беркли, когда объяснял важность изучения курса разработки компиляторов:
Не будьте разработчиками шаблонного ширпотребного софта. Вместо этого, постарайтесь разрабатывать новые инструменты для пользователей и других программистов. Если провести историческую аналогию, то кем бы вам больше хотелось быть: работником за ткацким станком, ежедневно выполняющим рутинные операции или разработчиком новых моделей таких станков?

Шаг номер 0: перестаньте называться себя «программист на Rails (подставьте свой язык\платформу)»


Это простой, но важный шаг. Да, у вас наверняка уже есть какая-то специализация и вы, возможно, гордитесь ею и продолжаете её совершенствовать — это хорошо. Но в то же время такая самоидентификация создаёт ментальный барьер в вашей голове. Каждая новая технология, каждый новый язык воспринимается с оттенком скепсиса или критики, а возможно и пренебрежения — и это уже плохо. Начните называть себя просто «инженер по разработке программного обеспечения» или «программист».

Примером может быть Alex Gaynor — большой специалист по Python, один из Core Developers таких вещей как Django и PyPy, член совета директоров Python Software Foundation. Но однажды его попросил о помощи United States Digital Service — и Алекс провёл несколько лет в проектах на ASP (даже не на ASP.NET, а на том, старом ASP). А знаете, почему? Потому, что он — «инженер по разработке программного обеспечения», а не «Python-разработчик».

Шаг номер 1: перейдите на мета-уровень


Есть такой старый анекдот о том, как прикладной физик случайно попал на конференцию теоретических физиков. Он обратился к одному из докладчиков и спросил, как ему вообще удаётся думать о всех этих вещах, происходящих в 11 измерениях? Теоретический физик ответил: «О, это просто. Просто представь N измерений, а потом зафиксируй N равным 11».

Хороший программист может использовать тот же трюк. Вы можете слушать все эти россказни маркетологов о том, что «Go — это новый и амбициозный язык программирования», а можете просто определить его для себя, как компилируемый статически типизируемый язык со сборщиком мусора и CSP-стилем конкурентности. Swift может быть «новым и тщательно спроектированным» ну или просто компилируемым мультипарадигменным языком общего назначения реализованным на базе LLVM.

Для тех, кто никогда не имел возможности пройти курс изучения компиляторов, я могу посоветовать несколько отличных книг и онлайн-материалов. Во-первых, это курс от Alex Aiken, который когда-то был доступен на Coursera, а теперь — на собственной платформе Стенфорда (Lagunita). Неплох и курс от Беркли — CS164. Правда, они перестали публиковать в открытом доступе его обновления, но материалы 2012 вроде бы ещё доступны.

Каноническая настольная книга о компиляторах: «Compilers: Principles, Techniques & Tools». Она же — Книга Дракона. Как и все книги такого уровня, она имеет как неистовых фанов, так и непримиримых критиков. Лично я считаю её отличным материалом, но будьте готовым к тому, что некоторые её части придётся перечитывать не один раз до полного понимания. Есть более простая и направленная на практиков книга — это Language Implementation Patterns. Если ваш интерес ограничен какой-то конкретной практической задачей небольшого масштаба (вроде написания предметно-ориентированного языка), то эта книга подойдёт лучше, чем классическая Книга Дракона.


Книга Дракона

Шаг номер 2: начните с первоисточников


С хорошим теоретическим базисом будет проще изучать новые языки, но всё же не так легко взять и выучить все 500+ более-менее актуальных сегодня языков программирования. Поэтому начать можно с определения языков, в которых впервые были исследованы и реализованы некоторые принципиально новые идеи. На их основе изучение аналогичных инструментов в более новых языках будет уже тривиальной задачей.

Peter Norvig даёт несколько советов о том, какие парадигмы действительно важны, а также в каких языках они были впервые реализованы:

Выучите хотя бы 5 языков программирования. В ваш багаж знаний должен входить хотя бы один язык с классической абстракцией «классов» (это может быть Java или С++), один функциональный язык (вроде Lisp, ML или Haskell), один язык с поддержкой синтаксической абстракции (вроде Lisp), один декларативный язык (Prolog или шаблоны С++), один язык с продвинутой поддержкой параллелизма (Clojure или Go).

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

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

Peter Norvig рекомендует изучение декларативных языков, но я был бы здесь более конкретным и посоветовал бы изучить язык логического программирования. Это может быть как классический Prolog, так и miniKanren.

В разделе «языков с поддержкой параллелизма» к упомянутым вариантам я бы добавил ещё и CUDA. Это качественно другой масштаб параллелизма, ведь сотни ядер GPU не сравнятся с какими-то 4 ядрами обычных процессоров. Вы не только поймёте лучше устройство GPU, но и заложите для себя хороший фундамент для дальнейшего изучения машинного обучения (там параллелизм и вычисления на GPU очень пригодятся). Но важно понимать, что вам нужны как знания CUDA, так и один из упомянутых языков с параллелизмом для CPU (вроде Go, Clojure или Erlang).

Векторное программирование является ещё одной мощной парадигмой. Norvig зря пропустил языки с его поддержкой, ведь они имеют достаточно конкретное прикладное применение. Классическими примерами могут быть APL/J/K/Q, а также Matlab.

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

Возможно, меня уже несколько понесло, но так трудно остановиться, когда вокруг столько всего вкусного! Кто-то скажет, что нельзя пропустить изучение Forth, чтобы понять стековые языки (хотя мне кажется работу стеков можно понять и в других языках). Кто-то скажет, что я упустил очень важный язык Х или целую категорию языков Y — и это будет правдой, ведь их немало.

Шаг номер 3: практикуйтесь


Достаточно просто составить список языков, которые вы планируете изучить. Но вот действительно взять и изучить — займёт какое-то время. Если вам повезёт, то какие-то из них вы сможете применить в своей основной работе. Но даже если этого не произойдёт, вы должны стараться сами найти способ изучить новый язык не только с теоретической, но и с практической точки зрения. Без теории прогресс будет медленным, но без практики вы вообще застрянете.

Хорошим способом начать изучение нового языка будет прочесть короткую выжимку на Hyperpolyglot или Learn X in Y Minutes. Это даст приблизительное понимание ключевых идей языка и уберёт страх перед незнакомым синтаксисом. Если вы уже знакомы с каким-то похожим языком, то Hyperpolyglot имеет очень удобную функцию сравнения языков — это может на удивление быстро продвинуть вас в изучении нового языка.

Другим полезным упражнением будет изучение даже не синтаксиса языка, а документа, в котором описывается мотивация его создателей. Это даст вам понимание того, почему люди вообще тратили своё время и силы на создание этой вещи, какова была их мотивация и может ли она сейчас или в будущем совпасть с вашей. Например, если вы побаиваетесь глубоко изучать С++ или скептически относитесь к некоторым решениям Страуструпа, вам определённо стоит прочесть книгу The Design and Evolution of C++. Большинство других языков программирования тоже имеют в некоторой мере аналогичные публикации.

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

Наиболее быстрый путь приобщиться к новому языку, по моему мнению, это найти набор небольших задач и постепенно их решать. Хорошим источником может быть Exercism.io. Кроме задач там даже есть тесты, дающие возможность быстро оценить качество вашей реализации. Решение маленьких задач хорошо согласуется с изучением теории и с основной работе над другими проектами.

Как только вы освоитесь с синтаксисом и небольшие задачи уже не будут вызывать у вас проблем, я советую найти большой проект на этом языке. И это должен быть проект именно в той сфере, для которой был создан этот язык. Например, если вы изучаете C или Go — пишите утилиту командной строки с большим количеством системных вызовов. Если изучаете Python или Ruby — попробуйте написать что-то алгоритмическое и не очень требовательное к производительности (ИИ для крестиков ноликов 🙂 ) ну и т.д.

Продолжайте копать


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

Gerald Jay Sussman обратил внимание на это в его потрясающем докладе We Really Don’t Know How To Compute. Он использует несколько устаревший инструментарий, но и существующие сегодня инструменты не дают нам каких-то качественно иных подходов к решению освещённых им проблем.


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

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

Первый язык программирования высокого уровня — Планкалкюль / Habr

Планкалкюль (Plankalkül) — первый в мире язык программирования высокого уровня, разработанный немецким инженером Конрадом Цузе между
1942 и 1946 годами для его компьютера «Z4» (компьютер на снимке ниже, фото взято из «Википедии»).
Шла Вторая Мировая Война, Цузе работал в отрыве от учёных других стран, совершенно самостоятельно. За это время он создал не только язык программирования,
но и написал на нём 49 страниц программ для оценки шахматных позиций. Полностью его работа была опубликована много позже, в 1972.

Рискну рассказать об этом языке программирования, в качестве археологического изыскания. Тем более, что на русском языке об этом языке сказано очень мало.

Только в 1957 году (работы были начаты в 1954) появился Фортран — язык, который большинство считает первым языком высокого уровня.

«Z4» был электро-механическим, поэтому компилятора или интерпретатора Планкалкюля не существовало, но в 2000 году в Свободном
универсистете Берлина (Freie Universität Berlin) был создан интерпретатор его
диалекта (запускается в виде Ява-аплета в браузере).

Диалект, который реализуется, назван Plankalkül-2000 и отличается от оригинала различными упрощениями.
Например, упрощена форма записи, Цузе использовал двухмерную запись —
первой строкой записывалось само выражение, а ниже некоторые его аргументы (тип переменной, индексы и так далее). Кроме того, были упрощены и значки самих операций,
приведены к более привычному нам с вами виду.

Язык довольно богатый, на мой взгляд, для сороковых годов-то: есть условные конструкции, два вида циклов (аналог while и for), есть массивы и кортежи,
можно описывать и вызывать подпрограммы (но рекурсии нет).

Все переменные делятся на четыре вида.

  • «Variablen» (Входные переменные) — это входные переменные подпрограмм, доступны только для чтения начинаются с буквы «V» и номера.
  • «Zwischenwert» (Значения промежуточные), доступны для чтения и записи, предназначены для хранения промежуточных вычисляемых значения, начинаются с «Z» и номера.
  • «Resultatwerte» (Результат) — в этих переменных возвращается результат вычисления, начинаются с «R» и номера.
  • «Indizes» (Индексы) — переменные цикла (аналога for), начинаются с «i», дальше может быть номер, номер необходим для организации вложенных циклов.

Доступны три типа переменных. Несмотря на то, что «Z4» умел оперировать числами с плавающей точкой, интерпретатор этого не умеет.
  • Для целого неотрицательного указывается размерность в битах. Есть две формы записи «0» — один бит, «n.0» — «n» бит, например, 8.0 — один байт (8 бит).
  • Кортеж указывается в скобках, например (3.0, 4.0) — это две переменные в три и четыре бита, кортеж должен иметь более одного элемента.
  • Массив записывается через точку, к примеру: 4.5.0 — массив из четырёх элементов по пять бит в каждом, 32.(0, 8.0, 16.0) — 32 кортежа, в каждом из которых три переменных: один бит, восемь и
    шестнадцать.

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

Одна из них вычисляет указанное (по порядку) число Фибоначчи:

P0 FactEvgenyStepanischev (V0[:4.0]) => (R0[:10.0])
(0, 1) => (Z0[:10.0], Z1[:10.0])

W1 (V0[:4.0]) [
    i > 0 -> (Z0[:10.0] + Z1[:10.0], Z1[:10.0] - Z0[:10.0]) => (Z1[:10.0], Z0[:10.0])
]

Z1[:10.0] => R0[:10.0]

END

Запускать следует так: открываете страницу с интерпретатором, копируете в окно мою программу, нажимаете «Compile», открывается отдельное
окно с Ява-аплетом (требует, чтобы на компьютере была установлена Ява), в открывшемся окне мышкой побитно набираете начальное значение V0 (нажимать надо на зелёные кружки́),
потом в окне браузера нажимаете «Run», в красной строчке (R0) увидите получившееся значение.Запущенная программа на Планкалкюле
Подпрограммы в языке начинаются с символа «P» и уникального номера, дальше идёт имя, по которому её можно будет вызвать, у меня подпрограмма называется «FactEvgenyStepanischev», заканчивается
подпрограмма ключевым словом «END» (в оригинальном Планкалкюле его не было).

У подпрограммы описываются принимаемые и возвращаемые значения, у меня используется одна переменная на вход, размерностью 4 бита и одна на выход, размерность в 10. Первой строкой
присваиваются значения «ноль» и «один» промежуточным переменным Z0 и Z1. Тип переменных приходится указывать при каждом их использовании, преобразовать переменную в другой
тип нельзя.

Ниже идёт цикл «for» (W1), поскольку номер переменной цикла я не указал (указывается в первых квадратных скобках, которые тут опущены), используется переменная цикла «i», без номера.
В круглых скобках указывается количество повторений, а в последующих квадратных — тело цикла. Подробности можно
найти в описании.

Операция «стрелка» („->“) — условная конструкция, часть справа будет выполнена, если выражение слева истинно. В диалекте работают только самые простые выражения, например
цикл туда подставить можно, но кнопка «Run» в аплете у меня не появилась, поэтому я ограничился присваиванием внутри цикла.

Я тут использовал комплексное присваивание, которое хорошо знакомо тем, кто использует Перл, Пайтон или ПХП, но работает оно иначе — присваивания выполняются
последовательно, слева направо, поэтому я не могу ограничиться «(Z0[:10.0] + Z1[:10.0], Z1[:10.0]) => (Z1[:10.0], Z0[:10.0])», результат будет не тот, который ожидается.

В конце я присваиваю промежуточное значение результирующему значению подпрограммы.

Кроме этого в языке почти ничего и нет. Обращение к элементам массива, вызов функции и цикл «while» описывать отдельно смысла не имеет, они выглядят достаточно естественно в рамках этого синтаксиса.
Все операции, поддерживаемые языком (их немного — логические операции, битовые операции и четыре арифметические действия) выглядят привычно.

Новая волна языков программирования / Habr

На конференции OSCON (19-23 июля, Портленд) в этом году решили организовать дополнительную секцию Emerging Languages Camp, посвящённую языкам программирования нового поколения. Организатор — Алекс Пейн, известный по своей работе в компании Twitter.

Новые языки появляются постоянно и в бесчисленном количестве, потому что в программировании всё время возникают новые задачи, с которыми старые языки справляются плохо. Алекс Пейн говорит, что главная фундаментальная проблема сейчас — параллелизм. Он добавляет к этому ясность выражений (expressability) и удобство сопровождения (maintainability).

На конференции будут обсуждаться три десятка новых и относительно новых языков: Go, Io, Duby, Kodu, Newspeak, CoffeeScript, Ur, Objective-J, BitC, F#, PyPy, Clojure, Fancy, Coherence/Subtext, Noop, Factor, C#, E, Caja, Slate, D, AmbientTalk, Thyrd, Cola, Gosu, Stratified JavaScript, Frink, Dalvik, Trylon, Ioke, ooc. Почти каждый язык будет представлен лично его автором.

Из всего этого многообразия сам Алекс Пейн выделяет несколько наиболее интересных докладов, на его взгляд.

Джилад Брача (Gilad Bracha) расскажет о своей разработке под названием Newspeak — это странная комбинация идей из Smalltalk и Java, а также некоторых вещей из Lisp. В сообществе разработчиков языков программирования и заинтересованных лиц (это сообщество очень маленькое) Newspeak считается провокационным языком, и вокруг него развернулись интересные дискуссии.

Рич Хикки (Rich Hickey) расскажет о Clojure. Это экспериментальный язык, который угрожает всей индустрии, это довольно редко встречается. В языке реализовано несколько совершенно новых идей нового уровня, и многим это нравится.

Язык Мэтта Маклорина (Matt MacLaurin) под названием Kodu использует способ визуального программирования и первоначально был разработан для Xbox как часть детской игры. Визуальные языки и раньше появлялись на сцене, но этот уже готов и нашёл свою нишу. Kodu резко отличается от всех остальных языков в повестке Emerging Languages Camp.

Джонатан Эдвардс из программы искусственного интеллекта Массачусетского технологического института многие годы работал над языком программирования Subtext, который сейчас переименован в Coherence, но работа так и не завершена. Скорее всего, выступление Эдвардса будет сугубо теоретическим.

Алан Элиасен (Alan Eliasen) покажет язык программирования Frink, нацеленный в первую очередь на научные вычисления, но при этом обладающий некоторыми уникальными синтаксическими способностями (пример).

Наконец, разработчик Слава Пестов выступит с презентацией языка программирования Factor, в котором программы записываются в стековой нотации, как в Forth. С коллегами они проделали невероятную работу по оптимизации компилятора и виртуальной машины для Factor. Около месяца назад они опубликовали запись в блоге о текущем состоянии дел, и многие считают, что это настоящий прорыв в реализации языка программирования.

языка программирования — с английского на русский

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

  • История языка программирования Python — Python был задуман в 1980 х годах, а его создание началось в декабре 1989 года Гвидо ван Россумом в составе центра математики и информатики в Нидерландах. Язык Python был задуман как потомок языка программирования ABC, способный к обработке… …   Википедия

  • Си (язык программирования) — У этого термина существуют и другие значения, см. Си. Запрос «Язык программирования Си» перенаправляется сюда; см. также другие значения. Си Класс языка: процедурный Тип исполнения: компилируемый Появился в: 1969 1973 Автор( …   Википедия

  • D (язык программирования) — У этого термина существуют и другие значения, см. D. D Семантика: мультипарадигменный: императивное, объектно ориентированное, обобщённое программирование Тип исполнения: компилятор Появился в: 1999 Автор(ы) …   Википедия

  • Язык программирования Си — Си Семантика: процедурный Тип исполнения: компилируемый Появился в: 1969 73 г. Автор(ы): Кен Томпсон, Денис Ритчи Типизация данных: статическая Основные реализации …   Википедия

  • Язык программирования C — Си Семантика: процедурный Тип исполнения: компилируемый Появился в: 1969 73 г. Автор(ы): Кен Томпсон, Денис Ритчи Типизация данных: статическая Основные реализации …   Википедия

  • Оберон (язык программирования) — У этого термина существуют и другие значения, см. Оберон. Oberon Класс языка: императивный, структурированный, модульный Появился в: 1986 Автор(ы) …   Википедия

  • Форт (язык программирования) — У этого термина существуют и другие значения, см. Форт (значения). Forth Семантика: императивный Тип исполнения: интерпретатор/компилятор Появился в: 1971 Автор(ы): Чарльз Х. Мур Основные реализации …   Википедия

  • Ада (язык программирования) — У этого термина существуют и другие значения, см. Ада. Ада Семантика: мультипарадигменный: конкурентное, обобщённое, императивное, объектно ориентированное, распределённое программирование Тип исполнения: компилируемый Появился в: 1980 …   Википедия

  • Языки программирования — Язык программирования  формальная знаковая система, предназначенная для записи программ. Программа обычно представляет собой некоторый алгоритм в форме, понятной для исполнителя (например, компьютера). Язык программирования определяет набор… …   Википедия

  • Язык программирования — Язык программирования  формальная знаковая система, предназначенная для записи компьютерных программ. Язык программирования определяет набор лексических, синтаксических и семантических правил, задающих внешний вид программы и действия,… …   Википедия

  • Отправить ответ

    avatar
      Подписаться  
    Уведомление о