Chương trình máy tính "Xin chào, thế giới" của Brian Kernighan (1978) 
**Chương trình máy tính** là tập hợp các câu lệnh  thực hiện một tác vụ cụ thể khi được máy tính thực thi. Hầu hết các thiết bị máy tính yêu cầu các chương trình để hoạt động đúng.

Một chương trình máy tính thường được viết bởi một lập trình viên máy tính bằng ngôn ngữ lập trình. Từ chương trình trong dạng mã nguồn mà con người có thể đọc được, một trình biên dịch hoặc lắp ráp có thể tạo thành hình thức mã máy bao gồm các hướng dẫn mà máy tính có thể trực tiếp thực hiện. Ngoài ra, một chương trình máy tính có thể được thực thi với sự trợ giúp của trình thông dịch.

Một bộ sưu tập các chương trình máy tính, thư viện và dữ liệu liên quan được gọi là phần mềm. Các chương trình máy tính có thể được phân loại theo các dòng chức năng, chẳng hạn như phần mềm ứng dụng và phần mềm hệ thống. Phương pháp cơ bản được sử dụng cho một số tính toán hoặc thao tác được gọi là thuật toán.

Lịch sử
-------

### Máy lập trình ban đầu

Các máy lập trình sớm nhất đi trước phát minh ra máy tính kỹ thuật số. Ngay từ thế kỷ thứ 9, một trình phát nhạc có thể lập trình được phát minh bởi anh em người Ba Tư Musu, người đã mô tả một người thổi sáo cơ khí tự động trong *Sách thiết bị khéo léo*. Năm 1206, kỹ sư người Ả Rập Al-Jazari đã phát minh ra một chiếc máy đánh trống có thể lập trình trong đó máy tự động tạo âm nhạc cơ học để chơi các nhịp điệu và mẫu nhịp trống khác nhau. Năm 1801, Joseph-Marie Jacquard đã nghĩ ra một khung dệt có thể dệt một mẫu vải bằng cách làm theo một loạt các thẻ đục lỗ. Các mẫu có thể được dệt và lặp đi lặp lại bằng cách sắp xếp các thẻ.

### Công cụ phân tích

 Sơ đồ của Lovelace từ Note G, thuật toán máy tính được xuất bản đầu tiên 
Năm 1837, Charles Babbage đã được truyền cảm hứng từ máy dệt của Jacquard để cố gắng xây dựng Công cụ phân tích. Tên của các thành phần của thiết bị tính toán được mượn từ ngành dệt may. Trong ngành dệt, sợi được mang từ cửa hàng để xay. Thiết bị này sẽ có một "cửa hàng" - bộ nhớ chứa 1.000 số có 40 chữ số thập phân mỗi số. Các số từ "cửa hàng" sau đó sẽ được chuyển sang "máy nghiền" (tương tự CPU của máy hiện đại) để xử lý. Và một "luồng" đóng vai trò thực hiện các hướng dẫn được lập trình của thiết bị. Nó được lập trình bằng cách sử dụng hai bộ thẻ đục lỗ - một bộ thẻ để chỉ đạo thao tác và bộ kia cho các biến đầu vào. Tuy nhiên, sau khi tiêu hết hơn 17.000 bảng tiền tài trợ của chính phủ Anh, hàng ngàn bánh xe và bánh răng của máy bị kẹt và các động cơ không bao giờ hoạt động hoàn toàn song song cùng nhau.

Trong khoảng thời gian chín tháng vào năm 1842-43, Ada Lovelace đã dịch cuốn hồi ký của nhà toán học người Ý Luigi Menabrea. Cuốn hồi ký bao trùm Công cụ phân tích. Bản dịch chứa Note G, chi tiết hoàn toàn một phương pháp tính toán số Bernoulli bằng Công cụ phân tích. Ghi chú này được một số nhà sử học công nhận là chương trình máy tính được viết đầu tiên trên thế giới.

### Máy Turing phổ dụng

Năm 1936, Alan Turing đã giới thiệu thiết bị lý thuyết Universal Turing machine Có thể mô hình hóa mọi tính toán có thể được thực hiện trên một máy tính hoàn chỉnh Turing. Đây là một máy trạng thái hữu hạn có băng đọc / ghi dài vô hạn. Máy có thể di chuyển băng qua lại, thay đổi nội dung của nó khi thực hiện thuật toán. Máy khởi động ở trạng thái ban đầu, trải qua một chuỗi các bước và dừng lại khi gặp trạng thái dừng. Máy này được một số người coi là nguồn gốc của chương trình máy tính được lưu trữ bởi John von Neumann (1946) cho "Công cụ điện toán điện tử" hiện mang tên kiến trúc von Neumann.

### Máy tính lập trình ban đầu

Máy tính Z3, được phát minh bởi Konrad Zuse (1941) ở Đức, là một máy tính kỹ thuật số và có thể lập trình. Một máy tính kỹ thuật số sử dụng điện làm thành phần tính toán. Z3 chứa 2.400 rơle để tạo mạch. Các mạch cung cấp một máy tính nhị phân, dấu phẩy động, với chín lệnh. Lập trình Z3 thông qua một bàn phím được thiết kế đặc biệt và băng đục lỗ.

ENIAC - Máy tính và tích hợp số điện tử (mùa thu 1945) là một máy tính hoàn chỉnh, đa năng, Turing đầy đủ, sử dụng 17.468 ống chân không để tạo ra các mạch. Tại lõi của nó là một loạt các Pascaline được nối với nhau. 40 bộ phận của nó nặng 30 tấn, chiếm 1.800 foot vuông (167 m2), và tiêu thụ $650 mỗi giờ (giá trị tiền năm 1940) khi không sử dụng. Nó có 20 máy cộng số cơ sở 10. Lập trình cho ENIAC mất tới hai tháng. Ba bảng chức năng được đặt trên các bánh xe và cần được cuộn vào các bảng chức năng cố định. Các bảng chức năng được kết nối với các bảng chức năng bằng cách sử dụng cáp đen nặng. Mỗi bảng chức năng có 728 núm xoay. Lập trình ENIAC cũng liên quan đến việc thiết lập một số trong số 3.000 thiết bị chuyển mạch. Sửa lỗi một chương trình mất một tuần. Các lập trình viên của ENIAC là những người phụ nữ được gọi chung là "những cô gái ENIAC". ENIAC có các hoạt động song song. Các bộ tích lũy khác nhau có thể đồng thời hoạt động trên các thuật toán khác nhau. Nó đã sử dụng máy đục lỗ cho đầu vào và đầu ra, và nó được điều khiển bằng tín hiệu đồng hồ. Nó đã hoạt động được 8 năm, tính toán các thông số cho bom hydro, dự đoán các kiểu thời tiết và sản xuất các bàn bắn để ngắm súng cao xạ.

Manchester Baby (tháng 6 năm 1948) là một máy tính được lưu trữ chương trình. Lập trình đã có thay đổi từ cáp di chuyển và quay số; thay vào đó, một chương trình máy tính được lưu trữ trong bộ nhớ dưới dạng số. Chỉ có ba bit bộ nhớ có sẵn để lưu trữ mỗi lệnh, vì vậy máy bị giới hạn với tám lệnh. 32 thiết bị chuyển mạch đã có sẵn để dùng vào việc lập trình.

### Máy tính sau này

 Chuyển mạch cho dữ liệu nhập thủ công trên Data General Nova 3, được sản xuất vào giữa những năm 1970 
Các máy tính được sản xuất cho đến những năm 1970 có các công tắc phía trước để lập trình. Chương trình máy tính được viết trên giấy để tham khảo. Một hướng dẫn được thể hiện bằng một cấu hình cài đặt bật / tắt. Sau khi thiết lập cấu hình, một nút thực thi sẽ được nhấn. Quá trình này sau đó đã được lặp lại. Các chương trình máy tính cũng được nhập thủ công thông qua băng giấy hoặc thẻ đục lỗ. Sau khi phương tiện được tải, địa chỉ bắt đầu được đặt qua các công tắc và nhấn nút thực thi.

Vào năm 1961, Burroughs B5000 được chế tạo riêng để được lập trình bằng ngôn ngữ ALGOL 60. Các mạch phần cứng đặc trưng để giai đoạn biên dịch được dễ hơn.

Năm 1964, IBM System/360 là một dòng gồm sáu máy tính, mỗi máy tính có cùng kiến trúc tập lệnh. Model 30 là nhỏ nhất và ít tốn kém nhất. Khách hàng có thể nâng cấp và giữ lại phần mềm ứng dụng tương tự. Mỗi mô hình Hệ thống / 360 có tính năng đa chương trình. Với sự hỗ trợ của hệ điều hành, nhiều chương trình có thể nằm trong bộ nhớ cùng một lúc. Khi một chương trình đang đợi đầu vào/đầu ra, chương trình khác có thể tính toán. Mỗi mô hình cũng có thể mô phỏng các máy tính khác. Khách hàng có thể nâng cấp lên System/360 và giữ lại phần mềm ứng dụng IBM 7094 hoặc IBM 1401 của họ.

Lập trình máy tính
------------------

