Почему у c кроссплатформенность чем c
Перейти к содержимому

Почему у c кроссплатформенность чем c

Являются ли приложения C ++ кроссплатформенными?

Одна из первых вещей, которую я узнал в студенческие годы, заключалась в том, что приложения C ++ не работают в разных операционных системах. Недавно я прочитал, что приложения C ++ на основе Qt работают повсюду. Так, что происходит? Являются ли приложения C ++ кроссплатформенными?

Совместимость с исходным кодом. Если я скомпилирую исходный код, он будет работать везде?

Совместимость API / ABI. Предоставляет ли ОС интерфейс для своих компонентов таким образом, чтобы код был понятен?

Двоичная совместимость. Может ли код работать на целевом хосте?

Совместимость с исходным кодом

C++ — это стандарт, который определяет, как можно читать и записывать структуры, память и файлы.

Код, написанный для обработки данных (например grep , ) awk , sed обычно является кроссплатформенным.

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

Такие библиотеки, как qt или wxWidgets , имеют реализации для нескольких платформ и позволяют вам программировать qt вместо Windows или iOS , в результате чего они совместимы с обеими.

Проблема с этими анонимизирующими библиотеками заключается в том, что они лишают некоторых конкретных преимуществ платформы X в интересах единообразия между платформами.

Примерами этого могут быть Windows использование WaitForMultipleObjects функции, которая позволяет вам ждать возникновения различных типов событий, или fork функции в UNIX, которая позволяет запускать две копии вашего процесса со значительным общим состоянием. В пользовательском интерфейсе формы выглядят и ведут себя немного иначе (например, выбор цвета, развертывание, минимизация, возможность отслеживать мышь за пределами вашего окна, поведение жестов).

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

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

Таким образом, библиотеки, такие как Qt, работают, они могут давать неудовлетворительные результаты, и вам придется писать собственный код.

Совместимость API / ABI

Различные выпуски UNIX и Windows имеют некоторую совместимость друг с другом. Это позволяет двоичному файлу, созданному для одной версии ОС, работать в других версиях ОС.

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

В Windows и Mac OS X вы выбираете SDK, который позволяет настроить таргетинг на набор ОС с такими же проблемами с критическими изменениями.

В Linux каждая ревизия ядра ABI несовместима с любой другой, и модули ядра необходимо перекомпилировать для каждой ревизии ядра.

Двоичная совместимость

Это способность ЦП понимать код. Это сложнее, чем вы думаете, поскольку чипы x64 могут (в зависимости от поддержки ОС) выполнять код x86.

Обычно программа на C ++ упаковывается в контейнер (исполняемый файл PE, формат ELF), который используется операционной системой для распаковки разделов кода и данных и для загрузки библиотек. Это делает окончательную программу несовместимой как в двоичной (тип кода), так и в форме API (формат контейнера).

Также сегодня, если вы скомпилируете приложение Windows x86 (ориентированное на Windows 7 в Visual Studio 2015), код может не выполняться, если процессор не имеет инструкций SSE2 (примерно 10-летний ЦП).

Наконец, когда Apple перешла с PowerPC на x86, они предоставили уровень эмуляции, который позволил старому коду PowerPC запускаться в эмуляторе на платформе x86.

Так что в целом бинарная несовместимость — это темная область. Можно было бы создать ОС, которая выявляла недопустимые инструкции (например, SSE2) и в случае ошибки имитировала поведение, это можно было бы обновлять по мере появления новых функций и поддерживать работу вашего кода, даже если он несовместим с двоичными кодами.

Даже если ваша платформа не способна запускать какую-либо форму набора инструкций, ее можно эмулировать и вести себя соответствующим образом.

Стандартный C ++ является кроссплатформенным в смысле «написать один раз, скомпилировать где угодно», но не в смысле «скомпилировать один раз, запустить где угодно».

Это означает, что если вы пишете программу на стандартном C ++, вы можете скомпилировать и затем запустить ее в любой целевой среде, имеющей стандартную соответствующую реализацию C ++.

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

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

Некоторые библиотеки, такие как Qt и Boost, доступны во многих системах (по крайней мере, я считаю, что эти две в Linux, Mac и Windows), поэтому ваш код останется кроссплатформенным, если вы их используете.

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

Это не «скомпилировать один раз, запустить где угодно с подходящей виртуальной машиной », как это делают Java или C #, а «написать один раз, скомпилировать где угодно с подходящей средой », как C делал это все время.

