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

от admin

C против C ++ — кроссплатформенность

У меня очень быстрый вопрос, на который я не нашел ответа. Существуют ли какие-либо основные платформы (Windows, MacOS, unix, linux, Android, iOS и т. д.), которые поддерживают C, но не C++?

Микроконтроллеры серии PIC имеют только компилятор C (но не C++), поставляемый производителем. Arduino поддерживает только C (хотя вы можете взломать компилятор AVR для подмножества C++). Они единственные, кто не в моей голове — Seb Holzapfel

4 ответы

C и C++ не зависят от операционной системы. Если есть компилятор, который может скомпилировать код C/C++ для выполнения не текущим процессором. Все хорошо.

ответ дан 18 авг.

Языки и компиляторы сами по себе не зависят от ОС, но Время автономной работы находятся. — Темная пыль

Поскольку C является подмножеством C++, вы обязательно столкнетесь с какой-нибудь средой, поддерживающей C, но не поддерживающей C++. Другой вопрос, можно ли назвать такую ​​платформу «мажорной» по каким-либо меркам. (Существовал компилятор C для C64, но компилятора C++, насколько мне известно, не было. C64 была абсолютно важной платформой 🙂

ответ дан 18 авг.

C64 тоже был 25 лет назад. В то время было не так много компиляторов C++. — Бо Перссон

Я думаю, что Clang может скомпилировать C++ в C. Так что, в принципе, вы можете комбинировать это с вашим компилятором C, чтобы скомпилировать любую стандартную программу C++ для вашей целевой платформы. (Однако не уверен, что Clang производит чисто стандартный C или есть зависимости от библиотек.) — Керрек С.Б.

Обратите внимание, что C не является подмножеством C++; даже в случае C89 есть вещи (тернарный оператор, например), которые работают по-разному для двух. Тем не менее, смысл поста остается в силе. — Антон Голов

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

Являются ли приложения 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 лет CPU).

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

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

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

Другие решения

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

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

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

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

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

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

Это не «скомпилировать один раз, запустить где угодно с соответствующей ВМ«как Java или 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 — не эмуляция»), что делает исполняемые файлы скомпилированный для Windows бежать на различных Unix-подобных системах (Linux, OS X, * BSD, Solaris). У его возможностей есть определенные ограничения, но все лучше и лучше.

Да. Может быть Что такое кроссплатформенный код C ++? Кроссплатформенный код C ++ — это такой код, который может быть скомпилирован в различных операционных системах без необходимости его изменения.

Это означает, что если вы явно используете заголовки, зависящие от платформы, ваш код больше не является кроссплатформенным. Qt решает эту проблему следующим образом: они предоставляют оболочки для всего, что зависит от платформы. Например, представьте, что вы используете QFile открыть / прочитать / написать файл. Ваш код выглядит как

Вы можете скомпилировать этот код под любой ОС, если у вас есть подходящий компилятор и библиотеки Qt для этой ОС. Код скрыт под QFile будет использовать соответствующие операционные функции для обработки файлов, но это не должно вас беспокоить.

Кроме того, если вы используете только стандартную библиотеку, ваш код может быть скомпилирован в любом месте, где присутствует компилятор C ++.

Однако уже скомпилированные приложения не являются кроссплатформенными, как, скажем, приложения Java — например, вы не можете скомпилировать приложение для Windows и затем запустить его в Linux, вам придется перекомпилировать код вместо Linux

C ++ — это язык программирования. Текст. Как таковой, он никуда не бежит.

Ожидается, что соответствующий стандарт C ++ код вести себя одинаково на любой платформе; «кроссплатформенный», если хотите. Написание (строго) соответствующего кода C ++ требует педантичности, потому что некоторые часто используемые предположения зависят от деталей, которые являются окончательными для фактической реализации, и это унаследовано от целей, к которым стремится сам C ++.

