LLVM по сравнению с C —; как LLVM не может существенно быть лучше для Haskell, чем C-?

У вас есть две проблемы:

  • Как прочитать документ YAML из файла с несколькими документами
  • Как выбрать нужный ключ из этого документа YAML

Я догадался, что вам нужен документ YAML типа 'DaemonSet' из прочтения ответа Грегори Нисбетта.

Я постараюсь использовать только те инструменты, которые, вероятно, уже установлены в вашей системе, потому что вы упомянули, что хотите сделать это в скрипте Bash. Я предполагаю, что у вас есть JQ, потому что без него очень сложно сделать в Bash!

Для библиотеки YAML я склонен использовать Ruby для этого, потому что:

  • Большинство систем имеют Ruby
  • Библиотека Ruby's Psych была включена в состав начиная с Ruby 1.9
  • ]
  • Библиотека PyYAML в Python немного негибкая и иногда ломается по сравнению с Ruby по моему опыту
  • Библиотека YAML в Perl часто не устанавливается по умолчанию

предложил использовать yq , но это не очень поможет в этом случае, потому что вам все еще нужен инструмент, который может извлечь документ YAML.

После извлечения документа я собираюсь снова использовать Ruby для сохранения файла в формате JSON. Тогда мы можем использовать JQ.

Извлечение документа YAML

Чтобы получить документ YAML с использованием Ruby и сохранить его как JSON:

url=...
curl -s $url | \
  ruby -ryaml -rjson -e \
    "puts YAML.load_stream(ARGF.read)
      .select{|doc| doc['kind']=='DaemonSet'}[0].to_json" \
  | jq . > calico.json

Дальнейшее объяснение:

  • YAML.load_stream читает документы YAML и возвращает их как массив
  • ARGF.read читает из файла, переданного через STDIN
  • Выбор Ruby позволяет легко выбирать документ YAML в соответствии с к его доброму ключу
  • Затем мы берем элемент 4 и преобразуем в JSON.

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

Выбор нужной клавиши

Чтобы выбрать нужную клавишу, можно использовать следующий JQ-запрос:

jq -r \
  '.spec.template.spec.containers[].env[] | select(.name=="CALICO_IPV4POOL_CIDR") | .value' \
  calico.json                                                          

Дальнейшее объяснение:

[ 1140]

  • Первая часть spec.template.spec.containers[].env[] выполняет итерации для всех контейнеров и для всех envs внутри них
  • Затем мы выбираем хеш, где ключ имени равен CALICO_IPV4POOL_CIDR, и возвращаем значение
  • The - r удаляет кавычки вокруг строки
    • Собирая все вместе:

    #!/usr/bin/env bash
    
    url='https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml'
    
    curl -s $url | \
      ruby -ryaml -rjson -e \
        "puts YAML.load_stream(ARGF.read)
          .select{|doc| doc['kind']=='DaemonSet'}[0].to_json" \
      | jq . > calico.json
    
    jq -r \
      '.spec.template.spec.containers[].env[] | select(.name=="CALICO_IPV4POOL_CIDR") | .value' \
      calico.json
    

    Тестирование:

    ▶ bash test.sh
    192.168.0.0/16
    

    26
    задан Peter Mortensen 6 March 2016 в 18:01
    поделиться

    2 ответа

    Ну, в UNSW есть проект по переводу ядра GHC на LLVM

    Помните: 10 лет назад не было ясно, что LLVM создаст всю инфраструктуру C-- не в состоянии. К сожалению, LLVM имеет инфраструктуру для переносимого, оптимизированного кода, но не инфраструктуру для хорошей поддержки языка высокого уровня, что C-- ha (s) г.

    Интересным проектом было бы нацеливание на LLVM из C-- ...


    Обновление , начиная с GHC 7, GHC использует LLVM для генерации кода . Используйте флаг -fllvm . Это улучшило числовую производительность для некоторых программ низкого уровня. В остальном производительность аналогична старой версии GCC.

    22
    ответ дан 28 November 2019 в 06:39
    поделиться

    GHC теперь официально имеет бэкэнд LLVM, и оказывается, что он конкурентоспособен с GCC и native-codegen и фактически быстрее в некоторых случаях. И проект LLVM принял новое соглашение о вызовах Дэвид Терей, созданное для Haskell на LLVM, так что удивительно, что два проекта сейчас фактически работают вместе.

    12
    ответ дан 28 November 2019 в 06:39
    поделиться
    Другие вопросы по тегам:

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