Data description language FlexT: flexible types for description of static data.
The problem of binary data format specification is considered as a subtask of the problem of software system specification. This problem is further limited to simpler subproblems. First, the concept of specification of data interpretation as opposed to specification of data modification is introduced. That is we'll concentrate on the interpretation of already existing static data, and won't take into account different aspects of memory allocation, correct sequence of data items and so on. Next, we'll consider the problem of data type identification. Data type identification is a special and most basic kind of data interpretation. Specification of the data type identification for some data format enables to identify every bit of data of this format as a part of representation of some data item of definite type.
The language of Flexible Types FlexT was developed for description of the data type identification. It uses rather simple extensions of the set of type constructors traditional to common procedural languages. These extensions are very effective for the problem under consideration.
On the one hand, the use of specification when developing a program enables to increase the safety of the program due to increase of the level of abstraction of the specified program part, which simplifies the programmers task and leaves less room for errors. On the other hand, the specification of format of some data enables to increase the reliability and safety of processing of this data, because it makes them transparent. I.e. specification of data format enables to consider the data not as a ''black box" - a sequence of bytes of unknown purpose, but as a collection of data items of definite types, which makes it possible to control the contents of the data.
We can also consider a machine code as a specific type of data. The language FlexT was successfully used for specification of binary encoding of separate machine instruction, so it can be used for disassembling and decompilation of binary code (in conjunction with some kind of instruction semantics specification).