Обратите внимание, что мы все еще говорим о коде C ++, а не о программах на C ++. Действительно, когда мы переходим к термину «программа», у нас больше нет гарантий, потому что мы больше не говорим о C ++; скорее вывод компилятора. Вот где начинает исчезать переносимость: исполняемый формат, ISA, ABI, низкоуровневые подпрограммы и так далее.
Вы можете на это положиться? Если вы не можете этого сделать, вам нужно интегрировать вашу программу на C ++ в среду, в которой она будет выполняться, перекомпилировать ее или использовать элементы, специфичные для платформы.

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

Что не является кроссплатформенным, так это компиляторы, которые переводят C ++ в объектный код. Насколько мне известно, ни один компилятор не обладает всеми необходимыми функциями, поэтому, когда вы используете его для компиляции программы C ++, он автоматически запускается в Windows, Linux и Mac OS.

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

Русские Блоги

Если вы порекомендуете мою статью и обратите внимание на мой блог, я буду более счастлив, и в будущем я напишу больше статей о компьютерных системах / принципах, чтобы удовлетворить читателей. Еще раз спасибо Некоторое время назад я прочитал книгу Чжоу Чжимина «Углубленное понимание виртуальной машины Java». дляНезависимость от платформыЕсть новое понимание проблемы. Так что пишите блог для подведения итогов.

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

Почему C не может кросс-платформенный

Давайте сначала обсудим процесс реализации языка Си, чтобы выяснить, почему язык Си не может кросс-платформенный.

Это то, что знают широкие массы людей hello world Программа. Окончательный результат выполнения — вывести строку строки на консоль, hello world! 。

В колледже, учебник Си по языку Тан Хаоцян, main Возвращаемое значение метода void , Но это неправильно. По сути должен вернуться int Чтобы сообщить операционной системе результаты. (Конечно, после глубокого изучения я понял, что в учебнике Тана много ошибок, но у меня все еще хорошее впечатление об этом учебнике, потому что это мой просветительский учебник по программированию).

Мы знаем, что компьютер распознает только 0 и 1 (то есть двоичный код), другими словами, независимо от того, что мы делаем на компьютере, насколько сложна программа, от рисования ps, до чата qq, прослушивания музыки и, наконец, Уровень выполнения ЦП фактически представляет собой последовательность инструкций, состоящую из 0 и 1. Конечно, на аппаратном уровне это область ворот NAND. Тем не менее, тот, что выше hello world Как программа конвертирует в 0 и 1.
В обычных условиях для использования IDE, такого как Visual Studio, CodeBlocks и т. п., достаточно просто нажать кнопку запуска или использовать командную строку gcc для компиляции, Вы также можете использовать команду gcc -o hello hello.c , Окончательный результат компиляции выводится. Но на самом деле, hello world Процесс компиляции выглядит так:

  • Стадия предварительной обработки, Препроцессор (cpp) поставить код # Разверните первую строку, такую ​​как заголовочные файлы, макросы и т. Д., И измените исходный файл C.
  • Этап компиляции, Компилятор (ccl) переводит модифицированный файл C в другой текстовый файл, hello.s Это то, что мы называем ассемблером. Откройте содержимое этого текстового файла, похожего на следующий формат:

Конечно, разные процессорные и платформенные среды, вывод кода сборки также различен, мы здесь только в качестве примера.

  • Этап сборки, Ассемблер (как) будет hello.s Переведите на машинный язык инструкции. Упакуйте эти команды в формат, который называется перемещаемая объектная программа (перемещаемая объектная программа), выходной формат в это время hello.o A. Это на самом деле бинарный файл.
  • Фаза соединения, Существует также этап связывания в конце процесса компиляции (программа вызывает printf Функция), окончательный вывод все еще похож на предыдущий шаг, все являются прямыми двоичными файлами.

Понял hello world Процесс компиляции программы, давайте обсудим, что ассемблер , Давайте сначала посмотримВикипедияПо определению. (Это ссылка на Википедию, студенты без фан-стены не должны открываться)。

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

Что такое компиляция, студенты смежных специальностей должны понимать, что, поскольку компьютеры распознают только 0 и 1 (то есть двоичный код), когда компьютер был впервые изобретен, эти ученые непосредственно вводят 0 и 1 в компьютер для выполнения вычислительных задач. (Конечно, они прошлиБумажная перфорированная лентаСпособ ввода в компьютер, например, с отверстием, представляющим 1, и без отверстия, представляющего 0). Таким образом, компьютер, наконец, может работать, но эта эффективность слишком медленная.

