Tin học (tiếng Anh: computer science) là ngành nghiên cứu lý thuyết về thông tin và tính toán cùng với sự thực hiện và ứng dụng của chúng trong các hệ thống máy tính. Tin học tiếp cận khoa học và thực tiễn để tính toán và ứng dụng của nó, nghiên cứu về tính khả thi, cấu trúc, biểu hiện và cơ giới hóa các thủ tục cơ bản cho việc thu thập, đại diện, xử lý, lưu trữ, truyền thông và truy cập thông tin. Định nghĩa khác ngắn gọn hơn về tin học là nghiên cứu về các quy trình thuật toán tự động hóa có thể mở rộng. Nhà khoa học máy tính là chuyên gia về lý thuyết tính toán và thiết kế hệ thống tính toán.
Khoa học máy tính bao gồm nhiều lĩnh vực chuyên sâu; một số lĩnh vực tập trung vào các ứng dụng thực tiễn cụ thể như đồ họa máy tính, trong khi các lĩnh vực khác tập trung vào nghiên cứu tính chất cơ bản của các vấn đề tính toán như lý thuyết độ phức tạp tính toán. Ngoài ra, còn có các lĩnh vực khác nghiên cứu các vấn đề trong thực thi các phương pháp tính toán. Ví dụ, lĩnh vực lý thuyết ngôn ngữ lập trình nghiên cứu các phương thức mô tả khác nhau của tính toán, trong khi lĩnh vực lập trình nghiên cứu cách sử dụng các ngôn ngữ lập trình và các hệ thống phức tạp, và lĩnh vực tương tác người-máy tập trung vào các thách thức để làm cho máy tính và công việc tính toán hữu ích và dễ sử dụng đối với mọi người dùng.
Lịch sử
Lịch sử của khoa học máy tính bắt đầu từ nhiều năm trước khi máy tính hiện đại được phát minh. Các thiết bị tính toán cho các bài toán số đã tồn tại từ thời cổ đại, ví dụ như bàn tính. Ngoài ra, các thuật toán để thực hiện tính toán đã có từ thời cổ đại, thậm chí trước khi các thiết bị tính toán phức tạp được phát triển.
Wilhelm Schickard thiết kế và hoàn thành chiếc máy tính cơ học đầu tiên vào năm 1623. Năm 1673, Gottfried Leibniz giới thiệu một máy tính cơ học số, gọi là Stepped Reckoner. Ông có thể được xem là nhà khoa học máy tính đầu tiên và nhà lý thuyết thông tin đã ghi lại hệ thống số nhị phân.
Blaise Pascal thiết kế và xây dựng chiếc máy tính cơ học hoạt động được gọi là Pascaline vào năm 1642. Charles Babbage đã thiết kế một máy tính theo mô hình difference engine vào thời Victoria, và Ada Lovelace đã viết hướng dẫn sử dụng máy. Nhờ công trình này, bà được coi là lập trình viên đầu tiên trên thế giới. Vào khoảng năm 1900, tập đoàn IBM đã bán những chiếc máy tính dùng thẻ đục lỗ. Tuy nhiên, tất cả những chiếc máy này đều chỉ thực hiện một nhiệm vụ đơn lẻ hoặc một số nhiệm vụ nhỏ.
Trước năm 1920, công việc tính toán chủ yếu được thực hiện bởi nhân viên chuyên nghiệp. Những nhà nghiên cứu đầu tiên trong lĩnh vực sau này được gọi là khoa học máy tính, như Kurt Gödel, Alonzo Church và Alan Turing, đã quan tâm đến câu hỏi về khả năng tính toán: những gì có thể được tính toán bởi một người chỉ đơn giản sử dụng giấy và bút chì để liệt kê các bước tính toán, cho đến khi hoàn thành mà không cần đến trí thông minh hay hiểu biết? Một phần của động lực này là ước muốn phát triển các máy tính có khả năng tự động hóa các công việc tính toán thường làm buồn chán và dễ gặp sai sót của con người tính toán. Vấn đề then chốt là xây dựng các hệ thống tính toán phổ dụng có khả năng (về mặt lý thuyết) thực hiện mọi nhiệm vụ tính toán có thể cần đến, và từ đó tổng quát hóa tất cả các máy tính chuyên biệt trước đây thành một khái niệm duy nhất về máy tính phổ dụng.
Trong những năm 1940, khi các máy tính mới mạnh mẽ hơn được phát triển, người ta nhận ra rằng máy tính có thể được sử dụng cho nhiều mục đích khác ngoài các tính toán toán học, mở rộng lĩnh vực khoa học máy tính thành ngành nghiên cứu về tính toán nói chung. Từ những năm 1960, khoa học máy tính đã trở thành một ngành học độc lập, với sự ra đời của các khoa học máy tính đầu tiên và các chương trình đào tạo đại học chuyên ngành khoa học máy tính. Khi máy tính được áp dụng vào thực tế, nhiều ứng dụng của tính toán đã trở thành các lĩnh vực nghiên cứu độc lập.
Những thành tựu đáng kể
Mặc dù trở thành một môn học chính thức với một lịch sử ngắn, khoa học máy tính đã có nhiều đóng góp quan trọng cho khoa học và xã hội. Những đóng góp này bao gồm:
- Ứng dụng trong lĩnh vực khoa học máy tính
- Đã xác định một cách chính thức về tính toán (computation) và khả năng tính toán (computability), đồng thời cung cấp bằng chứng cho các vấn đề không thể giải quyết tính toán (computationally unsolvable) và các vấn đề khó tính toán (intractable).
- Đã phát triển khái niệm về ngôn ngữ lập trình, một công cụ để biểu diễn thông tin được tổ chức một cách chính xác trong nhiều tầng lớp trừu tượng khác nhau.
- Ứng dụng bên ngoài lĩnh vực
- Làm nền tảng cho cuộc cách mạng kỹ thuật số (Digital Revolution) dẫn đến thời đại thông tin (Information Age) và internet hiện nay.
- Trong mật mã học (cryptography), việc giải mã của máy Enigma đã đóng góp quan trọng vào chiến thắng của phe Đồng Minh trong Thế chiến II.
- Tính toán khoa học (Scientific computing) cho phép nghiên cứu não bộ con người, đồ thị hóa bản đồ gen con người như Dự án bản đồ gen con người (Human Genome Project) ở mức độ sâu sắc. Các dự án tính toán phân tán như Folding@home khám phá quá trình gấp cuộn protein (protein folding).
- Giao dịch thuật toán cải thiện hiệu quả và tính thanh khoản của thị trường tài chính bằng cách áp dụng trí tuệ nhân tạo, học máy và các kỹ thuật thống kê/giải tích số trên quy mô lớn.
Các lĩnh vực của khoa học máy tính
Cơ sở toán học
- Lôgic toán (Mathematical logic)
- Lôgic Bool và các phương pháp tương ứng dùng để mô hình hóa các truy vấn lôgic; Sự sử dụng các phương pháp chứng minh hình thức (formal proof) cùng những hạn chế của chúng.
- Lý thuyết số (Number theory)
- Lý thuyết về chứng minh và các khảo nghiệm trong việc lùng tìm những chứng minh trong giới hạn các số nguyên. Lý thuyết số được sử dụng trong mật mã học và đồng thời được dùng như một phương thức kiểm thử trong trí tuệ nhân tạo.
- Lý thuyết đồ thị (Graph theory)
- Cơ sở cho cấu trúc dữ liệu và các thuật toán tìm kiếm.
- Lý thuyết kiểu (Type Theory)
- Phân tích quy chính các kiểu dữ liệu, cùng sự sử dụng các kiểu dữ liệu nhằm giảng giải tính chất của các chương trình phần mềm - đặc biệt là tính an toàn của chương trình.
- Lý thuyết phạm trù (Category theory)
- Lý thuyết phân loại cho phép tổng quát các phương pháp toán học và các phương thức tính toán thành một ước thể.
- Hình học tính toán (Computational geometry)
- Chuyên tâm vào việc nghiên cứu các thuật toán nhằm giải quyết những vẫn đề được đề bạt trên phương diện hình học.
- Giải tích số (Numerical analysis)
- Nền tảng của các thuật toán trong toán học rời rạc, đồng thời cũng dùng để nghiên cứu những giới hạn trong các tính toán dùng số thập phân (1.0E-3), bao gồm những sai số xảy ra trong phương pháp làm tròn số (round-off errors).
Lý thuyết tính toán
- Lý thuyết Ôtômat (Automata theory)
- Các cấu trúc lôgic khác nhau có thể sử dụng để giải quyết các bài toán.
- Lý thuyết khả năng tính toán (Computability theory)
- Những gì có thể tính toán được bằng các mô hình máy tính hiện tại. Các chứng minh của Alan Turing và những người khác bày tỏ cho chúng ta biết được khả năng những gì có thể tính toán được và những gì không thể.
- Lý thuyết độ phức tạp tính toán (Computational complexity theory)
- Các giới hạn căn bản (cụ thể là thời gian và dung lượng bộ nhớ đòi hỏi) đối với các hạng loại bài toán khác nhau.
- Lý thuyết tính toán lượng tử (Quantum computing)
- Phương thức biểu hiện và chuyển hóa dữ liệu sử dụng những đặc tính của vật chất cùng cơ chế lượng tử.
Cấu trúc dữ liệu và giải thuật
- Phân tích thuật toán (Analysis of algorithms)
- Độ phức tạp về thời gian và không gian của các thuật toán.
- Thuật toán (Algorithms)
- Các quá trình lôgic trên nguyên tắc được sử dụng cho việc tính toán và tính hiệu quả của các quá trình này.
- Cấu trúc dữ liệu (Data structures)
- Tổ chức của dữ liệu và các quy tắc thao tác dữ liệu.
Ngôn ngữ lập trình và trình biên dịch
- Trình biên dịch (Compilers)
- Dịch toàn bộ mã nguồn của ngôn ngữ lập trình thành chương trình đích rồi sau đó mới thực hiện, thường là từ các ngôn ngữ lập trình bậc cao sang các ngôn ngữ lập trình bậc thấp, hay dịch sang mã máy. Các ngôn ngữ sử dụng trình biên dịch như Pascal, C,...
- Trình thông dịch (Interpreter)
- Là cách dịch từng lệnh một, dịch tới đâu thực hiện tới đó. Chẳng hạn ngôn ngữ LISP sử dụng trình thông dịch.
- Ngôn ngữ lập trình (Programming languages)
- Ngôn ngữ lập trình là một ngôn ngữ được thiết kế và tạo ra để viết chương trình cho máy tính. Những ngôn ngữ này còn đồng thời biểu hiện những đặc tính không giống nhau giữa các ngôn ngữ khác nhau (ví dụ, chúng thích hợp cho việc giải các bài toán thuộc dạng nào).
Hệ thống phân tán, song song, tương tranh
- Tương tranh (Concurrency)
- Lý thuyết và thực tiễn của tính toán đồng thời; an toàn dữ liệu trong môi trường đa nhiệm hay đa luồng bất kỳ.
- Tính toán phân tán (Distributed computing)
- Tính toán sử dụng nhiều thiết bị tính toán trên một mạng để thực hiện một nhiệm vụ hoặc một mục tiêu chung.
- Tính toán song song (Parallel computing)
- Tính toán sử dụng nhiều luồng thực thi đồng thời.
Phát triển phần mềm
- Thiết kế thuật toán (Algorithm design)
- Áp dụng ý tưởng từ lý thuyết thuật toán để sáng tạo giải pháp cho các vấn đề thực tế.
- Lập trình máy tính (Computer programming)
- Sử dụng ngôn ngữ lập trình để thực hiện các thuật toán.
- Các phương pháp hình thức (Formal methods)
- Sử dụng toán học để mô tả và chứng minh thiết kế phần mềm.
- Kỹ nghệ đảo ngược (Reverse engineering)
- Áp dụng phương pháp khoa học để phân tích và giải thích một phần mềm có sẵn.
- Phát triển phần mềm (Software development)
- Các nguyên lý và thực tiễn trong thiết kế, phát triển và kiểm thử các ứng dụng, và các phương pháp thực tiễn kỹ nghệ chính xác.
Cấu trúc máy tính
- Cấu trúc máy tính (Computer architecture)
- Thiết kế, tổ chức, tối ưu hóa và kiểm định hệ thống máy tính, đặc biệt là về CPU và bộ nhớ máy tính (và các hệ thống liên kết giữa chúng).
- Tổ chức máy tính (Computer organization)
- Nghiên cứu các kiến trúc máy tính dựa trên mô tả mạch điện, trung tâm xử lý, và xử lý tín hiệu số trong máy tính.
- Hệ điều hành
- Các hệ thống quản lý chương trình máy tính và cung cấp nền tảng cơ bản cho một hệ thống có sẵn.
Truyền thông - Viễn thông
- Xử lý âm thanh trong máy tính (Computer audio)
- Các thuật toán và cấu trúc dữ liệu dùng để tạo, thao tác, lưu trữ và truyền dữ liệu âm thanh kỹ thuật số (digital audio). Lĩnh vực này còn quan trọng trong các ứng dụng nhận dạng giọng nói (speech recognition).
- Mạng máy tính (Computer networking)
- Các thuật toán và giao thức để truyền dữ liệu một cách đáng tin cậy qua các môi trường truyền thông khác nhau hoặc chia sẻ. Thường bao gồm cả sửa lỗi trong truyền thông.
- Mật mã học (Cryptography)
- Sử dụng các lý thuyết về độ phức tạp tính toán, xác suất và số học để tạo và giải mã mật mã.
Cơ sở dữ liệu
- Khai thác dữ liệu (Data mining)
- Nghiên cứu các phương pháp để lọc, rút trích thông tin từ nhiều nguồn dữ liệu khác nhau.
- Cơ sở dữ liệu quan hệ (Relational databases)
- Nghiên cứu các thuật toán tìm kiếm và xử lý thông tin trong các tài liệu và cơ sở dữ liệu, có liên quan mật thiết đến thu thập thông tin.
Trí tuệ nhân tạo
- Trí tuệ nhân tạo (Artificial intelligence)
- Nghiên cứu và triển khai các hệ thống có khả năng tự học và tự thích nghi, hoặc tự động mô phỏng các hành vi của con người.
- Sinh học nhân tạo (Artificial life)
- Nghiên cứu các sinh vật kỹ thuật số để hiểu sâu hơn về các hệ sinh thái sinh học và quá trình tiến hóa.
- Lập luận tự động (Automated reasoning)
- Nghiên cứu các phương pháp giải quyết vấn đề, ví dụ như sử dụng trong Prolog, mà các phương pháp này dẫn đến kết quả khi có một câu hỏi và một cơ sở dữ liệu chứa các quy tắc.
- Tầm nhìn máy tính (Computer vision)
- Các thuật toán nhận diện các đối tượng ba chiều từ một hoặc nhiều hình ảnh hai chiều.
- Học máy (Machine learning)
- Nghiên cứu các phương pháp tự động tạo ra các luật và giả định từ dữ liệu có sẵn.
- Xử lý ngôn ngữ tự nhiên/Ngôn ngữ học tính toán (Natural language processing/Computational linguistics)
- Tự động hóa việc hiểu và tạo ra ngôn ngữ của con người.
- Robot học (Robotics)
- Các thuật toán điều khiển hành vi của robot.
Tính toán mềm
Một thuật ngữ tổng hợp dành cho các kỹ thuật được áp dụng để giải quyết các vấn đề cụ thể, xem chi tiết ở bài gốc.
Đồ họa máy tính
- Đồ họa máy tính (Computer graphics)
- Các thuật toán được sử dụng để tạo ra hình ảnh nhân tạo mà con người có thể nhìn thấy bằng mắt, đồng thời thay đổi và kết hợp dữ liệu không gian và thị giác thu được từ môi trường xung quanh.
- Xử lý ảnh (Image processing)
- Sử dụng tính toán để lấy thông tin từ hình ảnh.
Tương tác người-máy
- Tương tác người-máy (Human computer interaction)
- Nghiên cứu các phương pháp làm cho máy tính và các tính năng của chúng hữu ích, dễ truy cập và sử dụng bởi mọi người trên toàn cầu, bao gồm cả nghiên cứu và thiết kế giao diện người dùng.
Tính toán khoa học
- Tin sinh học (Bioinformatics)
- Sử dụng khoa học máy tính để duy trì, phân tích, lưu trữ dữ liệu sinh học (biological data) và hỗ trợ giải quyết các vấn đề sinh học như gấp cuộn protein, dự đoán chức năng của cấu trúc protein và phát sinh phân loại.
- Khoa học nhận thức (Cognitive Science)
- Sử dụng kỹ thuật máy tính để xây dựng các mô hình về trí tuệ con người.
- Hóa học tính toán (Computational chemistry)
- Mô hình hóa tổ chức của các phân tử hóa học trên lý thuyết bằng tính toán, để xác định cấu trúc và đặc tính của chúng.
- Thần kinh học tính toán (Computational neuroscience)
- Mô hình hóa não bộ con người bằng tính toán.
- Vật lý tính toán (Computational physics)
- Sử dụng tính toán số để mô phỏng các hệ thống lớn không thể phân tích được.
- Phân tích số (Numerical analysis) hoặc (Numerical algorithms)
- Sử dụng các thuật toán để giải các vấn đề toán học, như thuật toán tìm nghiệm của hàm, tích phân, giải phương trình vi phân thông thường và xấp xỉ/đánh giá các hàm đặc biệt.
- Toán học ký hiệu
- Thao tác và giải quyết biểu thức dưới dạng ký hiệu, còn được biết đến là Đại số máy tính.
Đào tạo về khoa học máy tính
Một số trường đại học cung cấp đào tạo về khoa học máy tính như một ngành nghiên cứu về lý thuyết tính toán và lập luận thuật toán. Các chương trình đào tạo này thường bao gồm các môn lý thuyết về tính toán, phân tích thuật toán, phương pháp số, lý thuyết xung đột, cơ sở dữ liệu, đồ họa máy tính và phân tích hệ thống cùng các môn học khác. Các chương trình này cũng thường dạy lập trình, mặc dù coi nó chỉ là một công cụ hỗ trợ cho các lĩnh vực khác của khoa học máy tính chứ không phải là trọng tâm của nghiên cứu ở mức cao.
Các trường cao đẳng và đại học khác, cũng như các trường trung học và các chương trình dạy nghề khác, tập trung vào thực hành lập trình cao cấp hơn là lý thuyết về thuật toán và tính toán trong chương trình giáo dục của họ. Những chương trình này thường hướng tới phát triển các kỹ năng quan trọng cho nhân viên trong ngành công nghiệp phần mềm. Phương diện thực hành của việc lập trình thường được gọi là kỹ nghệ phần mềm. Tuy nhiên, vẫn có nhiều tranh luận về ý nghĩa thực sự của thuật ngữ 'kỹ nghệ phần mềm' (software engineering) và về sự khác biệt giữa nó và lập trình (programming).
- Xem Peter J. Denning, Great principles in computing curricula, Technical Symposium on Computer Science Education, 2004.