Cat

Где применяются Python и C/C++ (часть 1)

Данная статья расскажет о различии областей применения языков Python и C/C++.

Сравнение Python и С Arduinum628 11 Июль 2024 Просмотров: 243

Вступление

Всем доброго дня! Сегодня мы поговорим об области применения Python и C/C++. Тема областей применения очень обширная, поэтому информация будет разделена на несколько статей. Отложите свои IDE, налейте чая, возьмите вкусняшек и расслабьтесь. Ибо код писать мы сегодня не будем =)

 

Прототипирование

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

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

Прототипирование на Python обычно используют крупные компании такие как Яндекс. Не обязательно, чтобы код на Python был именно прототипом. Иногда спустя время рабочий код тоже могут переписать с Python на C++ для увеличения производительности. Это только пример, ибо Яндекс может писать много на каких языках. Почему же они переписывают код Python на C++? Всё очень просто. Микросервис на C++ работает гораздо быстрее и выдерживает гораздо больше нагрузки. Это делает связку Python и C++ хорошей для веб разработки. Код на C++ пишут, если важна скорость вычислений и количество запросов в секунду rps. Для сравнения: код, написанный на C++, может держать rps в 4 раза больше чем аналогичный на Python. В конце статьи я прикреплю ссылку на видео компании Яндекс с упоминанием об этом (момент на 16м 21с в видео).

Веб приложения это не единственное где вы можете написать прототип на Python, а затем переписать на C++. Также вы можете, например, написать Библиотеку для обработки изображений, алгоритмы машинного обучения, систему управления базой данных и тд. Количество областей для этого очень большое.

 

Веб приложения

Выше я уже слегка затронул тему веб приложений, а тут я её раскрою и конкретизирую. На Python обычно пишут бэкенд на таких фреймворках как Flask, Django, Fastapi, Streamlit. Затронем вкратце каждый из них чтоб было понятно какой из них выбрать для своей задачи.

Начнём с фреймворка Flask. Это лёгкий и модульный микрофреймворк. Он очень минималистичен и подходит для маленьких сайтов и веб приложений. Также на нём можно писать и большие приложения, где важна гибкость и кастомизация. Хорошая документация, работа с шаблонизатором Jinja2, работа с rest api, возможность использовать много разных библиотек и многое другое. Он подходит как для монолитной, так и для микросервисной архитектуры приложения. Минус его в том что он не поддерживает напрямую асинхронность. Однако есть возможность использовать его с ASGI сервером Uvicorn через адаптер WSGI-to-ASGI. Для работы с ним потребуется библиотека asgiref. Помните, что это не идеальное решение для асинхронности и высокой скорости. Ссылку на неё я оставлю в ссылках к статье.

Следующим на очереди у нас идёт большой фреймворк Django. Данный фреймворк нужен для написания веб сайтов и приложений на монолитной архитектуре. На нём можно быстро поднять стартап. У него есть всё необходимое, чтобы написать веб сайт в кратчайшие сроки. Тут вам и встроенная админка, поддержка orm, поддержка асинхронности и многое другое. Единственное, для чего он не подходит, это микросервисы. Однако к нему можно подключать сторонние микросервисы и боты. Получится монолит + микросервисы.

Далее идёт быстрый фреймворк Fastapi. Его я рекомендую использовать, когда вы хотите разделить свой проект на много микросервисов и когда вам важна скорость. Данный фреймворк начинает набирать популярность в компаниях из-за своей скорости, простоты и асинхронности. Также микросервисы обеспечивают высокую отказоустойчивость и надёжность работы сайтов и веб приложений. Обычно микросервисная архитектура не подходит маленьким проектам из-за сложности проектирования данной архитектуры.

Последним в моём списке популярных микросервисов идёт фреймворк Streamlit. Этот фреймворк хорош в быстром прототипировании сайтов и веб приложений. На нём можно создать простое веб приложение без глубоких познаний в html и css. Также в него можно внедрять и свои html и css как это делается в других фреймворках. У него очень мал порог вхождения поэтому он хорошо подходит начинающим разработчикам. Время, потраченное на разработку сайта на Streamlit, будет меньше в сравнении с другими фреймворками.

Теперь поговорим о языке C++. Пишут ли на нём бэкенд для сайтов и веб приложений? Конечно же да и они гораздо более производительны чем аналогичные по функциональности сайты и веб приложения на Python. Помните о том, что не каждая команда или компания может себе позволить переписывать код Python или другого высокоуровневого языка на C++ или писать на нём с нуля. Однако иногда так случается, что определённому функционалу нужна максимальная производительность и скорость низкоуровневого языка. Также для C++ существуют веб фреймворки такие как Wt, Poco, CppCMS и другие.

Поговорим о фреймворке Wt. Этот веб фреймворк обладает встроенными виджетами и компонентами, что облегчает и ускоряет время на создание интерфейсов. Низкоуровневый C++ обеспечивает высокую производительность для сайта и веб приложения, написанного на данном фреймворке.

Poco (Portable Components) - это набор библиотек C++, предназначенных для разработки сетецентрических, портативных приложений. Сетецентрическое веб-приложение - это тип веб-приложения, который активно использует сетевые протоколы и технологии для обмена данными между клиентом и сервером. Данная библиотека портативна и портирована на различные платформы. Это делает её удобной для создания кроссплатформенных приложений. Poco включает поддержку различных сетевых протоколов, таких как HTTP, FTP, SMTP, а также предоставляет HTTP-сервер и парсер XML с интерфейсами SAX2 и DOM. Poco использует принцип RAII (Resource Acquisition Is Initialization) для безопасного управления ресурсами. Производительный, имеет мощный функционал, даже позволяет работать с потоками. Из недостатков - требуется хорошее и глубокое знание языка C++.

CppCMS - это открытый фреймворк с лицензией MIT. Фреймворк позволяет разрабатывать как производительные сайты, так и веб сервисы. CppCMS поддерживает кроссплатформенную разработку, что позволяет разрабатывать приложения для различных операционных систем. Данный фреймворк поддерживает протоколы http, fastcgi, scgi (ссылки на последние два оставлю в ссылках к данной статье), имеет поддержку ajax и comet. Поддерживает различные модели параллелизма: single thread (один поток), thread pool (пул потоков) и prefork (префорк). В данной статье я не буду заострять внимания на данных вещах, но очень хочу в них копнуть в будущих статьях. CppCMS поддерживает и шаблонизатор, который позволяет работать с данными в html.

Что же касается чистого языка С, то в этом плане он не совсем удобен. На нём можно написать некое подобие бэкэндной части, используя такие библиотеки как Libcurl, PicoHTTP и т.д. Расскажу вкратце об этих двух библиотеках.

Libcurl - это библиотека для выполнения различных операций с URL, таких как GET, POST, FTP, FTPS, SCP, SFTP, TELNET, DICT, LDAP, LDAPS, FILE, POP3, IMAP, SMTP, RTSP, RTMP, SMB, SMBS, TFTP, HTTP, HTTPS, и многие другие. Она предоставляет высокоуровневый интерфейс для работы с сетевыми протоколами и поддерживает множество платформ, включая Windows, macOS, Linux, Unix, Solaris и другие. Libcurl широко используется в различных проектах, начиная от командной строки до сложных веб-приложений.

PicoHTTP - это легковесная HTTP-серверная библиотека на языке программирования C, которая позволяет быстро создавать веб-серверы с минимальными требованиями к ресурсам. Она идеально подходит для использования в устройствах с ограниченными возможностями, таких как микроконтроллеры, где требуется минимизация потребления памяти и процессорного времени.

 

Игры

Следующее, что можно писать на языке Python, это игры. Данный язык не является идеальным для создания игр, так как он высокоуровневый и его производительности может оказаться недостаточно для современных игр. Однако существует ряд библиотек для Python, на которых можно делать игры. Не буду перечислять большое количество библиотек, а лишь озвучу несколько примеров для создания 2d и 3d игр.

Pygame - это одна из самых популярных библиотек для создания 2D игр на Python. Она основана на Simple DirectMedia Layer (SDL) и предлагает простые средства для работы с графикой, звуком и вводом. Pygame хорошо подходит для создания классических аркадных игр, платформеров и головоломок, делая ее универсальным выбором для разработчиков, начинающих работу с созданием игр. Создание простеньких игр может стать хорошим хобби или работой. Альтернативой для 2d игр может стать библиотека Arcade.

