Формальная система знаков для написания компьютерных программ

Обновлено: 31.10.2024

Узнайте все о курсе и экзамене. Уже зачислен? Присоединяйтесь к своему курсу в My AP.

Не студент?

Перейдите на AP Central, чтобы получить ресурсы для учителей, администраторов и координаторов.

AP Computer Science A

О курсе

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

Навыки, которым вы научитесь

Проектирование программы, разработка необходимых алгоритмов и написание кода для их реализации

Тестирование программного кода и исправление ошибок

Документирование и объяснение того, как работает программный код

Эквивалентность и предпосылки

Эквивалент курса колледжа

Вводный семестровый курс компьютерных наук в колледже

Рекомендуемые условия

Курсы английского языка и алгебры для старших классов, а также знакомство с функциями и понятиями, связанными с использованием обозначений функций

Дата экзамена

Среда, 4 мая 2022 г.,
12:00 по местному времени

Экзамен AP по информатике

Это обычная дата экзамена AP Computer Science A.

Об объектах

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

Содержание курса

Модуль 1: Примитивные типы

Вы изучите основы Java, языка программирования, а также другие основополагающие концепции кодирования.

Темы могут включать:

  • Примитивные типы данных, включая int , double и Boolean
  • Вычисление арифметических выражений в программном коде
  • Использование операторов присваивания для получения значения
  • Как переменные и операторы упорядочиваются и комбинируются в выражении для получения результата

На экзамене

2,5 – 5 % от экзаменационного балла

Модуль 2: Использование объектов

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

Темы могут включать:

  • Объекты и классы как способы описания экземпляров, атрибутов и поведения
  • Создание объектов путем вызова конструкторов с параметрами и без них
  • Использование библиотек классов, включая Integer и Double.
  • Определение поведения объекта с помощью методов, в том числе статических и математических классов
  • Вызов нестатических методов void с параметрами и без них
  • Использование объектов и методов String
  • Использование интерфейсов прикладных программ (API) и библиотек

На экзамене

5–7,5 % от экзаменационного балла

Модуль 3. Логические выражения и операторы if

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

Темы могут включать:

  • Поиск логических значений с помощью выражений, включающих операторы отношения
  • Использование условных операторов для выполнения различных операторов на основе входных значений
  • Использование условных операторов для создания нескольких возможных результатов.
  • Создание одного и того же значения с использованием эквивалентных логических выражений
  • Ссылки на объекты с помощью псевдонимов

На экзамене

15–17,5 % от экзаменационного балла

Модуль 4: Итерация

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

Темы могут включать:

  • Создание цикла для многократного запуска выражения до тех пор, пока не будут выполнены определенные условия.
  • Стандартные арифметические и строковые алгоритмы
  • Представление итерационных процессов в коде с использованием циклов for и while
  • Вложенные операторы цикла и итерации

На экзамене

17,5–22,5 % от экзаменационного балла

Модуль 5: Написание курсов

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

Темы могут включать:

  • Состав класса, включая атрибуты, являющиеся общедоступными или закрытыми
  • Установка атрибутов объекта с помощью конструкторов
  • Использование комментариев для описания функциональности кода
  • Определение поведения объекта с использованием методов non-void, void и static
  • Где переменные могут использоваться в программном коде
  • Разбиение проблемы на более мелкие части путем создания методов для решения отдельных подзадач.
  • Интеллектуальная собственность и этические аспекты программирования

На экзамене

5–7,5 % от экзаменационного балла

Модуль 6: Массив

Вы изучите методы и стандартные алгоритмы работы с наборами связанных данных, известных как структуры данных.

Темы могут включать:

  • Представление нескольких связанных элементов в виде объектов-массивов
  • Обход массива путем доступа к элементам с помощью операторов итерации
  • Стандартные алгоритмы, использующие обход массива для выполнения функций.

На экзамене

10–15 % от экзаменационного балла

Модуль 7: ArrayList

Вы углубитесь в наборы данных, исследуя объекты ArrayList для больших объемов данных, а также проблемы конфиденциальности, связанные с хранением личных данных.