Lập trình máy tính là quá trình viết hoặc chỉnh sửa mã nguồn. Chỉnh sửa mã nguồn bao gồm kiểm tra, phân tích, tinh chỉnh và đôi khi phối hợp với các lập trình viên khác trong một chương trình được phát triển chung. Một người thực hành kỹ năng này được gọi là lập trình viên máy tính, nhà phát triển phần mềm và đôi khi là lập trình viên.

Quá trình đôi khi kéo dài của lập trình máy tính thường được gọi là phát triển phần mềm. Thuật ngữ công nghệ phần mềm đang trở nên phổ biến vì quy trình này được coi là một chuyên ngành kỹ thuật.

### Ngôn ngữ lập trình

Một chương trình máy tính được viết theo phong cách lập trình câu lệnh
Các chương trình máy tính có thể được phân loại theo mô hình ngôn ngữ lập trình được sử dụng để sản xuất chúng. Hai trong số các mô hình chính là mệnh lệnh và khai báo.

#### Ngôn ngữ mệnh lệnh

*Các ngôn ngữ lập trình mệnh lệnh* xác định một thuật toán tuần tự bằng cách sử dụng các khai báo, biểu thức và câu lệnh:

* Một *khai báo kết hợp* một tên biến với một kiểu dữ liệu - ví dụ: `var x: integer;`
* Một *biểu thức* mang lại một giá trị - ví dụ: `2 + 2` mang lại 4
* Một *câu lệnh* có thể gán một biểu thức cho một biến hoặc sử dụng giá trị của một biến để thay đổi luồng điều khiển của chương trình - ví dụ: `x:= 2 + 2; if x = 4 then do_something();`

Một chỉ trích về ngôn ngữ mệnh lệnh là tác dụng phụ của câu lệnh gán trên một lớp biến được gọi là biến không cục bộ.

#### Ngôn ngữ khai báo

*Các ngôn ngữ lập trình khai báo* mô tả *những gì* tính toán nên được thực hiện và không mô tả cách thức *làm thế nào* để tính toán nó. Các chương trình khai báo bỏ qua luồng điều khiển và được coi là *tập hợp* các lệnh. Hai loại ngôn ngữ khai báo rộng là ngôn ngữ chức năng và ngôn ngữ logic. Nguyên tắc đằng sau các ngôn ngữ chức năng (như Haskell) là không cho phép các hiệu ứng bên lề, điều này giúp dễ dàng lý luận về các chương trình như các hàm toán học. Nguyên tắc đằng sau các ngôn ngữ logic (như Prolog) là xác định vấn đề cần giải quyết   - mục đích   - và để lại giải pháp chi tiết cho chính hệ thống Prolog. Mục tiêu được xác định bằng cách cung cấp một danh sách các điểm phụ. Sau đó, mỗi subgoal được xác định bởi tiếp tục cung cấp một danh sách các subgoals của nó, vv Nếu một con đường subgoals thất bại trong việc tìm ra giải pháp, sau đó subgoal được quay lui và đường dẫn khác được thử mở ra một cách hệ thống.

### Biên dịch và thông dịch

Một chương trình máy tính ở dạng ngôn ngữ lập trình máy tính mà người có thể đọc được được gọi là mã nguồn. Mã nguồn có thể được chuyển đổi thành một dạng thực thi nhờ một trình biên dịch hoặc trình lắp ráp hợp ngữ, hoặc thực hiện ngay lập tức với sự trợ giúp của một trình thông dịch.

Trình biên dịch được sử dụng để dịch mã nguồn từ ngôn ngữ lập trình sang mã đối tượng hoặc mã máy. Mã đối tượng cần xử lý thêm để trở thành mã máy và mã máy bao gồm các lệnh gốc của đơn vị xử lý trung tâm, sẵn sàng để thực thi. Các chương trình máy tính được biên dịch thường được gọi là tệp thực thi, hình ảnh nhị phân hoặc đơn giản là tệp nhị phân   - một tham chiếu đến định dạng tệp nhị phân được sử dụng để lưu trữ mã thực thi.

Một số chương trình đối tượng được biên dịch và lắp ráp cần được kết hợp thành các mô-đun với tiện ích liên kết (linker) để tạo ra một chương trình thực thi.

Trình thông dịch được sử dụng để thực thi mã nguồn từ từng dòng ngôn ngữ lập trình. Trình thông dịch giải mã từng câu lệnh và thực hiện hành vi của nó. Một lợi thế của phiên dịch viên là họ có thể dễ dàng được mở rộng thành một phiên tương tác. Lập trình viên được trình bày với một dấu nhắc và các dòng mã riêng lẻ được nhập và thực hiện ngay lập tức.