Поскольку стандартная библиотека не предоставляет всего, что вам может понадобиться, вам придется искать сторонние библиотеки, чтобы обеспечить эту функциональность. Определенные фреймворки, такие как Boost, Qt, GTK +, wxWidgets и т. Д., Могут предоставить это. Поскольку эти фреймворки написаны таким образом, что они компилируются на разных платформах, вы можете достичь кроссплатформенной функциональности в вышеупомянутом смысле.

Если вы хотите, чтобы ваш код на C ++ был кроссплатформенным, нужно помнить о различных вещах.

Очевидно, что источник, который делает предположение о типах данных . У вас long может быть 32-битный здесь и 64-битный там. Выравнивание типов данных и заполнение структуры могут отличаться. Здесь есть способы «перестраховаться», например size_t / size_type / uint16_t typedefs и т. Д., И способы сделать это неправильно, например wchar_t и std::wstring . Чтобы «все сделать правильно», нужны дисциплина и некоторый опыт.

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

Другое дело — байты . Только один пример: когда вы записываете поток целых чисел в файл на одной платформе (скажем, x86 или x86_64), а затем читаете его снова на другой платформе (скажем, POWER), вы можете столкнуться с проблемами. Зачем писать целые числа в файл? Ну, UTF-16 — это целые числа . опять же, дисциплина и некоторый опыт имеют большое значение для того, чтобы сделать это довольно безболезненным.

После того, как вы отметили все эти флажки, вам необходимо убедиться в доступности библиотек , на которых вы основываете свой код. Хотя std:: это безопасно (но см. Выше «не все компиляторы созданы равными»), что-то столь же невинное, как boost:: может стать проблемой, если вы выходите за рамки мейнстрима. (В прошлые годы я помог ребятам из Boost исправить одну или две демонстрации, связанные с AIX / Visual Age, просто потому, что у них не было доступа к этой платформе для тестирования новых выпусков . )

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

При этом существует Wine («Wine — это не эмуляция»), который заставляет исполняемые файлы, скомпилированные для Windows , запускаться на различных Unix-подобных системах (Linux, OS X, * BSD, Solaris). У его возможностей есть определенные ограничения, но они все время становятся лучше.

Знакомьтесь, C#!

Почему C# программисты скоро будут нарасхват

C# обладает выразительным синтаксисом, и его легко изучать. Фигурные скобки узнают все, кто работал в C, C++ или Java. Знакомы с одним из этих языков? Тогда вы быстро начнёте продуктивную работу в C#.

Синтаксис языка устраняет сложности C++ и предоставляет такие мощные возможности, как обнуляемые значения типов, перечисления, делегаты, лямбда-выражения и прямой доступ к памяти. C# поддерживает универсальные методы и типы, которые повышают безопасность типов и производительность. Итераторы позволяют классам создателей коллекций определять кастомные поведения итераций, которые легко использовать в клиентском коде. Выражения интегрированного языка запросов (LINQ) делают строго типизированный запрос первоклассной конструкцией языка.

C# – объектно-ориентированный язык, а значит, поддерживает инкапсуляцию, наследование и полиморфизм. Класс может наследоваться напрямую от одного родительского класса, но может реализовывать любое число интерфейсов. Методы, которые переопределяют виртуальные методы в родительском классе, требуют указания ключевого слова override для предотвращения случайного переопределения.

В дополнение ко всем плюшкам ООП язык C# облегчает разработку программных компонентов посредством нескольких инновационных конструкций языка:

  • Инкапсулированные сигнатуры методов, названные делегатами, включают оповещения о безопасности типов.
  • Свойства служат акцессорами к переменным закрытых частей.
  • Атрибуты предоставляют декларативные метаданные о типах во время исполнения.
  • Строчные документационные комментарии XML.
  • Интегрированный язык запросов (LINQ) предоставляет встроенные возможности запросов между различными источниками данных.

Нужно взаимодействовать с другими программами Windows, например, с COM-объектами или со встроенными Win32 DLL? Сделайте это с помощью C# через процесс «Interop». Interop позволяет программам, написанным на C#, делать почти всё, что доступно программам, написанным на C++. C# поддерживает даже указатели и концепцию «небезопасного» кода для случаев, когда прямой доступ к памяти абсолютно критичен.

Причём тут .NET?