Темы могут включать:

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

На экзамене

2,5–7,5 % от экзаменационного балла

Модуль 8: 2D-массив

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

Темы могут включать:

  • Представление наборов данных в виде массивов массивов или двумерных массивов.
  • Обход двумерного массива путем доступа к элементам с помощью вложенных операторов итерации

На экзамене

7,5–10 % от экзаменационного балла

Модуль 9: Наследование

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

Темы могут включать:

  • Использование общих атрибутов и поведения для группировки существующих объектов в надклассы
  • Определение и переопределение методов внутри подклассов и суперклассов
  • Создание ссылок с использованием иерархии наследования
  • Связывание объектов подклассов с суперклассами для создания полиморфизма

На экзамене

5–10 % от экзаменационного балла

Модуль 10: Рекурсия

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

Темы могут включать:

  • Выполнение рекурсивных методов
  • Поиск и сортировка с использованием алгоритмов бинарного поиска и сортировки слиянием

На экзамене

5–7,5 % от экзаменационного балла

Скриншот поиска кредитной политики AP инструмент на мобильном телефоне

Поиск кредитной политики AP

Найдите колледжи, которые присуждают зачеты и/или зачисляют баллы за экзамен AP на этом и других курсах AP.

Ресурсы курса

Ресурсы класса AP

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

Требования к лаборатории AP Computer Science A

Узнайте о необходимых лабораторных компонентах, включенных в программу AP Computer Science A, и загрузите руководства для студентов.

AP Computer Science: краткий справочник по Java — экзамен 2020

В кратком справочнике по Java перечислены доступные методы из библиотеки Java, которые могут быть включены в экзамен, начиная с 2019–20 учебного года. Краткий справочник по Java включен в экзаменационный буклет.

ACM (Ассоциация вычислительной техники)

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

  • Перейти к ACM (Ассоциация вычислительной техники)

ACSL (Американская лига компьютерных наук)

ACSL организует конкурсы по информатике и компьютерному программированию для учащихся начальных, младших и старших классов средней школы.

IEEE – крупнейшая в мире профессиональная техническая организация, занимающаяся развитием технологий на благо человечества.

AP Computer Science A Elevens Lab Руководство для студентов

Эта лабораторная работа связана с простым пасьянсом под названием «Одиннадцать». Вы изучите правила Elevens и сможете играть в нее, используя прилагаемый графический интерфейс пользователя (GUI).

AP Computer Science A Magpie Lab Руководство для студентов

В этом лабораторном занятии вы изучите некоторые основы обработки естественного языка. По мере изучения вы будете работать с различными методами класса String и практиковаться в использовании оператора if. Вы проследите сложный метод поиска слов в пользовательском вводе.

AP Computer Science: руководство для студентов Picture Lab

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

AP Computer Science: курс и описание экзамена

Это основной документ курса. Он четко излагает содержание курса и описывает экзамен и программу AP в целом.

Подробнее о вашем курсе

Подать заявку на стипендию, стажировку и другие возможности

Откройте для себя стипендии в колледжах, оплачиваемые стажировки и другие возможности в этой области с такими компаниями, как Amazon, Facebook и Google.

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

Мы известны своими теоретическими достижениями, такими как модель параллелизма актеров; переписывание логики и связанных с ней семантических рамок; concolic тестирование для автоматизированной генерации тестов; автоматизированное логическое мышление; автоматизированный вывод спецификаций и инвариантов; и теоретико-управляющие методы анализа киберфизических систем. Мы также разработали широко используемые инструменты и методы, такие как механизм перезаписи Maude; инфраструктура компилятора LLVM; Системы HPVM и ApproxHPVM для компиляции и аппроксимации программ, работающих на гетерогенных системах; К Фреймворк; системы Probfuzz, PSense и AxProf для тестирования вероятностных и рандомизированных вычислений; первые полные формализации C, Java и Javascript; и методы регрессионного тестирования.

Сильные стороны и влияние

