LINUX.ORG.RU

Тупые вопросы по pure C.

 


0

2

Вот есть функция типа clock_gettime() или open(). Я правильно понимаю, что это то, что называется «стандартная библиотека C» - libc или glibc, существующее на linux, windows, freebsd, но внутри юзающее платформ-специфик системные вызовы?

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

Перемещено mono из talks

Если хочешь писать на си, привыкай к платформозависимости. Си — непереносимый язык. Хочешь переносимый, бери java.

unt1tled ★★★★
()

Вот есть функция типа clock_gettime() или open(). Я правильно понимаю, что это то, что называется «стандартная библиотека C

Нет. open и clock_gettime – не входят в стандартную библиотеку C и добавляются в POSIX. clock_gettime – вообще часть POSIX RT Extensions и на некоторых «сертифицированных юниксах» такого вызова просто нет.
Стандартная библиотека – то, что описано в стандарте языка (всегда ваш, К.О.). glibc и прочие – библиотеки, в том числе реализующие стандартную библиотеку языка C (на расширяющие ее).

unikoid ★★★
()
Ответ на: комментарий от hlamotron

Там должно быть «но» вместо «на», но «редактирование комментариев с ответами запрещено»

unikoid ★★★
()
Ответ на: комментарий от unt1tled

Это называется не «переносимость», а «совместимость кодовой базы» или что-то вроде того — не скажу за правильность термина. Тем более процессоры там одинаковые.

anonymous
()

Вот есть функция типа clock_gettime() или open(). Я правильно понимаю, что это то, что называется «стандартная библиотека C» - libc или glibc, существующее на linux, windows, freebsd, но внутри юзающее платформ-специфик системные вызовы?

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

ту часть libc, которая входит в стандарт, можно, по сути, считать частью языка.

waker ★★★★★
()
Ответ на: комментарий от unt1tled

Если хочешь писать на си, привыкай к платформозависимости. Си — непереносимый язык. Хочешь переносимый, бери java.
unt1tled ★★★★ (10.11.2016 14:12:58) Не определился, то ли дурачок, то ли просто идиот.

andreyu ★★★★★
()
Ответ на: комментарий от unt1tled

А что ты понимаешь под переносимостью?

Я всегда считал, что переносимый код – это когда один и тот же код (или с минимальными изменениями) ты можешь скомпилировать и использовать на нескольких платформах.

mono ★★★★★
()
Ответ на: комментарий от mono

А что такое платформа? ОС или железяка? И что-то мне кажется для n разных железяк в любой оси лежит n разных сишноассемблерных кусков.

unt1tled ★★★★
()
Ответ на: комментарий от unt1tled

Си — непереносимый язык

Ядро линукса переписывают для каждой платформы заново? Нет? Ну тогда почему же он непереносимый?

mbivanyuk ★★★★★
()
Ответ на: комментарий от mbivanyuk

Таки если платформа это железо, то загляни в исходники. Там для каждой железяки своя папочка с мамочкой и код там на асме.

unt1tled ★★★★
()
Последнее исправление: unt1tled (всего исправлений: 1)
Ответ на: комментарий от mbivanyuk

Си то почему непереносимый?

Напиши как ты будешь экспортировать символ на C.

anonymous
()
Ответ на: комментарий от mbivanyuk

В первую очередь сам язык Си переносимый, а не то, что на нем написано. Легко написать компилятор для новой платформы, а потом перенести код ОС. Он так задумывался.

xezsien
()
Ответ на: комментарий от mbivanyuk

Не, ну printf(«hello, world») может и будет перенесен почти без проблем, но более-менее что-то делающее приложение, написанное для под линуксом с использованием gcc на венде не факт что заведется. В 99% случаев упадет с сегфолтом.

+ кто в наше время пишет си код, не использующий системные вызовы? Говноедство и зачем.

Еще задумайся, почему вещи «портируют» на фрю или что-то там еще с линукса. Вот и будет непереносимость.

unt1tled ★★★★
()
Последнее исправление: unt1tled (всего исправлений: 1)
Ответ на: комментарий от unt1tled

Твой пассаж в сторону «Си без асма не бывает» стоит на таком же уровне, что и «Жаба без сишных либ не бывает». Я об этом.

пиши код на ява

Спасибо, но у меня уже нетрадиционная сексуальная ориентация.

anonymous
()
Ответ на: комментарий от unt1tled

написанное для под линуксом

и собранное gcc на венде факт что заведется в 99% случаев, если только использованные фичи (а их не так много в принципе) не были завязаны на ядро линукса. Исправил ошибку в твоих рассуждениях, не благодари.

anonymous
()
Ответ на: комментарий от unt1tled

более-менее что-то делающее приложение, написанное для под линуксом с использованием gcc на венде не факт что заведется

Да. Но опять таки при чем тут Си? Не заведется потому что использует системные вызовы или еще что-то платформоспецифичное, не являющееся частью языка. Код на самом Си то почему не переносимый ты так и не ответил. И почему ты считаешь переносимым java? Как ты перенесешь код на java на какой-нибудь микроконтроллер?

mbivanyuk ★★★★★
()
Ответ на: комментарий от unt1tled

Платформа – это ОС плюс подразумеваемая железка/железки, на которых она будет работать.

В прошлом проекте мы использовали нейтивную (плюсовую, правда, а не сишную) реализацию собственного протокола для сетевого взаимодействия на сервере (Linux) и на клиентах (Android, iOS, Windows).

Конечно же, без #ifdef не обошлось, но такие места можно было по пальцам пересчитать.

mono ★★★★★
()
Ответ на: комментарий от unt1tled

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

и самый популярный здесь пример переносимого кода - кернел.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от unt1tled

но более-менее что-то делающее приложение, написанное для под линуксом с использованием gcc на венде не факт что заведется.

Заведется, еще как. Еще и соберется с помощью gcc.exe на винде, сразу под винду и под ондроед :) А некоторый код (например, оборачивающий обращения к GSM модемам типа SIM900) перенесется без изменений между разными вариациями одноплатников типа STM32 на другие (только для отладочного printf там придется написать кое-какие штуки, объявленные макросами, чтоб оно серило выхлопом куда-нибудь в U(S)ART).

slackwarrior ★★★★★
()
Ответ на: комментарий от CYB3R

Си относительно переносимый, если хорошо писать.

Ключевое слово - «относительно». То есть, абстрактный код, не использующий API операционной системы и прочие штуки, скорее всего будет работать. Но это мы ещё не затрагиваем такие нюансы, как система сборки, модули и прочие адовые ништяки, которых в случае с C/C++ просто зоопарк.

hateyoufeel ★★★★★
()
Ответ на: комментарий от Iron_Bug

и самый популярный здесь пример переносимого кода - кернел.

Собери мне ядро лялекса из под венды, детка. Желательно с помощью MSVS. Давай, сделай это.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

в отличие от жабки, которая только на довольно мощных машинках может жить, ибо жрёт ресурсы, как не в себя.

Это неправда.

и самый популярный здесь пример переносимого кода - кернел.

Скорее это обратный пример, ядро даже на GNU/Linux собирается только одним компилятором (я знаю про clang, в ядро вносили патчи, clang учили gcc-ам, но совместимости так и нет). И ядро это написано не на С, а на GNU C.

anonymous
()
Ответ на: комментарий от hateyoufeel

Ну в эту ваше десяточку они как-то таки его всандалили. А то, что у MS конпелятор - говно и поддерживает только с89 и то не весь, то это не проблемы С

anonymous
()
Ответ на: комментарий от anonymous

Ну в эту ваше десяточку они как-то таки его всандалили.

Нет. Ядра там нет, там скорее адовый слой совместимости типа Wine. Тут кто-то в толксах презентацию с разбором внутренностей кидал даже.

А то, что у MS конпелятор - говно и поддерживает только с89 и то не весь, то это не проблемы С

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

hateyoufeel ★★★★★
()
Ответ на: комментарий от anonymous

А то, что у MS конпелятор - говно и поддерживает только с99 и то не весь

Починено, а полностью С99 практически никто и не умеет.

anonymous
()
Ответ на: комментарий от anonymous

А то, что у MS конпелятор - говно и поддерживает только с89 и то не весь, то это не проблемы С

И насчет поддержки С, в glibc threads.h уже завезли, или даже не планируют?

anonymous
()
Ответ на: комментарий от hateyoufeel

Ты гонишь.

МС компилятор говно, которое застряло в 90-х. Возьми код, который явой 8 написан и запусти на ява 2 версии, чо.

вон возьми lua. собирается ваще всем даже турбо С 90 года.

anonymous
()
Ответ на: комментарий от anonymous

Не гони лошадей.

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.