Panda3D - это мощный открытый фреймворк для разработки 3D игр и симуляций на Python. Он предлагает ряд функций, таких как физическая симуляция, рендеринг и поддержка аудио, что делает его подходящим для создания погружающих игровых опытов. Panda3D поддерживает кроссплатформенность, имеет мощный движок рендеринга, встроенный физический движок для реалистичного взаимодействия объектов, поддержку анимации, интеграцию аудио, управление сценографией и сетевые возможности для многопользовательских игр. Более простой альтернативой для 3d игр может стать библиотека Ursina. Ursina построена поверх Panda3D и предоставляет специализированный движок для разработки игр, упрощающий многие аспекты Panda3D.

Ren'Py - это популярный игровой движок для создания визуальных новелл и интерактивных историй на Python. Он был разработан для облегчения процесса написания визуальных новелл, предлагая удобные инструменты для работы с текстом, изображениями, музыкой и звуковыми эффектами.  Его простой синтаксис и возможность использования скриптов на Python делают его доступным даже для начинающих разработчиков. Ren'Py поддерживает кроссплатформенность, позволяя создавать игры для Windows, macOS, Linux, Android и iOS. Для тех, кто хочет сосредоточиться на создании визуальных новелл с минимальными усилиями, Ren'Py является отличным выбором благодаря своей интуитивно понятной структуре и мощным инструментам. 

Язык C++ в свою очередь подходит для создания высокопроизводительных игр. На нём написаны такие игровые движки как Open 3D Engine, Unreal Engine, CryEngine.

Open 3D Engine - это открытый и бесплатный движок для создания 2D и 3D игр. Он предлагает широкий набор инструментов для разработки игр, включая физику, рендеринг, сетевые возможности и многое другое. O3DE поддерживает разработку на нескольких платформах, включая настольные компьютеры, консоли и мобильные устройства.

Unreal Engine - один из самых популярных игровых движков, используемых в индустрии. Он предлагает мощные инструменты для создания 3D игр, включая физическую симуляцию, AI, сетевые возможности и многое другое. Unreal Engine поддерживает разработку на C++ и Blueprint Visual Scripting. Blueprint Visual Scripting - это система визуального программирования, используемая в Unreal Engine, которая позволяет разработчикам создавать элементы игрового процесса с помощью графического интерфейса.

CryEngine - это профессиональный 3D движок, известный своей высокой производительностью и реалистичным рендерингом. Он используется во многих крупных играх и фильмах. CryEngine поддерживает разработку на C++ и C#, предлагая мощные инструменты для создания высококачественных 3D игр.

На языке C тоже можно создавать игры, но в современных реалиях делать это гораздо сложнее чем на С++ или Python. Примером может являться библиотека Allegro для 2D-графики и звука, поддерживающая множество платформ и языков программирования. Такая игра как DOOM в 1993 году была написана именно на языке C. Движок DOOM, также известный как id Tech 1, был написан в основном на языке программирования ANSI C, с некоторыми элементами на языке ассемблера. Стандарт ANSI был завершен в 1989 году и утвержден как ANSI X3.159-1989 для языка программирования C. Разработка велась на компьютерах NeXT, работающих под операционной системой NeXTSTEP. Этот движок использовался в играх DOOM и DOOM II: Hell on Earth, а также в других играх. Эту великую игру я проходил в детстве и в более взрослом возрасте уже по сети со своим двоюродным братом. Я не могу удержаться и оставлю видео ролик об истории этой легендарной игры в ссылках к этой статье =)

 

Робототехника и DIY

Язык Python применяется активно в робототехнике и DIY. DIY - аббревиатура английского Do It Yourself, то есть - сделай сам. Некие "очумелые ручки", но с микроконтроллерами, датчиками и прочими устройствами =) Для этого можно использовать такие одноплатные компьютеры как Raspberry Pi, Orange Pi и Banana Pi. В России появилась своя альтернатива этим платам под названием Repka Pi, ссылку на неё оставлю в ссылках к статье. Эти платы достаточно мощные для установки на них Linux систем с полноценным Python 3. Это позволяет вам создавать сложных роботов, которые способны распознавать объекты, умные дома и многое другое. Кроме того к этим платам можно подключить камеры и прочие датчики. Программирование для этих плат схоже с обычным программированием на Python. Дополнительно нужно уметь работать с пинами GPIO, к которым подключаются различные датчики, прочими встроенным модулями (например, wi-fi) и модулям с особыми разъёмами (например, камера с разъемом CSI). Обычный Python не лучший выбор если вам важна скорость работы вашего проекта. Также существует MicroPython, разработанный специально для программирования слабых плат с микроконтроллерами типа Raspberry Pi Pico или Nano 33 BLE Sense. Микроконтроллер - это компактная интегральная схема, предназначенная для управления электронными устройствами. MicroPython - это экономичная и эффективная реализация языка программирования Python, которая включает в себя небольшое подмножество стандартной библиотеки Python и которая оптимизирована для работы на микроконтроллерах и в ограниченных средах. Мало кто использовал MicroPython поэтому, думаю, вам будет интересно о нём почитать. Ссылку на MicroPython оставлю в ссылках к статье.