В нашей области есть несколько направлений исследований, их общим знаменателем является гармония, которую мы поддерживаем между теорией и развитием системы. Компиляторы, оптимизация компилятора и преобразование программ — традиционные темы, но мы подходим к ним с использованием новых методов и инструментов, которые не только выполняют работу, но и делают ее с высокой степенью уверенности в правильности, иногда даже доказуемо правильно. Параллельные вычисления и модели параллелизма — сложные области, в которых мы обладаем уникальным опытом. Некоторые из наших преподавателей продвигают традиционные формальные методы и проверку в область киберфизических систем, которые имеют как дискретное, так и непрерывное поведение, а также в вероятностные и приблизительные модели вычислений. Тестирование программного обеспечения — одна из наших сильных сторон в разработке программного обеспечения; часто бывает так, что 10% или более всех статей на ведущих конференциях по тестированию написаны преподавателями Иллинойса. В языках программирования мы очень хорошо освещаем семантику и логику для рассуждений программ, предлагая структуры и основы, которые значительно лучше, чем современные.

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

Документ ICSE представляет методы, опробованные командой Amazon Web Services Automated Reasoning.

Конференция

Похожие публикации

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

Известно, что формальная проверка обеспечивает более безопасный код и меньше ошибок, но она редко используется в крупных коммерческих проектах по разработке программного обеспечения. Разработчикам, работающим в сжатые сроки, не хватает времени, чтобы написать подробные спецификации функций, даже если они знакомы с формальными языками, обычно используемыми для них. Группы проверки, наоборот, не знакомы с разрабатываемым программным обеспечением; изучение того, как должна вести себя каждая функция в программе коммерческого масштаба, может занять непомерно много времени.

Встроенный код подтверждения.jpg

В команде автоматического рассуждения Amazon Web Services мы запустили несколько пилотных проектов по интеграции формальной проверки в процесс разработки программного обеспечения. Некоторые включают проверку на уровне протокола; некоторые предполагают генерацию кода непосредственно из проверенной спецификации; а некоторые требуют проверки на самом уровне кода.

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

В документе мы сообщаем, что благодаря нашей методологии количество проверенных строк кода, найденных и исправленных ошибок, «контрактов» проверки, введенных разработчиками, и рабочего кода (т. е. кода без проверки), предоставленного вся группа проверки резко увеличилась за первые восемь месяцев проекта.

Проверенные линии.jpg

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

Наш метод состоит из шести ключевых компонентов:

1. Спецификация функций на знакомом языке программирования.

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

2. Спецификация декларативной функции.

Большинство известных языков программирования, таких как C, являются императивными, то есть они описывают функции как последовательности операций. Однако для спецификации функций декларативный синтаксис более интуитивно понятен. Например, разработчик должен иметь возможность сказать (в несколько более формальных терминах): «Эта функция удваивает каждое значение в массиве», вместо того чтобы записывать процедуру пошагового прохода по массиву и удвоения значений по отдельности. С помощью нашего метода группа проверки предоставляет библиотеку функций, которая позволяет разработчикам писать такие декларативные спецификации на знакомом императивном языке.

3. Спецификации, встроенные в код.

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

4. Пробная модель, в которой используется знакомый синтаксис «модульного теста».

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

Найдены ошибки.jpg

5. Исправление ошибок.

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

6. Непрерывная интеграция.

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

Continuous Integration.jpg

Интерфейс для нашего механизма непрерывной интеграции, указывающий на недавно зарегистрированный код, который (x) или не (галочки) нарушает существующие спецификации функций.< /p>

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

Используя нашу методологию, один штатный инженер по проверке и два стажера, работающие вместе с командой разработчиков, смогли указать и проверить (с некоторыми предположениями) 171 точку входа (точки в программе, где пользователь может вводить данные). более девяти ключевых модулей библиотеки.

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

Конференция

Похожие публикации

Дэниел Шварц-Нарбонн (Daniel Schwartz-Narbonne) – старший инженер по разработке программного обеспечения в группе автоматизированного мышления Amazon Web Services.

