**OCaml** là dòng ngôn ngữ lập trình phổ dụng trong ngôn ngữ **Caml** (một dạng của ngôn ngữ lập trình ML), bắt đầu được Viện Nghiên cứu Khoa học Máy tính Quốc gia ở Pháp (INRIA) phát triển từ năm 1985. Caml là ngôn ngữ lập trình hàm và đến OCaml thì thêm các tính năng lập trình hướng đối tượng (Object - chữ O trong OCaml).

Đặc điểm
--------

* Kiểu mạnh: các biến trong Caml khi khởi tạo chỉ mang một dạng dữ liệu nhất định (khác với các ngôn ngữ kiểu yếu như Lisp).
* Hệ thống gỡ lỗi.

Kiểu dữ liệu
------------

Trong OCaml, kiểu số nguyên và số thực có các toán tử riêng biệt:

* Với số nguyên: `+`, `\*`,...
* Với số thực: `+.`, `\*.`,...

Kiểu chuỗi ký tự được bao trong cặp dấu nháy kép: `"Viet Nam"`

Kiểu `boolean` có hai giá trị `true` và `false`.

Kiểu danh sách (`list`) bao giữa cặp ngoặc vuông với các thành phần phân cách nhau bởi dấu chấm phẩy.

`[2; 3; 65; -4]`

Câu lệnh
--------

Câu lệnh của OCaml kết thúc với hai dấu chấm phẩy (`;;`), khác với ML chuẩn.

Trong OCaml, cũng như các ngôn ngữ lập trình hàm khác, *tên* được gán giá trị bằng lệnh `let`:
<syntaxhightlight lang="ocaml" style="font-size:1.2em;">
let x = 3 + 5 \* 2;;
</syntaxhightlight>

Đặc điểm lập trình hàm của OCaml cho phép các hàm là dạng dữ liệu cấp I. Hàm số ưu tiên kết hợp với tham số ở mức ưu tiên cao nhất.
<syntaxhightlight lang="ocaml" style="font-size:1.2em;">
(\* Chú thích: giả sử f là một hàm có một tham số \*)
2 + f 3 (\* cách thông dụng \*)
2 + (f 3) (\* rõ ràng hơn \*)
2 + f(3) (\* thường dùng với các ngôn ngữ mệnh lệnh như C, Pascal... Không thông dụng trong OCaml \*)
</syntaxhightlight>

Với đặc điểm này, một tên cũng có thể khai báo như một hàm bằng `let`:
<syntaxhightlight lang="ocaml" style="font-size:1.2em;">
let gapDoi x = x \*. 2.0;;
</syntaxhightlight>

Với các hàm đệ quy, ta cần viết `let rec`:
<syntaxhightlight lang="ocaml" style="font-size:1.2em;">
let rec giaiThua n = 

```
 if n = 0 then 1 else n * giaiThua (n-1);;
```

</syntaxhightlight>

Hiện thực
---------

**Hệ thống Objective Caml** được phát triển gồm có một bộ biên dịch (`ocamlopt`) theo mã gốc (*native code*) trên nhiều hệ vi xử lý (i386, IA64, Power PC, v.v...); cùng với bộ biên dịch *bytecode* (`ocamlc`). Ngoài ra, còn có các công cụ hỗ trợ như: môi trường dòng lệnh (`ocaml`), gỡ lỗi (`ocamldebug`), v.v...

OCaml được phân phối dưới dạng mã nguồn cùng các bản nhị phân trên các hệ điều thành thông dụng (Windows, Mac OS X, Linux (gói `deb` và `rpm`).

Dấu nhắc lệnh
-------------

`ocaml` cũng là tên trình thông dịch của ngôn ngữ. Dấu nhắc lệnh OCaml có hình dấu thăng (`#`). Cần nhớ rằng để kết thúc dòng lệnh cần gõ `;;` trước khi gõ `Enter`.
<syntaxhightlight lang="ocaml" style="font-size:1.2em;">

1. 1+2\*3;;

-: int = 7
</syntaxhightlight>

Kết quả phép tính có giá trị bằng 7, kể cả kiểu dữ liệu: số nguyên (`int`) cũng được máy thông báo.

<syntaxhightlight lang="ocaml" style="font-size:1.2em;">

1. let pi = 4.0 \*. atan 1.0;;

val pi: float = 3.14159265358979312

1. let binhPhuong x = x \*. x;;

val binhPhuong: float -> float = <fun>
</syntaxhightlight>

Kết quả của một khai báo sẽ được máy thông báo là `val` *`tên`*. Trong trường hợp hàm số thì có cả thông báo về các kiểu dữ liệu (ở đây hàm nhận tham số dạng `float` (số thực) và trả kết quả cũng dưới dạng `float`.

Ứng dụng
--------

OCaml có một số ứng dụng trong kĩ thuật, công nghiệp, thương nghiệp:

* Được công ty Jane Street Capital  sử dụng rộng rãi
* Phần mềm Unison
* Phần mềm chứng minh định lý có tên là Coq.
* MLdonkey, phần mềm dạng BitTorrent.
* FFTW: chương trình tính biến đổi Fourier nhanh nhất phương Tây.

| * x
* t
* s
Ngôn ngữ lập trình |
| --- |
| Dùng cho kỹ nghệ | 
* ABAP
* Ada
* ASP
* ASP.NET
* AWK
* Bash
* Assembly
* C
* C++
* C#
* D
* Delphi
* Erlang
* Groovy
* Fortran
* Java
* JavaScript
* Lisp
* Lua
* Lotus Notes
* Objective-C
* OCaml
* Perl
* PHP
* PL/SQL
* Python
* Ruby
* SAS
* sed
* Smalltalk
* Tcl
* sh
* Visual Basic
* VBScript
* Visual Basic for Applications
* VB.NET
* Scheme
* XML

 |
| Dùng trong giảng dạy | 
* Alice
* C
* C++
* Eiffel
* Fortran
* Haskell
* Java
* JavaScript
* Logo
* ML
* Oz
* Pascal
* Prolog
* Scheme
* Visual Basic
* Visual FoxPro

 |
| Có giá trị lịch sử | 
* ABC
* ALGOL
* APL
* BASIC
* Clipper
* COBOL
* Hope
* MUMPS
* Pascal
* PL/I
* PowerBuilder
* Simula

 |

Tham khảo
---------