Free Pascal

**Free Pascal Compiler** (**FPC**) là một trình biên dịch cho các ngôn ngữ lập trình có liên quan chặt chẽ, Pascal và Object Pascal. Nó là phần mềm tự do được phát hành theo Giấy phép Công cộng GNU, với các điều khoản ngoại lệ cho phép liên kết tĩnh với các thư viện thời gian chạy và các gói của nó cho bất kỳ mục đích nào kết hợp với bất kỳ giấy phép phần mềm nào khác.

Nó hỗ trợ ngôn ngữ Object Pascal của riêng nó cũng như các ngôn ngữ của một số trình biên dịch gia đình Pascal khác đến một mức độ nhất định, bao gồm các trình biên dịch Turbo Pascal, Delphi, và một số trình biên dịch Macintosh lịch sử. Ngôn ngữ được chọn trên cơ sở mỗi đơn vị (mô-đun) và có thể sử dụng nhiều ngôn ngữ cho mỗi chương trình.

Free Pascal theo triết lý lập trình *viết một lần, dịch bất kỳ đâu*, và có sẵn cho nhiều kiến trúc CPU và hệ điều hành. Nó hỗ trợ hợp ngữ trên dòng lệnh và bao gồm một chương trình lắp ráp nội bộ có khả năng phân tích cú pháp một số phương ngữ theo phong cách AT&T, GAS và Intel.

Các dự án riêng biệt tồn tại để tạo thuận lợi cho việc phát triển ứng dụng giao diện người dùng đồ họa đa nền tảng (GUI), một ứng dụng nổi bật nhất là môi trường phát triển tích hợp Lazarus (IDE).

## Ngôn ngữ được hỗ trợ
Ban đầu, Free Pascal áp dụng ngôn ngữ chuẩn thực tế của các lập trình viên Pascal, Borland Pascal nhưng sau đó áp dụng bản Delphi. Từ phiên bản 2.0 trở đi, khả năng tương thích Delphi 7 đã được nâng cao triển khai hoặc cải tiến liên tục.

Dự án có khái niệm chế độ biên dịch và các nhà phát triển đã làm rõ rằng họ sẽ kết hợp các bản vá làm việc cho các phương ngữ chuẩn của Viện tiêu chuẩn quốc gia Hoa Kỳ (ANSI) và Tổ chức tiêu chuẩn hóa quốc tế (ISO), để tạo ra một chế độ tuân thủ tiêu chuẩn.

Một nỗ lực nhỏ đã được thực hiện để hỗ trợ một số cú pháp Apple Pascal để dễ dàng giao tiếp với Hệ điều hành Mac cổ điển và macOS. Do phương ngữ của Apple thực hiện một số tính năng Pascal tiêu chuẩn mà Turbo Pascal và Delphi bỏ qua, Free Pascal tương thích với ISO nhiều hơn một chút.

Phiên bản phát hành 2.2.x không thay đổi đáng kể mục tiêu phương ngữ vượt ra ngoài Delphi 7, thay vào đó chúng nhắm đến khả năng tương thích gần hơn. Dự án vẫn còn thiếu chức năng Delphi của việc xuất khẩu hỗ trợ trình biên dịch của các lớp từ các thư viện chia sẻ, điều này rất hữu ích, ví dụ, đối với Lazarus, thực hiện các gói thành phần.

Tính đến năm 2011, một số tính năng cụ thể của Delphi 2006 đã được thêm vào trong nhánh phát triển và một số công việc bắt đầu cho các tính năng mới trong Delphi 2009 (đáng chú ý nhất là việc bổ sung kiểu `UnicodeString` ) đã được hoàn thành. Nhánh phát triển cũng có tính năng mở rộng *Objective-Pascal* cho giao tiếp Objective-C (Cocoa).

Kể từ phiên bản 2.7.1, Free Pascal đã thực hiện chế độ ISO Pascal cơ bản, mặc dù nhiều thứ như thủ tục Get và Put và khái niệm biến tập tin đệm để xử lý tệp vẫn không có.

Kể từ phiên bản 3.0.0, chế độ ISO Pascal khá hoàn chỉnh, với một lỗi còn lại được sửa trong 3.1.1 sau đó. Nó đã có thể biên dịch mã P5 của standardpascal.org mà không cần thay đổi gì.

## Lịch sử

### Những năm đầu
Free Pascal được tạo ra khi Borland nói rõ rằng việc phát triển Borland Pascal cho DOS sẽ dừng lại với phiên bản 7, được thay thế bằng một sản phẩm chỉ có trên Windows, mà sau này trở thành Delphi.

Sinh viên Florian Paul Klämpfl bắt đầu phát triển trình biên dịch riêng của mình được viết bằng ngôn ngữ Turbo Pascal và đã tạo mã 32-bit cho bộ mở rộng DOS GO32v1, được sử dụng và phát triển bởi dự án Nền tảng lập trình GNU (DJGPP) của DJ vào thời điểm đó.

Ban đầu, trình biên dịch là một file thực thi DOS 16 bit được biên dịch bởi Turbo Pascal. Sau hai năm, trình biên dịch đã có thể biên dịch chính nó và trở thành một trình thực thi 32-bit.

### Mở rộng
Trình biên dịch 32 bit ban đầu được xuất bản trên Internet, và những người đóng góp đầu tiên đã tham gia dự án. Sau này một bản chuyển sang Linux đã được Michael van Canneyt tạo ra, 5 năm trước khi trình biên dịch Borland Kylix được phổ biến. 

Chương trình chuyển đổi cho DOS đã được điều chỉnh để sử dụng trong OS/2 bằng cách sử dụng Eberhard Mattes eXtender (EMX) làm cho OS/2 trở thành mục tiêu biên dịch được hỗ trợ thứ hai. Cũng như Florian Klämpfl, tác giả ban đầu, Daniël Mantione cũng đóng góp đáng kể để thực hiện điều này, cung cấp cổng gốc của thư viện thời gian chạy cho OS/2 và EMX. Trình biên dịch được cải thiện dần dần, và phiên bản DOS di chuyển đến bộ mở rộng GO32v2. Điều này lên đến đỉnh điểm trong bản phát hành 0.99.5, được sử dụng rộng rãi hơn nhiều so với các phiên bản trước và là bản phát hành cuối cùng chỉ nhằm tuân thủ Turbo Pascal; các bản phát hành sau này đã thêm chế độ tương thích cho Delphi. Bản phát hành này cũng được chuyển đến các hệ thống sử dụng bộ xử lý gia đình Motorola 68000 (m68k).

Với việc phát hành 0,99,8 mục tiêu Win32 đã được thêm vào, và bắt đầu được thực hiện với việc kết hợp một số tính năng Delphi. Quá trình ổn định cho bản phát hành không phải beta đã bắt đầu và phiên bản 1.0 được phát hành vào tháng 7 năm 2000. Loạt phiên bản 1.0.x được sử dụng rộng rãi, trong kinh doanh và giáo dục. Đối với phiên bản 1.0.x, phiên bản chuyển của 68k CPU được làm lại và trình biên dịch tạo mã ổn định cho một số hệ điều hành giống như Unix và AmigaOS 68k.

### Phiên bản 2
Trong quá trình ổn định những gì sẽ trở thành 1.0.x, và cũng khi chuyển sang các hệ thống Motorola 68k, rõ ràng là thiết kế của trình tạo mã là quá hạn chế về nhiều mặt. Các vấn đề chính là việc thêm bộ vi xử lý có nghĩa là viết lại bộ tạo mã và việc phân bổ đăng ký dựa trên nguyên tắc luôn giữ ba thanh ghi miễn phí giữa các khối xây dựng, không linh hoạt và khó bảo trì.

Vì những lý do này, chuỗi 1.1.x phân nhánh từ nhánh chính 1.0.x vào tháng 12 năm 1999. Lúc đầu, các thay đổi chủ yếu là dọn dẹp và viết lại thiết kế lại cho tất cả các phần của trình biên dịch. Trình tạo mã và trình cấp phát đăng ký cũng được viết lại. Bất kỳ khả năng tương thích còn thiếu nào của Delphi đã được thêm vào.

Công việc trên 1.1.x tiếp tục chậm nhưng đều đặn. Vào cuối năm 2003, một phiên bản cho máy PowerPC đang hoạt động đã sẵn sàng, tiếp theo là một phiên bản cho ARM vào mùa hè năm 2004, một phiên bản cho SPARC vào mùa thu năm 2004 và một phiên bản cho x86-64-AMD64 vào đầu năm 2004, làm cho trình biên dịch trở nên có sẵn cho một nền tảng 64 bit. 

Vào tháng 11 năm 2003, bản phát hành beta đầu tiên của nhánh 1.1.x đã được đóng gói và đánh số 1.9.0. Chúng nhanh chóng được theo sau bởi các phiên bản 1.9.2 và 1.9.4; sau này giới thiệu hỗ trợ OS X. Công việc tiếp tục với phiên bản 1.9.6 (tháng 1 năm 2005), 1.9.8 (cuối tháng 2 năm 2005), 2.0.0 (tháng 5 năm 2005), 2.0.2 (tháng 12 năm 2005) và 2.0.4 (tháng 8 năm 2006).

### Phiên bản 2.2.x
Trong năm 2006, một số các công việc chính được lên kế hoạch cho phiên bản 2.2, chẳng hạn như viết lại hệ thống đơn vị, vẫn chưa bắt đầu, và nó đã được quyết định thay vì bắt đầu ổn định các tính năng đã được thực hiện.

Một số động cơ cho sự thay đổi lộ trình này là nhu cầu của dự án Lazarus, đặc biệt là mối liên kết nội bộ, hỗ trợ cho Win64, Windows CE, và OS X trên x86 và các tính năng liên quan như DWARF. Sau phiên bản 2.1.2 và 2.1.4, phiên bản 2.2.0 được phát hành vào tháng 9 năm 2007, tiếp theo là phiên bản 2.2.2 vào tháng 8 năm 2008 và phiên bản 2.2.4 vào tháng 3 năm 2009.

Phiên bản2.2.x đã cải thiện rất nhiều sự hỗ trợ cho giao diện Mô hình đối tượng ActiveX và Thành phần (COM), và Object Linking and Embedding (OLE), mặc dù các lỗi vẫn đang được tìm thấy. Phần chuyển giao giao diện sử dụng từ khóa implement đã được triển khai một phần, nhưng không hoàn thành kịp vào tháng 3 năm 2011. Hỗ trợ thư viện cho ActiveX cũng được cải thiện.

Một tính năng chính khác là trình liên kết nội bộ cho Win32, Win64 và Windows CE, giúp cải thiện liên kết thời gian và sử dụng bộ nhớ, và làm cho chu trình biên dịch-liên kết chạy nhanh hơn trong Lazarus. Hiệu quả cho việc loại bỏ liên kết thông minh, hoặc mã chết, cũng được cải thiện.

Các tính năng mới nhỏ bao gồm cải thiện DWARF (2/3) hỗ trợ định dạng gỡ lỗi và tối ưu hóa như đệ quy đuôi, bỏ sót các khung ngăn xếp không cần thiết và tối ưu hóa dựa trên loại bỏ phổ biến dựa trên đăng ký (CSE). Việc thực hiện đầu tiên hỗ trợ lập trình tổng quát cũng trở nên có sẵn, nhưng chỉ có tính thử nghiệm.

### Phiên bản 2.4.x
Loạt phát hành 2.4.x có bộ mục tiêu rõ ràng hơn so với các bản phát hành trước đó. Việc viết lại hệ thống đơn vị đã bị trì hoãn một lần nữa, và chi nhánh đã trở thành 2.4 đã được tạo ra để giữ các cam kết rủi ro từ 2.2 để ổn định nó. Chủ yếu là những cam kết rủi ro này có nhiều cải tiến liên quan đến các nền tảng mới, Mac PowerPC 64, Mac  x86-64, và nhiều bản sửa lỗi cho kiến trúc ARM và x86-64 nói chung, cũng như DWARF.

Các cải tiến khác của trình biên dịch bao gồm tối ưu hóa toàn bộ chương trình (WPO) và hỗ trợ ảo hóa và hỗ trợ giao diện nhị phân nhúng (EABI) của ARM.

Sau đó, trong chu kỳ 2.2, việc hỗ trợ tài nguyên giống như Delphi (dựa trên các phần đặc biệt trong tệp nhị phân thay vì dùng hằng số Pascal) đã được thêm vào. Tính năng này, cần thiết đối với Lazarus, trở thành điểm nhấn chính của phần mềm phiên bản nhánh này.

Các phần bổ sung nhỏ hơn khác là một trình quản lý bộ nhớ để cải thiện hiệu năng quản lý heap trong môi trường luồng, cải tiến nhỏ trong tương thích Delphi như OleVariant và các cải tiến trong giao diện được ủy nhiệm.

Vào ngày 1 tháng 1 năm 2010, Free Pascal 2.4.0 đã được phát hành, tiếp theo vào ngày 13 tháng 11 năm 2010, bởi bản sửa lỗi sửa lỗi 2.4.2, với sự hỗ trợ cho các vòng lặp, vòng kín, các lớp trừu tượng và các thay đổi khác.

### Phiên bản 2.6.x
Vào tháng 1 năm 2012, Free Pascal 2.6 đã được phát hành. Phiên bản đầu tiên này từ loạt phát hành 2.6 cũng hỗ trợ Objective Pascal trên OS X và các mục tiêu iOS và triển khai nhiều cải tiến nhỏ và sửa lỗi. Vào tháng 2 năm 2013, FPC 2.6.2 đã được phát hành. Nó chứa phiên bản NetBSD và OpenBSD lần đầu tiên kể từ 1.0.10, dựa trên các cổng mới. Vào tháng 3 năm 2014, bản phát hành điểm cuối cùng trong loạt 2,6, 2.6.4, đã được phát hành, với hầu hết các bản cập nhật cơ sở dữ liệu (fcl-db).

### Phiên bản 3.0.x
Phiên bản 3.0.0 được phát hành vào ngày 25 tháng 11 năm 2015 và là bản phát hành chính đầu tiên kể từ Januari 1, 2012. Nó chứa nhiều tính năng ngôn ngữ mới: Các tính năng mới của FPC 3.0

### Các phiên bản sau đó
Phiên bản 3.0.2 đã được phát hành vào ngày 15 tháng 2 năm 2017 và bao gồm sửa lỗi và cập nhật trình biên dịch nhỏ.
Phiên bản 3.0.4 đã được phát hành vào ngày 28 tháng 11 năm 2017.
Nó bao gồm nhiều cải tiến ngôn ngữ so với các phiên bản trước như trình liên kết nội bộ cho Định dạng thực thi và liên kết (ELF), Arm AARCH64 cho iOS và Linux, nền tảng i8086 đã được khôi phục, thư viện mở rộng và nhiều hơn thế nữa. 

## Chú thích