La totalité des variables et des structures de données utilisées sont définies au début du programme, avant la division procédurale où il y a les instructions. La manière dont sont définies les variables, c'est-à-dire les espaces de stockage temporaire, est très particulière. C'est une structure arborescente définie par une suite de lignes de code. Chaque ligne commence par un nombre qui définit le niveau d'imbrication du champ ou du groupe de variables.
Par exemple :
01 NomPrenom. 05 Prenom PIC X(20). 05 Nom PIC X(20).
qui défini une structure NomPrenom contenant les champs Prenom et Nom sur 20 caractères.
Comme défini dans la spécification originale, COBOL possédait déjà les nombreuses fonctionnalités qui ont fait son succès : d'excellentes capacités d'auto-documentation, des méthodes pratiques de gestion des fichiers et des types de données variés, dont le format est précisé par la clause PICTURE. Comme la plupart des autres langages de l'époque, il ne permet pas de définir de variables locales, de fonctions récursives et d'allouer de la mémoire dynamiquement.
La gestion des décimales en COBOL (nombres en virgule fixe), et la maîtrise des arrondis et des dépassements, permettent d'éviter les nombreux problèmes qui arriveraient en utilisant des nombres à virgule flottante pour les calculs financiers.
Il intégre également un générateur de rapports, défini de la même manière que les autres structures de données. Sont intégrées des fonctions de tri, de fusion et de communication. Un module optionnel permettait également une forme de communication inter-processus par file de messages.
Le parti-pris initial de définir un langage de programmation proche du langage naturel (comme pour FLOW-MATIC) devait faciliter, sinon la programmation, du moins l'audit des programmes COBOL par des gestionnaires non-informaticiens. Ce choix a eu pour conséquence une syntaxe complexe (le langage naturel n'est pas simple), avec de nombreux mots réservés, et de nombreuses options (les opérations de gestion ne sont pas simples non plus) qui valent à COBOL une réputation de verbosité, qui n'est pas forcément fondée sur des faits.
Par exemple en Cobol l'instruction
ADD montant TO total-jour total-mois total-annee.
s'exprimerait, en C ou autres langages dérivés, par
total_jour += montant; total_mois += montant; total_annee += montant;
Comme d'autres langages de l'époque (par exemple Fortran 2), COBOL offrait la possibilité de modifier du code pendant l'exécution à l'aide de la fameuse instruction ALTER X TO PROCEED TO Y (altérer X pour aller vers Y). Cette possibilité dangereuse, qui transposait une technique courante de la programmation en langage machine, a été éliminée des spécifications du langage. Rendant possible la modification à la volée de l'exécution d'un programme, cette commande permettait d'outrepasser des ordres GO TO, complexifiant ainsi la maintenance.
Les versions successives du standard ont modernisé le langage, par exemple en ajoutant des structures de contrôle améliorées et le support de la programmation objet, tout en préservant au maximum la compatibilité avec les versions précédentes, de façon à éviter d'avoir à modifier l'énorme stock de programmes COBOL en service.