Программы C# выполняются поверх .NET Framework – встроенного компонента Windows, который включает в себя виртуальную среду выполнения, называемую общеязыковой исполняющей средой (CLR), и единый набор классовых библиотек. CLR – это коммерческая реализация общеязыковой инфраструктуры (CLI). Она служит основой для создания исполняемых файлов и окружений разработки, в которых языки и библиотеки работают совместно и незаметно.

Исходный код, написанный на C#, компилируется в промежуточный язык (IL), который удовлетворяет спецификации CLI. Код IL и такие ресурсы, как растровые изображения и строки, хранятся на диске в виде исполняемого файла – сборки, обычно с расширениями .exe и .dll . Сборка содержит манифест, который предоставляет информацию о типах, версии, культуре и требованиях безопасности сборки.

При запуске программы сборка C# загружается в CLR, которая совершает определённые действия, исходя из информации в манифесте. Если требования безопасности удовлетворяют CLR, она производит JIT-компиляцию, чтобы конвертировать код IL во встроенные машинные инструкции. CLR предоставляет и другие службы, связанные с автоматической сборкой мусора, обработкой исключений и управлением ресурсами. Код, выполняемый в CLR, иногда называют «управляемым кодом» для сравнения с «неуправляемым кодом», который компилируется во встроенный машинный язык, нацеленный на определённую систему.

Вот отношение между временем компиляции и временем выполнения исходников C#, классовых библиотек .NET Framework, сборок и CLR:

Почему C# программисты скоро будут нарасхват

Языковая совместимость – ключевая особенность .NET Framework. Так как IL-код производится на C#, компилятор соответствует общей спецификации типов (CTS). IL код, сгенерированный из C#, может взаимодействовать с более чем двадцатью другими CTS-совместимыми языками. Одиночная сборка может содержать множество модулей, а типы могут ссылаться друг на друга так, будто они написаны на одном языке.

.NET Core – кроссплатформенный .NET

Версия Core – это модульная кроссплатформенная open source реализация стандарта .NET общего назначения. Она содержит множество API из .NET Framework и включает среду выполнения, фреймворк, а также инструменты, поддерживающие различные ОС и процессоры. Реализация находилась под управлением наработок из ASP.NET Core, но требовала более современного подхода. Она может использоваться для различных устройств, в облаке и для встроенных/IoT сценариев.

Вот основные характеристики .NET Core:

  • Кроссплатформенность: .NET Core предоставляет ключевую функциональность для реализации нужных особенностей вашего приложения, а также возможность повторного использования кода вне зависимости от вашей платформы. Она поддерживает Windows, Linux и macOS. Вы можете писать приложения и библиотеки, которые запускаются на всех поддерживаемых ОС без изменений.
  • Open source: .NET Core – один из многих проектов, который находится под управлением .NET Foundation и доступен на GitHub. Использование .NET Core в качестве open source проекта способствует прозрачному процессу разработки и развитию активного, вовлечённого сообщества.
  • Гибкий деплой: есть два главных способа деплоя вашего приложения: зависимый от фреймворка и автономный. В первом случае устанавливаются только ваше приложение и зависимости. Приложение зависит от глобальной версии .NET Core. Во втором случае версия .NET Core, которая использовалась для сборки вашего приложения, деплоится вместе с приложением и зависимостями, и может выполняться параллельно другим версиям.
  • Модульность: .NET Core обладает модульностью потому, что выпускается через NuGet в меньших пакетах сборок. В отличие от одной большой сборки со всей встроенной функциональностью, .NET Core доступен в виде меньших функционально-ориентированных пакетов. Это приводит к более гибкой модели разработки, позволяет оптимизировать приложение, включая только необходимые пакеты NuGet. Преимущества меньшего поля покрытия приложения отражаются в повышенной безопасности, менее требовательном обслуживании, высокой производительности и в сниженных затратах по принципу «плати только за то, чем пользуешься».

Благодаря .NET Core C# программисты могут разрабатывать не только на Windows.

Xamarin: мобильная разработка на C#? Легко!

Многие думают о разработке под Android и iOS в контексте таких встроенных языков, как Objective-C, Swift, Java и Kotlin.

Xamarin позволяет разрабатывать на C#, используя библиотеки и рантайм, которые работают на iOS, Android и Windows. При этом компилируются встроенные (не интерпретированные) приложения с достаточной производительностью для игр.

Почему C# программисты скоро будут нарасхват