Из 0 и 1, которые они вводят, некоторые представляютинструкцияОни имеют фиксированное значение и кодирование. Это также признается чипом. В то время как другиеданные, Данные этих разных программ естественно разные. Ранее мы говорили, что независимо от сложности работы компьютера уровень ЦП равен 0 и 1. Хотя данные являются переменными, количество инструкций ограничено. Потому что команда должна быть четко распознана чипом. Комбинация затворов NAND транзисторов (первоначально ламп) используется для идентификации этих команд и данных в микросхеме. Поскольку вводить 0 и 1 слишком сложно, они изобрели язык ассемблера. Упростить подготовку программы.

Например, для расчета 1 + 1 используются оба данных 1 0x0001 Чтобы указать, что операция сложения, помещенная в CPU, может быть 0xa90df (Это написано без разбора), Операция сложения, представленная этим двоичным файлом, может быть распознана компьютером. И из-за этой операции сложения для процессора, закодированный 0xa90df Формат исправлен. Таким образом, вы можете напрямую использовать мнемонику add Чтобы выразиться, ученым гораздо удобнее писать программы, и это происхождение ассемблера. Поскольку после завершения программы сборки может быть другая специальная программа (то есть то, что упомянуто вышеассемблер) Чтобы скомпилировать скомпилированную программу сборки в 0 и 1. Таким образом, компьютер также может ее распознать, а сам язык ассемблера также облегчает написание и чтение программы.

Написание ассемблера намного удобнее и эффективнее, чем написание бинарного кода напрямую. Однако со сложностью вычислительной задачи масштаб программы становится все больше и больше, и использование ассемблера очень утомительно, так есть ли более простой способ? Таким образом, ученые изобрели языки высокого уровня (такие как C , lisp И т.д.), при написании программ используйте язык C и т. Д., А затем используйтесоставительПереведите программу на языке C в программу сборки, а затем используйте программу сборкиассемблерСкомпилировано в 0 и 1, чтобы процессор мог распознавать то, что не изменилось, но для человека, пишущего программу, это действительно намного удобнее.

Благодаря приведенному выше описанию мы знаем приблизительное происхождение языка высокого уровня. Я также понимал различные языки высокого уровня, которые мы написали, и в итоге все они были преобразованы в двоичное исполнение.

И программа в прямом двоичном формате, мы называем этоНативный машинный код (нативный код), И похоже на те add Мнемоника и тому подобное, а также формат компиляции или стандарт сборки, мы называем этоНабор инструкций

Но суть проблемы пришла. Чипы процессоров производства разных компаний. Набор команд, которые они используют, отличается. Этот вопрос дизайна микросхемы не похож на протокол TCP / IP. Он имеет унифицированные на международном уровне стандарты и даже сложный набор команд, представленный Intel, и сокращенный набор команд, представленный arm Идея дизайна их набора инструкций другая.

Таким образом, бинарный файл, скомпилированный нашим языком C, считается этим разделом. 93034030930900090222ab2d11cd22dfad (Написано случайно), смысл распознавания на разных процессорах различен.

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

  • То, что мы подразумеваем под кросс-платформенной операцией, не означает hell.c Этот текстовый файл работает. Поскольку сам текстовый файл не может быть запущен. Это просто результат его компиляции hello , И этот результат компиляции состоит из 0 и 1, разные процессоры и платформы, их формат отличается. так C В результате языковой компиляции нет возможности запустить кроссплатформенный.
  • Даже на разных платформах, hello.c Формат окончательных скомпилированных файлов различен. Например, скомпилированный под Linux hello , результат компиляции под окном hello.exe И результат компиляции под Mac hello.out (Что касается суффикса результата компиляции на микроконтроллере, это забыто).
  • Некоторые люди также будут говорить о hello Программа работает на window Я не беру окончательный результат компиляции hello Чтобы запустить напрямую, я заново создал проект с IDE в оконной среде, и тот же исходный код был снова запущен в окне, вывод hello.exe И тогда беги по окну, хорошо? ОтветNo, Потому что в разных средах стандарт языка Си отличается. Например, тип int может быть представлен 16 битами на некоторых платформах и 32 битами на некоторых платформах. Поэтому одна и та же программа в разных средах будет иметь такие ошибки, как переполнение данных.
  • На самом деле, есть еще одна вещь: каждый обычно пишет программу, нажимает на прогон / сборку и т. П. В IDE и через некоторое время выводит результат, но на самом деле процесс компиляции многих крупных программ относительно длинный, такой как мой первый. Для системы мобильных телефонов компания компилирует систему Android 5.0. На компьютере с процессором i7 и памятью 16G сборка и запуск занимает более часа, прежде чем она сможет успешно скомпилировать и вывести окончательный результат.

