Khoa học máy tính (tiếng Anh: computer science hay computing science) là ngành nghiên cứu các cơ sở lý thuyết về thông tin và tính toán cùng sự thực hiện và ứng dụng của chúng trong các hệ thống máy tính. Khoa học máy tính có nhiều chi nhánh; một số chi nhánh nhấn mạnh vào việc tính toán các kết quả cụ thể (chẳng hạn đồ họa máy tính), trong khi các chi nhánh khác lại liên hệ đến tính chất của những vấn đề có thể giải quyết được dùng phương pháp máy tính, (ví dụ như Lý thuyết độ phức tạp tính toán). Còn lại những chi nhánh khác thì tập trung vào những khó khăn trong việc thực thi những phương pháp dùng để tính toán, lấy ví dụ, ngành Lý thuyết ngôn ngữ lập trình chẳng hạn. Đây là chi nhánh nghiên cứu những phương thức khác nhau tiếp cận việc mô tả cách tính toán, trong khi ngành Lập trình ứng dụng những Ngôn ngữ lập trình cụ thể để giải các bài toán.
Lịch sử của khoa học máy tính đã bắt đầu từ nhiều năm trước phát minh ra máy tính hiện đại. Các máy móc dành cho việc tính toán các bài toán số học cố định đã tồn tại từ thời cổ đại, chẳng hạn máy abacus (bàn tính). Wilhelm Schickard đã xây dựng chiếc máy tính cơ học đầu tiên năm 1632.[1]Charles Babbage đã thiết kế một máy tính theo hiệu (difference engine) vào thời Victoria[2], và 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ỗ.[3]. 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, hoặc cùng lắm là một tập nhỏ các nhiệm vụ.
Trước năm 1920, công việc tính toán được thực hiện chủ yếu bởi những nhân viên chuyên nghiệp. Những nhà nghiên cứu đầu tiên về ngành mà sau này được gọi là khoa học máy tính, chẳng hạn 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 thủ quỹ - người chỉ đơn giản dùng giấy và bút chì để làm một danh sách các bước tính toán, cho đến khi nào xong việc mà không cần đến trí thông minh hay hiểu biết? Một phần của động 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à buồn tẻ và dễ sai của một 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ề lý thuyết) thực hiện mọi nhiệm vụ tính toán có thể cần đến, và nhờ đó tổng quát hóa tất cả các máy tính chuyên biệt trước kia thành một khái niệm đơn nhất về chiếc máy tính phổ dụng.
Trong những năm 1940, khi các máy tính mới hơn và mạnh hơn được phát triển, người ta thấy rõ ràng hơn 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, lĩnh vực khoa học máy tính được mở rộng thành ngành nghiên cứu tính toán nói chung. Từ thập kỷ 1960, khoa học máy tính bắt đầu được thiết lập như là một ngành học riêng biệt, với sự ra đời của các khoa 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.[4] Từ khi các máy tính được sử dụng trong thực tiễn, nhiều ứng dụng của tính toán đã trở thành các lĩnh vực nghiên cứu riêng biệt một cách xứng đáng.
Quân đội Đức Quốc Xã sử dụng máy Enigma trong Đệ nhị thế chiến để truyền tin bí mật. Máy phá mã tầm cỡ tại Công Viên Bletchley, được xây dựng để phá mã của máy Enigma, đã đóng góp một vai trò quan trọng trong chiến thắng của quân đồng minh trong cuộc chiến tranh thế giới lần thứ Hai. .[5]
Tuy được trở thành một bộ môn giáo dục chính thức với một quãng thời gian lịch sử ngắn ngủi, khoa học máy tính đã có một số cống hiến quan trọng đối với khoa học và xã hội. Những cống hiến này bao gồm:
Ứng dụng trong nghành khoa học máy tính
Đã định nghĩa được 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 đưa ra bằng chứng rằng có những vấn đề bất khả tính toán (computationally unsolvable) và những vẫn đề rất khó tính toán (intractable).[6]
Đã đưa ra khái niệm về ngôn ngữ lập trình, một dụng cụ dùng để biểu đạt thông tin đã được trật tự hóa một cách chính xác trong nhiều tầng lớp trừu tượng khác nhau.[7]
Mặc dù có tên là "khoa học máy tính", nhưng ngành này không bao gồm nghiên cứu về chính những chiếc máy tính. Thực tế, người ta thường dẫn lời nhà khoa học máy tính nổi tiếng Edsger Dijkstra rằng, "Khoa học máy tính đối với máy tính không hơn thiên văn học đối với kính thiên văn." (Computer science is no more about computers than astronomy is about telescopes.) Việc thiết kế và triển khai máy tính và các hệ thống máy tính thường được xem là thuộc lĩnh vực của các ngành khác. Ví dụ, nghiên cứu về phần cứng máy tính thường được coi là một phần của ngành kỹ thuật máy tính (computer engineering), trong khi nghiên cứu về các hệ thống máy tính thương mại và việc triển khai chúng thường được thuộc về ngành công nghệ thông tin hoặc ngành các hệ thống thông tin. Khoa học máy tính đôi khi bị chỉ trích là không khoa học lắm, quan điểm này được thể hiện trong phát biểu "Khoa học so với khoa học máy tính cũng giống như ngành khí động học so với việc lắp đường ống" của Stan Kelly-Bootle[10] và một số người khác. Tuy nhiên, đã có nhiều sự phát triển tương giao của các ý tưởng giữa các ngành khác nhau có liên quan đến máy tính. Nghiên cứu khoa học máy tính cũng thường nối sang các ngành khác, chẳng hạn như trí tuệ nhân tạo, khoa học nhận thức, vật lý học (xem tính toán lượng tử), và ngôn ngữ học.
Một số người lại coi khoa học máy tính là ngành có quan hệ gần gũi hơn cả với toán học.[4]. Khoa học máy tính thời kỳ đầu đã chịu ảnh hưởng mạnh mẽ bởi các công trình của các nhà toán học như Kurt Gödel và Alan Turing, và vẫn tiếp tục có những trao đổi tư tưởng hữu ích giữa hai ngành trong các lĩnh vực chẳng hạn như lôgic toán, lý thuyết phạm trù, lý thuyết miền xác định (domain theory), và đại số.
Quan hệ giữa khoa học máy tính và kỹ nghệ phần mềm là một vấn đề gây tranh cãi, vấn đề này bị làm cho rắc rối thêm bởi các cuộc tranh luận về ý nghĩa của từ "kỹ nghệ phần mềm", và khoa học máy tính được định nghĩa như thế nào. Một số người tin rằng kỹ nghệ phần mềm là một tập con của khoa học máy tính. Dựa theo quan hệ giữa các ngành khoa học (science) và kỹ thuật hay kỹ nghệ (engineering) khác, một số khác lại cho rằng trọng tâm chính của khoa học máy tính là nghiên cứu các tính chất của việc tính toán nói chung, trong khi trọng tâm chính của kỹ nghệ phần mềm là việc thiết kế các tính toán cụ thể để đạt được các mục tiêu thực tiễn, nghĩa là đây là hai ngành khác nhau. Một trong những người phổ biến quan niệm này là David Parnas[11].
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 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.
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.
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).
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ể.
Một chương trình sử dụng để biên dịch và thi hành trực tiếp một chương trình phần mềm khác dùng trong máy tính mà không phải thông qua quá trình biên dịch.
Các khuôn mẫu ngôn ngữ đã được hình thức hóa và dùng để biểu diễn các thuật toán. 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).
Những thuật toán và cấu trúc dữ liệu dùng để kiến tạo, thao tác, lưu trữ, và truyền thanh các bản ghi âm thanh kỹ thuật số (digital audio). Nghành này còn đóng vai trò quan trọng đối với các ứng dụng nhận dạng giọng nói (voice recognition) nữa.
Các thuật toán và giao thức dành cho việc truyền thông dữ liệu một cách đáng tin cậy qua các môi trường truyền thông chuyên dụng hoặc chia sẻ khác nhau. Thường khi bao gồm cả việc sửa lỗi(error correction) trong truyền thông.
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ó quan hệ gần gũi với ngành thu thập thông tin (information retrieval).
Nghiên cứu các động cơ giải quyết bài toán, chẳng hạn như được sử dụng trong Prolog, các động cơ này tạo ra các bước dẫn đến một kết quả nếu cho trước một truy vấn về một sự kiện và một cơ sở dữ liệu gồm các luật (rule database).
Những thuật toán sử dụng trong cả hai trường hợp, kiến tạo hình ảnh một cách nhân tạo mà người thường có thể xem được bằng mắt, đồng thời kết hợp và thay đổi các dữ liệu về không gian và thị giác thu được từ môi trường sống bên ngoài.
Nghiên cứu phương pháp làm cho máy tính và sự tính toán của chúng trở nên hữu dụng, có thể tiếp cận và sử dụng bởi bất cứ ai trên thế giới là người dùng, bao gồm cả việc nghiên cứu và thiết kế giao diện người dùng.
Các trường cao đẳng và đại học khác, cũng như các trường trung học và những chương trình dạy nghề có giảng dạy về khoa học máy tính, lại nhấn mạnh thực hành lập trình cao cấp thay vì lý thuyết đối với các 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 có xu hướng tập trung vào những kỹ năng quan trọng cho những người đi làm 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, có rất nhiều bất đồng xung quanh ý nghĩa thật của từ "kỹ nghệ phần mềm" (software engineering) và về việc nó với lập trình (programming) có phải là một hay không.
^Abelson, H.; G.J. Sussman with J.Sussman (1996). Structure and Interpretation of Computer Programs, 2nd Ed., MIT Press. ISBN 0-262-01153-0. “Cách mạng khoa học tính toán được gọi là một cuộc cách mạng vì nó thay đổi cách suy nghĩ của chúng ta, và thay đổi cách chúng ta biểu đạt những suy nghĩ của mình. Khái niệm căn bản trong sự thay đổi này là sự xuất hiện của cái mà chúng ta có thể đặt tên cho là "Quan niệm tri thức trình tự" (procedural epistemology) - tức sự nghiên cứu cấu trúc của ngôn ngữ từ góc độ "mệnh lệnh" (imperative), thay vì góc độc "tường thuật" (declarative) mà những bộ môn toán học cổ truyền khác vẫn sử dụng”
^Parnas, David L. (1998). “Software Engineering Programmes are not Computer Science Programmes”. Annals of Software Engineering6: 19–37., p. 19: "Rather than treat software engineering as a subfield of computer science, I treat it as an element of the set, {Civil Engineering, Mechanical Engineering, Chemical Engineering, Electrical Engineering,....}."