M язык программирования – Язык программирования PL/M-80 и его развитие — Мир науки,техники,медицины и образования © первая научно-техническая коммерческая социальная сеть

Содержание

стероиды для MS Excel и Power BI / Habr

В данной статье я хочу рассказать о некоторых возможностях бесплатной и крайне полезной, но пока еще мало известной надстройки над MS Excel под названием Power Query.

Power Query позволяет забирать данные из самых разных источников (таких как csv, xls, json, текстовых файлов, папок с этими файлами, самых разных баз данных, различных api вроде Facebook opengraph, Google Analytics, Яндекс.Метрика, CallTouch и много чего еще), создавать повторяемые последовательности обработки этих данных и загружать их внутрь таблиц Excel или самого data model.

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

Совместимость и технические подробности

Power Query доступен бесплатно для всех версий Windows Excel 2010, 2013 и встроен по умолчанию в Windows Excel 2016. Для пользователей MacOS X Power Query недоступен (впрочем, даже без этого маковский Excel отвратителен на ощупь и продвинутые пользователи, включая меня, чаще всего работают с нормальным Excel через Parallels или запуская его на удаленной виндовой машинке).

Также, Power Query встроен в новый продукт для бизнес аналитики — Power BI, а еще, ходят слухи, что Power Query будет появляться и в составе других продуктов от Microsoft. Т.е. Power Query ждет светлое будущее и самое время для адептов технологий Microsoft (и не только) заняться его освоением.

Как оно работает

После установки Power Query в интерфейсе Excel 2010–2013 появляется отдельная одноименная вкладка.

В новом Excel 2016 функционал Power Query доступен на вкладке Data (данные), в блоке “Get & Transform”.

Сначала, в интерфейсе Excel мы выбираем конкретный источник данных, откуда нам их нужно получить, и перед нами открывается окошко самого Power Query с предпросмотром первых строчек загруженных данных (область 1). В верхней части окошка располагается Ribbon с командами по обработке данных (область 2). И в правой части экрана (область 3) у нас расположена панель с последовательностью всех действий, которые применяются к данным.

Возможности Power Query

У Power Query очень много возможностей и я хочу остановиться на некоторых из числа моих любимых.

Как я уже писал выше, Power Query замечателен тем, что позволяет подключаться к самым разным источникам данных. Так он позволяет загружать данные из CSV, TXT, XML, json файлов. Притом процесс выбора опций загрузки тех-же CSV файлов гибче и удобнее, чем он реализован штатными средствами Excel: кодировка автоматически выбирается часто правильно и можно указать символ разделителя столбцов.

Объединение файлов лежащих в папке

Power Query умеет забирать данные из указанной папки и объединять их содержимое в единые таблицы. Это может быть полезно, например, если вам периодически приходят какие-то специализированные отчеты за отдельный промежуток времени, но данные для анализа нужны в общей таблице. Гифка

Текстовые функции

К столбцам из текста в Power Query по нажатию на кнопки на Ribbon можно применять такие функции как:
  1. Разделить столбец по символу или по количеству символов. И в отличие от Excel можно задать максимальное количество столбцов, а также направление откуда нужно считать символы — слева, справа.
  2. Изменить регистр ячеек в столбце
  3. Подсчитать количество символов в ячейках столбца.
Числовые функции

К столбцам с числовыми значениями по нажатию на кнопки на Ribbon можно применять:
  1. Арифметические операции
  2. Возводить в степени, вычислять логарифмы, факториалы, корни
  3. Тригонометрические операции
  4. Округлять до заданных значений
  5. Определять четность и т.д.
Функции для работы с датами, временем и продолжительностью

К столбцам со значениями даты и времени по нажатию на кнопки на Ribbon можно применять:
  1. Автоматическое определение формата вписанной даты (в excel c этим большая боль)
  2. Извлекать в один клик номер месяца, дня недели, количество дней или часов в периоде и т.п.
Unpivot — Pivot

В интерфейсе Power Query есть функция “Unpivot”, которая в один клик позволяет привести данные с одной метрикой разложенные по столбцам по периодам к форме, которая будет удобна для использования в сводных таблицах (понимаю что трудно написал — смотрите пример). Также, есть функция с обратным действие Pivot. Гифка

Операция Merge — смерть ВПР

Функция ВПР (VLOOKUP) одна из наиболее используемых функций в MS Excel. Она позволяет подтягивать данные в одну таблицу из другой таблицы по единому ключу. И вот как раз для этой функции в Power Query есть гораздо более удобная альтернатива — операция Merge. При помощи этой операции соединение таблиц нескольких таблиц в одну по ключу (по простому или по составному ключу, когда соответствие нужно находить по нескольким столбцам) выполняется буквально в 7 кликов мыши без ввода с клавиатуры.

Операция Merge — это аналог join в sql, и ее можно настроить чтобы join был разных типов — Inner (default), Left Outer, Right Outer, Full Outer.

Upd.Мне тут подсказали, что Power Query не умеет делать Aproximate join, а впр умеет. Чистая правда, из коробки альтернатив нет. Гифка

Подключение к различным базам данных. Query Folding.

Power Query также замечателен тем, что умеет цепляться к самым разным базам данных — от MS SQL и MySQL до Postgres и HP Vertica. При этом, вам даже не нужно знать SQL или другой язык базы данных, т.к. предпросмотр данных отображается в интерфейсе Power Query и все те операции, которые выполняются в интерфейсе прозрачно транслируются в язык запросов к базе данных.

А еще в Power Query есть понятие Query Folding: если вы подключены к совместимой базе данных (на текущий момент это MS SQl), то тяжелые операции по обработке данных Power Query будет стараться выполнить на серверной стороне и забирать к себе лишь обработанные данные. Эта возможность радикально улучшает быстродействие многих обработок.

Язык программирования “М”

Надстройка Power Query — это интерпретатор нового, скриптового, специализированного для работы с данными, языка программирования М.

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

Также, мы всегда можем посмотреть и отредактировать сам код написанного скрипта. И выглядеть будет он примерно так:

Язык M, к сожалению, не похож ни на язык формул в Excel, ни на MDX и, к счастью, не похож на Visual Basic. Однако, он очень прост в изучении и открывает огромные возможности по манипуляции данными, которые недоступны с использованием графического интерфейса.

Загрузка данных из Яндекс.Метрики, Google Analytics и прочих Api

Немного овладев языком “M” я смог написать программки в Power Query, которые умеют подключаться к API Яндекс.Метрики и Google Analytics и забирать оттуда данные с задаваемыми настройками. Программки PQYandexMetrika и PQGoogleAnalytics я выложил в опенсорс на гитхаб под лицензией GPL. Призываю пользоваться. И я буду очень рад, если эти программы будут дорабатываться энтузиастами.

Для Google Analytics подобного рода экспортеров в разных реализациях достаточно много, но вот для Яндекс.Метрики, насколько я знаю, мой экспортер был первым публично доступным, да еще и бесплатным 🙂

Power Query умеет формировать headers для post и get запросов и забирать данные из интернета. Благодаря этому, при должном уровне сноровки, Power Query можно подключить практически к любым API. В частности, я для своих исследований дергаю данные по телефонным звонкам клиентов из CallTouch API, из API сервиса по мониторингу активности за компьютером Rescuetime, занимаюсь парсингом нужных мне веб-страничек на предмет извлечения актуальной информации.

Еще раз про повторяемость и про варианты применения

Как я уже писал выше, скрипт Power Query представляет собой повторяемую последовательность манипуляций, применяемых к данным. Это значит, что однажды настроив нужную вам обработку вы сможете применить ее к новым файлам изменив всего один шаг в скрипте — указав путь к новому файлу. Благодаря этому можно избавиться от огромного количества рутины и освободить время для продуктивной работы — анализа данных.

Я занимаюсь веб-аналитикой и контекстной рекламой. И так уж получилось, что с момента, как я познакомился с Power Query в ее интерфейсах я провожу больше времени, чем в самом Excel. Мне так удобнее. Вместе с тем возросло и мое потребление другой замечательной надстройки в MS Excel — PowerPivot.

Вот часть задач, которые я делаю с использованием Power Query:

  1. разбираю семантику для Толстых проектов,
  2. Делаю частотные словари,
  3. Создаю веб-аналитические дашборды и отчеты для анализа конкретных срезов,
  4. Восстанавливаю достижение целей в системах веб-аналитики, если они не настроены на проекте,
  5. Сглаживаю прогноз вероятности методами Андрея Белоусова (+Байеса:),
  6. Делаю аудит контекстной рекламы на данных из K50 статистика,
  7. И много других разных ad-hoc analysis задач, которые нужно сделать лишь однажды

Вот bi систему, про которую я рассказывал на Yac/M 2015 (видео) я делал полнстью при помощи Power Query и загружал данные внутрь PowerPivot.

Пару слов про локализацию

На сайте Microsoft для пользователей из России по умолчанию скачивается Power Query с переведенным на русским язык интерфейсом. К счастью, локализаторы до перевода на русский языка программирования (как это сделано с языком формул в excel) не добрались, однако жизнь пользователям неоднозначными переводами сильно усложнили. И я призываю вас скачивать, устанавливать и пользоваться английской версией Power Query. Поверьте, она будет гораздо понятнее.
Ссылки по теме

Официальные ресурсы на английском:

  1. Скачать Английскую версию Power Query
  2. Справка по формулам языка M
  3. Ветка Форума Microsoft Technet про Power Query

На момент написания статьи на русском языке информации по Power Query практически нет, и то что мной найдено приведено ниже:

  1. Импорт данных из таблиц в Google Spreadsheets
  2. Power BI. Получаем данные из REST API
  3. Сообщество продвинутых пользователей Excel, Power Pivot и Power Query в Facebook
  4. Обновляемая страничка в Marketing-wiki про Power Query

На английском:

  1. Видео с демонстрацией возможностей Power Query на конференции TechEd North America
  2. Блог Chris Webb, пожалуй наиболее полный ресурс с примерами использования Power Query
  3. Книга Chris Webb — Power Query for Power BI and Excel
  4. Блог Ken Puls
  5. Курс «Excel для интернет-маркетинга»
  6. Книга Ken Puls и Miguel Escobar — M is for Data Monkey

M (язык программирования) — это… Что такое M (язык программирования)?


  • MeetYourMakers
  • M 10 (шаровое скопление)

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

  • Язык программирования C++ — Эта статья о книге; о языке программирования см.: C++. Язык программирования C++ The C++ Programming Language Автор: Бьёрн Страуструп Язык оригинала: английский Оригинал издан: 1986 Издательство: Addison–Wesley …   Википедия

  • Язык программирования Java — разработанный корпорацией Sun Microsistems межплатформенный, интерпретируемый, объектно ориентированный язык программирования, используемый для создания приложений, работающих в под управлением веб браузера и характеризующихся высоким уровнем… …   Финансовый словарь

  • Язык программирования Паскаль — процедурно ориентированный язык программирования высокого уровня, предназначенный для широкого класса задач. Язык Паскаль считается языком структурного программирования. По английски: Pascal language См. также: Процедурно ориентированные языки… …   Финансовый словарь

  • Язык программирования — искусственный (формальный) язык, предназначенный для записи алгоритмов. Язык программирования задается своим описанием и реализуется в виде специальной программы: компилятора или интерпретатора. По английски: Programming language Синонимы:… …   Финансовый словарь

  • Язык программирования COBOL — язык программирования, предназначенный для решения экономических задач и задач обработки коммерческой информации. Язык COBOL отличается развитыми средствами работы с файлами и формой записи, приближенной к английскому языку. По английски: COBOL… …   Финансовый словарь

  • Язык программирования Лисп — универсальный язык программирования высокого уровня. Язык Лисп: относится к декларативным языкам функционального типа; предназначен для обработки символьных данных, представленных в виде списков. Основой языка являются функции и рекурсивные… …   Финансовый словарь

  • Язык программирования Ада — универсальный язык программирования: предназначенный для создания сложных систем; характеризующийся высокой степенью независимости от операционных систем; обеспечивающий поддержку средств параллельной обработки данных в реальном времени. По… …   Финансовый словарь

  • Язык программирования Алгол — язык программирования, предназначенный для решения численных задач. Программа на языке ALGOL имеет блочную структуру, позволяющую эффективно реализовывать механизмы динамического распределения памяти. По английски: ALGOL language См. также:… …   Финансовый словарь

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

  • Язык программирования Пролог — язык логического программирования, программа на котором состоит: из логических утверждений, образующих базу данных; и из правила вывода новых утверждений из известных. По английски: PROLOG language См. также: Декларативные языки программирования… …   Финансовый словарь

  • Язык программирования Форт — процедурно ориентированный язык программирования, предназначенный для эффективной работы с персональными системами. Форт близок к языку ассемблера. См. также: Процедурно ориентированные языки программирования Финансовый словарь Финам …   Финансовый словарь

Книги

  • Язык программирования C++. Базовый курс, Липпман Стенли Б., Лажойе Жози, Му Барбара Э.. Книга «Язык программирования C++. Базовый курс» (5-е издание) — лучшее руководство по программированию и справочник по языку, полностью пересмотренное и обновленное под стандарт C++11! Книга»… Подробнее  Купить за 4538 руб
  • Язык программирования Go, Керниган Брайан, Донован Алан А. А.. Вы краем уха слышали о новом языке программирования Go, но не знаете, что он представляет собой на самом деле? Ответы на все ваши вопросы вы получите в этой книге. Онапоможет вам… Подробнее  Купить за 2722 руб
  • Язык программирования C, Керниган Брайан, Ритчи Деннис. Перед Вами классическая книга по языку программирования C (Си), написанная самими разработчиками этого языка и выдержавшая в США уже 34 переиздания! Книга является как практически… Подробнее  Купить за 2283 руб
Другие книги по запросу «M (язык программирования)» >>

Язык M для Power Query и Power BI: введение

Вы можете указывать имена для обозначения значений – идентификаторы. Если в идентификаторе есть пробел, то он указывается с помощью символа # и в кавычках, например:

[ #"2016 Sales" = 1000,
 #"2017 Sales" = 1100,
 #"Total Sales" = #"2016 Sales" + #"2017 Sales" ]

 

Для обращения к данным записей (record) используются идентификаторы с квадратными скобками [ ]. Пример:

[ Data = [ Base Line = 100, Rate = 1.8 ],
Progression = Data[Base Line] * Data[Rate]  ]

 

В языке M есть зарезервированные последовательности символов, которые нельзя использовать как операторы, это:

and as each else error false if in is let meta not otherwise or section shared then true try type #binary #date #datetime #datetimezone #duration #infinity #nan #sections #shared #table #time

 

Также есть стандартные операторы и знаки пунктуации:

, ; = < <= > >= <> + - * / & ( ) [ ] { } @ ! ? => .. ...

 

Логические выражения if

Логические выражения записываются как if…then…else

Например:

if [Sales] > 1000 then "более 1000" else if [Sales] > 500 then "более 500" else "500 или меньше"

 

Оператор let

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

Например:

let
    Sales2017 =
     [ Year = 2017, FirstHalf = 1000, SecondHalf = 1100,
       Total = FirstHalf + SecondHalf   ], // 2100
    Sales2018 =
     [ Year = 2018, FirstHalf = 1200, SecondHalf = 1300,
       Total = FirstHalf + SecondHalf  ] // 2500
in 
    Sales2017[Total] + Sales2018[Total] // 4600
 

 

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

Например:

let 
      AreaСalculation = (x, y) => 
            let 
                  Area = x * y, 
                  DoubleArea = Area * 2 
            in 
            DoubleArea 
in 
AreaСalculation

Глава 20. Понимание языка М

Это продолжение перевода книги Кен Пульс и Мигель Эскобар. Язык М для Power Query. Главы не являются независимыми, поэтому рекомендую читать последовательно.

Предыдущая глава    Содержание    Следующая глава

Откройте Understanding M.xlsx. Выберите любую ячейку в таблице Sales. Данные –> Из таблицы/диапазона. В редакторе Power Query удалите шаг Измененный тип.

Рис. 20.1. Начальный вид запроса; чтобы увеличить изображение кликните на нем правой кнопкой мыши и выберите Открыть картинку в новой вкладке

Скачать заметку в формате Word или pdf, примеры в формате архива

Ранее вы управляли кодом через пользовательский интерфейс. Вы видели, что Power Query действует как макро-рекордер, и взаимодействовали с ним через окно ПРИМЕНЕННЫЕ ШАНИ. У вас также был небольшой опыт взаимодействие через строку формул. Пора познакомиться с языком программирования. Главная –> Расширенный редактор. Откроется окно, содержащее код запроса:

Рис. 20.2. Расширенный редактор

Расширенный редактор – это, по сути, текстовый редактор с проверкой синтаксиса. Взгляните на код внутри окна. Первая строка каждого запроса должна включать единственное слово let (для функций может быть иначе, см. главу 21). Вторая строка начинается со слова Источник. Это имя шага из поля ПРИМЕНЕННЫЕ ШАГИ. Это имя устанавливает соответствие шагов и строк кода. В нашем примере Power Query вызвал функцию Excel.CurrentWorkbook(). Затем он добавил список импортированных записей (таблиц Excel). Наконец, он извлек содержимое записей для этого объекта. Синтаксис записи можно представить, как Функция(){Объект}[Поле]. Мы уже видели эту конструкцию раньше, см. главу 19, раздел Создание записи из строки таблицы.

Предпоследняя строка каждого запроса состоит из единственного слова in. Последняя строка (одно слово) – ссылка на имя шага, содержащего данные, возвращаемые запросом. Как правило, это имя последнего шага, но не обязательно.

Добавим еще один шаг к нашему запросу. Закройте Расширенный редактор, нажав кнопку Готово. Щелкните правой кнопкой мыши столбец Price –> Тип изменения –> Десятичное число. Вернитесь в Расширенный редактор.

Рис. 20.3. В запрос добавлен новый шаг

Обратите внимание. Во-первых, в конец второй строки была добавлена запятая. Это важно: каждая строка между строками let и in должна заканчиваться запятой. Исключение – последняя строка перед in. Во-вторых, написание имени второго шага отличается по синтаксису от первого. Отличие вызвано наличием пробела в имени Измененный тип. Power Query рассматривает эти два слова как отдельные термины.

Если хотите, переименуйте шаг. Это можно сделать двумя способами. Щелкните правой кнопкой мыши имя шага в области ПРИМЕНЕННЫЕ ШАГИ (перед входом в Расширенный редактор) и переименуйте шаг. В самом Расширенном редакторе удалите каждое вхождение #»Измененный тип» и замените на NewType. Независимо от того, какой метод вы выберете, ваш код приобретет вид:

Рис. 20.4. Упрощение кода удалением пробела из названия шага

Связывая шаги вместе

Обратите внимание, что отдельные строки связаны друг с другом. Так, например, в строке NewType есть ссылка на Источник:

Рис. 20.4а. Элемент в строке NewType ссылается на Источник

Именно такие ссылки позволяют Power Query связывать все команды вместе. Вы можете интерпретировать строку NewType следующим образом: получить выход предыдущего шага и загрузить его в функцию преобразования типов данных для столбцов.

Разрыв строк

Строки можно переносить без особых ограничений. Когда Power Query читает код, он ищет ключевые слова и запятые. При чтении строки он игнорирует запятые, заключенные в круглые, фигурные или квадратные скобки и кавычки. Но обнаружив одинокую запятую, он распознает ее как конец строки и дальнейший код относит к следующему шагу. А найдя ключевое слово in, он понимает, что запрос завершен, и смотрит, какой шаг нужно вернуть. Это означает, что код…

NewType = Table.TransformColumnTypes(Source,{{«Price», type number}})

NewType = Table.TransformColumnTypes(Source,{{«Price», type number}})

… эквивалентен коду…

NewType = Table.TransformColumnTypes (Source,{{«Price», type number}})

NewType = Table.TransformColumnTypes

   (Source,{{«Price», type number}})

… или…

NewType = Table.TransformColumnTypes(

NewType = Table.TransformColumnTypes( Source, { {«Price», type number} } )

NewType = Table.TransformColumnTypes(

   Source,

   {

      {«Price», type number}

   }

)

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

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

Рис. 20.5. Типы данных для столбцов таблицы Sales

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

let Source = Excel.CurrentWorkbook(){[Name=»Sales»]}[Content], NewType = Table.TransformColumnTypes (Source, { {«Price», type number}, {«Date», type date}, {«Inventory Item», type text}, {«EmployeeID», type number}, {«Quantity», type number} } ) in NewType

let

   Source = Excel.CurrentWorkbook(){[Name=»Sales»]}[Content],

   NewType = Table.TransformColumnTypes

   (Source,

      {

         {«Price», type number},

         {«Date», type date},

         {«Inventory Item», type text},

         {«EmployeeID», type number},

         {«Quantity», type number}

      }

   )

in

   NewType

Если вы введете этот код в Расширенный редактор и нажмете Готово, то увидите, что запрос возвращает желаемые результаты:

Рис. 20.6. Столбцы в запросе изменили тип данных в соответствии с кодом

Комментарии к коду

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

let // Retrieve the Sales table from Excel Source = Excel.CurrentWorkbook(){[Name=»Sales»]}[Content],

let

   // Retrieve the Sales table from Excel

   Source = Excel.CurrentWorkbook(){[Name=»Sales»]}[Content],

Иногда вам нужны более длинные комментарии, которые не помещаются в одной строке. В этом случае вы помещаете символы /* перед текстом, который вы не хотите выполнять, и символы */ в конце раздела, например:

/* I broke this code comment across multiple lines (by reading M is for Data Monkey) */

   /* I broke this code comment across multiple lines

   (by reading M is for Data Monkey) */

Рис. 20.7. Сводка специальных символов Power Query

Работа с каждой строкой в столбце

Существует еще одна очень важная конструкция для понимания M: как читать и изменять код, который работает на каждой строке в столбце. Чтобы получить этот код, можно взять существующий запрос и добавить столбец для определения общего объема продаж по строкам. Убедитесь, что вы вышли из Расширенного редактора. Выберите столбцы Quantity и Price –> Добавление столбца –> Стандартны -> Умножить. Щелкните правой кнопкой мыши столбец Умножение –> Переименовать –> Gross Sales. Щелкните правой кнопкой мыши шаг Вставлено умножение –> Переименовать –> CalcSales. Щелкните правой кнопкой мыши на шаге Переименованные столбцы –> Переименовать –> Rename:

Рис. 20.8. Запрос после обработки

Просмотр кода в Расширенном редакторе показывает две новые строки кода (отступы добавлены для удобства восприятия):

CalcSales = Table.AddColumn(NewType, «Умножение», each [Quantity] * [Price], type number), Rename = Table.RenameColumns(CalcSales, {«Умножение», «Gross Sales»})

    CalcSales = Table.AddColumn(NewType, «Умножение»,

       each [Quantity] * [Price], type number),

    Rename = Table.RenameColumns(CalcSales,

       {«Умножение», «Gross Sales»})

Функция RenameColumns ссылается на предыдущий шаг (CalcSales), а затем предоставляет список предыдущего имени столбца и новое имя. В этой строке вы можете переименовать несколько столбцов, если используете список списков. Например:

Rename = Table.RenameColumns(CalcSales,

Rename = Table.RenameColumns(CalcSales, { {«Умножение», «Gross Sales»}, {«Price», «Price1»} } )

Rename = Table.RenameColumns(CalcSales,

   {

      {«Умножение», «Gross Sales»},

      {«Price», «Price1»}

   }

)

Функции Table.AddColumn добавляет столбец и имеет четыре аргумента, причем первые три – обязательные (как получить справку по функции см. последний раздел главы 19):

  1. Имя предыдущего шага
  2. Имя нового столбца. Поскольку на следующем шаге вы переименовали это имя «Умножение» на «Gross Sales», можно сразу ввести здесь нужное имя.
  3. Действие, которым получаются значения в новом столбце. Обратите внимание на новое ключевое слово – each. Оно указывает Power Query, что действие должно выполняться для каждой строки запроса. После этого вы какие столбцы следует умножать друг на друга
  4. Тип данных, возвращаемый функцией (необязательный).

Вы можете внести изменения, чтобы сделать код короче:

Рис. 20.9. Оптимизированный код

Завершите запрос. Переименуйте его в GrossSales. Главная –> Закрыть и загрузить.

Ссылка на шаги или строки

Рассмотрим сценарий, в котором у вас есть текстовый файл:

Рис. 20.10. Текстовый файл с разделителем табуляция

Обратите внимание:

  • Данные разделены табуляцией. Однако, в первой строке табуляций нет. Это означает, что разделять столбцы нужно будет вручную.
  • Число строк, предшествующих строке заголовка может варьироваться от 5 до 5000.
  • Количество строк, между заголовком и итогами также является переменным.

Вам нужно извлечь строки из середины набора данных, причем точное положение извлекаемых строк не известно. Допустим, вам также нужно подсчитать количество дней между датами заказов. Это нельзя сделать в пользовательском интерфейсе Power Query.

Создайте пустую книгу Excel. Данные –> Из текстового/CSV-файла –> загрузите Varying Header Rows.txt. В окне предварительного просмотра кликните Изменить. В редакторе Power Query перейдите на вкладку Добавление столбца –> Столбец индекса. Фильтр Column1 –> Текстовые фильтры –> Начинается с… Установите для фильтра значения начинается с ID Number или начинается с ID Total.

Рис. 20.11. Настройки фильтра строк

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

Рис. 20.12. Запрос показывает только две нужные строки с их индексами

Обратите внимание, что ваш фильтр динамичен: не важно, под какими номерами появляются строки, начинающиеся с ID Number или ID Total, в любом случае отфильтруются нужные строки.

Объединение шагов

Вы можете посмотреть код, пройдя по меню Главная –> Расширенный редактор.

Рис. 20.13. Исходный код

Объединение шагов похоже на создание мегаформул в Excel. Вы можете подставлять предыдущий шаг, в последующую ссылку. Например, в предыдущем коде строка #»Добавлен индекс… может войти в строку RowNumbers:

Рис. 20.14. Один шаг сокращен

Создание новых шагов

Для создания нового шага кликните на кнопку fx слева от строки формул:

Рис. 20.15. Создание нового шага запроса вручную

В области ПРИМЕНЕННЫЕ ШАНИ вас появится новый шаг, а в строке формул, заготовка для написания формулы шага:

Рис. 20.16. Новый шаг и заготовка для формулы

Нажатие fx всегда создает новый шаг, который ссылается на предыдущий. Применительно к нашей задаче, измените ссылку на =Источник. Войдите в Расширенный редактор. Вы увидите, что появилась запятая в конце шага RowNumbers и финальная ссылка изменилась с RowNumbers на Пользовательская1.

Рис. 20.17. Изменения, вызванные добавлением шага

Итак, у вас есть шаг RowNumbers, чтобы отфильтровать первую и последнюю строки таблицы, подлежащей обработке, и шаг Пользовательская1, чтобы начать писать логику обработки.

Вернитесь в пользовательский интерфейс, чтобы создать синтаксис обработки, а не писать его с нуля. Сначала удалите ненужные нижние строки, начинающиеся с индекса 10 (если вы начнете с удаления верхних строк, то индекс изменится). На самом деле, удалить нижние строки сложно, так как интерфейс запросит число строк для удаления, а вы его не знаете (его можно только вычислить). Поэтому сохраните 9 верхних строк. В редакторе Power Query встаньте на шаг Пользовательская1. Пройдите по меню Главная –> Сохранить строки –> Сохранить верхние строки –> 9. Теперь вы получаете таблицу фильтруется, чтобы показать только верхние 9 строк:

Рис. 20.18. Данные содержат верхние 9 строк

Обратите внимание, что у вас нет строки, которая начинается с ID Total. Этого следовало ожидать, потому что строка ID Total была десятой строкой в файле. Поскольку Power Query начинает счет с нуля, строке ID Total соответствует индекс 9. Однако, отсутствие строки ID Total вам на руку, так как всё равно общие итоги вам не нужны.

Зайдите в Расширенный редактор, и посмотрите, какой код сгенерировал Power Query:

#»Сохраненные первые строки» = Table.FirstN(Пользовательская1,9)

Чтобы код работал корректно на любых исходных данных, замените цифру 9 «правильным» значением из шага RowNumbers. Это можно сделать, обратившись к шагу RowNumbers и извлекая значение из столбца Индекс для второй строки (помните, что строка 2 имеет индекс 1; см. рис. 20.16):

RowNumbers[Индекс]{1}

Теперь запись шага выглядит так:

#»Сохраненные первые строки» = Table.FirstN(Пользовательская1,RowNumbers[Индекс]{1})

Можно еще упростить код, включив строку…

Пользовательская1 = Источник,

… в следующую строку:

Рис. 20.19. Оптимизированный код

Закройте Расширенный редактор. Удалите первые четыре строки таблицы. Главная –> Удалить строки –> Удаление верхних строк –> 4. Переименуйте шаг Удаленные верхние строки –> ExtractRows. Перейдите в Расширенный редактор. Отредактируйте формулу, заменив…

ExtractRows = Table.Skip(#»Сохраненные первые строки»,4)

… на

ExtractRows = Table.Skip(#»Сохраненные первые строки»,RowNumbers[Индекс]{0})

В результате у вас набор строк, ограниченный строкой заголовка и необработанными данными, которые вам нужны:

Рис. 20.20. Вы использовали код, чтобы извлечь динамический диапазон

Вы можете объединить последние два шага, что еще больше повысит читаемость кода:

Рис. 20.21. Динамический набор данных готов для финальной очистки

Преобразование –> Разделить столбец –> По разделителю –> Табуляция –> По каждому вхождению разделителя. Удалите шаг Измененный тип. Он автоматически устанавливает тип данных для всех столбцов – Текст, что неверно из-за наличия текстовых заголовков. Главная –> Использовать первую строку в качестве заголовков. Вот теперь автоматически добавленный шаг Измененный тип должен верно выполнить свою работу, установив для столбцов ID Number  и Amount тип данных – Целое число, а для столбца OrderDateДата. Если этого не произошло, установите типы данных вручную:

Рис. 20.22. Набор данных очищен и готов к использованию

Динамически ссылка на предыдущую строку

В начале главы мы сформулировали еще одну задачу для нашего примера – определение числа дней с момента предыдущего заказа. К сожалению, Power Query не имеет встроенной функции для выполнения этой задачи. Чтобы выполнить эту работу вручную, создадим новый столбец, который содержит дату предыдущего заказа. Вернитесь в редактор Power Query. Пройдите по меню Добавление столбца –> Столбец индекса. Переименуйте шаг Добавлен индекс –> Transactions:

Рис. 20.23. Вы готовы построить формулу, извлекающую дату предыдущего заказа

Добавление столбца –> Настраиваемый столбец. Назовите его PreviousOrder. Введите формулу:

(1) =Transactions[OrderDate]{[Индекс]-1}

Вы ссылаетесь на шаг Transactions и хотите получить значение из столбца OrderDate. Последняя часть формулы – {[Индекс]-1} – заключена в фигурные скобки и не имеет префикса имени шага. Это означает, что ссылка относится к текущему шагу – Добавлен пользовательский столбец. Для каждой строки пользовательского столбца формула возьмет значение индекса строки и уменьшит его на 1. Это приведет к извлечению значения из столбца OrderDate предыдущей строки.

Любопытно, что столбец Индекс нужен, чтобы указать Power Query, какую строку вы хотите получить из набора данных. Но совершенно необязательно, чтобы ссылка столбец Индекс присутствовала в формуле шага. Например, формула =#»Измененный тип»[OrderDate]{[Индекс]-1} также будет работать, несмотря на то, что на шаге Измененный тип еще не был создан столбце Индекс.

Результат не идеален:

Рис. 20.24. В первой строке возвращается ошибка

Это естественно, так как для первой строки не существует предыдущей. Чтобы исправить это, можно использовать оператор try, как описано в главе 18. Щелкните значок шестеренки рядом с шагом добавленным пользовательским шагом Добавлен пользовательский столбец. Измените формулу:

=try Transactions[OrderDate]{[Индекс]-1} otherwise [OrderDate]

Рис. 20.25. Теперь для первой строки значение PreviousOrder берется из текущей строки

Наконец вы можете рассчитать количество дней между двумя датами. Выберите столбец OrderDate, удерживая нажатой клавишу Ctrl, выберите столбец PreviousOrder. Добавление столбца –> Дата –> Вычесть дни.

Рис. 20.26. Рассчитана разница дат

Напоминаем, что порядок выбора столбцов важен. Если вы сначала выберете столбец PreviousOrder, а затем столбец OrderDate, новый столбец покажет разницу PreviousOrder минус OrderDate.

Щелкните правой кнопкой мыши столбец Индекс –> Удалить. Щелкните правой кнопкой мыши столбец PreviousOrder –> Тип изменения –> Дата. Щелкните правой кнопкой мыши столбец Вычитание –> Переименовать –> DaysSinceLastOrder. Главная –> Закрыть и загрузить.

Можете протестировать работоспособность запроса, открыв файл Varying Header Rows.txt и добавив строки до ID Number и после ID Total. Далее обновите запрос в Excel-файле.

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

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

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

Заранее скажу, что писал весь проект на Free Pascal, т.к. проги на нем можно собрать под огромное число платформ, да и сам компилятор выдает очень даже оптимизированные бинарники (собираю все составляющие проекта с O2 флагом).

Среда выполнения языка


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

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

В ВМ используется несколько стеков:

  1. Основной стек.
  2. Стек для хранения точек возврата.
  3. Стек сборщика мусора.
  4. Стек обработчика try/catch/finally блоков.

Константы и переменные

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

В моей ВМ он полуавтоматический. Т.е. разработчик сам решает когда нужно вызвать сборщик мусора. Работает он не по обычному счетчику указателей, как в тех же Python, Perl, Ruby, Lua и т.д. Он реализован через систему маркеров. Т.е. когда подразумевается, что переменной присваивается временное значение — указатель на это значение добавляется в стек сборщика мусора. В дальнейшем сборщик быстро пробегается по уже готовому списку указателей.
Обработка try/catch/finally блоков

Как и в любом современном языке, обработка исключений — важная его составляющая. Ядро ВМ обернуто в try..catch блок, который может вернуться к исполнению кода, после поимки исключения, поместив в стек немного информации о нем. В коде приложений можно задавать try/catch/finally блоки кода, указывая точки входа на catch (обработчик исключения) и на finally/end (конец блока).
Многопоточность

Она поддерживается на уровне ВМ. Это просто и удобно для использования. Работает без системы прерываний, так что код должен выполняться в нескольких потоках в несколько раз быстрее соответственно.
Внешние библиотеки для ВМ

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

Транслятор с высокоуровневого языка Mash в байткод для ВМ


Промежуточный язык

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

Выбрал я не самую хорошую архитектуру для реализации. Транслятор не строит дерево кода, как подобает прочим трансляторам. Он смотрит на начало конструкции. Т.е. если разбираемый кусок кода имеет вид «while :», то очевидно, что это конструкция while цикла и обрабатывать её нужно как конструкцию while цикла. Что-то вроде сложного switch-case.

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

Оптимизация кода

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

Язык Mash


Основная концепция языка

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

Все конструкции в языке открываются двоеточием : и закрываются оператором end.

Процедуры и функции объявляются как proc и func соответственно. В скобках перечисляются аргументы. Все как у большинства других языков.

Оператором return можно вернуть из функции значение, оператор break позволяет выйти из процедуры/функции (если он стоит вне циклов).

Пример кода:

...

func summ(a, b):
  return a + b
end

proc main():
  println(summ(inputln(), inputln()))
end

Поддерживаемые конструкции

  • Циклы: for..end, while..end, until..end
  • Условия: if..[else..]end, switch..[case..end..][else..]end
  • Методы: proc <имя>():… end, func <имя>():… end
  • Label & goto: <имя>:, jump <имя>
  • Enum перечисления и константные массивы.

Переменные

Транслятор их может определять автоматически, либо если разработчик пишет var перед их определением.

Примеры кода:

a ?= 10
b ?= a + 20
var a = 10, b = a + 20

Поддерживаются глобальные и локальные переменные.
ООП

Ну вот и подобрались мы к самой вкусной теме. В языке Mash поддерживаются все парадигмы объектно-ориентированного программирования. Т.е. классы, наследования, полиморфизм (в т.ч. динамический), динамические автоматические рефлексия и интроспекция (полная).

Без лишних слов, лучше просто приведу примеры кода.

Простой класс и работа с ним:

uses <bf>
uses <crt>

class MyClass:
  var a, b
  proc Create, Free
  func Summ
end

proc MyClass::Create(a, b):
  $a = new(a)
  $b = new(b)
end

proc MyClass::Free():
  Free($a, $b)
  $rem()
end

func MyClass::Summ():
  return $a + $b
end

proc main():
  x ?= new MyClass(10, 20)
  println(x->Summ())
  x->Free()
end

Выведет: 30.

Наследование и полиморфизм:

uses <bf>
uses <crt>

class MyClass:
  var a, b
  proc Create, Free
  func Summ
end

proc MyClass::Create(a, b):
  $a = new(a)
  $b = new(b)
end

proc MyClass::Free():
  Free($a, $b)
  $rem()
end

func MyClass::Summ():
  return $a + $b
end

class MyNewClass(MyClass):
  func Summ
end

func MyNewClass::Summ():
  return ($a + $b) * 2
end

proc main():
  x ?= new MyNewClass(10, 20)
  println(x->Summ())
  x->Free()
end

Выведет: 60.

Что на счет динамического полиморфизма? Да это же рефлексия!:

uses <bf>
uses <crt>

class MyClass:
  var a, b
  proc Create, Free
  func Summ
end

proc MyClass::Create(a, b):
  $a = new(a)
  $b = new(b)
end

proc MyClass::Free():
  Free($a, $b)
  $rem()
end

func MyClass::Summ():
  return $a + $b
end

class MyNewClass(MyClass):
  func Summ
end

func MyNewClass::Summ():
  return ($a + $b) * 2
end

proc main():
  x ?= new MyClass(10, 20)
  x->Summ ?= MyNewClass::Summ
  println(x->Summ())
  x->Free()
end

Выведет: 60.

Теперь уделим минутку интроспекции для простых значений и классов:

uses <bf>
uses <crt>

class MyClass:
  var a, b
end

proc main():
  x ?= new MyClass
  println(BoolToStr(x->type == MyClass))
  x->rem()
  println(BoolToStr(typeof(3.14) == typeReal))
end

Выведет: true, true.
Об операторах присваивания и явных указателях

Оператор ?= служит для присвоения переменной указателя на значение в памяти.
Оператор = изменяет значение в памяти по указателю из переменной.
И теперь немного о явных указателях. Добавил я их в язык чтобы они были.
@ — взять явный указатель на переменную.
? — получить переменную по указателю.
@= — присвоить значение переменной по явному указателю на неё.

Пример кода:

uses <bf>
uses <crt>

proc main():
  var a = 10, b
  b ?= @a
  PrintLn(b)
  b ?= ?b
  PrintLn(b)
  b++
  PrintLn(a)
  InputLn()
end

Выведет: какое-то число, 10, 11.
Try..[catch..][finally..]end

Пример кода:
uses <bf>
uses <crt>

proc main():
  println("Start")
  try:
    println("Trying to do something...")
    a ?= 10 / 0
  catch:
    println(getError())
  finally:
    println("Finally")
  end
  println("End")
  inputln()
end

Планы на будущее

Все присматриваюсь да присматриваюсь к GraalVM & Truffle. У моей среды выполнения отсутствует JIT компилятор, так что в плане производительности он пока что может составлять конкуренцию разве что питону. Надеюсь, что мне окажется под силу реализовать JIT компиляцию на базе GraalVM или LLVM.
Репозиторий

Вы можете поиграться с наработками и проследить за проектом сами.

Сайт
Репозиторий на GitHub

Спасибо, что дочитали до конца, если вы это сделали.

Примеры кода на 39 эзотерических языках программирования / Edison corporate blog / Habr

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

«Argh!», «Oof!», «2-ill», «Nhohnhehr», «Noit o’ mnain gelb», «DZZZZ», «Ypsilax», «YABALL», fuckfuck — это заклинания, поэзия только названия… под катом — примеры кода на самых вырвиглазных языках программирования.

Кроличья нора глубока.

INTERCAL (тьюринг-полный)



Don Woods и Jim Lyon

Один из старейших эзотерических языков программирования. Как утверждают создатели, его название означает «Язык программирования с непроизносимой аббревиатурой» (англ. Compiler Language With No Pronounceable Acronym). Язык был создан в 1972 году студентами Доном Вудсом (Don Woods) и Джеймсом М. Лайоном (James M. Lyon) как пародия на существующие языки программирования и гимнастика ума.

Hello, world

Каждой команде программы можно задать вероятность, с которой она будет выполняться при запуске программы. Кроме того, существуют команды, которые блокируют выполнение последующих команд определенного типа или изменения переменных.
Статья про INTERCAL на Хабре

Brainfuck (тьюринг-полный)


Один из известнейших эзотерических языков программирования, придуман Урбаном Мюллером (нем. Urban Müller) в 1993.

Hello, world!


Стековый эзотерический язык программирования. Считается двумерным, так как программа на Befunge записывается в таблицу со сшитыми краями (тор), по которой в различных направлениях перемещается интерпретатор, исполняя команды, расположенные в её ячейках. Написан Крисом Пресси в 1993 году. Как утверждал автор, его целью было разработать язык, максимально сложный для компиляции. Сложность обеспечивается командами p и g, модифицирующими текст программы.

Hello, world!


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

Hello, world!

или


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

Hello, world!

1L_a (expected to be Turing-complete, but this has not been proven)


Программа для печати символа «A»


Оригинал проги слева, справа — укрупненная версия

2L (тьюринг-полный)


Простой цикл, который получает 9 путем умножения 5 на 2 и вычитания 1


В 4DL для представления программы используется четырёхмерная решётка, и направлений её выполнения, соответственно, 8.

Программа, печатающая сумму чисел из входной строки:

Траектория выполнения приведённой выше программы в 4-мерном пространстве:


Aheui (아희 на корейском) первый ЯП, который разработан на корейском алфавите Hangul.

Hello, world!

quine+상밢밢밣밦발받밧밥밣밦밦받밦밢밝받밝받밦밧밢받발받밧밣밦밥발받밝밥밧밦밦받밧받붑
+붇벌벖벒벖벌벋벖법벍벒벖벋벍벌벍벍벖버벋벌벍벌벗벌벋벌법벓벖벗벋벌벓법벋벖벋벌벓
+밦밦발받발받밧밣밦밥발받발밦밧밣발받밦밦발받발받밧밣밦밥발받발밦밧밣발받밦밦발붇
+붉벗벋벌벓벓벋벒벋벌벓벗벖벌벋벌법벖벓벗벋벌벋벌벖벖벋벌벓벗벖벌벋벌법벖벓벗벋벌
+밧밣밦받밦밣밦밝발받밧받밢발밦받밦밥밧밣발받밧밦받밢발받바밦밝밢밥밦받밧밧발밣불
+붒벓벍벋벌벋벍법벖벋벖법벒벍벖벋벌벓벌벋벓벋벖법벒벍벖벋벌벗벍벗벗벋벖법벒벍벖벋
+밧밦받밧받밦밢발받밦밧밢받발받밧밝밝받밦받밦밦발밧밦받바밧밝밝받밦받밦받밣밧밦붇
+붏법법벋벋벌벋벒벗벖벋벌벓법법벖벋벌벌벍벒벖벋벖벓벓법벖벋벖벓벖벋벗벋벌벒벌법벗
+발받발밥밥밣발받밧밥받밥발받밦밝밧받밝받밧밢발밣발받밝밝밥밧밦받밦밥밥밣발받밦붏
+불벓벓벗벖벋벌벓벌벗벗벋벌벒벍벗벗벋벖법벋벒벖벋벌벒벍벗벗벋벖벋벗벍벍버벋벌벓벍
+받밦밧밧받발받발받밥밣발받밧밝발밦발받밧받밥밣발받밧밣밦밧밝받밧밢받밥밝받밧밦붏
+붇벌벓법법벌벋벍벋벗벍벖벋벌벓법벋벗버벋벌벋벍법벖벋벖벋벓벓벗벋벖벗벖벌벖벋벍벗
+밧밢밧밦밦받밦받밢밢발받밧발밥밣밦받밦받밥밣발받밦받밥밣발받밦발밥발발받밧받밥붏
+붓벋벌벌벗법벗버벋벌벌벗법벗벋벌벓벒벒벋벋벖벓벓법벖벋벌벒법벌벗벋벖벖벗벒벗벋벌
+밣밦밥발받밦밦밧밣발받밦밦밧밣발받밝발밧밣발받밝밧발밧밦받발밥받밝발받밦밧밝밥붒
+붓벌벍벋벌벓벗벖벖벋벌법벖벓벗벋벌법벖벓벗벋벌벋벌벖벖벋벖벋벖벋벗벋벖벗벌벓벖벋
+밣발받밦발밦밧밦받밣밥받밣발받밦받밦발발받바밧밢발밣발받밧밧발밧밝받밦밧밢받발붇
+붑벍벒벖벋벌벋벌벖벖벋벖벗벌벗벍벋벌벒벍벗벗벋벌벓벗벖벓벋벌벓벋법벍벋벌법벒벌벗
+밦받밣발받밣발받밦밢밝밥밦받밧밥발밧발받밦밢밝밥밦받밧밥받밣발받밦밢밝밥밦받발붑
+불벓벓법벗벋벌벌벗법벗벋벌벓벋법벖벋벌벓벌벒벖버벋벌법벍벍벗벋벖벋법벖벋벋벌벍벋
+받밧밧밝밢발받받밦밧밣발받밧발밢받밦받밦밝밧받밝받밧밥받밥발받발밦밧밣발받받밦붓
+붓벋벌벒벋벖벗벋벖벓벖벋벗벋벖벓벓법벖벋벌벌벒벍벖벋벌벓벗벖벖벋벌벋벒벗벖벋벌벓
+밣밣밢발받밦밧밣밣발받바밧밣밧받밦받밧밥밧발발받밢받밝밝발받밦밦발받발받받받밣붏
+붉벗벋벌벓벗벌벗벋벍벗벌벗벗벋벍법벋벒벗벋벖벗벓벋벖벋벌벒벒벋벖벋벌벌벗법벗벋벌
+발밦발받발발밧밣발받밦밧밧받발받밦밧밣밣발받밧밥받밣발받밧밧밝밢발받밦밢받밥밦붇
+붎벋벗벋벖벋벗벌벗벋벖벓법벌벗벋벖벗법벍벖벋벌벖벒벖벌버벋벖벋벌벒벗벋벖벋벗벌벗
+발밦받밧밥받밥발받밦받밣받발받밧밥받밣발받밝밝밥밧밦받밦발밥발발받밦발밧밣발받붒
+불벓벗벌벗벋벍벋벗벍벖벋벌벓벗벖벌벋벖벌벒벋벗벋벌벒벒벋벖벋벖벓벗벍벗벋벌벓벗벌
+받밝밝밧받밦받바밧밦밣밥발받밧밦밣밥발받받받밥밣발받밧밣밦밧밝받발밥받밝발받밝붏
+붇벌벒벌법벗벋벍벗벖벓벗벋벌벓법벋벗벋벌법벓벖벗벋벌벒벌법벗벋벌벓법벋벖벋벖벗벖
+밧밦밣밥발받밣밥밥밣발받밝받밥밣발받밦밥밝받발받밧밦밣밥발받밝받밥밣발받밧밦밣붑
+불벋벌벓벗벌벗벋벌법벖벓벗벋벌법벖벓벗벋벌벌법벌벖버벋벌법벋법벗벋벌벓법벋벓벋벌
+발밧밣발받받발밧밣발받받발밧밣발받밝발밧밣발받밧밧발밧밝받밧발밧밣발받밧밣밦밥불
+붑벍벖벋벌벓벗벌벌벋벖벋벌벒벋벋벌벓벗법벖벋벖벋벌벒법벋벌벓벗벌벍벋벌벒벋벖벗벋
+밧밦받사받싹바싺밝빠따반타밝밙밙받반따따뚜
+두벎떠벍떠더벍벖떠뻐터번떠뻐벌섵멓터벉떠떠
+숭반투밣쟈뿌차발발뚜삭뱐뎌두쟈수처사맣
+싸수쑼뽀뱐분누받루반타푸소뿌또붉다뭏또숰
+분뾰빠초추러밤도밡밣두투쏘밡뽀붐또뱔볼
+땨슡멓야뱐야냐야뱞야다샅뽀밦뱕뗘도타본
+뜌뱖서밝밤따따다쌈샴아멓샅밝밤밤따또
+또뷹추뺘져번뚜벌벌처뿌져벓투번
+더쎰서토푸터번루벋누분변뽀쑼뽀숭
+뵴범삭본투두벓벑도범라추초뻐소써
+샤써도뼈섵더여볎여녀여변여
+빠바쟈무차붏밣따다밣따다밣따다밣따다맣야희
+뫃떠벌번정따도퍼즐릿

[источник]

Hello, world!


Hello, world!


Справа — оригинал, слева — увеличенная версия.


DOt-Based Esoteric LAnguage.

Hello, world!


Hello, world!


Hexagony — первый язык, где инструкции расположены внутри шестиугольной сетки. Название происходит от слов «hexagon» (шестиугольник) и «agony» (агония), потому что программирование будет сложным.

Hello, world!


Язык логических вентелей и цифровых схем.

Hello, world!


Язык и игра в одном лице.

Hello, world!


Hello, world!

Hello, world!

Hello, world!


Есть провода, токи, логические вентили и I/O.

Hello, world!


Hello, world!


Hello, world!

Hello, world!


В Surface программные инструкции расположены на 2D сетке вокруг бутылки Клейна.

Hello, world!


Hello, world!


Hello, world!


Hello, world!


Тьюринговая трясина, основанная на комбинаторной логике.

Hello, world!


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

Hello, world!

1111111111001000101111111010111111111101011101010
11011011011000001101011001010010100101011111110
01010001010111001010010110010100110111111111111
1111100101001000101011100101000000000000000000
000101000000000000000000000000000101001010010
10010001010


Hello, world!

Слушать

Whitespace


Whitespace (англ. пробел) – эзотерический язык программирования, созданный Э. Брэди и К. Моррисом. Существенным его отличием является то, что для управляющих конструкций используются только непечатаемые символы, а именно: пробел, перевод строки и табуляция. Интересным следствием этого факта является то, что текст программы на языке Whitespace можно «скрыть» внутри исходных кодов другой программы.

Hello, world! («Суслика не видно, но он есть»)

с подсветкой спецсимволов
S=пробел T=Tab

Откровенно шуточные ЯП


HQ9+ шуточный язык с четырьмя инструкциями:

H: Print «hello, world»
Q: Print the program’s source code
9: Print the lyrics to «99 Bottles of Beer»
+: Increment the accumulator


Эзотерический язык программирования, созданный под влиянием интернет-мема о lolcat’ах. Есть спецификация этого языка и существуют несколько работающих интерпретаторов и компиляторов этого языка. LOLCODE является Тьюринг-полным языком.

Hello World

// «Hello World» by Stephen McGreal.
// Note that the views expressed in this source code do not necessarily coincide with those of the author :o)

Gr34t l33tN3$$?
M3h…
iT 41n’t s0 7rIckY.

l33t sP33k is U8er keWl 4nD eA5y wehn u 7hink 1t tHr0uGh.
1f u w4nn4be UB3R-l33t u d3f1n1t3lY w4nt in 0n a b4d4sS h5xX0r1ng s1tE!!! ;p
w4r3Z c0ll3cT10n2 r 7eh l3Et3r!

Qu4k3 cL4nS r 7eh bE5t th2ng 1n teh 3nTIr3 w0rlD!!!
g4m3s wh4r3 u g3t to 5h00t ppl r 70tAl1_y w1cK1d!!!
I’M teh fr4GM4stEr aN I’lL t0t41_1Ly wIpE teh phr34k1ng fL00r ***j3d1 5tYlE*** wItH y0uR h2dE!!! L0L0L0L!
t3lEphR4gG1nG l4m3rs wit mY m8tes r34lLy k1kK$ A$$

l33t hAxX0r$ CrE4t3 u8er- k3wL 5tUff lIkE n34t pR0gR4mm1nG lAnguidGe$…
s0m3tIm3$ teh l4nGu4gES l00k jUst l1k3 rE41_ 0neS 7o mAkE ppl Th2nk th4y’r3 ju$t n0rMal lEE7 5pEEk but th4y’re 5ecRetLy c0dE!!!
n080DY unDer5tAnD$ l33t SpEaK 4p4rT fr0m j3d1!!!
50mE kId 0n A me$$4gEb04rD m1ghT 8E a r0xX0r1nG hAxX0r wH0 w4nT2 t0 bR34k 5tuFf, 0r mAyb3 ju5t sh0w 7eh wAy5 l33t ppl cAn 8E m0re lIkE y0d4!!! hE i5 teh u8ER!!!
1t m1ght 8E 5omE v1rus 0r a Pl4ySt4tI0n ch44t c0dE.
1t 3v3n MiTe jUs7 s4y «h4LL0 W0RLD!!!» u ju5t cAn’T gu3s5.
th4r3’s n3v3r anY p0iNt l00KiNg sC3pT1c4l c0s th5t, be1_1Ev3 iT 0r n0t, 1s whAt th2s 1s!!!

5uxX0r5!!!L0L0L0L0L!!!

ArnoldC


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

Hello, world!


То ли язык орангутангов, то ли мечта Вильяма Оккама.

Hello, world!


Эзотерический язык программирования, разработанный Дэвидом Морган-Маром, программы на котором сходны с кулинарными рецептами. Каждая программа в языке состоит из названия, списка переменных и их значений, списка инструкций. Переменные могут быть названы только названиями основных продуктов питания. Стек, в которые помещаются значения переменных, называется англ. mixing bowl («чаша для смешивания»), а операции для манипуляции с переменными — mix («смешать»), stir («взболтать») и так далее.Hello WorldHello World Souffle.

Ingredients.
72 g haricot beans
101 eggs
108 g lard
111 cups oil
32 zucchinis
119 ml water
114 g red salmon
100 g dijon mustard
33 potatoes

Method.
Put potatoes into the mixing bowl.
Put dijon mustard into the mixing bowl.
Put lard into the mixing bowl.
Put red salmon into the mixing bowl.
Put oil into the mixing bowl.
Put water into the mixing bowl.
Put zucchinis into the mixing bowl.
Put oil into the mixing bowl.
Put lard into the mixing bowl.
Put lard into the mixing bowl.
Put eggs into the mixing bowl.
Put haricot beans into the mixing bowl.
Liquefy contents of the mixing bowl.
Pour contents of the mixing bowl into the baking dish.

Serves 1.




Эзотерический язык программирования разработанный Джоном Аслаудом и Карлом Хассельстромом. Язык Shakespeare призван замаскировать исходный код программы под пьесы Шекспира.Hello, world!Romeo, a young man with a remarkable patience.
Juliet, a likewise young woman of remarkable grace.
Ophelia, a remarkable woman much in dispute with Hamlet.
Prince Hamlet, the flatterer of Andersen Insulting A/S.

Act I: Hamlet's insults and flattery.
Scene I: The insulting of Romeo.
[Enter Hamlet and Romeo]
Hamlet:
You lying stupid fatherless big smelly half-witted coward! You are as
stupid as the difference between a handsome rich brave hero and thyself!
Speak your mind!
You are as brave as the sum of your fat little stuffed misused dusty
old rotten codpiece and a beautiful fair warm peaceful sunny summer's
day. You are as healthy as the difference between the sum of the
sweetest reddest rose and my father and yourself! Speak your mind!
You are as cowardly as the sum of yourself and the difference
between a big mighty proud kingdom and a horse. Speak your mind.
Speak your mind!
[Exit Romeo]
Scene II: The praising of Juliet.
[Enter Juliet]
Hamlet:
Thou art as sweet as the sum of the sum of Romeo and his horse and his
black cat! Speak thy mind!
[Exit Juliet]
Scene III: The praising of Ophelia.
[Enter Ophelia]
Hamlet:
Thou art as lovely as the product of a large rural town and my amazing
bottomless embroidered purse. Speak thy mind!
Thou art as loving as the product of the bluest clearest sweetest sky
and the sum of a squirrel and a white horse. Thou art as beautiful as
the difference between Juliet and thyself. Speak thy mind!
[Exeunt Ophelia and Hamlet]

Act II: Behind Hamlet's back.
Scene I: Romeo and Juliet's conversation.
[Enter Romeo and Juliet]
Romeo:
Speak your mind. You are as worried as the sum of yourself and the
difference between my small smooth hamster and my nose. Speak your
mind!
Juliet:
Speak YOUR mind! You are as bad as Hamlet! You are as small as the
difference between the square of the difference between my little pony
and your big hairy hound and the cube of your sorry little
codpiece. Speak your mind!
[Exit Romeo]
Scene II: Juliet and Ophelia's conversation.
[Enter Ophelia]
Juliet:
Thou art as good as the quotient between Romeo and the sum of a small
furry animal and a leech. Speak your mind!
Ophelia:
Thou art as disgusting as the quotient between Romeo and twice the
difference between a mistletoe and an oozing infected blister! Speak
your mind!
[Exeunt]




Ответ русских гопников Шекспиру.

Читать еще




Поддержка публикации — компания Edison, которая разработала систему проведения онлайн лотерей для африканская игровой компании и автоматизировала всю нудную рутину для торговой сети.

Социальная Архитектура: стратагемы для успеха open source проектов

Компилятор — Википедия

Компиля́тор – это специальная программа, которая переводит текст программы, написанный на языке программирования, в набор машинных кодов.[1][2][3].

Компиля́ция — сборка программы, включающая трансляцию всех модулей программы, написанных на одном или нескольких исходных языках программирования высокого уровня и/или языке ассемблера, в эквивалентные программные модули на низкоуровневом языке, близком машинному коду (абсолютный код, объектный модуль, иногда на язык ассемблера)[2][3][4] или непосредственно на машинном языке или ином двоичнокодовом низкоуровневом командном языке и последующую сборку исполняемой машинной программы. Если компилятор генерирует исполняемую машинную программу на машинном языке, то такая программа непосредственно исполняется физической программируемой машиной (например компьютером). В других случаях исполняемая машинная программа выполняется соответствующей виртуальной машиной. Входной информацией для компилятора (исходный код) является описание алгоритма или программы на предметно-ориентированном языке, а на выходе компилятора — эквивалентное описание алгоритма на машинно-ориентированном языке (объектный код[5], байт-код).

Компили́ровать — проводить трансляцию машинной программы с предметно-ориентированного языка на машинно-ориентированный язык[3].

Виды компиляции[2]:

  • Пакетная. Компиляция нескольких исходных модулей в одном задании.
  • Построчная. Машинный код порождается и затем исполняется для каждой завершённой грамматической конструкции языка. Внешне воспринимается как интерпретация, но устройство имеет иное.
  • Условная. Компиляция, при которой транслируемый текст зависит от условий, заданных в исходной программе директивами компилятора. (Яркий пример — работа препроцессора языка С и производных от него.) Так, в зависимости от значения некой константы некая заданная часть исходного текста программы транслируется или не транслируется.

Процесс компиляции состоит из следующих этапов:

  1. Трансляция программы — трансляция всех или только изменённых модулей исходной программы.
  2. компоновка машинно-ориентированной программы.

В первом случае компилятор представляет собой пакет программ, включающий в себя трансляторы с разных языков программирования и компоновщики. Такой компилятор может компилировать программу, разные части исходного текста которой написаны на разных языках программирования. Нередко такие компиляторы управляются встроенным интерпретатором того или иного командного языка. Яркий пример таких компиляторов — имеющийся во всех UNIX-системах (в частности в Linux) компилятор make.

Во втором случае компилятор де-факто выполняет только трансляцию и далее вызывает компоновщик как внешнюю подпрограмму, который и компонует машинно-ориентированную программу. Этот факт нередко служит поводом считать компилятор разновидностью транслятора, что естественно неверно, — все современные компиляторы такого типа поддерживают организацию импорта программой процедуры (функции) из уже оттранслированого программного модуля, написанного на другом языке программирования. Так в программу на С/С++ можно импортировать функцию написанную например Pascal или Fortran. Аналогично и напротив написанная на С/С++ функция может быть импортирована в Pascal- или Fortran-программу соответственно. Это как правило было бы невозможно без поддержки многими современными компиляторами организации обработки входных данных в процедуру (функций) в соответствии с соглашениями других языков программирования. Например современные компиляторы с языка Pascal помимо соглашения самого Pascal поддерживает организацию обработки процедурой/функцией входных в соответствии с соглашениями языка С/С++. (Чтобы на уровне машинного кода написанная на Pascal процедура/функция работала с входными параметрами в соответствии с соглашениями языка С/С++, — оператор объявления такой Pascal-процедуры/Pascal-функции должен содержать ключевое слово cdecl.) Примерами таких компиляторов являются компиляторы со всех без исключения языков программирования, используемые непосредственно.

Трансляция программы как неотъемлемая составляющая компиляции включает в себя:

  1. Лексический анализ. На этом этапе последовательность символов исходного файла преобразуется в последовательность лексем.
  2. Синтаксический (грамматический) анализ. Последовательность лексем преобразуется в дерево разбора.
  3. Семантический анализ. Дерево разбора обрабатывается с целью установления его семантики (смысла) — например, привязка идентификаторов к их декларациям, типам, проверка совместимости, определение типов выражений и т. д. Результат обычно называется «промежуточным представлением/кодом», и может быть дополненным деревом разбора, новым деревом, абстрактным набором команд или чем-то ещё, удобным для дальнейшей обработки.
  4. Оптимизация. Выполняется удаление излишних конструкций и упрощение кода с сохранением его смысла. Оптимизация может быть на разных уровнях и этапах — например, над промежуточным кодом или над конечным машинным кодом.
  5. Генерация кода. Из промежуточного представления порождается код на целевом машинно-ориентированном языке.

Генерация машинного кода[править | править код]

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

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

Для каждой целевой машины (IBM, Apple, Sun, Эльбрус и т. д.) и каждой операционной системы или семейства операционных систем, работающих на целевой машине, требуется написание своего компилятора. Существуют также так называемые кросс-компиляторы, позволяющие на одной машине и в среде одной ОС генерировать код, предназначенный для выполнения на другой целевой машине и/или в среде другой ОС. Кроме того, компиляторы могут оптимизировать код под разные модели из одного семейства процессоров (путём поддержки специфичных для этих моделей особенностей или расширений наборов команд). Например, код, скомпилированный под процессоры семейства Pentium, может учитывать особенности распараллеливания инструкций и использовать их специфичные расширения — MMX, SSE и т. п.

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

Генерация байт-кода[править | править код]

Результатом работы компилятора может быть программа на специально созданном низкоуровневом языке двоично-кодовых команд, выполняемых виртуальной машиной. Такой язык называется псевдокодом или байт-кодом. Как правило, он не есть машинный код какого-либо компьютера и программы на нём могут исполняться на различных архитектурах, где имеется соответствующая виртуальная машина, но в некоторых случаях создаются аппаратные платформы, напрямую выполняющие псевдокод какого-либо языка. Например, псевдокод языка Java называется байт-кодом Java и выполняется в Java Virtual Machine, для его прямого исполнения была создана спецификация процессора picoJava. Для платформы .NET Framework псевдокод называется Common Intermediate Language (CIL), а среда исполнения — Common Language Runtime (CLR).

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

Динамическая компиляция[править | править код]

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

Наиболее популярной разновидностью динамической компиляции является JIT. Другой разновидностью является инкрементальная компиляция[en].

CIL-код также компилируется в код целевой машины JIT-компилятором, а библиотеки .NET Framework компилируются заранее.

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

Декомпиляция[править | править код]

Существуют программы, которые решают обратную задачу — перевод программы с низкоуровневого языка на высокоуровневый. Этот процесс называют декомпиляцией, а такие программы — декомпиляторами. Но поскольку компиляция — это процесс с потерями, точно восстановить исходный код, скажем, на C++, в общем случае невозможно. Более эффективно декомпилируются программы в байт-кодах — например, существует довольно надёжный декомпилятор для Flash. Разновидностью декомпиляции является дизассемблирование машинного кода в код на языке ассемблера, который почти всегда благополучно выполняется (при этом сложность может представлять самомодифицирующийся код или код, в котором собственно код и данные не разделены). Связано это с тем, что между кодами машинных команд и командами ассемблера имеется практически взаимно-однозначное соответствие.

Раздельная компиляция (англ. separate compilation) — трансляция частей программы по отдельности с последующим объединением их компоновщиком в единый загрузочный модуль[2].

Исторически особенностью компилятора, отражённой в его названии (англ. compile — собирать вместе, составлять), являлось то, что он производил как трансляцию, так и компоновку, при этом компилятор мог порождать сразу машинный код. Однако позже, с ростом сложности и размера программ (и увеличением времени, затрачиваемого на перекомпиляцию), возникла необходимость разделять программы на части и выделять библиотеки, которые можно компилировать независимо друг от друга. В процессе трансляции программы сам компилятор или вызываемый компилятором транслятор порождает объектный модуль, содержащий дополнительную информацию, которая потом — в процессе компоновки частей в исполнимый модуль — используется для связывания и разрешения ссылок между частями программы. Раздельная компиляция также позволяет писать разные части исходного текста программы на разных языках программирования.

Появление раздельной компиляции и выделение компоновки как отдельной стадии произошло значительно позже создания компиляторов. В связи с этим вместо термина «компилятор» иногда используют термин «транслятор» как его синоним: либо в старой литературе, либо когда хотят подчеркнуть его способность переводить программу в машинный код (и наоборот, используют термин «компилятор» для подчёркивания способности собирать из многих файлов один). Вот только использование в таком контексте терминов «компилятор» и «транслятор» неправильно. Даже если компилятор выполняет трансляцию программы самостоятельно, поручая компоновку вызываемой внешней программе-компоновщику, такой компилятор не может считаться разновидностью транслятора, — транслятор выполняет трансляцию исходной программы и только. И уж тем более не являются трансляторами компиляторы вроде системной утилиты-компилятора make, имеющейся во всех UNIX-системах.

Собственно утилита make — яркий пример довольно удачной реализации раздельной компиляции. Работа утилиты make управляется сценарием на интерпретируемым утилитой входном языке, известном как makefile, содержащемся в задаваемом при запуске утилиты входном текстовом файле. Сама утилита не выполняет ни трансляцию, ни компоновку — де-факто утилита make функционирует как диспетчер процесса компиляции, организующий компиляцию программы в соответствии с заданным сценарием. В частности в ходе компиляции целевой программы утилита make вызывает трансляторы с языков программирования, транслирующие разные части исходной программы в объектный код, и уже после этого вызывается тот или иной компоновщик, компонующий конечный исполняемый программный или библиотечный программный модуль. При этом разные части программы, оформляемые в виде отдельных файлов исходного текста, могут быть написаны как на одном языке программирования, так и на разных языках программирования. В процессе перекомпиляции программы транслируются только изменённые части-файлы исходного текста программы, вследствие чего длительность перекомпиляции программы значительно (порой на порядок) сокращается.

На заре развития компьютеров первые компиляторы (трансляторы) называли «программирующими программами»[6] (так как в тот момент программой считался только машинный код, а «программирующая программа» была способна из человеческого текста сделать машинный код, то есть запрограммировать ЭВМ).

  1. ↑ ГОСТ 19781-83 // Вычислительная техника. Терминология: Справочное пособие. Выпуск 1 / Рецензент канд. техн. наук Ю. П. Селиванов. — М.: Издательство стандартов, 1989. — 168 с. — 55 000 экз. — ISBN 5-7050-0155-X.; см. также ГОСТ 19781-90
  2. 1 2 3 4 Першиков, 1991.
  3. 1 2 3 Вычислительная техника.
  4. Борковский А. Б. Англо-русский словарь по программированию и информатике (с толкованиями). — М.: Русский язык, 1990. — 335 с. — 50 050 (доп,) экз. — ISBN 5-200-01169-3.
  5. ↑ Толковый словарь по вычислительным системам = Dictionary of Computing / Под ред. В. Иллингуорта и др.: Пер. с англ. А. К. Белоцкого и др.; Под ред. Е. К. Масловского. — М.: Машиностроение, 1990. — 560 с. — 70 000 (доп,) экз. — ISBN 5-217-00617-X (СССР), ISBN 0-19-853913-4 (Великобритания).
  6. Н. А. Криницкий, Г. А. Миронов, Г. Д. Фролов. Программирование / Под ред. М. Р. Шура-Бура. — М.: Государственное издательство физико-математической литературы, 1963.
  • Вычислительная техника. Терминология. Указ. соч.
  • Першиков В. И., Савинков В. М. Толковый словарь по информатике / Рецензенты: канд. физ.-мат. наук А. С. Марков и д-р физ.-мат. наук И. В. Поттосин. — М.: Финансы и статистика, 1991. — 543 с. — 50 000 экз. — ISBN 5-279-00367-0.
  • Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман. Компиляторы: принципы, технологии и инструментарий = Compilers: Principles, Techniques, and Tools. — 2-е изд. — М.: Вильямс, 2010. — 1184 с. — ISBN 978-5-8459-1349-4.
  • Робин Хантер. Основные концепции компиляторов = The Essence of Compilers. — М.: Вильямс, 2002. — 256 с. — ISBN 0-13-727835-7.
  • Хантер Р. Проектирование и конструирование компиляторов / Пер. с англ. С. М. Круговой. — М.: Финансы и статистика, 1984. — 232 с.
  • Д. Креншоу. Давайте создадим компилятор!
  • Серебряков В. А., Галочкин М. П. Основы конструирования компиляторов.

Author: admin

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

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