Зная, что язык C не может работать на разных платформах, есть ли способ включить языки высокого уровня для работы на разных платформах?

Думая о сценарии в реальном программировании, некоторые из данных, которые нам нужно обработать во внешнем интерфейсе, находятся в формате A, но внутренний интерфейс может предоставлять данные только в формате B. Что нам делать? Очень просто. Написать интерфейс и конвертировать формат B в формат A. Это один из шаблонов дизайнаШаблон дизайна адаптера

То же самое относится и к кроссплатформенному. Набор команд ЦП различен, а формат результата, скомпилированный на разных платформах, различен. Затем мы можем запустить виртуальную машину на каждой платформе, а затем сформулировать выходной формат скомпилированного результата. Наш вывод определенного формата находится непосредственно в Запустите на виртуальной машине. Это не нормально ,

Это на самом деле так, как Java.

Формат файла класса, виртуальная машина и ByteCode

Это версия Java helloJava ;

Результат компиляции этой Java-программы helloJava.class Другими словами, результат, который это выводит, является форматом файла Класса (также называемый форматом хранения байт-кода).
Содержимое файла класса , вероятно, выглядит следующим образом:

class

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

Похоже на следующее.

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

Таким образом, наша Java-программа является кроссплатформенной.

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

Независимость от платформы

И благодаря виртуальной машине Java и формату файла Class мы достиглиНезависимость от платформыДругими словами, кто-то, кто должен адаптироваться к работе различных платформ и процессоров, все еще должен быть готов. Это люди, которые проектируют виртуальную машину Java для этих задач, но их тяжелая работа поменялась простотой наших программистов высшего уровня. Мы не заботимся о различиях между платформами и процессорами вообще.

Читать:
Unsupported cpu installed как исправить ошибку

Результат компиляции кода, от собственного машинного кода (NativeCode) до байтового кода (ByteCode), является небольшим шагом в формате хранения, но это большой шаг в развитии языков программирования.

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

Зная общий принцип, мы подумали о другой проблеме: виртуальная машина Java выполняет файл Class. Какое это имеет отношение к исходному файлу java? ОтветНе важно, Другими словами, выходным результатом компиляции исходного файла Java является файл Class, и файл Class может быть распознан и выполнен виртуальной машиной java. Это два независимых процесса, и между ними нет взаимосвязи и неизбежности.

Тогда это приводит к другому вопросу: если я спроектирую соответствующий компилятор для определенного другого языка программирования, скомпилирую и выведу результат в виде файла класса, достигнет ли этот язык кроссплатформенности?

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

независимость языка

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

Многие программисты также считают, что виртуальная машина Java выполняет Java-программы — это само собой разумеющееся. Это неправильно

Некоторые из перечисленных ниже цитируются Чжоу Чжимином, «Углубленное понимание виртуальной машины Java»:

Команда разработчиков и разработчиков Sun разделила спецификацию Java на спецификацию языка Java «Спецификация языка Java» и спецификацию виртуальной машины Java «Спецификация виртуальной машины Java», когда она была изначально разработана.

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

jvm