Языки C/C++ тоже очень популярны в робототехнике и DIY. Такие платы с микроконтроллерами как Arduino, STM32, ESP32 поддерживают эти языки. В самой слабенькой из них, Arduino UNO, стоит микропроцессор ATmega328P, который имеет всего 8 МГц, 8 бит, 32кб флеш памяти и 2кб озу. Такой маленькой малышке просто показана экономия ресурсов и низкоуровневый язык прекрасно для этого подходит. На Arduino вы можете сделать простенького робота на Bluetooth или IR (аналог пульта от телевизора) управлении, часы с будильником и многое другое. У него есть пины, чтобы подключить простенькое устройство (например, ультразвуковой дальномер).

Для сравнения, STM32 ARM процессор может иметь и 550 МГц (зависит от модели) и 32 бит что гораздо мощнее простых моделей Arduino. STM32 поддерживает широкий спектр интерфейсов, включая Ethernet, USB OTG, CAN, SPI, I2C, USART, а также поддержку беспроводных технологий, таких как Bluetooth и Wi-Fi. Это расширяет возможности подключения и взаимодействия с другими устройствами. Для сравнения: STM32 предлагает от 16 до 144 GPIO пинов подключения, а Arduino от 14 до 54 GPIO. Высокая производительность STM32 позволяет браться за более сложные в плане вычисления задачи. Например, к мощным моделям STM32 можно подключить даже простенькую видеокамеру. STM32 доминирует на промышленном секторе из-за своей высокой надёжности. STM32 может запускать операционные системы реального времени, такие как FreeRTOS и RT-Thread, что делает его подходящим для сложного управления системами. STM32 предлагает широкий выбор интегрированных периферийных устройств, включая большее количество GPIO, более продвинутые таймеры, несколько АЦП и ЦАП, аппаратное ускорение шифрования и другие дополнительные функции. Это увеличивает гибкость и контроль над проектированием систем.

Теперь поговорим о ESP32 и посмотрим что это за зверь такой =) Из его особенностей я бы хотел отметить встроенные модули Bluetooth и Wi-Fi, её миниатюрность, хорошую мощность и низкую стоимость. Это делает ESP32 идеальной платой для начинающих. Для примера плата ESP-WROOM-32 DevKit v1 имеет двух ядерный 32 битный микропроцессор с тактовой частотой 240 мгц, 4мб флеш памяти и 520 кб оперативной памяти. Согласитесь, это гораздо больше чем в Arduino? Её можно спокойно применять в сфере интернет-вещей. На ней можно запускать даже страницы html. Я приложу ссылку на интересную статью от Amperka про ESP32, где на ней мигают светодиодом используя кнопки на веб странице. Прошу заметить, что ESP32 тоже имеет поддержку FreeRTOS и RT-Thread, как и STM32.

Какую из этих плат выбрать, зависит от требований к вашему проекту и ваших финансовых возможностей. И на этом я заканчиваю первую часть статьи о применении Python и C/C++. Скоро выйдет вторая часть данной статьи. Дальше будет ещё интереснее :)

 

Заключение

  1. Поговорили о прототипировании;
  2. Поговорили о веб разработке;
  3. Насладились темой игр;
  4. Вдохновились робототехникой и DIY;

 

Ссылки к статье

  1. ШБР 2023 - Вводная лекция про бэкенд (Яндекс)
  2. Библиотека asgiref для WSGI-to-ASGI адаптера (Flask)
  3. Протокол FastCGI
  4. Протокол Scgi
  5. 16 бит тому назад - idTech1 (Doom) engine
  6. Repka Pi
  7. MicroPython
  8. ESP32 Amperka мигает светодиодами через веб страницу

Автор

    Нет комментариев

    Реклама