I took the Ada vs. C++ "trade study" sent out a few days ago,
and tried to turn it into an FAQ for such a comparison. Here
are the results. Totally unbiased, of course ;-).
Comments and (serious) contributions welcomed.
-Tuck
----------------
Q: Don't software costing model sensitivities show that language selection
has little impact on cost?
A: It is true that in some models, varying the programming language has
less effect than variying other parameters. For example:
domain experience (18% improvement)
overall engineering competency (analysts: 29% improvement,
programmers: 30% improvement)
programming language (5% improvement).
However, analyzing these numbers indicates several issues. First,
withing a given organization, domain experience and engineering
competency are relatively fixed. With a given staff in a given
organization, a wise choice of programming language may be
the biggest and most cost-effective lever available.
Secondly, the amount of improvement due to programming language choice
clearly depends on the specific languages considered. If we compare
Modula-2 and TurboPascal, very little effect may be noticed, since both
languages have comparable safety and features. However, if we compare
Ada 95 and C++, the languages differ dramatically in safety and features.
The most basic features of C++ (arrays, pointers, casting) are all
unsafe. C++ provides no support for multithreading or interrupt
handling in the language, and there are no guarantees of thread
safety in implementations of the C++ run-time support, particularly
in the implementation of destructors and exceptions. The basic
features of Ada 95 are all safe, and the language includes built-in
support for multi-threading and interrupt handling with a requirement
for thread-safe runtimes in all validated compilers.
Thirdly, a cost model for traditional waterfall development is
substantially different from a cost model for a more modern,
iterative development process, with interleaved development,
integration, testing, enhancement, requirements analysis, etc.
In the more modern development process, the robustness, capability, and
flexibility of the programming language become more critical.
The more safety and consistency checking built into the language,
the more rapidly errors can be found and fixed, and the more
rapidly enhancements can be made without undermining the consistency
and safety of the overall system. Furthermore, as systems age, even if
they were developed using a waterfall process, maintenance and enhancement
ends up more iterative, and again, the support in the programming language
for safety and consistency checking has a dramatic effect on the
productivity and quality of the maintenance and enhancement process.
Q: Isn't the C/C++ tools market much larger than the Ada tools market?
Doesn't this mean that C++ is a more viable language than Ada
for building real-time systems?
A: The C/C++ tools market is certainly much larger if you include
all PC-targeted tools. However, if you focus just on C++ compilers
that provide thread-safe runtimes, and that have been validated
to some level of conformance with the ISO C++ standard, and
that are designed for use in the real-time systems market,
the size shrinks dramatically. On the other hand, the bulk of the Ada
compiler market is made up of sales of products that provide a thread-safe
runtime, a validation certificate, and support for mission critical,
real-time system development.
The Ada compiler vendor market is strong. Several vendors, such
as ACT and Green Hills, have rapidly growing Ada businesses.
The largest Ada vendor, Rational, is an extremely strong software
company, with Ada as one of their most important product lines.
All the major Ada vendors are focused on the real-time systems
marketplace, and bring extensive expertise to this arena. Most C++ vendors
are focused on the desktop market, and generally have little or
no expertise in the real-time systems arena.
Q: Are there any comparisons which show the relative strengths
of Ada and C/C++?
A: Unfortunately, there are very few "scientific" comparisons of
any sort that compare programming language benefits, in use in
real projects.
One company that publishes records of language productivity and
error rates is Software Productivity Research. Their most recent
records indicate that Smalltalk has the lowest error rates in
the desktop arena, and Ada 95 has the lowest error rates
in the real-time systems arena. An excellent, if somewhat dated,
paper comparing Ada 83 and C was written by Steve Ziegler, formerly
of Rational. This paper was based on bug reports and bug-fix times
recorded over several years on tools written in C and Ada 83.
The evidence showed a striking difference in bug rates and bug-fix times,
with the tools written in Ada having much lower bug rates, and
much shorter bug-fix times.
Q: Aren't Ada 95 and C++ similar in capability?
A: It is true that both languages support both object-oriented programming
as well as more low-level programming capabilities. However, Ada 95
provides many more features to support the development of real-time
critical systems. For example, the following Ada 95 real-time control
features are not provided as part of C++:
1) Portable multithreaded language features, with at least
30 real-time priority levels
2) Thread-safe runtimes, including exception handling and
destructors/finalization
3) Uniform model for interrupt handling support and control
4) Portable bit-level control of representation
5) Packed arrays, with 1, 2, 4, or 8 bits per element.
6) Delays based on both time-of-day and a real-time clock
7) Compiler-provided routines for serializing data types as part
of remote procedure calls or I/O, as well as ability for
user to substitute their own.
Furthermore, these capabilities are available in a portable way,
both on top of off-the-shelf RTOS's (such as VxWorks) as well as
on "bare" machines.
In the area of safety critical systems, Ada 95 provides significantly
more support for building certifiable systems more cost-effectively:
1) Several Ada vendors provide certifiable run-times, including
all documentation required by organizations like the FAA
or the NRC.
2) Because the Ada user can define their own distinct numeric types and
subranges, array types, and pointer types, the compiler can
perform many more compile-time consistency checks. This
can dramatically reduce the static analysis time for a large
safety-critical system.
3) All of the basic features of Ada are safe. The unsafe features
are available only through highly visible unchecked programming
features, which can be localized or restricted as desired to
reduce the certification effort. In C/C++, the basic features
(arrays, pointers, casts) are all unsafe, making it much more
expensive to identify and certify all uses of potentially unsafe
constructs.
4) Commercial tools are available for further automating the
certification process (e.g. the SPARK toolset from Praxis, Ltd.)
5) Ada 95 compilers can automatically enforce project-specific
restrictions specified using the pragma "Restrictions."
Q: What about the future availability of Ada compilers, especially
on "new" chips that are designed in the future?
A: The availability of Ada compilers used to lag behind
behind that of C. However, because of changes in the
technology underlying Ada compilers, that is no longer a significant
problem. In particular, a number of Ada 95 compilers are now based
on optimization, code-generation, and run-time technology that is
shared with C and C++ compilers. For example, the GNAT Ada 95 compiler
makes use of the GCC C-compiler optimizer, back end, and gdb debugger.
In fact, the primary maintainer of the GCC technology is now an employee of
ACT, the company that developed and maintains GNAT. As another
example, the Green Hills Ada 95 technology shares optimizer,
code generator, and debugger with their C/C++/Fortran product line.
Finally, AverStar has just announced a prevalidated Ada 95 compiler
that uses optimized ANSI/ISO C as its intermediate representation,
an Ada run-time built on top of a standard ANSI/ISO C run-time, and
generates debugging information that allows C debuggers to debug
at the Ada level.
With these various options, an Ada 95 compiler for any new chip
will be available in the same time frame as any C compiler for the chip.
Augmenting this sharing of technology with C compilers are
Ada 95 compilers that generate Java byte code files as their
output (e.g. AppletMagic and jGNAT), and include a run-time built on
the standard Java run-time classes. This means that Ada 95 can also
be used in environments where Java virtual machines, or Java
"just-in-time" compilers are available.
Q: Aren't Ada compilers big and slow, and what about the quality of
the generated code?
A: These days, modern Ada 95 compilers run as fast or faster than
compilers for other languages. This is particularly apparent when
compared with C or C++ compilers attempting to compile very large systems.
Separate compilation in C/C++ is based on the lexical-level "#include"
model. This poses a real challenge for avoiding having to repeatedly
read include files in a single execution of the compiler. Kludgey
and non-portable "pre-compiled header" facilities are provided by
some C/C++ compilers to address this performance problem. This
is not a problem for Ada compilers because separate compilation
is based on a semantic-level module importation. There is never
a need to read the same spec more than once in the execution of
an Ada 95 compiler.
Many Ada 95 compilers also have a simplified program library
model that is strictly source-based, eliminating the need for
any large disk-based program library.
Because of changes in the underlying technology, Ada 95 compilers
now generate code as good or better than C or C++ for the same
construct. Because of reduced aliasing concerns, optimizers
can be more aggressive with Ada programs than C programs. Redundant
run-time checks are eliminated by the optimizers built into many
Ada compilers, and of course all run-time checks can be suppressed
program-wide, or in specific modules, with the use of a pragma.
Q: What happens if I don't have enough Ada programmers for my team?
Can my programmers learn on the job? Is Ada being taught in
colleges? Where can I find Ada mentoring?
A: Many companies find that experienced programmers can learn
Ada on the job given a modest amount of mentoring. It turns
out that the Ada compiler itself is an excellent teaching tool,
because the language was carefully human-engineered to allow the
compiler to catch most "silly" errors, while the extensive compile-time
and run-time consistency checks provide guidance on semantic-level
correctness.
Ada is one of the most widely taught languages in colleges. Because
of its Pascal heritage, its excellent human-engineering, and its
support for software engineering principles, it has emerged as a
natural step up for colleges that have taught Pascal in the past.
In a recent survey of colleges using various languages for teaching
programming, those using Ada and Scheme were clearly the most
satisfied with their languages as teaching tools.
Ada mentoring is available from a number of sources. Ada has
an active newsgroup (comp.lang.ada), several extensive web-sites
(www.adaic.org, www.adahome.com), an active user group
(www.acm.org/SIGAda), and a vendor consortium (www.adaresource.org).
Any one of these can supply information on tools and services
available for the Ada community.
Q: Hasn't C++ already incorporated all the good features that Ada has?
A: C++ has some of the same features as Ada, however the features
in C++ are generally less safe, suffer from poor human-engineering,
emphasize writability over readability, or involve more hidden
overhead. It is interesting to see C++-like languages like Java and
Embedded C++ appearing to try to overcome some of the unsafety
and inefficiency of C++. Nevertheless, none of these C++ spinoffs
fully address the fundamentally poor human engineering of C-based
languages, with "=" vs. "==" confusion, missing "break"s, misplaced
"const"s, missing "&"s, arrays indexable by any arbitrary integer or
enum type, no overflow detection, etc.
|