Основой для достижения языковой независимости по-прежнему является формат хранения виртуальной машины и байт-кода. Виртуальная машина Java не привязана ни к какому языку, включая Java. Она связана только с конкретным двоичным форматом файла, называемым «Файл класса». Файл Class содержит набор инструкций виртуальной машины Java и таблицу символов, а также некоторые другие вспомогательные данные. , Исходя из соображений безопасности, спецификация виртуальной машины Java требует использования многих обязательных грамматик и структурных ограничений в файле Class, но любой функциональный язык может быть выражен как допустимый файл Class, который может быть принят виртуальной машиной Java. , В качестве универсальной, независимой от машины платформы исполнения любой другой языковой исполнитель может использовать виртуальную машину Java в качестве средства доставки языкового продукта.

Другими словами, имя виртуальной машины Java на самом деле вводит в заблуждение. Виртуальная машина Java не имеет ничего общего с Java. На самом деле, она должна называться виртуальной машиной файла класса.

Поскольку другие языки, при наличии соответствующего компилятора, вывод можно запускать на виртуальной машине java, поэтому сегодня Clojure, Groovy, JRuby, Jython, Scala — пакет языков, работающих на виртуальной машине java.

В настоящее время языки, показанные на рисунке ниже, уже могут работать на виртуальной машине Java.

jvm

Поэтому система технологий Java в широком смысле также включает в себя такие языки, как Clojure, JRuby, Groovy и Scale, работающие на виртуальной машине Java, и связанные с ними программы.

Семантика различных переменных, ключевых слов и арифметических символов в различных языках, таких как Java и Scale, в конечном итоге объединяется несколькими командами байт-кода, поэтому возможности семантического описания, предоставляемые командами байт-кода, определенно будут лучше, чем Единый язык сам по себе более мощный.

Конечно, когда Java впервые появилась, «Write Once, Run Anywhere», независимость от платформы была в восторге, но теперь идея этой виртуальной машины была изучена многими другими языками, такими как python и pvm. Go language, .NET и т. Д. — это все та же идея

Почему C / C ++ не был заменен.

Что касается виртуальной машины java и формата файла Class, он кажется очень мощным. Какой маленький шаг, большой шаг для людей, должны быть некоторые сомнения, почему языки c / c ++, которые не могут быть кроссплатформенными, все еще остаются Многие люди используют его, но он еще не был заменен на Java.

Конечно, есть много причин для этого, таких как неизбежный процесс Java-GCstop the worldПроцесс, который недопустим в некоторых системах с высокими требованиями в реальном времени, таких как системы торговли акциями и военные системы. (Это еще одна тема о сборке мусора, которая выходит за рамки этой статьи. У меня будет время написать еще один блог для обсуждения этой проблемы в будущем.)

Но есть хорошая поговорка
Между java и c ++ существует "высокая стена", окруженная динамическим распределением памяти и технологией сбора мусора.

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

Но помимо вышесказанного есть и другая причина. Расскажите всем о главном уроке в истории программного обеспечения, вы можете понять.

Чтобы противостоять Java-платформе Sun, в 2002 году Microsoft запустила платформу .NET (C #), аналогичную промежуточному программному обеспечению. В то время Windows XP объединила реки и озера, что сделало Microsoft, как нигде больше, Microsoft решила использовать C # в разработке операционной системы следующего поколения (то есть Windows Visa). Ученые, но в конце концов они обнаружили, что использование C #, языка промежуточного программного обеспечения, работающего на виртуальной машине, в любом случае не может достичь скорости C / C ++. Поэтому все оконные визы в финальной трагедии были заново изобретены и переработаны. Кай-фу Ли был в Microsoft в то время, что было подробно описано в одной из его книг.

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

Теперь все понимают, что ByteCode работает на виртуальной машине, которая медленнее, чем прямая компиляция NativeCode для запуска на физической машине.

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

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

В некоторых коммерческих виртуальных машинах Java-программы первоначально интерпретируются и выполняются интерпретатором (Interpreter). Когда виртуальная машина обнаруживает, что метод или блок кода выполняется очень часто, она идентифицирует эти коды как «горячий код» Код горячей точки. Чтобы повысить эффективность выполнения кода горячей точки, во время выполнения виртуальная машина скомпилирует эти коды в машинный код, связанный с локальной платформой, и выполнит различные уровни оптимизации. Компилятор, который выполняет эту задачу, называется Just-In-Time В Time Compiler, называемом JIT-компилятором).

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

Но на самом деле, компилятор может скомпилировать вывод исходного файла java в формат Class (то есть ByteCode), тогда, естественно, могут существовать другие типы компиляторов, которые могут напрямую компилировать исходный файл java в NativeCode. Так что для языка программирования мы можем скомпилировать его различными способами. «Период компиляции» языка Java на самом деле является «неопределенным» процессом работы. Потому что мы можем использовать разные типы компиляторов для компиляции разных выходных результатов.

Общие компиляторы Java имеют следующие типы.

  • Фронтальный компилятор: поставитьФайл .java преобразуется в.class файл. Такие как Sun Javac, Eclipse JDT инкрементный компилятор (ECJ).
  • JIT-компилятор: ByteCode (ByteCode) в машинный код (NaticeCode). Например, компиляторы C1 и C2 виртуальной машины HotSpot.
  • Компилятор AOT: непосредственно компилировать файлы * .java в локальный машинный код. Такие как GNU Compiler для Java (GCJ), Excelsior JET.

конец

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

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

Дополнительный контент (20170905)

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

Некоторые ответы на вопросы в комментариях.

Как упоминалось в конце статьи, я изначально писал общие идеи, поэтому многие детали не были подробно исследованы. Фактически, такие как формат сборки, выполнение набора команд и т. Д., На самом деле, эти обсуждения действительно сложны и связаны с конструкцией структуры ЦП. В будущем я планирую написать статьи и обсудить эти вопросы с вами.

Никто не указал на эту проблему в комментариях, но я делал C и MCU, когда учился в колледже. Я понимаю, что введение в этой области все еще не является точным и подробным. (Конечно, я забыл много деталей)

Некоторые люди упоминали о проблеме виртуальной машины .NET в комментариях. Прежде всего, потому что я программист на Android, я также занимался языком C и одним чипом в колледже, поэтому я немного знаю о Java и C, но я не знаю .NET. , Ограниченные знания .NET также происходят из обсуждений и обменов с друзьями, которые делают .NET. Поэтому оценка мысли .NET может быть недостаточно точной.

Кто-то задал следующие вопросы в комментариях:

wdwwtzyКомментарий: Затем я хочу спросить, .net — это также технология виртуальных машин, как java. Почему в ранние времена не было .net кроссплатформенным?
Длинные DeerКомментарий: Хозяин, насколько я знаю, java и .net, эта виртуальная машина не является другой виртуальной машиной. И эта проблема была смущена многими javaers.
wdwwtzyКомментарий: что это значит, прочитайте статью, разве Java не является настоящей кроссплатформеной с самого рождения?

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

WindyAmyКомментарий: .net CLR / .net Framework и оконная система объединены слишком тесно. Теперь Microsoft переписала часть библиотеки фреймворков (ядро .net), которая уже может реализовать платформу.
BlackheartКомментарий: поскольку никто не реализует .net clr на других платформах, а позже и с моно, он может быть кроссплатформенным. Здесь нет реальной кроссплатформенности, для разработчиков вам может не понадобиться заботиться о том, является ли операционная система Windows или Linux, вы чувствуете себя кроссплатформенным. Тем не менее, всегда есть группа людей внизу, которые помогают вам построить «кроссплатформенную» инфраструктуру. Для них каждая платформа должна быть реализована отдельно. **

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

Очевидно, что виртуальные машины .NET и Java имеют одинаковую идею, обе из которых представляют средний уровень / виртуальную машину. Одноклассники, которые делают Java, говорят виртуальную машину Java (JVM), а имя виртуальной машины Microsoft .NET называется Common Language Runtime (CLR). Хотя некоторые студенты могут подумать, что CLR не называется виртуальной машиной, в конечном счете, это все еще широкая концепция и идея виртуальной машины.

В JVM могут работать Clojure, Groovy, JRuby, Jython, Scala и многие другие языки. И CLR один и тот же, десятки языков, таких как C #, F #, VB.NET, C ++, Python и т. Д., Также могут работать на CLR.

