Contract-based Programming or Design By Contract (DBC) is a discipline for system construction that
in recent years has postulated to be one of the most solid and reliable models for software creation. It
is well known that in the software industry the number of projects not being successfully developed is
huge. The main cause of the failure is that projects do not meet user expectations. In this context, Design
By Contract seems to emerge as a solution to decrease this failure rate. This philosophy provides a set
of mechanisms for the validation of part of the requirements specification.
In recent years, several programming languages started to implement DBC, either as part of the language
or an external library. The main programming languages that support contract-based programming
are Ada 2012, Spark, Eiffel, D, C# CodeContracts or Microsoft Source-Code Annotation Language
(Microsoft SAL). Traditionally, C++ has been a programming language focused on flexibility, performance
and efficiency. This has attracted many people to carry out projects using this programming
language. However, trends make programming languages change, and the interests of the industry
are leaning towards solid solutions. Those solutions shall include frameworks that are reliable. With
this same purpose, C++ has designed a specification for the implementation of Design By Contract in
the programming language. This new specification has been accepted by the ISO C++ committee to
be included in C++20. The specification includes several clauses that allow the user to write pre/postconditions
on the code. This allows part of the requirement specification to be merged into the code,
enabling traceability between the phases of the software project.
The specification of a new feature in a programming language implies changes in how the language
is understood by a compiler. For the implementation of a new specification, several changes are required
at different levels. This document describes these changes. Additionally, it provides an overview of the
structure of a compiler, and a brief description of all the parts of the Clang C++ compiler.La programación por contratos es una disciplina de construcción de sistemas que recientemente se ha
postulado como una de las más solidas y fiables para la creación de sistemas software. Se sabe que la
industria de desarrollo de software no está siendo exitosa debido en parte a la tasa de fallos que hay en
éstos. En este contexto, la programación por contratos emerge como una solución para reducir esta tasa
de fracaso en la industria. Esta tendencia de desarrollo provee a los usuarios con mecanismos para la
validación de los requisitos.
En los últimos años, varios lenguajes de programación han comenzado a implementar la programación
por contratos, bien como parte del lenguaje o como una biblioteca externa. Los principales lenguajes de
programación que a día de hoy soportan programación por contratos son Ada 2012, Spark, Eiffel, D, C#
CodeContracts or Microsoft Source-Code Annotation Language (Microsoft SAL). Tradicionalmente, C++
ha sido un lenguage de programación centrado en proveer al usuario con flexibilidad, rendimiento y
eficiencia. Estas características han atraido a muchos clientes de cara a utilizar este lenguaje de programación
en proyectos. Sin embargo, las tendencías fuerzan cambios en los lenguajes de programación, y
los intereses de las empresas actualmente se están inclinando hacia soluciones robustas. Estas soluciones,
deben incluir marcos de trabajo que sean fiables. Con esto en mente, se ha diseñado una especificación
para la programación por contratos en el lenguaje de programación. Esta nueva especificación, ha sido
aceptada para por el Comite ISO C++ para ser incluida en C++20. Esta especificación provee al usuario
con varios mecanismos que permiten verificar condiciones en el código. Esto permite directamente enlazar
la especificación de requisitos con la implementación de los mismos.
La especificación de una nueva característica dentro de un lenguaje de programación implica cambios
en como el lenguaje es entendido por un compilador. Para la implementación de estos nuevos requisitos
se requiere de realizar modificaciones en el compilador en distintos niveles de análisis. En este
proyecto, se describe un resumen de los cambios que son necesarios dentro de un compilador. Estos
cambios incluyen un resumen de la estructura del compilador, posteriormente se desglosa la estructura
del compilador de C++ Clang y por último se describen las modificaciones en cada una de las partes
involucradas.Ingeniería Informátic