LINUX.ORG.RU

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

 


0

2

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

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

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

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

Это Open Source. Без финансирования они лет через 10 это запилят, если повезет.

Проверил, в libstdc++ хедер <thread> доступен минимум с 2009-го года (более ранней версии компилятора под рукой нет), т.е. еще до принятия стандарта, а значит дело не в Open Source, а в принципиальном решении, что «скрипач» не нужен, или почти не нужен.

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

При чем тут асм если речь про Си? Си то почему непереносимый?

Тебя директория arch/ с архитектурно-зависимыми вещами не смущает?

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

Если ты на жабке напишешь, что у тебя внезапно arch исчезнет?

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

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

архитектурно-зависимыми вещами

Даже в ОС на Java или C# без них не обойтись, но непереносимыми эти языки никто не называет.

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

Кстате а кокое отношение имеет глибц к гцц?

Такое, что gcc не предоставляет свою собственную реализацию libc. А для GNU/Linux стандарт это glibc, и все остальное - ничтожно малые флуктуации.

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

Даже в ОС на Java или C# без них не обойтись, но непереносимыми эти языки никто не называет.

Ты на Java пишешь архитектурно-зависимый код? Часто? Заметь, тут речь не про ОС-специфичные вещи. Я говорю о такой банальной вещи, как атомарные переменные.

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 2)
Ответ на: комментарий от anonymous

У меня это MinGW-w64, дальше что?

Да ничего, ты точно так же не можешь пользоваться тредами из С11, что gcc/glibc, что с MinGW-w64. В некотором роде это даже можно назвать совместимостью.

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

Я в первом своем сообщении и написал, что проблема в glibc.

anonymous
()

К языку стандартная библиотека имеет опосредованное отношение. Для исполнения программы на си хватит наличия стека и boilerplate кода передающий управление в main.

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

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

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

Хочешь переносимый, бери java.

На машинах с отличной от IEEE754 FP арифметикой не заработает. А C заработает.

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

К языку стандартная библиотека имеет опосредованное отношение. Для исполнения программы на си хватит наличия стека и boilerplate кода передающий управление в main.

Не мешай всё вместе. В hosted-окружении должны быть реализованы все неопциональные хедеры. Во freestanding-окружении программа даже с main() начинать исполняться не обязана.

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

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

Ты сделал мой день !

Хочешь переносимый, бери java

Запусти кусок Java на QNX, к примеру.

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

Кому он нужен при живом pthreads?

Очевидно тем, кто хотел бы писать переносимый (на деле, а не в виде POSIX) код на С.

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

переносимый (на деле, а не в виде POSIX)

https://www.opengroup.org/austin/papers/posix_faq.html

Q0. What is POSIX? What is POSIX.1? POSIX is a registered trademark of the IEEE.

POSIX is an acronym for Portable Operating System Interface.

anonymous
()

Для изучения С я бы посоветовал изучать сорцы Plan 9.

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

POSIX is an acronym for Portable Operating System Interface.

Спасибо, кэп, но я же не зря написал «на деле». А на деле есть ОС, где клали с прибором на POSIX. И имеют на это право.

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

есть ОС, где клали с прибором на POSIX

Так значит проблема непереносимости не в коде, а в этих ОС.

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

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

Посчитай количество ifdef там.

Я посчитал, у меня ноль вышло.

┌ home :: ~/tmp :: rm lua-5.3.3.tar.gz
└ d_a % wget https://www.lua.org/ftp/lua-5.3.3.tar.gz
--2016-11-10 20:59:15--  https://www.lua.org/ftp/lua-5.3.3.tar.gz
Распознаётся www.lua.org (www.lua.org)... 148.251.24.173, 2a01:4f8:201:620f::2001
Подключение к www.lua.org (www.lua.org)|148.251.24.173|:443... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа... 200 OK
Длина: 294290 (287K) [application/gzip]
Сохранение в: «lua-5.3.3.tar.gz»

100%[===================================================================================================================================================================================================>] 294 290     1,15MB/s   за 0,2s   

2016-11-10 20:59:17 (1,15 MB/s) - «lua-5.3.3.tar.gz» сохранён [294290/294290]