Результатом компиляции java, Scala и т. Д. Является ByteCode (байт-код), который называется форматом файла Class и выполняется на jvm. Когда JVM запускает файл формата Class, его можно интерпретировать и запускать, или он может быть скомпилирован в NativeCode компилятором JIT для ускорения операции , C #, C ++ и т. Д. Компилируются в Common Intermediate Language (CIL), а затем собираются в байт-код (конечно, этот байт-код определенно не будет форматом файла Class, но концепция будет той же), и во время выполнения Это также переводится в локальную операцию машинного кода (но CLR, кажется, не имеет операции объяснения. Это вопрос, задаваемый соответствующими студентами. Я предполагаю, что должен быть подобный метод операции объяснения JavaScript, но соответствующая информация не была найдена).

Выше технический уровень. Давайте обсудим некоторые нетехнические уровни.

Как все мы знаем, если мы хотим запустить проект разработки java на определенной платформе, мы должны установить jdk, этот процесс все еще очень хлопотный, мы должны установить переменные окружения и тому подобное. Это невозможная операция для обычных пользователей. Для .NET на самом деле требуется среда установки (называемая .NET Framework), но окно принадлежит Microsoft, поэтому в оконную систему встроен фреймворк .NET. (win7 поставляется с версией .net3.5, win10 поставляется с версией 4.0), поэтому вы можете запускать программы .NET в окне. Это избавляет обычных пользователей от установки .NET Framework.

Однако Microsoft определенно не будет создавать JDK для Windows. Причина слишком проста. Если в Windows также есть встроенный JDK, а также встроены другие операционные системы, такие как Linux, Mac и т. Д., То различные производители приложений / игр будут использовать его напрямую. Java-разработка просто прекрасна, и тогда разработанные продукты являются общими для всех системных платформ Windows / Linux / Mac. Производители довольны, а потребители довольны. В настоящее время, почему мы до сих пор используем оконную операционную систему? В любом случае, для обычных потребителей нет никакой разницы между использованием приложений или игрой в игры.

(Вот почему java не используется в прикладной / игровой сфере на стороне ПК, а на стороне сервера так много использует Java, потому что программисты, разрабатывающие сервер, очень просты в использовании со средой Java)

Вспомните, что браузер сражается между Netscape и Netscape. Если вы можете делать большинство вещей с браузером, то вам даже не важно, является ли операционная система, в которой работает браузер, оконной или linux. Конечно, текущий интернет-трафик / входной спор на самом деле та же самая причина. Обычные потребители очень заботятся о том, что легче использовать, а что дешевле.

12 ноября 2014 года Microsoft объявила, что полностью откроет исходный код .NET Framework и предоставит его для Linux и OS X.

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

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

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

Microsoft теперь может создавать кроссплатформенные платформы .NET. Во-первых, общая ситуация изменилась (предыдущая операционная система продавалась настолько дорого, а теперь win10 может быть бесплатной). Во-вторых, Microsoft контролирует .NET. Когда впервые появилась Java, Microsoft также поддержала Java и разработала версию JVM для Microsoft. Тем не менее, Microsoft хотела иметь контроль над системой технологий Java, но обнаружила, что невозможно получить Sun и тому подобное, и Java не находилась под его контролем, поэтому Microsoft начала разрабатывать свою собственную платформу .NET.

