Search
Write a publication
Pull to refresh
64
1.8
Вадим Румянцев @vadimr

Разработчик аппаратно-программных комплексов

Send message

Конечный автомат, машина Тьюринга, порождающая грамматика и компьютер: в чём разница

Level of difficultyHard
Reading time12 min
Views3K

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

А в конце мы немного пофилософствуем на тему, что же такое программа и что такое семантика.

Читать далее

Функциональное и объектно-ориентированное проектирование

Level of difficultyMedium
Reading time6 min
Views8K

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

Читать далее

Вызовы функций, стек, куча и продолжения. Часть 2

Level of difficultyHard
Reading time13 min
Views4.1K

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

Читать далее

Вызовы функций, стек, куча и продолжения. Часть 1

Level of difficultyMedium
Reading time5 min
Views4.8K

Для многих людей, занимающихся программированием, вызов функции воспринимается практически как синоним передачи управления с сохранением адреса возврата и выделением фрейма памяти в стеке. Это однако, не всегда верно и в практическом, и в теоретическом отношении. О семантике и прагматике вызова функций мы и поговорим в этой статье.

Читать далее

Gambit Scheme: интегрируемся с Python

Level of difficultyMedium
Reading time7 min
Views1.9K

Статья продолжает рассмотрение неочевидных возможностей Gambit Scheme, начатое в предыдущих статьях.

На этот раз расскажем о том, как использовать в программах на Gambit Scheme код на языке Python, в том числе многочисленные библиотеки, разработанные для Python.

Читать далее

Gambit Scheme: переопределяем формат вывода u8vector

Level of difficultyMedium
Reading time6 min
Views699

Продолжим рассмотрение неочевидных поучительных возможностей программирования на Gambit Scheme, начатое в предыдущих статьях.

На этот раз займёмся пристойной печатью значений типа u8vector, то есть массивов байтов.

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

Читать далее

Семь способов выхода из рекурсии

Level of difficultyMedium
Reading time5 min
Views3.3K

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

Читать далее

Gambit Scheme: проверяем, определён ли атом

Level of difficultyMedium
Reading time3 min
Views692

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

Одной из самых проблематичных операций, реализацию которой затрудняет идеология Scheme, является стандартная для ряда диалектов форма is-bound?, предназначенная для проверки, определён ли её аргумент, то есть занесён ли он в системный ассоциативный список атомов и, как следствие, имеет ли он вообще какое-либо значение. Рассмотрим, как мы можем реализовать данную форму в Gambit Scheme.

Читать далее

Gambit Scheme: переопределяем скобки

Level of difficultyEasy
Reading time3 min
Views581

Рассмотрим недавно вошедшую в Gambit Scheme возможность по переопределению семантики скобок.

Gambit Scheme – используемый автором диалект Scheme, имеющий очень быстрый интерпретатор и компилятор с рядом полезных расширений, которые могут быть построены из исходного кода без внешних зависимостей, а также в полной мере поддерживают интернациональные символы UTF-8.

Читать далее

Задача о банкомате

Level of difficultyMedium
Reading time12 min
Views19K

Рассмотрим одну задачу, которая на leetcode маркирована как "medium", хотя на самом деле это невероятно сложная задача. Примечательна она тем, что допускает в разной степени оптимальные решения, самые упрощённые из которых действительно весьма просты, а самые оптимальные ещё не найдены современной наукой. В этой задаче ценно то, что на её примере можно изучать целый ряд техник программирования.

Читать далее

Почему Scheme?

Level of difficultyMedium
Reading time5 min
Views8K

Введение

Язык Scheme (произносится "ским"), которому в следующем году исполняется 50 лет, является языком программирования, занимающим необычное место среди прочих. Это язык, который гораздо больше изучают, чем потом на нём пишут. Скорее это язык для развития ума программиста, чем для написания коммерческого кода, хотя и примеры использования Scheme в коммерческой разработке тоже встречаются. На мой личный взгляд, Scheme идеален в качестве первого языка программирования в старшем школьном и институтском возрасте, а также идеально продолжает изучение Scratch в младших классах школы и Logo в средних классах.