Nhược điểm chính của trình thông dịch là chương trình máy tính chạy chậm hơn so với khi được biên dịch. Mã thông dịch chậm hơn vì trình thông dịch phải giải mã từng câu lệnh và sau đó thực hiện nó. Tuy nhiên, việc phát triển phần mềm có thể nhanh hơn khi sử dụng trình thông dịch vì việc kiểm tra là ngay lập tức khi bước biên dịch bị bỏ qua. Một nhược điểm khác của trình thông dịch là một trình thông dịch phải có mặt trên máy tính thực thi. Ngược lại, các chương trình máy tính được biên dịch không cần trình biên dịch trong quá trình thực thi.

Xem thêm
--------

* Trí tuệ nhân tạo
* Lập trình tự động
* Firmware
* Phần mềm
* Lỗi phần mềm

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

1. ↑  Rochkind, Marc J. (2004). *Advanced Unix Programming, Second Edition*. Addison-Wesley. tr. 1.1.2.
2. ↑  Kapur, Ajay; Carnegie, Dale; Murphy, Jim; Long, Jason (2017). "Loudspeakers Optional: A history of non-loudspeaker-based electroacoustic music". *Organised Sound*. Cambridge University Press. **22** (2): 195–205. doi:10.1017/S1355771817000103. ISSN 1355-7718.
3. ↑  Noel Sharkey (2007), A 13th Century Programmable Robot, University of Sheffield
4. 1 2 3  McCartney, Scott (1999). *ENIAC – The Triumphs and Tragedies of the World's First Computer*. Walker and Company. tr. 16. ISBN 978-0-8027-1348-3.
5. ↑  Bromley, Allan G. (1998). "Charles Babbage's Analytical Engine, 1838" (PDF). *IEEE Annals of the History of Computing*. **20**.
6. ↑  Tanenbaum, Andrew S. (1990). *Structured Computer Organization, Third Edition*. Prentice Hall. tr. 15. ISBN 978-0-13-854662-5.
7. ↑  *Lovelace & Babbage and the creation of the 1843 'notes'*
8. ↑  Rosen, Kenneth H. (1991). *Discrete Mathematics and Its Applications*. McGraw-Hill, Inc. tr. 654. ISBN 978-0-07-053744-6.
9. ↑  Linz, Peter (1990). *An Introduction to Formal Languages and Automata*. D. C. Heath and Company. tr. 234. ISBN 978-0-669-17342-0.
10. ↑  *Engines of Logic: Mathematicians and the origin of the Computer*, 2000
11. ↑  "History of Computing".
12. 1 2 3 4  McCartney, Scott (1999). *ENIAC – The Triumphs and Tragedies of the World's First Computer*. Walker and Company. tr. 102. ISBN 978-0-8027-1348-3.
13. ↑  Frink, Brenda D. (ngày 1 tháng 6 năm 2011). "Researcher reveals how "Computer Geeks" replaced "Computer Girls"". *Gender News*. Stanford University. Lưu trữ bản gốc ngày 12 tháng 3 năm 2015. Truy cập ngày 22 tháng 10 năm 2018.
14. ↑  *Computing's Golden Jubilee*
15. ↑  Silberschatz, Abraham (1994). *Operating System Concepts, Fourth Edition*. Addison-Wesley. tr. 6. ISBN 978-0-201-50480-4.
16. ↑  Tanenbaum, Andrew S. (1990). *Structured Computer Organization, Third Edition*. Prentice Hall. tr. 20. ISBN 978-0-13-854662-5.
17. ↑  Tanenbaum, Andrew S. (1990). *Structured Computer Organization, Third Edition*. Prentice Hall. tr. 21. ISBN 978-0-13-854662-5.
18. ↑  Wilson, Leslie B. (1993). *Comparative Programming Languages, Second Edition*. Addison-Wesley. tr. 75. ISBN 978-0-201-56885-1.
19. 1 2  Wilson, Leslie B. (1993). *Comparative Programming Languages, Second Edition*. Addison-Wesley. tr. 213. ISBN 978-0-201-56885-1.
20. ↑  Wilson, Leslie B. (1993). *Comparative Programming Languages, Second Edition*. Addison-Wesley. tr. 244. ISBN 978-0-201-56885-1.
21. ↑  "What is a Compiler?". Truy cập ngày 10 tháng 1 năm 2012.
22. ↑  Tanenbaum, Andrew S. (1990). *Structured Computer Organization, Third Edition*. Prentice Hall. tr. 11. ISBN 978-0-13-854662-5.

|  |  |
| --- | --- |
| Tiêu đề chuẩn Sửa dữ liệu tại Wikidata | 
* BNE: XX526558
* GND: 4047394-6
* LCCN: sh85029524
* NARA: 10675392
* NKC: ph124516

 |