Возможно, программисты на Java могут показаться удивленными, что Microsoft когда-то была сторонником технологии Java (нужно также признать, что она конкурирует с Sun за контроль над Java и меняет Java с кроссплатформенной технологии на технологию с привязкой к Windows. Является основной целью корпорации Microsoft). На заре развития языка Java Microsoft разработала собственную виртуальную машину Java для поддержки приложения Java Applets в IE3, хотя эта виртуальная машина доступна только на платформе Windows, она была самой эффективной виртуальной машиной Java под Windows. Но хорошие времена длились недолго. В октябре 1997 года Sun официально обвинила Microsoft в обвинениях в нарушении прав на товарные знаки и недобросовестной конкуренции. В последующем расследовании монополии Microsoft эта виртуальная машина также была представлена ​​в качестве одного из доказательств. суд. Результатом этого судебного процесса стало то, что Microsoft выплатила Sun 20 миллионов долларов США (окончательная сумма компенсации Microsoft Sun составила 1 миллиард долларов США), обещая прекратить разработку своей виртуальной машины Java и постепенно удалить ее из продукта. Функции, связанные с виртуальной машиной Java. По иронии судьбы, к тому времени, когда виртуальная машина Java была полностью стерта в Windows XP SP3, Sun повсюду сообщала, что надеется, что Microsoft не сделает этого. Джим Каллинан, старший менеджер по продукту для Windows XP, сказал: «Мы потратили 3 года на споры с Sun, когда они пытались помешать нам поддерживать Java в Windows. Теперь мы сделали это, но они снова жалуются, что слишком иронично. Сейчас ".

Эта история говорит нам правду: если вы знали сегодня, почему у вас это было?

Этот блог дополняет вышесказанное, всем спасибо и приветствую вашу критику.

Языки C и C++. Где их используют и зачем?

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

Когда и зачем используются C и C++ ?

1. Операционные системы

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

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

Вот почему он идеален для разработки операционных систем.

Любая операционная система в первую очередь должна быстро запускаться и эффективно управлять системными ресурсами. Например, Linux, Microsoft Windows, Mac OS полностью написаны на языке C, а Android и iOS — частично.

Разработчик на языке C может реализовывать все структуры данных самостоятельно, производя тонкую настройку мельчайших деталей операционной системы. Такая высокая гибкость — весомый аргумент в пользу языка.

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

2. Программирование встроенных систем

Язык программирования C просто необходим при проектировании встроенных систем.

Главным образом из-за высокой производительности и простоты использования. Язык C очень экономичен в потреблении ресурсов системы, благодаря чему программа выполняется быстро. В результате встроенные системы работают в реальном времени без замедления.

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

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

3. Разработка игр и игрового движка

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

Являясь самым быстрым на сегодняшний день языком программирования, С++ оказывается одним из лучших для игр в 3D, многопользовательских и других.

Например, Counter-Strike, StarCraft: Brood War, Diablo I, World of Warcraft — все эти игры написаны на C++. Не говоря уже о консолях Xbox и PlayStation, в основе которых лежит программирование C++.

В ядре игрового движка Unity — самого популярного движка для создания видеоигр под несколько операционных систем одновременно — также использовался C++.

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

4. Разработка настольных и кроссплатформенных приложений

C++ также можно использовать для создания настольных приложений. Всё благодаря превосходным кроссплатформенным средствам разработки (иногда называемым фреймворками), таким как Qt. Оно позволяет нацелиться на Windows, Linux, macOS, Android и встроенные системы — все c единой кодовой базой. Так что разработка приложений с помощью Qt оказывается отличным решением для тех, кто хочет сэкономить на времени и стоимости программирования.

Стоит упомянуть и о библиотеке SDL, нашпигованной функциями, позволяющими создавать приложения одновременно для Windows, Linux, Android, MacOS и iOS.

Кстати, Photoshop, Illustrator и Adobe Premiere целиком написаны на C++.

Какие ещё есть приложения?

В Facebook перевели часть кода из PHP на язык C++, чтобы сократить затраты электроэнергии в расчёте на одного пользователя. Возможно, облачные системы хранения, базы данных, драйверы устройств и другие виды ПО тоже используют C++.

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

Выводы

Принимая во внимание всё вышесказанное, будем считать, что языки C/C++ вполне годятся для:

  1. разработки операционных систем,
  2. программирования встроенных систем,
  3. разработки игр,
  4. разработки баз данных,
  5. разработки настольных и кроссплатформенных приложений (с помощью средств C++).

Также можно отметить, что в проектах, имеющих дело со сложными типами данных, разработка ПО с использованием C++ предотвращает перегрузку данными и похожие проблемы.

Так что, если вы спросите:

Почему мы до сих пор используем C/C++?

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

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

Похожие статьи