Xamarin совмещает все возможности встроенных платформ и добавляет несколько мощных особенностей:

  • Полная привязка к базовым SDK: Xamarin содержит привязки практически ко всем базовым платформенным SDK от iOS и Android. Вдобавок эти привязки строго типизированы, что облегчает использование и навигацию, а также включает строгую проверку типов во время компиляции и разработки.
  • Interop для Objective-C, Java, C и C++: Xamarin содержит средства для прямого вызова библиотек Objective-C, Java, C, and C++, а значит, вы свободны использовать сторонний код, не изобретая велосипед. Таким образом, вы воспользуетесь преимуществами существующих библиотек iOS и Android, написанных на Objective-C, Java или C/C++.
  • Современные языковые конструкции: приложения Xamarin пишутся на C#, современном языке, который содержит существенные улучшения по сравнению с Objective-C и Java. Например, особенности динамического языка, лямбды, LINQ, функции параллельного программирования, дженерики и многое другое.
  • Библиотека базовых классов (BCL): приложения Xamarin используют .NET BCL, большую коллекцию классов, которая имеет такие функции, как XML, базы данных, сериализацию, IO, строки и поддержку сети. Существующий код C# можно скомпилировать для дальнейшего использования в приложении, что открывает доступ к тысячам библиотек, которые могут делать то, что недоступно в BCL.
  • Современная IDE: Xamarin использует Visual Studio на macOS и Windows. Обе версии обладают такими современными функциями, как автозавершение кода, системой управления проектом, библиотекой шаблонов, встроенным контролем версий.
  • Поддержка мобильной кроссплатформенности: Xamarin поддерживает iOS, Android и Windows. Приложения могут иметь до 90% общего кода. Библиотека Xamarin.Mobile предлагает унифицированный API для доступа к ресурсам всех платформ.

C# программисты могут разрабатывать кроссплатформенные мобильные приложения на Xamarin!

C# используется в машинном обучении

У вас уже есть опыт в .NET, и вы хотите освоить машинное обучение? ML.NET – это кроссплатформенный фреймворк машинного обучения с открытым исходным кодом.

Он позволяет создавать кастомные ML-модели на C#, не покидая экосистему .NET. Вы можете использовать весь ваш опыт и багаж знаний, накопленный за время работы с .NET, чтобы интегрировать машинное обучение в существующие десктопные, игровые, мобильные или веб-приложения, и даже в IoT-устройства.

Почему C# программисты скоро будут нарасхват

Вот что можно сделать с ML.NET:

  • Классификация/категоризация: разделяйте пользовательский фидбэк на позитивную и негативную категории автоматически.
  • Регрессия/Прогнозирование: непрерывных значений: прогнозируйте цены на недвижимость исходя из размеров и местоположения.
  • Обнаружения аномалий: обнаруживайте мошеннические банковские операции.
  • Рекомендации: предлагайте продукты онлайн-покупателям исходя из их истории покупок.

Отдельно про игры

Unity – самый популярный игровой движок для разработки инди-игр, и он использует код на C#. Интересно, что сам движок написан на C++, поэтому он освобождает программиста от необходимости разбираться со скоростью исполнения, что идеально для новичков.

Есть и другие движки с поддержкой C#:

    позволяет «написать игру один раз и играть везде»;
  • WAVE – кроссплатформенный движок; – довольно мощный кроссплатформенный движок ; поддерживает только 2D ; – официальный движок от Microsoft; – 2D-движок.

Все перечисленные движки позволяют писать игровой код на C#, но Unity определённо занял особое место в коммерческой разработке. Достаточно вспомнить такие игры, как Rust и Forest – они написаны на Unity, а значит и на C#.

Почему C# программисты скоро будут нарасхват

Игра Rust написана на Unity

C# программисты имеют большие возможности в геймдеве!

Как всё это влияет на рынок труда?

Возможно, C# программисты не ринулись строем писать мобильные или веб-приложения. Но посмотрите, какие возможности открываются для тех, кто уже знает C#. К тому же, Microsoft планируют к 2021 году объединить .NET Core и .NET Framework совместно с фишками вроде Windows Presentation Foundation (WPF).

C# программисты больше не ограничены платформой Windows. Сегодня они могут смело пробовать себя в роли мобильных, игровых или веб-разработчиков.

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

Отдельно стоит отметить машинное обучение – это огромные перспективы для C# разработчиков и для самого языка.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *