Skip to content

Commit 926f90a

Browse files
committed
blog: added explora section
1 parent a8588d8 commit 926f90a

File tree

3 files changed

+226
-2
lines changed

3 files changed

+226
-2
lines changed
Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
---
2+
title: "Abstract Data Type in C"
3+
summary: "Object-oriented programming in ANSI-C is a disciplined approach that implements information hiding, inheritance, and polymorphism by leveraging standard C features like structures and function pointers"
4+
---
5+
6+
7+
An Abstract Data Type represents a generic data object with a well-defined set of logical properties and behavioral characteristics that are independent of implementation details. Rather than focusing on how data is stored internally, an ADT specifies what operations can be performed on data and what those operations should accomplish.
8+
9+
<YouTube id = "VwPJGWxIDhM" />
10+
11+
At its core, an ADT defines:
12+
13+
- **A set of values**: The domain of data the type can represent
14+
- **A set of operations**: Functions that can be performed on those values
15+
- **Behavioral specifications**: What each operation should do and return
16+
17+
An ADT can be characterized through abstract constructors—operations that create instances—and abstract observations—operations that retrieve information about instances. The behavior of an ADT is specified by defining what each observation should return when applied to each constructor's result.
18+
19+
This approach originated from academic research and was formalized in languages like CLU. It serves as a foundational principle for creating maintainable, reusable code by separating interface from implementation. Crucially, clients interact with ADTs through their public interface without knowledge of underlying representation details.
20+
21+
## 2. ADT vs OOP: Conceptual Relationship
22+
23+
While often conflated, Abstract Data Types and Object-Oriented Programming represent fundamentally different approaches to data abstraction.
24+
25+
### Core Distinction
26+
27+
**ADTs use type abstraction** to hide implementation details. The mechanism is a type boundary: clients declare variables of an abstract type but cannot inspect the representation.
28+
29+
**OOP uses procedural abstraction** to achieve abstraction. Data becomes abstract because it is accessed only through procedural interfaces. Individual objects act as clients of each other.
30+
31+
### Organizational Contrast
32+
33+
Consider a data abstraction as a matrix with constructors on one axis and observations on the other:
34+
35+
- **ADTs decompose by observations**: Each observation becomes an operation examining the underlying representation
36+
- **OOP decompose by constructors**: Each constructor defines an object template; observations become methods
37+
38+
This fundamental difference has consequences: ADTs excel at adding new operations but struggle with new constructors. OOP excels at adding new constructors but struggles when adding operations across all existing types.
39+
40+
## 3. Why ANSI C Can Support ADTs
41+
42+
C lacks built-in object-oriented or abstract data type features, yet it provides all necessary primitives.
43+
44+
### Key C Mechanisms
45+
46+
**Opaque Types**: C's forward declaration allows declaring a pointer to an incompletely-defined structure. Clients can declare variables without seeing the definition.
47+
48+
**Separate Compilation**: The C module system naturally supports the separation of interface from implementation.
49+
50+
**Function Pointers**: Enable implementing virtual method dispatch manually.
51+
52+
**Structs and Typedefs**: Structures bundle data; typedef creates new type names.
53+
54+
**Memory Management Control**: Manual allocation grants precise control over object lifetimes.
55+
56+
## 4. Encapsulation in C Using Header and Source Files
57+
58+
### Header File Role
59+
60+
The header file (.h) exposes the public interface with type declarations and function prototypes, withholding structure definitions:
61+
62+
```c
63+
/* Point.h - Public interface */
64+
typedef struct Point *Point; /* Opaque pointer type */
65+
Point Point_new(int x, int y);
66+
void Point_destroy(Point p);
67+
void Point_move(Point p, int new_x, int new_y);
68+
int Point_getX(Point p);
69+
int Point_getY(Point p);
70+
71+
```
72+
73+
### Source File Role
74+
75+
The source file (.c) contains the complete structure definition and implementations:
76+
77+
```c
78+
/* Point.c - Private implementation */
79+
struct Point {
80+
int x;
81+
int y;
82+
};
83+
84+
Point Point_new(int x, int y) {
85+
Point p = (Point)malloc(sizeof(struct Point));
86+
if (p) {
87+
p->x = x;
88+
p->y = y;
89+
}
90+
return p;
91+
}
92+
93+
```
94+
95+
This design enforces encapsulation through compiler mechanisms: clients cannot access struct members, cannot create stack instances, and can only use exported functions.
96+
97+
## 5. Example: Point ADT Implemented Using OOP Style in ANSI C
98+
99+
The Point ADT demonstrates fundamental principles. A Point represents a 2D coordinate with operations to manipulate it.
100+
101+
### 5.1 Public Interface (Point.h)
102+
103+
```c
104+
#ifndef POINT_H
105+
#define POINT_H
106+
107+
// set of values
108+
extern const void * Point;
109+
// sef of operations
110+
111+
void * new_point(int x, int y);
112+
void move_point(void * _self, int dx, int dy);
113+
void print_point(void * _self);
114+
115+
void delete_point(void * self);
116+
117+
#endif
118+
```
119+
120+
### 5.2 Hidden Implementation (Point.c)
121+
122+
```c
123+
#include "stdio.h"
124+
#include "stdlib.h"
125+
#include "Point.h"
126+
127+
struct Point { int x, y; };
128+
129+
void * new_point(int x, int y) {
130+
// allocate some memory
131+
struct Point * p = malloc(sizeof(Point));
132+
133+
p->x = x;
134+
p->y = y;
135+
136+
return p;
137+
}
138+
139+
void move_point(void * _self, int dx, int dy) {
140+
struct Point *p = _self;
141+
142+
p->x += dx;
143+
p->y += dy;
144+
}
145+
146+
void print_point(void * _self) {
147+
struct Point *p = _self;
148+
printf("Point is at x, y: %d, %d\n", p->x, p->y);
149+
}
150+
151+
void delete_point(void * self) {
152+
free(self);
153+
}
154+
```
155+
156+
### 5.3 Client Usage (main.c)
157+
158+
```c
159+
160+
#include "stdio.h"
161+
#include "Point.h"
162+
163+
int main() {
164+
void * p = new_point(15, 20);
165+
166+
move_point(p, 5, 5);
167+
print_point(p);
168+
169+
move_point(p, 5, 5);
170+
print_point(p);
171+
172+
delete_point(p);
173+
174+
return 0;
175+
}
176+
```
177+
178+
## 6. How This Design Achieves OOP Principles
179+
180+
The Point ADT exemplifies core OOP principles in ANSI C:
181+
182+
### Encapsulation
183+
184+
Data is encapsulated within the structure, accessible only through defined operations. Clients cannot directly modify coordinates.
185+
186+
### Abstraction
187+
188+
Clients interact with Points as abstract entities, unaware of internal representation. Implementation changes don't require client modifications.
189+
190+
### Modularity
191+
192+
The Point ADT is self-contained with clear boundaries: fixed public API, private implementation, and minimal dependencies.
193+
194+
### Data Hiding
195+
196+
Structure members are completely inaccessible from client code. All access flows through the interface.
197+
198+
### Method Dispatch
199+
200+
Functions like Point_move act as methods that operate on an object and maintain its state.
201+
202+
## 7. Key Takeaways
203+
204+
**ADTs in ANSI C represent a powerful design pattern:**
205+
206+
1. **Type Safety with Flexibility**: Opaque pointer types provide compile-time type checking while allowing implementation changes.
207+
2. **Clear Separation of Concerns**: Header files define public contracts; source files contain private implementation.
208+
3. **Compatibility with Embedded Systems**: Manual memory management makes C ADTs ideal for resource-constrained environments.
209+
4. **Educational Value**: Implementing ADTs in C reveals how language-level features are built from primitives.
210+
5. **Legacy and Current Relevance**: Much existing C code uses ADT patterns. Understanding these principles is essential for working with established systems.
211+
6. **Orthogonal Design Patterns**: ADTs and OOP represent complementary approaches. C enables both through disciplined use of modules and function pointers.
212+
7. **Scaling Considerations**: While single-level inheritance is practical in C, more complex OOP hierarchies become burdensome.
213+
214+
The techniques described have proven effective in production systems for decades. The Linux kernel, embedded systems, and numerous libraries employ these patterns. They remain relevant today for understanding software design fundamentals and for contexts where C is the appropriate language choice.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
title: "Object Oriented Programming in ANSI-C"
3+
publishedAt: "2025-12-21"
4+
summary: "Object-oriented programming in ANSI-C is a disciplined approach that implements information hiding, inheritance, and polymorphism by leveraging standard C features like structures and function pointers"
5+
image: "/images/javascript-frameworks.png"
6+
---
7+
8+
Object-oriented programming in ANSI-C is a disciplined approach that implements information hiding, inheritance, and polymorphism by leveraging standard C features like structures and function pointers
9+
10+
It utilizes abstract data types and dynamic linkage to separate implementation from usage, enabling robust code reuse and manageable system decomposition within the confines of plain C

app/global.css

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,11 @@ body {
5353
}
5454

5555
.prose pre {
56-
@apply bg-[#1e293b] text-[#f8fafc] p-4 rounded-lg overflow-auto my-6;
56+
@apply bg-gray-50 text-gray-900 p-4 rounded-lg border border-gray-200 overflow-auto my-6;
5757
}
5858

5959
.prose pre code {
60-
@apply bg-transparent text-[#f8fafc] p-0 text-sm sm:text-base;
60+
@apply bg-transparent text-gray-900 p-0 text-sm sm:text-base;
6161
}
6262

6363
.prose blockquote {

0 commit comments

Comments
 (0)