Читать далее

Установка Linux на компьютер MSI Cubi

Level of difficultyEasy
Reading time1 min
Views3.2K

Возникла необходимость установить операционную систему на компьютер MSI Cubi N ADL-017BRU.

Сам компьютер представляет собой относительно тихий неттоп. К сожалению, разработчики, видимо, кроме изделий Microsoft ничего не видели, и установка Linux сталкивается с проблемой: дальше начальной стадии загрузки инсталлятора дело не идёт. В SLES дело заканчивается командной строкой GRUB, в Debian – графическим экраном инсталлятора, который не может найти дистрибутив.

Читать далее

Негативное свойство отрицательных чисел

Level of difficultyEasy
Reading time2 min
Views4.9K

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

Читать далее

Повышаем быстродействие расчётов на примере медианного фильтра

Level of difficultyMedium
Reading time6 min
Views3.3K
Рассмотрим некоторые приёмы повышения быстродействия вычислительных программ на примере алгоритма медианного фильтра.
Читать дальше →

Операции, функции и специальные формы в императивных языках программирования

Level of difficultyEasy
Reading time4 min
Views2.1K

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

Если читатель владеет одним из языков семейства Лисп (Common Lisp, Scheme, Clojure и т.д.), а в особенности если читал SICP, то ему излагаемый вопрос не в новинку, и он может пропустить эту статью. Если читатель использует Хаскель или другой язык, основанный на модели ленивых вычислений, то там всё немножко по-другому, и впрямую изложение материала в данной статье к таким языкам не относится, хотя фундаментальные принципы в основе лежат те же.

Читать далее

Настройка распределённого выполнения параллельных программ в кластере

Level of difficultyMedium
Reading time9 min
Views2K

В предыдущей публикации Фортран: пишем параллельные программы для суперкомпьютера мы рассмотрели общий подход к программированию в массивно-паралллельной архитектуре (MPP) с использованием языка Фортран-2018 и дали пример запуска массивно-параллельной программы на одной машине с многоядерным процессором. В настоящей статье мы рассмотрим запуск массивно-параллельных программ на кластере высокой производительности (HPC) или кластере высокой готовности (HA). Код в данной статье пишется на языке Фортран-2018 с использованием комассивов (coarrays) и преобразуется компилятором Фортрана в вызовы фреймворка MPI.

Читать далее

Об одной тестовой задаче

Level of difficultyMedium
Reading time5 min
Views10K

Недавно Youtube (*сайт, нарушающий закон РФ) порекомендовал мне любопытный с различных сторон видеоролик. В нём рассматривалась задача, которую, по словам автора, задают на собеседовании при приёме на работу в Apple.

Читать далее

Язык PL/I: десять тонн синтаксического сахара

Level of difficultyEasy
Reading time17 min
Views16K

Данный обзор посвящён чрезвычайно популярному в прошлом, но практически полностью забытому в настоящее время языку программирования PL/I. Между тем, многие свойства этого языка, на наш взгляд, заслуживают изучения и наше время, так как часть их периодически переизобретается различными авторами, причём часто в ухудшенном виде.

Читать далее

Фортран: пишем параллельные программы для суперкомпьютера

Level of difficultyMedium
Reading time10 min
Views3.6K

В первой части статьи мы рассмотрели написание на современном Фортране простой программы, реализующей клеточный автомат "Жизнь", в виде классического последовательного кода (SISD), матричных операций (SIMD) и параллельных конструкций SMP (SIMD с частью функций MIMD). Сейчас мы будем рассматривать использование конструкций Фортрана для программирования массивно-параллельных архитектур (MPP), к которым, в частности, относятся современные суперкомпьютеры. Такие архитектуры реализуют классическую схему MIMD.

Читать далее
1

Information

Rating
412-th
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity

Specialization

Project Manager, Software Architect
Lead