Похожий контент

Protein graphs.16x9.jpg

Извлечение информации, обнаружение лекарств и анализ программного обеспечения — это лишь некоторые области применения этого универсального инструмента.

Reduce-scatter interleaving.jpg

Исследователи Amazon оптимизируют инструмент распределенного обучения для эффективной работы с сетевым интерфейсом адаптера Elastic Fabric.

чип с галочкой, иллюстрация

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

"Во многих случаях недостатки программного обеспечения не имеют никакого значения. В других случаях они могут вызвать серьезные проблемы", – говорит Кэтлин Фишер, профессор и заведующая кафедрой информатики Университета Тафтса, бывший чиновник США. Агентство перспективных оборонных исследовательских проектов (DARPA).

На протяжении десятилетий ученые-компьютерщики представляли себе мир, в котором программный код формально проверяется с помощью математических доказательств. В результате приложения будут свободны от ошибок кодирования, которые приводят к ошибкам, взломам и атакам. Проверка программного обеспечения повысит производительность устройства, повысив при этом кибербезопасность и общественную безопасность. "Применяя специализированные алгоритмы и наборы инструментов, "можно показать, что код полностью соответствует заданным спецификациям", – говорит Брайан Парно, доцент кафедры компьютерных наук, электротехники и вычислительной техники Университета Карнеги-Меллона.

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

"Формальное подтверждение — это просто способ поднять ставки", — объясняет Фишер. "Это способ модернизировать и улучшить способ написания программного обеспечения и гарантировать, что оно работает так, как должно работать."

В поисках доказательств

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

Вот где формальная проверка входит в картину.

Идея написания и запуска безошибочного программного обеспечения не нова. В 1973 году Эдсгер В. Дейкстра предложил концепцию использования математических доказательств для проверки кода. Три года спустя его основополагающая книга Дисциплина программирования представила концептуальную основу для того, чтобы заставить проверенный код работать в реальном мире. В нем была представлена ​​революционная на тот момент идея о том, что к задачам программирования следует относиться скорее как к математическим задачам. Попутно другие ученые-компьютерщики, в том числе Тони Хоар, сформулировали ключевые идеи, продемонстрировавшие осуществимость проверки программного обеспечения.

Однако формальная проверка продвигалась медленно. Прорыв оказался трудным, потому что требуемые доказательства невероятно сложны, а разработка удобных для пользователя готовых инструментов для проверки кода чрезвычайно сложна. Добавление к проблеме: проверка программного обеспечения может быть медленным процессом. За последние пару десятилетий появились разрозненные примеры формальной проверки, в том числе использование метода Национальным управлением по аэронавтике и исследованию космического пространства (НАСА) для критически важного программного обеспечения полета. Совсем недавно такие организации, как Amazon, Intel, AMD, IBM, Google, Firefox и Microsoft, начали использовать этот метод для различных программных компонентов, от микроядер в процессорах до веб-браузеров и облачной инфраструктуры.

"Мы стали свидетелями значительного прогресса в математических представлениях о компьютерных программах и в формальном определении поведения языка программирования", – говорит Парно. Проще говоря, огромный рост вычислительной мощности, значительный прогресс в языках моделирования и постоянное развитие алгоритмов и готовых наборов инструментов для проверки кода привели эту область к переломному моменту. Благодаря критической массе знаний и практическим способам проверки кода этот метод становится все более популярным.

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

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

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

Для всех значений j и k таких, что 0

© 2021 ACM 0001-0782/21/7

Цифровая библиотека публикуется Ассоциацией вычислительной техники. Авторские права © 2021 ACM, Inc.

Комментарии

Джей Пол Гибсон

Спецификация "Для всех значений j и k таких, что 0

Лоуренс Маркосян
Сэмюэл Грингард

Спасибо, Дж. Пол и Лоуренс за ваши комментарии. Я ценю, что вы указали на эти вещи, особенно на вклад Лесли Лэмпорт.

Читайте также: