Ответить
  • Сергей1734 Senior Member
    офлайн
    Сергей1734 Senior Member

    864

    18 лет на сайте
    пользователь #56271

    Профиль
    Написать сообщение

    864
    # 4 июня 2018 00:22 Редактировалось Сергей1734, 1 раз.

    Стандарт - понятие условное для языка, которому более 40 лет, и который несмотря на возраст, актуален.

    код выделить все

    static volatile unsigned char GPIO @ 0x05;

    ...

    static volatile bit GPIO0 @ (unsigned)&GPIO*8+0;
    static volatile bit GPIO1 @ (unsigned)&GPIO*8+1;
    static volatile bit GPIO2 @ (unsigned)&GPIO*8+2;
    static volatile bit GPIO3 @ (unsigned)&GPIO*8+3;

    Вильма-102
  • Неизвестный кот Senior Member
    офлайн
    Неизвестный кот Senior Member

    12519

    21 год на сайте
    пользователь #6965

    Профиль

    12519
    # 4 июня 2018 00:27

    Сергей1734, да именно

    static volatile unsigned char GPIO @ 0x05;

    символ @ (at) говорит о том что переменная GPIO будет расположена по абсолютному адресу 0x05 в адресном пространстве микроконтроллера.

    Эта директива @ не входит стандарт языка C. Это расширение конкретного компилятора который вы используете.

    НКХЖЕХВ
  • Сергей1734 Senior Member
    офлайн
    Сергей1734 Senior Member

    864

    18 лет на сайте
    пользователь #56271

    Профиль
    Написать сообщение

    864
    # 4 июня 2018 00:42 Редактировалось Сергей1734, 1 раз.

    Да, для того и существуют компиляторы языков высокого уровня под разные платформы. Но это вовсе не означает нарушение чистоты языка. Это всего-лишь среда разработки, в рамках которых программист может писать на чистом СИ, а компилятор генерирует машинный код. Как именно он это делает? Что-то доступно для изучения (благодаря использованию расширений стандарта), что-то совсем скрыто (в .exe-файлах компилятора). Я предпочитаю сам писать все библиотеки, чтобы сделать то что мне надо максимально понятным, эффективным, и избежать подключения ненужных функций.

    Вильма-102
  • Неизвестный кот Senior Member
    офлайн
    Неизвестный кот Senior Member

    12519

    21 год на сайте
    пользователь #6965

    Профиль

    12519
    # 4 июня 2018 01:23

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

    НКХЖЕХВ
  • Korben_Dallas Senior Member
    офлайн
    Korben_Dallas Senior Member

    2843

    13 лет на сайте
    пользователь #395360

    Профиль
    Написать сообщение

    2843
    # 4 июня 2018 01:34 Редактировалось Korben_Dallas, 2 раз(а).
    Сергей1734:

    Korben_Dallas:

    Что скрывается за макросами `GPIO` и т.п.? "Чистый Си"? Нет, конечно. За ним скрывается платфторменно-зависимый хак - приведение целочисленного значения (адреса регистра) к указательному типу. А это уже семантически выходит за пределы "чистого Си".

    Это стандартная директива компилятора СИ - #define, а не какой не "хак".

    Что за чушь вы несете? О `#define` тут никто не говорит. Речь идет именно о макроподстановке, которая скрывается за этим `#define`. Которая на "чистом Си" написана быть никак не может.

    Сергей1734:

    Применяется, чтобы не держать в уме большие числа, а использовать их мнемоники. Это есть в любом компиляторе любого языка программирования, и называется предпроцессор. Не имеет значения, что именно программируется: микроконтроолер или календарь на обычном ПК. С точки зрения языка, что мнемоника, что число - абсолютно равноценно. Оно для людей, а не для машин.

    Во первых, препроцессор. Во-вторых, вы, я вижу, просто не врубаетесь, о чем идет речь.

    Сергей1734:

    Korben_Dallas:

    А далее идут библиотечные вызовы типа `lcd_init`, т.е. то, о чем и говорилось выше. Т.е. для общения с устройством вы используете HAL, который внутри, разумеется, рано или поздно выйдет за пределы "чистого Си".

    Здесь Вы строите лишь предположения без оснований.

    Нет, здесь я констатирую жесткие факты, с очевидными на то основаниями.

    Сергей1734:

    Реальность же такова: библиотечные вызовы - это просто подпрограммы на том же чистом СИ, которые просто оформлены отдельно (для облегчения читабельности исходника).

    Нет, конечно. Все эти подпрограммы написаны с использованием абсолютно тех же самых "хаков", которые скрывались за вашими первыми `#define`.

    Сергей1734:

    P.S. Korben_Dallas, Вы тролль?

    Нет. Я один из авторов языка Си. На вашем зачаточном уровне знания языка language-lawyer моего уровня действительно может показаться вам "троллем". Это нормально. Но по мере того как вы будете продвигаться в своем развитии (если будете) вам постепенно все будет становиться яснее.

    Сергей1734:

    код выделить все
    static volatile unsigned char GPIO @ 0x05;
    ...

    static volatile bit GPIO0 @ (unsigned)&GPIO*8+0;
    static volatile bit GPIO1 @ (unsigned)&GPIO*8+1;
    static volatile bit GPIO2 @ (unsigned)&GPIO*8+2;
    static volatile bit GPIO3 @ (unsigned)&GPIO*8+3;

    Вот это все - уже разухабистый выход за пределы языка С. Ничего подобного в С нет.

    Добавлено спустя 1 минута 19 секунд

    gooblin:

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

    //==============================================================================
    // GPIO Bits

    extern __at(0x0005) __sfr GPIO;

    О чем и речь.

    Et si tu tombes 7 fois Toujours se relever 8
  • Неизвестный кот Senior Member
    офлайн
    Неизвестный кот Senior Member

    12519

    21 год на сайте
    пользователь #6965

    Профиль

    12519
    # 4 июня 2018 01:42 Редактировалось Неизвестный кот, 1 раз.
    Korben_Dallas:

    Нет. Я один из авторов языка Си.

    Вы наверно хотели сказать что входите в состав рабочей группы по стандартизации языка?

    А то я тоже буду гордо говорить что я автор POSIX. :)

    НКХЖЕХВ
  • Korben_Dallas Senior Member
    офлайн
    Korben_Dallas Senior Member

    2843

    13 лет на сайте
    пользователь #395360

    Профиль
    Написать сообщение

    2843
    # 4 июня 2018 01:46 Редактировалось Korben_Dallas, 3 раз(а).
    Сергей1734:

    Стандарт - понятие условное для языка, которому более 40 лет, и который несмотря на возраст, актуален.

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

    И никакой "условности" тут нет. (Что за чушь?) Есть жесткая обязательность: программирование на С и С++ всегда делается по стандартам этих языков, отклонение от которых, разумеется, допускается только при наличии обоснованной необходимости (как в вашем примере). Зубрить стандарт наизусть вас никто не заставляет, но работать с документом вы должны уметь свободно. Без этого вас не только никто и близко не подпустит к программированию на С, но даже упоминать названия этих языков в разговоре вы не будете.

    Отдельно стоит заметить, что вы сначала рассказывали нам про "чистый Си". Термин "чистый Си" означает именно и только строго стандартный С. А тут, я смотрю, после разглагольствований о "чистом Си" ни с того ни и сего пошло вдруг верчение пятой точкой на тему "условности стандарта" :)

    Добавлено спустя 2 минуты 7 секунд

    gooblin:

    Korben_Dallas:

    Нет. Я один из авторов языка Си.

    Вы наверно хотели сказать что входите в состав рабочей группы по стандартизации языка?

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

    gooblin:

    А то я тоже буду гордо говорить что я автор POSIX.

    Подчеркну: не "автор", а "один из авторов". А так - говорите :)

    Et si tu tombes 7 fois Toujours se relever 8
  • Неизвестный кот Senior Member
    офлайн
    Неизвестный кот Senior Member

    12519

    21 год на сайте
    пользователь #6965

    Профиль

    12519
    # 4 июня 2018 01:59
    Korben_Dallas:

    Мой нынешний работодатель не спонсирует.

    А предыдущий спонсировал? Включая авиабилеты туда/обратно, командировочные и проживание в гостинице?
    Простите за любопытство, просто интересно.

    Добавлено спустя 2 минуты 9 секунд

    Korben_Dallas:

    Зубрить стандарт наизусть вас никто не заставляет

    зубрить бесполезно - его надо понимать.

    НКХЖЕХВ
  • Korben_Dallas Senior Member
    офлайн
    Korben_Dallas Senior Member

    2843

    13 лет на сайте
    пользователь #395360

    Профиль
    Написать сообщение

    2843
    # 4 июня 2018 02:05 Редактировалось Korben_Dallas, 2 раз(а).
    gooblin:

    Korben_Dallas:

    Мой нынешний работодатель не спонсирует.

    А предыдущий спонсировал? Включая авиабилеты туда/обратно, командировочные и проживание в гостинице?
    Простите за любопытство, просто интересно.

    Под спонсированием я имею в виду не спонсирование меня, а спонсирование самой рабочей группы/ANSI.

    Что же касается меня, то я в Калифорнии живу. В "удаленном" собрании участвовал только один раз и то по оказии, а в остальных случаях - только локально.

    Et si tu tombes 7 fois Toujours se relever 8
  • Сергей1734 Senior Member
    офлайн
    Сергей1734 Senior Member

    864

    18 лет на сайте
    пользователь #56271

    Профиль
    Написать сообщение

    864
    # 4 июня 2018 04:07 Редактировалось Сергей1734, 4 раз(а).

    Korben_Dallas, Вас очень беспокоят вещи, касающиеся тривиального процесса компиляции языка высокого уровня в ПО для конкретной аппаратной платформы. Вы утверждаете про какие-то "хаки" и чуть ли не обходные пути в применениях, для которых этот язык и был создан в 1972 г.

    Изначально СИ создавался для портирования операционной системы UNIX (написанной на ассемблере) с ЭВМ PDP-7 на другие ЭВМ. Если Вы разбираетесь в работе компилятора, то знаете лучше меня, как именно происходит привязка стандартного ANSI-синтаксиса к оборудованию.

    Вообще, с любым "железом" типичное взаимодействие - через регистры специального назначения и порты ввода-вывода. Эта задача ложится на плечи компилятора, а не языка программирования. Так было и в 1972 г, и так было все 45 лет. И как частный случай - написание функций взаимодействия на промежуточном языке высокого уровня, который также может быть си-подобным, может не быть, но уж точно не обязан соответствовать стандартам. Ибо на нём типичный СИ-программист не пишет.

    Я написал библиотечные функции для управления ЖК-индикатором, которые используют мнемоники в рамках стандартного языка. Вас же почему-то не устроили эти функции. Что касается проекции мнемоник на физические регистры, то это просто список ассоциаций "число - мнемоника", описанный через static разработчиком компилятора. Никаких других дебрей, "вакханалий" с кодом, ассемблерных вставок и прочего, о чём Вы писали в начале темы, здесь нет. Данный список не подлежит редактированию пользователем, и частью языка СИ считать его не нужно - чтобы меньше волноваться)

    И вообще, зачем так переживать за чистоту языка, который свою миссию давно выполнил?
    Сейчас уже есть новомодные Питоны, Cython'ы, Haskell и прочие, которые гораздо более удобны, допускают много вольностей с типами данных, и более алгоритмически-читабельны. За ними будущее.

    Вильма-102
  • Korben_Dallas Senior Member
    офлайн
    Korben_Dallas Senior Member

    2843

    13 лет на сайте
    пользователь #395360

    Профиль
    Написать сообщение

    2843
    # 4 июня 2018 06:04 Редактировалось Korben_Dallas, 2 раз(а).
    Сергей1734:

    Изначально СИ создавался для портирования операционной системы UNIX (написанной на ассемблере) с ЭВМ PDP-7 на другие ЭВМ.

    Тот язык, который создавался изначально "для портирования операционной системы UNIX", можно увидеть в "C Reference Manual" Дениса Ритчи вот здесь - https://www.bell-labs.com/usr/dmr/www/cman.pdf. Тот язык был действительно был неким "портабельным ассемблером" и сильно отличался даже от K&R С и в области синтаксиса, и в области семантики. Это был сильно другой язык. Его хвосты до сих пор торчат в старых Unix-овских хедерах.

    Сергей1734:

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

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

    В этом нет ничего плохого.

    Сергей1734:

    Ибо на нём типичный СИ-программист не пишет.

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

    Сергей1734:

    И вообще, зачем так переживать за чистоту языка, который свою миссию давно выполнил?

    Во-первых, никто тут ни за что не переживает. Я просто обратил внимание на странное утверждение об управлении микроконтроллером на "чистом Си".
    Во-вторых, боюсь, что утверждения о "давновыполненности" миссии Си малость преувеличены ))

    Et si tu tombes 7 fois Toujours se relever 8
  • Сергей1734 Senior Member
    офлайн
    Сергей1734 Senior Member

    864

    18 лет на сайте
    пользователь #56271

    Профиль
    Написать сообщение

    864
    # 4 июня 2018 23:19 Редактировалось Сергей1734, 4 раз(а).

    Директивы компилятора имеют отношение к языку СИ примерно такое же, как вождение автомобиля к русскому языку. По аналогии с созданием программы, возможны следующие варианты:

    - человек разговаривает на чистом русском языке.
    - человек разговаривает и при этом управляет автомобилем.
    - человек управляет автомобилем молча.

    Вопрос N1: является ли управление автомобилем во время разговора нарушением чистоты русского языка?
    Вопрос N2: насколько будет нарушена чистота языка, если водитель скажет "едем быстрее", и при этом нажмёт на газ?
    Вопрос N3: водитель скажет "мой автомобиль очень быстрый". Сколько борцов за частоту русского языка напишут жалобу в ООН за употребление греко-латинского словосочетания в данном предложении?

    Вильма-102
  • Korben_Dallas Senior Member
    офлайн
    Korben_Dallas Senior Member

    2843

    13 лет на сайте
    пользователь #395360

    Профиль
    Написать сообщение

    2843
    # 5 июня 2018 00:02
    Сергей1734:

    Директивы компилятора имеют отношение к языку СИ примерно такое же[...]

    Я не понял, что именно вы хотели сказать. Но на всякий случай спрошу: что именно вы имеете в виду под "директивами компилятора"?

    Et si tu tombes 7 fois Toujours se relever 8
  • Неизвестный кот Senior Member
    офлайн
    Неизвестный кот Senior Member

    12519

    21 год на сайте
    пользователь #6965

    Профиль

    12519
    # 5 июня 2018 01:17

    Сергей1734, речь идет о том, что @ не является ключевым словом в стандарте языка C. Т.е. он не входит в список ключевых слов синтаксиса языка С, описанного в стандарте ISO/IEC 9899:2011:

    6.4.1 Keywords
    Syntax
    keyword: one of
    auto
    break
    case
    char
    const
    continue
    default
    do
    double
    else
    enum
    extern
    float
    for
    goto
    if
    inline
    int
    long
    register
    restrict
    return
    short
    signed
    sizeof
    static
    struct
    switch
    typedef
    union
    unsigned
    void
    volatile
    while
    _Alignas
    _Alignof
    _Atomic
    _Bool
    _Complex
    _Generic
    _Imaginary
    _Noreturn
    _Static_assert
    _Thread_local

    Более понятным будет называть @ расширением стандартного синтаксиса языка C, а не директивой компилятора.

    НКХЖЕХВ
  • Сергей1734 Senior Member
    офлайн
    Сергей1734 Senior Member

    864

    18 лет на сайте
    пользователь #56271

    Профиль
    Написать сообщение

    864
    # 5 июня 2018 19:25 Редактировалось Сергей1734, 1 раз.

    Ну таки да, директивы обычно начинаются с символа # и служат для управления компиляцией.
    Но конструкции со знаком @ разве не делают тоже самое? Компилятор видит @, и даёт возможность разместить переменную по физическому адресу. Разве это имеет прямое отношение к языку? Ведь алгоритм программы не меняется в зависимости от привязки имени переменной к конкретному оборудованию.

    Вильма-102
  • Korben_Dallas Senior Member
    офлайн
    Korben_Dallas Senior Member

    2843

    13 лет на сайте
    пользователь #395360

    Профиль
    Написать сообщение

    2843
    # 5 июня 2018 20:38 Редактировалось Korben_Dallas, 6 раз(а).
    Сергей1734:

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

    То, что начинается с #, называется директивами препроцессора. Препроцессор, как и линкер, являются неотъемлемыми интегральными частями языка, встроенными частями каждой реализации языка С. То, что когда-то (и сейчас) линкер и/или препроцессор могут быть реализованы отдельными модулями, с точки зрения языка не имеет никакого значения. С точки зрения языка все это - не более чем фазы единого процесса трансляции, которые к тому же довольно тесно зависят друг от друга и взаимопроникают друг в друга.

    То есть да, это все имеет прямое отношение в языку. А вот никакого @ в языке С нет.

    Et si tu tombes 7 fois Toujours se relever 8
  • Неизвестный кот Senior Member
    офлайн
    Неизвестный кот Senior Member

    12519

    21 год на сайте
    пользователь #6965

    Профиль

    12519
    # 5 июня 2018 20:48

    Сергей1734, алгоритм не меняется, однако меняется переносимось программы (возможность быть скомпилированной без изменений и выполненной с тем же результатом) на другое железо (архитектуру процессора) или другой компилятор или другую операционную систему. Но в вашем случае это не важно - для embedded так все делают, расширяя синтаксис языка под конкретное железо. Это нормально, переносимось для embedded программ не имеет значения и в расчет не берется. Поскольку вероятность того что в другом микропроцессоре по адресу 0x5 будет находится регистр GPIO, с таким же назначением всех его бит, равна нулю.

    Для прикладных программ, написанных на C, переносимость важна. Я например, если надо написать на C какую-то утилиту командной строки, стараюсь написать ее так, чтобы не использовать кучу #ifdef-ов для различных платформ. Т.е. мой исходный код будет одинаково компилироваться и работать например и под Windows и по Linux без изменений. Конечно если для моей программы достаточно только стандартной библиотеки яыка C.

    НКХЖЕХВ
  • Сергей1734 Senior Member
    офлайн
    Сергей1734 Senior Member

    864

    18 лет на сайте
    пользователь #56271

    Профиль
    Написать сообщение

    864
    # 5 июня 2018 22:13

    Спасибо, очень интересно.
    А вот прикладная программа, потребовавшая, по заявлению разработчиков, большого труда по портированию. https://www.linux.org.ru/forum/desktop/13197888
    С чем это может быть связано?

    Вильма-102
  • Неизвестный кот Senior Member
    офлайн
    Неизвестный кот Senior Member

    12519

    21 год на сайте
    пользователь #6965

    Профиль

    12519
    # 5 июня 2018 22:56

    Сергей1734, оригинальный исходный код far manager завязан на WinAPI - системные вызовы Windows. В Линуксе их нет, там используются другие системные функции. На обоих операционках эти системные вызовы не входят в стандартную библиотеку языка C - поэтому при портировании win на lin надо было перепахать весь код.

    А почему 10 лет портировали? По мне так две причины:
    1. С самого начала, когда FAR писали под винду, разработчики не предусмотрели портирование на другие платформы. Обычно весь платформозависимый код прячется за набором процедур, являющимся "прослойкой" между системными вызовами операционной системы и остальной частью программы (ее основным функционалом). И тогда при портировании на новую платформу требуется переписать (добавить) только прослойку для новой операционнной системы. Когда Фар писали под винду - этого никто не сделал. Разработчики же сами написали по вашей ссылке - был разработан платформо-независимый API - это и есть прослойка про которую я говорил.
    2. Вторая причина - писали фанаты Фара в свободное от зарабатывания денег время. А свободного от работы времени не так много. Если бы писали за бабки - то было бы очень быстро.

    НКХЖЕХВ
  • 13308 FBY Team
    офлайн
    13308 FBY Team

    24964

    20 лет на сайте
    пользователь #13308

    Профиль
    Написать сообщение

    24964
    # 6 июня 2018 09:52 Редактировалось 13308, 1 раз.

    Гуру, киньте ссылку на проверенный !!! и понятный учебник си для школьников 12-13 лет.

    Картинки и таблицы пропускаю, в пролетарскую суть вникаю