вопрос к знатокам #define - страница 10

 
Алексей Тарабанов:

Давай. Сначала - дефайн, после - исполняемый файл, дальше - исполнение исполняемого файла. 

Это я понял. Получается дефайн ускоряет только сборку большого проекта, но не как не выполнение кода в исполняемом файле.

Вообще для самообразования, меня интересует максимально возможная реализация кода на уровне железа, по скорости выполнения.
Не важно в какой архитектуре или области.
Знаю есть языки которые полностью выполняются в памяти, наверно это будет самое быстрое решение.
 
Roman:

Это я понял. Получается дефайн ускоряет только сборку большого проекта, но не как не выполнение кода в исполняемом файле.

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

Дефайн не дает никакого ускорения, вообще. За может быть малым исключением дефайна простых чисел типо #define FIVE 5

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

 
Вот интересно, на каком языке пишут для МКС, или мед. оборудования.
Микроконтроллеры и драйвера пишут или на Си или ассемблере.
Какие варианты ещё есть? Кто нибудь изучал язык Q  ?
 

ИМХО этапы программирования))

1 - ничего не понимаю

2 - понимаю процедурный стиль (это даже не функциональный это когда просто портянка кода

3 - считаю что на функциональном могу написать все что угодно)

4 - понимаю что не понимаю ООП

5 - понимаю ООП

6 - продолжаю понимать ООП по строгости

7 - могу придумать на ООП любыt связки узлов деревьев чего угодно и все это за хэшмэпить и посолить дефанами по вкусу

8 - все это программирвоания но со строгим доступом по типу и прочее.

9 - понимаю что 7 пункт это зло (темная сторона) и есть в мире цивильное оод (типо шаблоны)

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

11 - есть четкое понимая что на современных функциональных языках почти за раз два имитируется ООП в определенных этапах, все эти расширения функций и т.п. другими словами начинаю Понимать функциональный потход программирования (пункт 3)

В обще не особо вижу разницы от синтаксиса языка, принципы не меняются, есть строгие языки - есть не строгие. На не строгих проблемно кодить. А что это C++ C# R Q GO JS Ruby  особо разницы нету

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

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

Документация по MQL5: Основы языка / Синтаксис
Документация по MQL5: Основы языка / Синтаксис
  • www.mql5.com
Синтаксис - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Не, не, не. Ни какого ООП ))
ООП это обёртка над процедуркой.
То есть расширение процедурного языка, но уже со своей парадигмой.
Лично я считаю ООП это замусоривание и так высокоуровнего языка ))
Все перечисленные языки это высокоуровневые языки, за исключением Q 
Вы наверно не за тот Q подумали. Q это тот который продолжение языка К
На языке Q реализована база данных KDB+

Kdb+, от  Kx , является

  • высокопроизводительная кроссплатформенная колончатая база данных исторических временных рядов
  • вычислительный движок в памяти
  • потоковый процессор в реальном времени
  • выразительные запросы и язык программирования под названием q

Там совсем другая парадигма, не Си подобная. По моему там векторная логика.
Но думается мне, что тут на форуме, даже самые маститые программисты не слышали об этом языке ))


w

 

0.0 эволюция Q

Артур Уитни разработал язык программирования q и его базу данных kdb+.  Выпущено компанией Kx Systems, Inc.  в 2003 году основными целями проектирования q были выразительность, скорость и эффективность. 
В них она не идет ни в какое сравнение.  Компромисс дизайна-это лаконичность, которая может сбить с толку программистов, приходящих из многословных традиционных сред программирования баз данных –
например, C++, Java, C# или Python – и реляционной СУБД.  В то время как боги программирования q упиваются программами, напоминающими дамп ядра ASCII, это руководство предназначено для всех нас.

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

Митохондриальная ДНК q следов от APL к A к  A+  и к k. все они были хорошо приспособлены для выполнения сложных вычислений быстро на векторах. 
Что нового в q / kdb+ , так это то, что он очень эффективно обрабатывает большие объемы данных временных рядов в реляционной парадигме. 
Его синтаксис позволяет" выбирать " выражения, аналогичные SQL 92, а его коллекция встроенных функций обеспечивает полный и мощный язык хранимых процедур.

В генах q также присутствует некоторая  шепелявость : фундаментальная конструкция данных q-это список.  Хотя обозначения и терминология различны, символы взяты из их аналогов в схеме.

Родословная APL q также показывает влияние функционального программирования. 
В своей лекции 1977 года на премию Тьюринга, которая представила чисто функциональное программирование,  Бэкус  признал вдохновение от APL. 
Хотя q не является чисто функциональным, он сильно функциональен в том смысле, что даже его основные структуры данных, список и словарь, рассматриваются как математические отображения.

0.1 философия