┌ home :: ~/tmp :: wget https://www.lua.org/ftp/lua-5.3.3.tar.gz
└ d_a % tar xf lua-5.3.3.tar.gz 
┌ home :: ~/tmp :: tar xf lua-5.3.3.tar.gz
└ d_a % cd lua-5.3.3/
┌ home :: ~/tmp/lua-5.3.3 :: cd lua-5.3.3/
└ d_a % grep -iR '#ifdef' src/
┌ home :: ~/tmp/lua-5.3.3 :: grep -iR '#ifdef' src/ (rc = 1)
└ d_a % grep -iR '#ifndef' src/
src/lctype.h:#ifndef lctype_h
src/ltm.h:#ifndef ltm_h
src/lobject.h:#ifndef lobject_h
src/lopcodes.h:#ifndef lopcodes_h
src/llimits.h:#ifndef llimits_h
src/luaconf.h:#ifndef luaconf_h
src/lgc.h:#ifndef lgc_h
src/lstate.h:#ifndef lstate_h
src/lcode.h:#ifndef lcode_h
src/llex.h:#ifndef llex_h
src/ldebug.h:#ifndef ldebug_h
src/lua.h:#ifndef lua_h
src/lauxlib.h:#ifndef lauxlib_h
src/lualib.h:#ifndef lualib_h
src/lfunc.h:#ifndef lfunc_h
src/ltable.h:#ifndef ltable_h
src/lstring.h:#ifndef lstring_h
src/lapi.h:#ifndef lapi_h
src/lparser.h:#ifndef lparser_h
src/lmem.h:#ifndef lmem_h
src/lundump.h:#ifndef lundump_h
src/lprefix.h:#ifndef lprefix_h
src/lvm.h:#ifndef lvm_h
src/ldo.h:#ifndef ldo_h
src/lzio.h:#ifndef lzio_h
┌ home :: ~/tmp/lua-5.3.3 :: grep -iR '#ifndef' src/
└ d_a % 

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

Так значит проблема непереносимости не в коде, а в этих ОС.

Треды в стандарте есть? Есть. Пользоваться ими можно (в том числе на ОС с pthreads)? Нет, хотя в стандарте они уже давно. Виноваты ли в этом ОС без поддержки POSIX? Конечно, нет. Т.е. пользуясь исключительно стандартом языка можно написать код, который почти нигде не соберется. Просто эталон переносимости.

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

И их поддержка опциональна.

Как и в POSIX.

Хм. А пруфы есть какие-то? А то я пока нашёл:

The following symbolic constants shall be defined by the implementation as follows:

Symbolic constants defined with the value 200809L:

_POSIX_ASYNCHRONOUS_IO
_POSIX_BARRIERS
_POSIX_CLOCK_SELECTION
_POSIX_MAPPED_FILES
_POSIX_MEMORY_PROTECTION
_POSIX_READER_WRITER_LOCKS
_POSIX_REALTIME_SIGNALS
_POSIX_SEMAPHORES
_POSIX_SPIN_LOCKS
_POSIX_THREAD_SAFE_FUNCTIONS
_POSIX_THREADS           <------
_POSIX_TIMEOUTS
_POSIX_TIMERS
_POSIX2_C_BIND

Это всё shall, не may.

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

Оно распространяется в составе ОраклЖдк.

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

Хм. А пруфы есть какие-то? А то я пока нашёл:
200809L

Сейчас, да, вероятно обязательно, а раньше было расширением. И учитывая, что все пишут на C89 и С99, то, если брать POSIX той же протухлости, то там тредов или не было, или были необязательны.

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

И учитывая, что все пишут на C89 и С99, то, если брать POSIX той же протухлости, то там тредов или не было, или были необязательны.

В C89 и C99 их же не было точно.

Разговор начался с C11. Ну и POSIX надо брать «той же протухлости».

Короче, для соответствия C11 треды реализовывать не обязательно. И никто не реализует, т.к. никому не нужно.

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

Разговор начался с C11. Ну и POSIX надо брать «той же протухлости».

Если отойти от темы тредов, то там ситуация еще хуже чем с С11. Есть хоть одна ОС, где заявлена полная поддержка POSIX 2008?

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

на нескольких платформах

на всех платформах поддерживаемых языком/инструментарием

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

детка, а ты понимаешь, что такое переносимость? так вот: переносимость - это возможность скомпилировать и запустить код на определённой архитектуре. а венда - это просто ДРУГАЯ программа, детка. и о «переносимости» одной программы внутри другой программы говорить как-то глупо, не правда ли?

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

ну-ну, тешьте себя сказочками. только не надо мне эту пургу рассказывать. жабка ваша - это её окружение, которое жрёт ресурсы. без него она - труп. и ни на какой, пардон, «сим-карте» запустить эту халабуду не получится.

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

переносимость - это возможность скомпилировать и запустить код на определённой архитектуре

Сама придумала?

Portability in high-level computer programming is the usability of the same software in different environments.

https://en.wikipedia.org/wiki/Software_portability

Кстати, под твоё определение C паршиво подходит. Про атомики и треды выше уже сказали.

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

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

Что мешает программисту на Си использовать какую-нибудь библиотеку, которая берёт на себя все специфичные вещи?

Взять тот же SDL. Можно написать игрушку, исходники которой менять не придётся, хоть ты компилируешь под винду, хоть под Linux, хоть по Mac OS. Отличаться будут только команды компиляции (и то какой-нибудь CMake упростит задачу портирования, а в простых случаях и вовсе позволит написать универсальный сценарий сборки), но это явно не часть исходного кода на Си (да и портабельность у разных систем сборки разная).

И да, в какой-нибудь Java тоже по факту портабельность осуществляется с помощью библиотек. Хоть интерфейс создания тех же окошек может быть и одинаков, но на винде в реальности будет дёргаться WinAPI, а под Linux - иксы. Чем кросс-платформенные библиотеки для Си (SDL, GTK) принципиально отличаются?

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.