![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Давай. Сначала - дефайн, после - исполняемый файл, дальше - исполнение исполняемого файла.
Это я понял. Получается дефайн ускоряет только сборку большого проекта, но не как не выполнение кода в исполняемом файле.
Вообще для самообразования, меня интересует максимально возможная реализация кода на уровне железа, по скорости выполнения.Не важно в какой архитектуре или области.
Знаю есть языки которые полностью выполняются в памяти, наверно это будет самое быстрое решение.
Это я понял. Получается дефайн ускоряет только сборку большого проекта, но не как не выполнение кода в исполняемом файле.
Вообще для самообразования, меня интересует максимально возможная реализация кода на уровне железа, по скорости выполнения.Не важно в какой архитектуре или области.
Знаю есть языки которые полностью выполняются в памяти, наверно это будет самое быстрое решение.
Дефайн не дает никакого ускорения, вообще. За может быть малым исключением дефайна простых чисел типо #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 особо разницы нету
Низкоуровневые они типо быстрее (там реально написать свой очень быстрый кусочек кода, быстрее стандартного, но только зачем?) - к примеру довольно просто написать сортировку быстрее стандартной, но суть своевременной сортировки это не скорость))) а минимальное количество действий, и минимальное количество действий далеко не всегда наиболее быстрый способ, но он по своему очень хорош.
по поводу микропоцессоров - ну обычно с этого начинают учить. Хотя суть языка не так важна. Высокоуровневые позволяют оперировать большими участками кода, низкоуровневые - более универсальные что ли.
ООП это обёртка над процедуркой.
То есть расширение процедурного языка, но уже со своей парадигмой.
Лично я считаю ООП это замусоривание и так высокоуровнего языка ))
Все перечисленные языки это высокоуровневые языки, за исключением Q
Вы наверно не за тот Q подумали. Q это тот который продолжение языка К
На языке Q реализована база данных KDB+
Kdb+, от Kx , является
Там совсем другая парадигма, не Си подобная. По моему там векторная логика.
Но думается мне, что тут на форуме, даже самые маститые программисты не слышали об этом языке ))
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.
Вспомним некоторые проблемы, связанные с данными в традиционном программировании баз данных:
Требуется значительное усилие, чтобы получить правильное объектно-реляционное соответствие.
Сложные числовые вычисления лучше всего выполнять отдельно от базы данных на сервере приложений.
Большая часть традиционного проектирования программирования тратится на корректное получение различных представлений, требуя много строк кода для маршалирования ресурсов и синхронизации различных представлений.
Они удивительно просты в 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 очень хорошо рантайм-оптимизацию производит, но все равно .... не правильно это, полагаться на умный компилятор - лишний вызов функции не лучшее решение,
имхо только так
первый цикл - перебор по убыванию индексов массива
нижний цикл - перебор по возрастанию индексов
не мала баба хлопоту купила порося (с) народная мудрость
угораздило влезть в обсуждения, покоя нет ))
протестировал еще варианты, MQL5 очень хорошо рантайм-оптимизацию производит, но все равно .... не правильно это, полагаться на умный компилятор - лишний вызов функции не лучшее решение,
имхо только так
первый цикл - перебор по убыванию индексов массива
нижний цикл - перебор по возрастанию индексов
Функция функции рознь. И может не удачный пример размер массива, т.к. это по использованию памяти и доступу к ней равно переменной, по сути это переменная в ячейке памяти, которая заполнилась при объявлении массива. А вот максимум или минимум из массива, или просто вычисление в условиях цикла из 10ка переменных, то да не стоит. Лучше сперва вычислить и подставить.
И насколько понимаю, элементы массива, элементы структуры это переменные с определенными адресами в памяти и это всего лишь удобство записи, А[10] и 10 переменных А1 А2 ... А10 одинаково по доступу и размеру. Тип конечно одинаковый)
И насколько понимаю, элементы массива, элементы структуры это переменные с определенными адресами в памяти и это всего лишь удобство записи, А[10] и 10 переменных А1 А2 ... А10 одинаково по доступу и размеру. Тип конечно одинаковый)
если физически в команда ЦПУ, то нет
массив это участок памяти, доступ к элементам массива - это расчет индекса элемента от начала этого участка памяти и извлечение данных (байты) в соответствии с хранимым типом
если это логика алгоритма, то да - это индексируемые переменные
в общем по изучаемой проблеме, единственный правильный совет https://www.mql5.com/ru/forum/354662/page4#comment_19039624:
Это суждение представляется поспешным. Что именно происходит за фасадом функции ArraiSize неизвестно, не так ли? В MQL это черный ящик. Вполне возможно, что for (int i=0; i<ArraiSize(max); i++) приведет к выполнению нескольких инструкций. Например, функция может проверить входные параметры. Сохранить - вытолкнуть данные из стека. Сохранить регистры. Восстановить регистры. Вызов функции - call, потом возврат. Я это к тому, что на заднем плане может происходить очень много чего, причем мы увидеть этого не можем. Поэтому надежнее использовать for (int i=0; i<size; i++) и не полагаться на то, что компилятор должен делать что - то, что мы предполагаем.
если физически в команда ЦПУ, то нет
массив это участок памяти, доступ к элементам массива - это расчет индекса элемента от начала этого участка памяти и извлечение данных (байты) в соответствии с хранимым типом
если это логика алгоритма, то да - это индексируемые переменные
в общем по изучаемой проблеме, единственный правильный совет https://www.mql5.com/ru/forum/354662/page4#comment_19039624:
С этим согласен, компилятор ящик черный, поэтому точно предположить не получиться.
Главное что бы все задуманное работало как задумано)))