Опытный разработчик q мыслит иначе, чем в обычных средах программирования, таких как C++, Java, C# или Python, отныне называемых "традиционным программированием". -
Чтобы ввести вас в правильное мышление, мы суммируем некоторые потенциальные разрывы для новичка q – отныне известного как qbie.

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

  • Представление в памяти-например, коллекции объектов-должно быть сопоставлено с другим представлением-например, таблицами-для сохранения. 
    Требуется значительное усилие, чтобы получить правильное объектно-реляционное соответствие.
  • Объекты должны быть сопоставлены с другим представлением для транспорта, обычно какой-то двоичной или XML-формой, которая сглаживает ссылочные цепочки.
  • Манипулирование данными – например, выделение, группирование и агрегирование-на больших наборах данных лучше всего выполнять в хранимых процедурах на сервере баз данных.
    Сложные числовые вычисления лучше всего выполнять отдельно от базы данных на сервере приложений.
  • Преобразование данных для отображения графического интерфейса лучше всего производить на отдельном слое – например, в HTML5 и JavaScript в браузере.

Большая часть традиционного проектирования программирования тратится на корректное получение различных представлений, требуя много строк кода для маршалирования ресурсов и синхронизации различных представлений. 
Они удивительно просты в q / kdb+.

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

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

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

Значения Null и Infinity  в классическом SQL это значение  NULL  представляет собой отсутствующие данные для поля любого типа и не занимает места для хранения. 
В q значения null типизируются и занимают то же пространство, что и ненулевые значения.  Числовые типы также имеют бесконечные значения. 
Бесконечные и нулевые значения могут участвовать в арифметических и других операциях с (в основном) предсказуемыми результатами.

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

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

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

Таблицы SQL, ориентированные на столбцы, организованы в виде строк, распределенных по хранилищу, и операции применяются к полям внутри строки.  Q таблицы - это списки столбцов в непрерывном хранилище, и операции применяются ко всем столбцам.

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

 

не мала баба хлопоту купила порося (с) народная мудрость

угораздило влезть в обсуждения, покоя нет  ))

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

имхо только так

void OnStart()
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = ArraySize(arr) - 1; i >= 0; i--)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
   
   sum = 0;
   for(int i = 0, sz = ArraySize(arr); i < sz; i++)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum); //sum = 100
}

первый цикл - перебор по убыванию индексов массива

нижний цикл  - перебор по возрастанию индексов

 
Igor Makanu:

не мала баба хлопоту купила порося (с) народная мудрость

угораздило влезть в обсуждения, покоя нет  ))

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

имхо только так

первый цикл - перебор по убыванию индексов массива

нижний цикл  - перебор по возрастанию индексов

Функция функции рознь. И может не удачный пример размер массива, т.к. это по использованию памяти и доступу к ней равно переменной, по сути это переменная в ячейке памяти, которая заполнилась при объявлении массива. А вот максимум или минимум из массива, или просто вычисление в условиях цикла из 10ка переменных, то да не стоит. Лучше сперва вычислить и подставить.

И насколько понимаю, элементы массива, элементы структуры это переменные с определенными адресами в памяти и это всего лишь удобство записи, А[10] и 10 переменных А1 А2 ... А10 одинаково по доступу и размеру. Тип конечно одинаковый)

 
Valeriy Yastremskiy:

И насколько понимаю, элементы массива, элементы структуры это переменные с определенными адресами в памяти и это всего лишь удобство записи, А[10] и 10 переменных А1 А2 ... А10 одинаково по доступу и размеру. Тип конечно одинаковый)

если физически в команда ЦПУ, то нет

массив это участок памяти, доступ к элементам массива - это расчет индекса элемента от начала этого участка памяти и извлечение данных (байты)  в соответствии с хранимым типом 


если это логика алгоритма, то да - это индексируемые переменные

 в общем по изучаемой проблеме, единственный правильный совет https://www.mql5.com/ru/forum/354662/page4#comment_19039624:

Andrei Novichkov:

Это суждение представляется поспешным. Что именно происходит за фасадом функции  ArraiSize неизвестно, не так ли? В MQL это черный ящик. Вполне возможно, что  for (int i=0; i<ArraiSize(max); i++)  приведет к выполнению нескольких инструкций. Например, функция может проверить входные параметры. Сохранить - вытолкнуть данные из стека. Сохранить регистры. Восстановить регистры. Вызов функции - call, потом возврат. Я это к тому, что на заднем плане  может происходить очень много чего, причем мы увидеть этого не можем. Поэтому надежнее использовать for (int i=0; i<size; i++)  и не полагаться на то, что компилятор должен делать что - то, что мы предполагаем.

 
Igor Makanu:

если физически в команда ЦПУ, то нет

массив это участок памяти, доступ к элементам массива - это расчет индекса элемента от начала этого участка памяти и извлечение данных (байты)  в соответствии с хранимым типом 


если это логика алгоритма, то да - это индексируемые переменные

 в общем по изучаемой проблеме, единственный правильный совет https://www.mql5.com/ru/forum/354662/page4#comment_19039624:

С этим согласен, компилятор ящик черный, поэтому точно предположить не получиться.

Главное что бы все задуманное работало как задумано)))