Переносність мови C


10

Як саме визначається портативність такої мови, як C? Я дізнався, що компілятори специфічні для ISA. Якщо це правда, як портативний C? Або це лише те, що вихідний код, записаний на C, є портативним, але не виконуваним файлом? Хіба не виконувані ISA специфічні для прикладів програми для x86 є окремими від програм для Apple (якщо припустимо, що Apple використовує мікропроцесор Motorola / PowerPC)?

Відповіді:


27

це лише те, що вихідний код, записаний на C, є портативним, а не виконуваним файлом?

Правильно. Дехто називає це писати один раз, збирати скрізь.

http://en.wikipedia.org/wiki/Write_once,_compile_anywhere .

Інша альтернатива - писати один раз, бігати скрізь. Java - хороший приклад цього.

http://en.wikipedia.org/wiki/Write_once,_run_anywhere

І хоча ви можете досягти часткової переносимості між платформами, ніколи не слід очікувати, що ваш код буде працювати всюди без змін.


Вихідний код C не переноситься на різні компілятори або ISA або ОС без трохи лінгвальних шеннаніганів. Прості речі, такі як розмір та вирівнювання стандартних типів, не є стандартними для С, тому перенесення програмного забезпечення, яке обмінюватиметься даними з іншими примірниками, може бути досить складним. Зверніться до GNU Autoconf / Automake для (можливо, затуманеного) прикладу обручів програмістів C перескочить, щоб отримати мобільність.
Тім Вілліскрофт

3
@TimWilliscroft: Проблеми з портативністю зазвичай викликаються нестандартними бібліотеками та поганими методами програмування; і не викликані С або його стандартними бібліотеками. Простим прикладом може бути використання нестандартного розширення GCC або невдача правильно серіалізувати / де-серіалізувати дані для IO.
Брендан

6

Це не лише ISA. Наприклад, ви запитуєте:

програми для x86 є окремими від додатків для apple?

Так, вони є, навіть якщо Apple використовує апаратне забезпечення x86. Бінарні файли C - це архітектура та операційна система.


1
@ Steven314: Ваш коментар є дотичною. Це не має нічого спільного з тим, стандартне обладнання чи ні, і все пов'язане з тим, що OS X має інший бінарний формат (Mach-O), ніж у, скажімо, Linux (як правило, ELF).
mipadi

@Steve: EFI проти BIOS має значення лише для завантаження та внутрішніх систем ОС; архітектура апаратури, яка є набором інструкцій CPU, однакова, тому що це той самий процесор.
vartec

Коментарі видалено, головним чином тому, що я ніколи не повинен був включати в себе mac-річ. Моя згадка про ABI (Application Binary Interface) та угоди про виклики все ще можуть бути актуальними (третій пункт, який слід додати до "архітектури та операційної системи"). Вони не мають технічного обладнання, за винятком того, що ABI, як правило, розроблені для конкретних архітектур (наприклад, доступні регістри), але вони мають відношення до бінарної портативності. Це не проблема формату файлу - ELF використовується в Windows та Linux (від gcc), але ви, ймовірно, не можете перенести об'єктний файл з одного в інший.
Steve314

@vartec Ви сказали, що бінарні файли C теж є специфічною для операційної системи, чи не тому, що O / S є специфічним для ISA, тож C бінарні файли стають O / S опосередковано?
KawaiKx

@Saurabh - всі нативні виконавчі файли є специфічними для ОС, оскільки ОС визначає формат файлу. Крім того, стандартна бібліотека C повинна реалізовувати багато функцій, викликаючи операційну систему, тому навіть якщо формат файлу був стандартизований, сам код не міг працювати в іншій ОС. Це є стандартним для мов, які компілюються в нативний код, на відміну від деяких кодів віртуальної машини, таких як JVM (Java Virtual Machine). Можна скомпілювати C для віртуальної машини, але ніколи не робилося того, що я знаю. LLVM наближається, але призначений як зворотний кінець компілятора, а не середовище компіляції, що використовується коли-небудь.
Стів314

5

це лише те, що вихідний код, записаний на C, є портативним, а не виконуваним файлом?

Саме так. Вам потрібно перекомпілювати свою програму C на кожній платформі. Компілятори C генерують машинний код, який переноситься лише в дуже обмеженій мірі між машинами тієї ж архітектури процесора / пам'яті та ОС. Ось чому ви бачите різні бінарні дистрибуції багатоплатформних додатків (наприклад, браузери), такі як "64-бітний Linux Linux" або "32-розрядний PowerPC Mac OS X Mac" (ОК, останній - лише ілюстрація, я знаю, що Apple переключилася до Intel кілька років тому :-).


3

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

Наприклад, JAVA можна записати один раз і запустити на будь-якій платформі, де VM (сьогодні це називається "середовище виконання"). Але ще одна перевага полягає в тому, що ви можете запустити код Java 1.1 з 1995 року на вашій машині 2011 року. Що неможливо, якщо ваш код був складений на i386 і ви намагаєтеся запустити його в архітектурі AMD64.

Ви також отримуєте удосконалення самої віртуальної машини.

Тоді я б сказав, що в цілому, переходячи від найменш портативного до більш портативних мов, які ви мали б: Асемблер, мова скомпільована на низькому рівні, як C, потім C ++, потім інтерпретовані мови або ті, які працюють у віртуальній машині.

Я насправді не захисник Java, принаймні, не для мови, ані для спільноти, наприклад, але це шлях, якщо ви шукаєте портативність та найменші втрати в порівнянні з C.


3

Хороші відповіді про те, як написати один раз, компілюйте будь-де.

Люди люблять думати про C як про портативну мову через його популярність та високу ймовірність того, що компілятор C буде доступний для майбутніх цільових платформ. Ще один фактор - це стандартна бібліотека, яка допомагає у виконанні загальних завдань програмування незалежно від платформи.

Тому я б сказав, що портативність мови визначається:

  1. Рівень стандартизації.
  2. Наявність компіляторів для різних платформ / архітектур.
  3. Глибина та ширина портативних бібліотек.

Реально, хоча майже будь-який складний додаток С потребує певної роботи, щоб перейти на нову платформу через апаратні або операційні системи. Цей процес відомий як перенос.


3

"Переносимість" має численні значення. Щодо С, це означає наступне:

  • Компілятори були впроваджені для C для широкого спектру апаратних та операційних системних платформ, що було великим укладом ще на початку 70-х;

  • Існує загальновизнаний стандарт для самої мови, на відміну від кожної реалізації компілятора, що розпізнає дещо інший варіант мови (знову ж таки, велика угода, коли C вперше був розроблений, оскільки існувало кілька варіантів мов, таких як Pascal та BASIC що не були загальновизнаними);

  • Через цей стандарт, відповідний код породжує однакову поведінку при компілюванні на різних платформах.

Вихідний код є стерпним, але новим двійковим повинен бути згенеровані для кожної мети.

Однак зауважте, що джерело C рідко є "тривіально" портативним; більшість програм вимагають, щоб ви вийшли за рамки визначеного мовним стандартом, використовуючи розширення, унікальні для певної платформи, тому на практиці вихідний код не є 100% портативним.

Зауважте, однак, що C залишає досить багато до впровадження. Точні розміри різних типів даних, поведінка при переповненні тощо, все залежить від реалізації; стандарт передбачає мінімальні вимоги, яким має відповідати імплементація, але реалізація вільна виходити за ці межі.


0

Що б не було ISA, C не є специфічним для ISA. Я припускаю, що ви не маєте на увазі застарілий слот для розширень для ПК.

Існують стандарти, що відповідають стандартам компіляторів С для дуже багатьох платформ, і поки ви використовуєте повністю визначені стандартами мови функції у вихідному коді, ви повинні мати можливість компілювати його на будь-якому компіляторі C для будь-якої платформи.

Однак одна з причин полягає в тому, що стандарт C залишає багато функцій поведінки як визначених реалізацією, так і не визначених. Це робиться для того, щоб зробити мову C загалом кориснішою для програмування на низькому рівні, уникаючи випадків, коли певна точно визначена поведінка є поганою відповідністю тому, що апаратне забезпечення підтримується на певній платформі. Однак, це робить трохи складніше писати переносні програми.

Крім того, на відміну від деяких мов, C не постачається з величезною бібліотекою такого типу, яку надають Java або C #. Ви можете змусити дуже портативні бібліотеки робити майже будь-що, але вам потрібно виконати певну роботу, щоб створити їх і змусити їх працювати разом.

Звичайно, у C є стандартна бібліотека, але її обсяг порівняно обмежений порівняно з Java, C #, Python тощо.


4
ISA = архітектура наборів інструкцій aka апаратна архітектура
vartec
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.