This document contains a list of programming language features to consider when evaluating a programming language. No one language will have all of these features (they are sometimes even contradictory); a language is not necessarily bad just because it lacks some feature. The purpose of this list is only to help you focus your thinking when reviewing a new language.
These are features (or potential features) of the language itself.
Imperative? Functional? Logic? What are the major programming styles supported by the language?
Support for object-oriented features. Is the language "object-oriented?" Does it support multiple inheritance or does it provide an alternative to multiple inheritance (interfaces, mix-ins, etc)?
Support for data hiding and encapsulation. How well does the language separate implementation and interface? Does it have good features for creating user defined, abstract data types?
Scope rules. Is scoping static or dynamic? Do subprogram definitions nest?
Built-in data structures, operators, and expression forms. Does the language offer high level data structures built-in? How are they manipulated?
Control structures. Does the language have any "unusual" control structures?
Memory management. Does the language support garbage collection or must dynamic memory be managed by the programmer?
Module system. What facilities does the language provide for creating and managing modules of code?
Type system. Are types checked dynamically or statically? Is type inference supported? What sort of built-in types are provided? Does the language do a lot of implicit type conversions?
Overloading. What kind of overloading does the language allow? Can operators be overloaded?
Support for generics/templates (static polymorphism). Does the language support such a feature?
Safe programming. Is the language particularly well suited for creating robust or secure software? Is it particularly bad at creating such software?
Error handling features. Are exceptions provided? What sort of errors are detected by the language (statically and dynamically)?
Support for floating point and numeric applications. Does the language have special features of interest to those doing large floating point computations?
Support for parallel applications. Does the language have special features designed to simplify the creation of concurrent or parallel programs?
Support for hardware control and low level or systems programming. Is it easy to write "bit twiddling" applications with the language such as device drivers or operating systems? Does the language offer good support for embedded systems programming?
These are things that exist outside of the language proper but that have an impact on the experience of using the language. Note that depending on the language some of these items may be directly supported in the language (and thus really in the first list, above).
History. Where did the language come from? Why was it created and how has it evolved?
Design goals. What is the language's main focus? Is it intended to support small, "throw-away" scripts, huge projects, numerical applications, the teaching of programming, etc?
Standardization. Does the language have a formal standard? Is there a single reference implementation?
Dialects. Does the language have many competing dialects and variations?
Libraries. How extensive is the library that comes with an implementation? What other libraries are available?
GUI support. Built-in or via library?
Network support. Built-in or via library?
Support for concurrent programming. Built-in or via library?
Support for distributed programming. Built-in or via library?
Programming environments. Does the implementation support an interactive "top loop" for evaluating expressions in the language? Are there IDEs for the language (or plug-ins for IDEs)?
Documentation. What kind of reference material and tutorials are available?
Community support. Are there mailing lists, newsgroups, web sites, etc, supporting the language?
Tool support. Are there debuggers, profilers, syntax directed editors, library managers, and other advanced tools supporting the language?
Required run-time support. Is the language runtime based on a virtual machine? Is it interpreted, strictly compiled, or something in between? Can "stand-alone" programs be created or must programs always be run in a special environment?
Interfacing with other languages: both called from another language... or calling another language. What about support for shared libraries?
Performance issues: Do programs tend to be fast or slow? Do they tend to consume a lot of memory? This is very implementation dependent, of course, but some languages have a fundamentally easier time than others at providing high efficiency.
Operating system interface. Is it easy or hard to call low level operating system services from the language?
Last Revised: 2014-09-29
© Copyright 2014 by Peter C. Chapin <pchapin@vtc.edu>