Почему трудно записать портативные программы C?

Проблема здесь - Вы, используют ReadLinesFromFile задача способом, это не было предназначено.

Чтения Задачи
ReadLinesFromFile список объекты от текстового файла.

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




    
        
        
        



        



И вывод похож на это:

  ItemGroup Color: Red;Blue;Green

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

Преобразования используются, чтобы создать один список от другого и также иметь способность преобразовать использование пользовательского разделителя. Таким образом, ответ должен преобразовать Ваше чтение списка в использование ReadItemsFromFile в другой список с новыми строками. Вот пример, который делает просто что:




    
        
    

    
        
            
        

        
        
    


Test.text похож:

Red
Green
Blue

И вывод похож на это:

[C:\temp]:: msbuild test.proj
Microsoft (R) Build Engine Version 3.5.21022.8
[Microsoft .NET Framework, Version 2.0.50727.1433]
Copyright (C) Microsoft Corporation 2007. All rights reserved.

Build started 11/8/2008 8:16:59 AM.
Project "C:\temp\test.proj" on node 0 (default targets).
  FileContents: Red;Green;Blue
  FileContents Transformed: Red
Green
Blue
Done Building Project "C:\temp\test.proj" (default targets).


Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:00.03

, Что продолжается вот, две вещи.

@(FileContents->'%(Identity)', '%0a%0d')   
  • Мы преобразовываем список от одного типа до другого использования тех же значений (Identity), но пользовательский разделитель '%0a%0d'
  • Мы используем MSBuild, Выходящий для выхода из перевода строки (%0a) и возврат каретки (%0d)

15
задан dmckee 20 February 2010 в 20:11
поделиться

10 ответов

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

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

26
ответ дан 30 November 2019 в 23:52
поделиться

Почему примитивные типы C не переносимы, и весь язык в целом?

Во время создания C считалось наиболее важным, что int использовать естественный размер слова (или размер полуслова) целевой машины (который в те дни мог быть 18 или 36 бит на PDP-10!), и менее важно, чем количество бит в int быть легко предсказуемым, не говоря уже об одинаковом для всего оборудования. Первостепенное значение имела эффективность, и особенно важно, чтобы в программе не было слишком много инструкций, чтобы ее можно было упаковать в небольшие воспоминания дня. Никто не захочет, например, моделировать 32-битную арифметику на 16-битной машине - это может утроить количество инструкций, необходимых для выполнения арифметических операций, что сделает невозможным размещение больших программ в памяти.

Почему сложно реализовать универсальную библиотеку?

Это совсем несложно. Проблема не в том, что нет универсальной библиотеки; проблема в том, что люди не могут прийти к единому мнению о том, что представляет собой универсальная библиотека. (См .: GTK, KDE, QT, AT&T U / WIN + AST и т. Д. До тошноты.) Но реализовать хорошую библиотеку действительно сложно. Относительно того, почему это сложно: дизайн библиотеки - это просто сложная проблема, и разумные люди могут и не соглашаются с тем, что составляет хороший дизайн. Таким образом, множество дизайнов разрастается, и переносимость идет не по плану.

Ситуация усугубляется очень тонкой стандартной библиотекой, поставляемой с C. Но давайте не будем забывать, что библиотека была разработана в те дни, когда программисту посчастливилось получить 64 КБ для кода и еще 64 КБ для данных. К тому времени, когда появился C ++, они могли позволить себе стандартизировать такую ​​огромную раздутую свинью, как Стандартная библиотека шаблонов. Но когда была разработана библиотека C, вещи должны были быть маленькими. Теперь, когда стандартная библиотека C неадекватна для сегодняшних более амбициозных приложений, всем программистам на C уже слишком поздно прийти к соглашению о едином стандарте.


Ткните профессора, получите лекцию ...

19
ответ дан 30 November 2019 в 23:52
поделиться

Это несложно, если вы будете придерживаться основного стандарта (примеры в K&R обычно работают с минимальными исправлениями). Но основной стандарт не поддерживает многие вещи, которые люди хотели бы делать. Такие мелочи, как:

  • поиск в файловой системе
  • более сложный ввод-вывод, чем простой поток текста
  • , запрашивающий у ОС доступ к часам, принтерам и сетям
  • общение с другими процессами

Относительно переносимости примитивных типов: стандарт определяет минимальные пределы размера для этих типов, но не определяет фактические размеры. Большинство платформ поддерживают размеры, превышающие минимальные, но не все платформы имеют одинаковые большие размеры.

15
ответ дан 30 November 2019 в 23:52
поделиться

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

Основные операции ввода-вывода файлов таковы.

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

Итак, если ваш код ничего не касается, он переносится.

7
ответ дан 30 November 2019 в 23:52
поделиться

Код переносим, ​​но проблема не в этом.

Проблема в том, что большинство больших приложений используют библиотеки, которые являются частью ОС. Так, например, если вы пишете сетевое приложение, оно может использовать встроенную библиотеку UPNP для Windows и библиотеку Bonjour в OS X, а также некоторые другие службы с нулевым конфигурированием в других вариантах unix.

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

Надеюсь, эти примеры достаточно ясны :)

3
ответ дан 30 November 2019 в 23:52
поделиться

Для java / ruby ​​/ ... кто-то портировал виртуальную машину, и ваш код просто запускается. Это упрощает задачу, если вы согласны с услугами, предоставляемыми виртуальной машиной. В C вы должны делать всю работу за себя, потому что вы можете напрямую взаимодействовать с оборудованием и ОС. Это добавляет зависимости, но дает вам большую мощность и гибкость. Это то, что делает C замечательным, но это может стать проблемой, если вы переключите ОС или оборудование.

1
ответ дан 30 November 2019 в 23:52
поделиться

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

  • Компилятор AC или C ++ (хотя и не все стандартные библиотека)
  • Ассемблер для любого языка ассемблера
  • Компоновщик для вышеуказанного
  • Интерпретатор для языка сценариев
  • Инструменты обработки текста, такие как sed, grep и т. д.
  • Простой редактор (кто-нибудь помнит, как ?)

Фактически, все основные инструменты разработки могут быть разработаны (и исторически разрабатывались) на C без использования специфических для ОС функций.

1
ответ дан 30 November 2019 в 23:52
поделиться

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

Я думаю, что код ANSI C довольно переносим. , раз уж вы пишете по стандарту. Ваш код переносим в той степени, в которой GNU и Microsoft придерживаются стандарта.

0
ответ дан 30 November 2019 в 23:52
поделиться

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

Различные процессоры (на основе CISC и RISC), 32- и 64-битные битовые потоки данных размещаются в разном порядке. Есть несколько поддерживающих API-интерфейсов для преобразования, но они не полностью надежны для всех случаев.

Windows и Unix имеют собственные флаги, которые необходимо использовать для сборки.

0
ответ дан 30 November 2019 в 23:52
поделиться

Почему примитивные типы C не переносимы, а не весь язык?

Примитивные типы переносимы в том смысле, что они гарантированно поддерживают минимальный диапазон значений (например, тип int должен как минимум ] поддерживает значения в диапазоне от -32767 до 32767). У них не гарантируется одинаковый размер или ограничения по выравниванию, потому что разные архитектуры имеют разные требования.

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

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

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

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

1
ответ дан 30 November 2019 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: