[Bài viết] Điện toán đám mây (cloud computing) ?

Công nghệ điện toán đám mây 

Điện toán đám mây là một thuật ngữ được nhắc tới khá nhiều trong giới công nghệ gần đây. Thuật ngữ này liên quan tới rất nhiều các công nghệ mới đang phát triển và bản thân định nghĩa về điện toán đám mây cũng vẫn còn đang được những người làm công nghệ tinh chỉnh lại hàng ngày. Thay vì tham vọng đưa lại cái nhìn chi tiết cho người đọc về từng khía cạnh khác nhau của điện toán đám mây, ở đây chỉ xin nêu những điểm chung nhất về thuật ngữ đang hot này.

Một cách đơn giản, điện toán đám mây là việc ảo hóa các tài nguyên tính toán và các ứng dụng. Thay vì việc bạn sử dụng một hoặc nhiều  máy chủ thật (ngay trước mắt, có thể sờ được, có thể tự bạn ấn nút bật tắt được) thì nay bạn sẽ sử dụng các tài nguyên được ảo hóa (virtualized) thông qua môi trường Internet. Bản thân từ đám mây (cloud) là một từ ẩn dụ (metaphor) cho Internet.

Như vậy, trước đây để có thể triển khai một ứng dụng (ví dụ một trang Web), bạn phải đi mua/thuê một hay nhiều máy chủ (server), sau đó đặt máy chủ tại các trung tâm dữ liệu (data center) thì nay điện toán đám mây cho phép bạn giản lược quá trình mua/thuê đi. Bạn chỉ cần nêu ra yêu cầu của mình, hệ thống sẽ tự động gom nhặt các tài nguyên rỗi (free) để đáp ứng yêu cầu của bạn. Chính vì vậy, có thể kể đến một vài lợi ích cơ bản của điện toán đám mây như sau :

Sử dụng các tài nguyên tính toán động (Dynamic computing resources) : Các tài nguyên được cấp phát cho doanh nghiệp đúng như những gì doanh nghiệp muốn một cách tức thời. Thay vì việc doanh nghiệp phải tính toán xem có nên mở rộng hay không, phải đầu tư bao nhiêu máy chủ thì nay doanh nghiệp chỉ cần yêu cầu “Hey, đám mây, chúng tôi cần thêm tài nguyên tương đương với 1 CPU 3.0 GHz, 128GB RAM…” và đám mây sẽ tự tìm kiếm tài nguyên rỗi để cung cấp cho bạn.

Giảm chi phí : Doanh nghiệp sẽ có khả năng cắt giảm chi phí để mua bán, cài đặt và bảo trì tài nguyên. Rõ ràng thay vì việc phải cử một chuyên gia đi mua máy chủ, cài đặt máy chủ, bảo trì máy chủ thì nay bạn chẳng cần phải làm gì ngoài việc xác định chính xác tài nguyên mình cần và yêu cầu. Quá tiện!.

Giảm độ phức tạp trong cơ cấu của doanh nghiệp : Doanh nghiệp sản xuất hàng hóa mà lại phải có cả một chuyên gia IT để vận hành, bảo trì máy chủ thì quá tốn kém. Nếu outsource được quá trình này thì doanh nghiệp sẽ chỉ tập trung vào việc sản xuất hàng hóa chuyên môn của mình và giảm bớt được độ phức tạp trong cơ cấu.

Tăng khả năng sử dụng tài nguyên tính toán : Một trong những câu hỏi đau đầu của việc đầu tư tài nguyên (ví dụ máy chủ) là bao lâu thì nó sẽ hết khấu hao, tôi đầu tư như thế có lãi hay không, có bị outdate về công nghệ hay không … Khi sử dụng tài nguyên trên đám mây thì bạn không còn phải quan tâm tới điều này nữa.

Kiến trúc hướng dịch vụ (SOA)
Tuy vậy, để có thể tận dụng tối đa điện toán đám mây thì điều quan trọng là doanh nghiệp cần phải tìm một nhà cung cấp “đám mây” đủ tốt để đáp ứng được cho mình tất cả những điều trên. Trong tương lai, điện toán đám mây sẽ rất hữu ích khi nó vươn cả tới việc sử dụng những tài nguyên dư thừa trong các máy tính cá nhân của chính bạn. Để biết thêm chi tiết về các dịch vụ hiện tại đang sử dụng Cloud Computing (ví dụ như Twitter, Jive …) và các nhà cung cấp dịch vụ liên quan tới Cloud Computing.


Theo Wiki:

Điện toán đám mây (tiếng Anh: cloud computing), còn gọi là điện toán máy chủ ảo, là mô hình điện toán sử dụng các công nghệ máy tính và phát triển dựa vào mạng Internet. Thuật ngữ "đám mây" ở đây là lối nói ẩn dụ chỉ mạng Internet (dựa vào cách được bố trí của nó trong sơ đồ mạng máy tính) và như một liên tưởng về độ phức tạp của các cơ sở hạ tầng chứa trong nó. Ở mô hình điện toán này, mọi khả năng liên quan đến công nghệ thông tin đều được cung cấp dưới dạng các "dịch vụ", cho phép người sử dụng truy cập các dịch vụ công nghệ từ một nhà cung cấp nào đó "trong đám mây" mà không cần phải có các kiến thức, kinh nghiệm về công nghệ đó, cũng như không cần quan tâm đến các cơ sở hạ tầng phục vụ công nghệ đó. Theo tổ chức Xã hội máy tính IEEE "Nó là hình mẫu trong đó thông tin được lưu trữ thường trực tại các máy chủ trên Internet và chỉ được được lưu trữ tạm thời ở các máy khách, bao gồm máy tính cá nhân, trung tâm giải trí, máy tính trong doanh nghiệp, các phương tiện máy tính cầm tay, ...". Điện toán đám mây là khái niệm tổng thể bao gồm cả các khái niệm như phần mềm dịch vụ, Web 2.0 và các vấn đề khác xuất hiện gần đây, các xu hướng công nghệ nổi bật, trong đó đề tài chủ yếu của nó là vấn đề dựa vào Internet để đáp ứng những nhu cầu điện toán của người dùng. Ví dụ, dịch vụ Google AppEngine cung cấp những ứng dụng kinh doanh trực tuyến thông thường, có thể truy nhập từ một trình duyệt web, còn các phần mềm và dữ liệu đều được lưu trữ trên các máy chủ.

Thuật ngữ cloud computing ra đời giữa năm 2007 không phải để nói về một trào lưu mới, mà để khái quát lại các hướng đi của cơ sở hạ tầng thông tin vốn đã và đang diễn ra từ mấy năm qua. [cần dẫn nguồn] Quan niệm này có thể được diễn giải một cách đơn giản: các nguồn điện toán khổng lồ như phần mềm, dịch vụ và các dịch vụ sẽ nằm tại các máy chủ ảo (đám mây) trên Internet thay vì trong máy tính gia đình và văn phòng (trên mặt đất) để mọi người kết nối và sử dụng mỗi khi họ cần. Với các dịch vụ sẵn có trên Internet, doanh nghiệp không phải mua và duy trì hàng trăm, thậm chí hàng nghìn máy tính cũng như phần mềm. Họ chỉ cần tập trung vào kinh doanh lĩnh vực riêng của mình bởi đã có người khác lo cơ sở hạ tầng và công nghệ thông tin thay họ. Google, theo lẽ tự nhiên, nằm trong số những hãng ủng hộ điện toán máy chủ ảo tích cực nhất bởi hoạt động kinh doanh của họ dựa trên việc phân phối các cloud (virtual server). Đa số người dùng Internet đã tiếp cận những dịch vụ đám mây phổ thông như e-mail, album ảnh và bản đồ số.


Thuật ngữ điện toán đám mây xuất hiện bắt nguồn từ ứng dụng điện toán lưới (grid computing) trong thập niên 1980, tiếp theo là điện toán theo nhu cầu (utility computing) và phần mềm dịch vụ (SaaS).

Điện toán lưới đặt trọng tâm vào việc di chuyển một tải công việc (workload) đến địa điểm của các tài nguyên điện toán cần thiết để sử dụng. Một lưới là một nhóm máy chủ mà trên đó nhiệm vụ lớn được chia thành những tác vụ nhỏ để chạy song song, được xem là một máy chủ ảo.
Với điện toán đám mây, các tài nguyên điện toán như máy chủ có thể được định hình động hoặc cắt nhỏ từ cơ sở hạ tầng phần cứng nền và trở nên sẵn sàng thực hiện nhiệm vụ, hỗ trợ những môi trường không phải là điện toán lưới như Web ba lớp chạy các ứng dụng truyền thống hay ứng dụng Web 2.0.

# Ứng dụng cơ bản của điện toán đám mây



Thực ra ứng dụng của công nghệ đám mây là vô giới hạn. Chỉ cần có một middleware phù hợp là một hệ thống mây có thể xử lý tất cả các chương trình như bất kỳ một máy tính bình thường nào khác. Tất cả các loại phần mềm, từ trình xử lý văn bản tới ứng dụng tin học tùy biến được thiết kế cho một công ty cụ thể nào đó đều có thể tự do hoạt động trong “đám mây.”

Các ông lớn về công nghệ đám mây

Một số công ty đang nghiên cứu công nghệ đám mây chính là những người khổng lồ trong ngành máy tính. Microsoft, IBM và Google đều đang đầu tư hàng triệu đôla vào việc nghiên cứu. Một số người còn nghĩ rằng Apple cũng sẽ tìm hiểu khả năng sản xuất phần cứng giao diện dành cho hệ thống công nghệ này.



Tại sao nhiều người lại muốn gửi gắm ứng dụng và dữ liệu của mình cho một hệ thống máy tính ngoài? Dưới đây là một trong số những lý do chính:

Khách hàng muốn truy cập vào các ứng dụng và dữ liệu của mình từ mọi nơi và vào mọi thời điểm. Họ có thể truy cập vào hệ thống mây từ bất kỳ máy tính nào nối mạng Internet. Dữ liệu của họ không còn bị giới hạn trong ổ cứng nữa mà có thể mở rộng ra thậm chí ngoài mạng nội bộ công ty.

Công nghệ này giúp giảm chi phí phần cứng, khách hàng không cần thiết phải lắp đặt những thiết bị đắt tiền, mua những chiếc máy tính nhanh nhất với bộ nhớ lớn nhất nữa, bởi hệ thống mây sẽ lo liệu mọi việc này cho bạn. Vì vậy bạn chỉ cần sắm cho mình một chiếc máy đầu cuối rẻ tiền gồm có một màn hình, một bàn phím, một chuột và vừa đủ khả năng xử lý để chạy phần mềm middleware mà thôi. Bạn cũng chẳng cần đến một ổ cứng lớn bởi bạn đã có hẳn một chiếc máy tính từ xa chuyên lưu dữ liệu cho mình.

Các công ty hoạt động chủ yếu trên máy tính cần đảm bảo rằng họ đã trang bị đúng loại phần mềm cần thiết để đạt được các mục tiêu kinh doanh. Hệ thống mây cho phép những công ty này tự do truy cập các ứng dụng cần thiets mà không cần mua bản quyền cả một bộ phần mềm cho từng nhân viên. Họ chỉ cần trả một lượng phí định kỳ cho công ty cung cấp dịch vụ đám mây mà thôi.

Máy chủ và các thiết bị lưu trữ khác cũng rất tốn diện tích. Một số công ty thậm chí phải thuê chỗ chứa máy chủ bởi họ không có đủ không gian cần thiết. Với công nghệ đám mây, các công ty này đã có thể lưu dữ liệu trên thiết bị của người khác, chuyển gánh nặng về không gian lên mặt sau của hệ thống mây.

Công nghệ đám mây giúp các công ty không phải chi tiền cho đội hỗ trợ IT. Theo lý thuyết thì cả những thiết bị phần cứng chuyên dụng cũng ít gặp vấn đề hơn so với một mạng lưới gồm những máy tính và hệ điều hành giống hệt nhau.

Nếu mặt sau của hệ thống mây là một hệ thống lưới thì khách hàng còn tận dụng được toàn bộ khả năng xử lý của mạng lưới. Các nhà khoa học và nhà nghiên cứu vẫn thường phải làm việc với những phép tính phức tạp đến nỗi các máy tính đơn lẻ phải mất hàng năm trời mới giải quyết xong. Còn trên hệ thống lưới, người dùng chỉ cần gửi phép tính đó lên cho đám mây xử lý. Đám mây sẽ thu hút toàn bộ năng lượng xử lý của các máy tính sẵn có ở mặt sau, từ đó đẩy nhanh quá trình tính toán.

Vẫn như ngày xưa

Công nghệ đám mây có thể biến máy tính gia đình thành những giao diện đầu cuối đơn giản. Xét từ một khía cạnh nào đó thì đây thực ra là một bước lùi. Bởi các máy tính “cổ xưa” thường có thiết bị đầu cuối nối dây. Mỗi máy đầu cuối có một màn hình và một bàn phím, nhưng chỉ có vai trò làm giao diện cho máy tính chính. Bạn không thể lưu thông tin trên máy đầu cuối nội bộ được.

Tuy những lợi ích của công nghệ đám mây có vẻ rất thuyết phục, nhưng liệu nó có bất lợi gì không? Hãy đến với phần tiếp theo.

Những lo ngại xung quanh công nghệ đám mây



Có lẽ mối lo lớn nhất của người dùng đối với công nghệ đám mây chính là tính an ninh và riêng tư. Nhiều người không dám giao phó những dữ liệu quan trọng cho một công ty khác. Các giám đốc điều hành cũng ngần ngại khi đề cập đến công nghệ đám mây bởi khi đó họ không thể bảo vệ thông tin mật của mình bằng két sắt và chìa khóa được.

Tuy nhiên, nhiều người phản đối quan điểm này cho rằng các công ty cung cấp dịch vụ đám mây tồn tại nhờ danh tiếng của họ. Việc đảm bảo sự an toàn cho khách hàng đã làm nên lợi nhuận cho những công ty này. Nếu không họ sẽ mất tất cả khách hàng đang có. Khi sử dụng những công nghệ tối tân nhất để bảo vệ dữ liệu khách hàng, các công ty cung cấp đang bảo vệ lợi ích của chính mình.

Nhưng vấn đề riêng tư lại là chuyện khác. Nếu một khách hàng có thể đăng nhập vào ứng dụng và dữ liệu của mình từ bất cứ địa điểm nào thì cũng rất có thể tính riêng tư của họ cũng không còn nữa. Và các công ty cung cấp dịch vụ đám mây cần tìm cách để bảo vệ sự riêng tư cho khách hàng. Một trong số những cách này là sử dụng công nghệ nhận dạng như username và password, hoặc dùng định dạng cấp phép – mỗi người dùng chỉ được phép sử dụng các dữ liệu và ứng dụng liên quan đến công việc của mình.

Cẩn thận, bạn đang bị theo dõi!

Giới tin tặc thường dùng một số cách đột nhập có thể khiến những công ty sử dụng “đám mây” hết sức đau đầu. Một trong số các cách này là key logging (theo dõi bàn phím). Một chương trình key logging sẽ ghi lại toàn bộ những gì người dùng đã gõ từ bàn phím. Vì thế nếu cài được chương trình key logging lên máy tính nạn nhân, tin tặc có thể biết được nạn nhân đã gõ username và password nào. Tất nhiên, nếu máy tính của người dùng chỉ là một chiếc máy đầu cuối đã được phân luồng, tin tặc sẽ không thể cài được chương trình này.

Một số câu hỏi liên quan đến công nghệ đám mây lại mang đầy tính triết lý, như: liệu người dùng hoặc công ty đăng ký dịch vụ đám mây có được sở hữu dữ liệu không? Hay chính công ty cung cấp dịch vụ mới là người sở hữu chúng? Liệu một hãng cung cấp “mây” có quyền không cho khách hàng đăng nhập vào chính dữ liệu của mình hay không? Nhiều công ty, hãng luật và trường đại học đang tranh cãi sôi nổi về vấn đề này cũng như nhiều câu hỏi khác liên quan tới công nghệ đám mây.



Và liệu công nghệ đám mây sẽ ảnh hưởng đến các ngành công nghiệp khác như thế nào? Ngay trong giới IT nhiều người cũng đang lo ngại về tác động của công nghệ đám mây lên ngành sửa chữa và bảo trì máy tính. Còn nếu một công ty chuyển sang sử dụng hệ thống máy phân luồng, nhu cầu về IT của họ cũng giảm đi. Theo một số chuyên gia trong ngành thì nhu cầu việc làm IT có thể sẽ chuyển sang mặt sau của hệ thống mây.

Hệ thống máy tính tự trị

Trong cộng đồng khoa học máy tính có tồn tại một lĩnh vực nghiên cứu mang tên công nghệ tự trị. Hệ thống máy tính tự trị có khả năng tự quản lý và tự tiến hành những biện pháp cần thiết để ngăn chặn và khắc phục vấn đề. Hiện tại hệ thống này vẫn đang ở dạng lý thuyết. Nhưng nếu nó trở thành thực tế, rất nhiều nhân viên bảo trì máy tính sẽ mất việc.

Theo tuvan1088

# Những tiên đoán về công nghệ tương lai của các nhà khoa học trong lịch sử




Nhiều ý kiến cho rằng những thế hệ trước hẳn không thể nhìn ra được sự phát triển tối tân của con người thời hiện đại. Nhưng không hẳn là như thế khi có rất nhiều những bậc học giả, nhà khoa học, thiên tài dường như là có tầm nhìn khá xa, tầm nhìn của họ không phải do sự linh cảm từ chúa mà chính là từ sức sáng tạo và tài năng. Trong thời đại của họ thì những tiên đoán có vẻ không tưởng nhưng thực tế chứng minh là những người này đã đúng, thậm chí là đúng nhiều. Sau đây là một số nhà tiên tri khoa học tài ba trong khoảng thời gian 400 lùi lại.
Facebook Twitter 0 bình chọn Viết bình luận Lưu bài này

1. Robert Boyle (1627-1691)
Robert Boyle – nổi tiếng nhất với định luật Boyle, một định luật hóa học mô tả mối quan hệ tỉ lệ nghịch giữa áp suất tuyệt đối và thể tích của khối khi nếu nhiệt độ giữ không đổi trong hệ kín. Ngoài ra ông còn là một nhà vật lý, phát minh và triết gia tài ba. Ông sở hữu một tư duy sáng tạo tuyệt vời và khả năng nhìn nhận sâu sắc.

Sau khi ông qua đời năm 1961, Hội Hoàng Gia đã phát hiện ra một bản viết tay mà trong đó ông có đề cập đến một số vấn đề rất hiện đại như “kéo dài sự sống”, “nghệ thuật bay” và “ánh sáng vĩnh viễn”. Ông thể hiện chúng như mong mỏi của mình, dự đoán đến việc tạo ra những loại thuốc ngủ, kích thích, thuốc nhuộm tóc … Nhà khoa học Ireland còn viết về sự phát triển trong nghiên cứu khoáng sản, động vật, thực vật – tiền thân của những công nghệ nano, công nghệ sinh học và kỹ thuật di truyền hiện đại. Tư tưởng của Boyle dường như là rất mới mẻ và không có giới hạn cho dù ông viết toàn những điều khó tin trong thời điểm thế kỉ 17. Như chúng ta đã thấy, các lĩnh vực mà ông đề cập đã rất phát triển theo nhiều cách khác nhau.

2. Denis Diderot (1713-1784)
Denis Diderot là một nhà văn và triết học nổi tiếng người Pháp, ông sống sau thời đại của Boyle một thời gian. Ông được coi là nhà tương lai học đáng chú ý nhất trong thời kỳ Khai Sáng ở Châu Âu và được biết đến như người biên tập chính của công trình Bách khoa toàn thư đồ sộ - Encyclopedie.

Ngoài ra ông còn để lại nhiều di sản và tư liệu quý giá. Trong các công trình của mình, ông có đề cập rằng mọi sinh vật đều là sản phẩm của sự chọn lọc qua thế hệ và thời gian. Đây giống như tiền thân của các lý thuyết chọn lọc tự nhiên. Denis còn lập luận rằng ý thức là một sản phẩm của vật chất, vật chất ở đây là não, do đó tâm thức có thể tái tạo vào liên kết với nhau. Ông nghĩ rằng khoa học trong tương lai sẽ tìm được cách để tái tạo cuộc sống, thiết kế được những động vật và máy moc thông minh. Chúng ta có thể thấy đó là robot của thời hiện đại. Tuy nhiên đồng thời ông cũng bác bỏ ý tưởng về sự tiến bộ vì cho rằng nó sẽ sớm bị dập tắt.

3. Marquis de Condorcet (1744-1794)
Ông là người đã dự đoán về sự tiến bộ, kéo dài tuổi thọ và khả năng trí óc của con người. Ông cũng là người Pháp - một nhà toán, triết học. Tuy cũng có những dự đoán về phát triển như Diderot nhưng Marquis không mang tư tưởng bài trừ mà luôn tin tưởng và ủng hộ con người tiến tới sự phát triển bằng trí tuệ, khoa học, công nghệ.

Trong thời đại trước, đây là sự giác ngộ mạnh mẽ về lý tưởng. Không chỉ trên lĩnh vực toán học mà ở bộ môn khoa học chính trị ông cũng rất xuất sắc, tư tưởng “hoàn hảo hóa xã hội” của ông đã tác động mạnh đến những tác phẩm của Thomas Malthus. Tiêu biểu là tác phẩm “Phác thảo lịch sử về sự tiến bộ trong nhận thức con người”, trong đó ông đã lập luận rằng lý luận và khoa học nên được áp dụng vào phát triển khoa học và đạo đức con người. Ông có mong muốn kéo dài tuổi thọ của con người và tiên đoán trong tương lai điều này sẽ được khắc phục (thời đó tuổi thọ của con người chỉ khoản 40). Condorcet còn quả quyết rằng những khám phá trong khoa học và nghệ thuật sẽ làm cho xã hội được hoàn hảo hóa một cách thực sự, mọi giới hạn về thể chất, tinh thần, hiểu biết của con người sẽ ngày càng được nâng cao.

4. Benjamin Franklin (1706-1790)
Nhân vật này hẳn phần lớn chúng ta đều biết, ông là một trong những người thành lập Hoa Kỳ. Không chỉ vậy ông còn là một chính trị gia, nhà khoa học, ngoại giao, triết gia, nhà phát minh … Một con người đa tài trên nhiều lĩnh vực. Có lẽ rằng với tầm hiểu biết và sức sáng tạo của ông thì việc ông tiên đoán được một số vấn đề hiện đại không có gì khó hiểu.

Ông đã thể hiện suy nghĩ của mình thông qua việc viết cho bạn mình là linh mục Joseph về "Khoa học thực sự năm 1780" với nội dung thể hiện sự nuối tiếc vì mình sinh ra quá sớm. Ông cho rằng trong tương lai việc vận chuyển sẽ trở nên dễ dàng, nền nông nghiệp có thể giảm thiểu lao động và tăn năng suất, phương pháp y học cải tiến giúp con người sống lâu hơn. Franklin đã thể hiện một niềm tin tuyệt đối vào tương lai. Trước đó vào năm 1773 ông đã cho rằng có thể duy trì sự sống của con người qua hàng thế kỉ bằng một số hóa chất, sau đó đánh thức họ dậy. Thậm chí ông còn thể hiện tâm nguyện muốn được bảo quản trong một thùng rượu van Madeira cho đến khi khoa học có thể đưa ông trở lại. Phần lớn sự tiên tri của ông đã thành hiện thực khi khoa học đang làm được những điều phi thường. Nhưng có lẽ để tiến hành phương thức ngủ đông thì chúng ta còn phải hướng về tương lai lâu dài hơn.

5. Konstantin Tsiolkovsky (1857-1935)
Nếu những nhà khoa học phía trên thường dự đoán về sự phát triển y học hay công nghệ thì nhà khoa học Nga Konstantin Tsiolkovsky còn nhìn ra được sự phát triển của khoa học vũ trụ. Tsiolkovsky là một nhà khoa học lý thuyết, nhà nghiên cứu, người đặt nền móng cho ngành du hành vũ trụ hiện đại, nhà sư phạm, nhà văn. Ngoài ra ông được biết đến với vai trò là nhà sáng chế tên lửa Xô Viết, ông là người tiên phong trong lí thuyết du hành vũ trụ.


Năm 1895, lấy cảm hứng từ việc tháp Eiffel được xây dựng ở Paris, ông đưa ra một ý tưởng chưa từng có - thang máy không gian. Mô hình của ông là chỉ một máy nâng đơn sơ nhưng đã đặt một nền tảng mới cho khoa học. Thời điểm đó chưa có ai nghĩ tới việc đưa con người vào không gian nhưng ông đã là người đầu tiên. Ông đã phát triển một phương trình mô tả động cơ đẩy tên lửa. Ông hoàn toàn tin vào việc trong tương lai con người sẽ đi được từ hành tinh này đến hành tinh khác, thậm chí còn nghĩ tới việc con người có thuộc địa không gian. Trong cuốn sách xuất bản năm 1928, ông dự đoán rằng nhân loại sẽ chiếm được thuộc địa trong giải Ngân Hà.

6. Vladimir Vernadsky (1863-1945)
Lại một nhà khoa học Nga khác – Vladimir Vernadsky. Ông là một nhà địa chất nổi tiếng. Ông là người đã thừa nhận ý tưởng về Noosphere – khái niệm mà sau này Pierre Teilhard de Chardin mô tả như “phạm vi tư tưởng con người”.


Đầu tiên, Vernadsky đã miêu tả noosphere như một giai đoạn thứ ba của cuộc sống trên trái đất. Sau giai đoạn Geosphere (vô thức) và Biosphere (cuộc sống sinh học). Vernadsky cho rằng cuối cùng thì trí khôn (hay ý thức) của mỗi cá nhân sẽ được kết hợp thành một mạng lưới, toàn thế giới sẽ hợp tác phát triển. Có thể nói đây là dự đoán về toàn cầu hóa và hệ thống internet toàn cầu.
7. Pierre Teilhard de Chardin (1881-1955)
Pierre Teilhard de Chardin là linh mục dòng người Pháp, ngoài ra ông còn là một nhà cổ sinh vật học. Trong cuốn sách “The Phenomenon of Man” được xuất bản sau khi ông qua đời, Chardin đã suy đoán rằn nhân loại đang đi trên một quỹ đạo tiến hóa. Ông mô tả việc tiến hóa là “con đường đi lên sinh vật”.

Chính ông là người đã khái niệm hóa Noosphere và nói rằng thế giới đang ở trong giai đoạn Noosphere, nửa thực nửa áo, dường như đang trên quá trình vật chất biến hóa thể nhập hợp nhất với tinh thần, cuối cùng sẽ đạt được đến điểm Omega tuyệt đối trong đời sống tâm ly và vật lý vũ trụ. Nói chung vấn đề này khá hàn lâm nhưng tư tưởng mới của ông cũng mang đến nhiều cảm hứng cho các nhà khoa học hiện đại.

8. J.B.S. Haldane (1892-1944)
John Burdon Sanderson Haldane hay còn được gọi tắt là JBS Haldane là một nhà sinh học tiến hóa rất có tiếng tăm. Ông có tư tưởng tân tiến, đã nhìn trước được các khả năng tương lai của y học như tử cung nhân tạo, nhân bản người hay kĩ thuật di truyền. Đóng góp quan trọng nhất của JBS Haldane không liên quan đến bản đồ di truyền, mà là ứng dụng thống kê học trong di truyền, qua một loạt 10 công trình về tiến hóa của gen được công bố liên tục từ 1924 đến 1934. Do những đóng góp này, JBS Haldane được xem là một trong 3 trụ cột của di truyền quần thể học.


Những dự đoán của ông vào thời điểm lúc bấy giờ khá gây sốc và tranh luận. Ông mở đường bằng chính đóng góp về di truyền của mình và cho rằng nhân loại sẽ sớm có khả năng nhân bản. Ông dự đoán về “tử cung nhân tạo” và liệu pháp gen (ngày nay chúng ta gọi là RNA). Ông còn đưa ra ý kiến về sự thụ tinh nhân tạo (thụ tinh ống nghiệm). Haldane đã thẳng thắn tuyên bố “ Tôi chắc rằng tương lai sẽ còn đáng ngạc nhiên hơn chính tôi tưởng tượng”. Và thật tuyệt vời khi ông đã tiên đoán hoàn toàn chuẩn xác.

(sưu tầm)

# Trí tuệ nhân tạo trong phát triển khoa học kỹ thuật




QĐND - Trí tuệ nhân tạo (TTNT) là "khả năng suy luận và thực hiện các hành động" của các thiết bị, máy móc tương tự như trong não người. Thuật ngữ này được dùng để nói đến các máy tính có mục đích không nhất định, ngành khoa học nghiên cứu lý thuyết và các ứng dụng của TTNT. Đây là một ngành trọng yếu của tin học, liên quan đến cách cư xử, sự học hỏi và khả năng thích ứng thông minh của máy móc. TTNT trở thành một môn học với mục đích chính là cung cấp lời giải cho các vấn đề của cuộc sống thực tế. Ngày nay, các hệ thống nhân tạo được dùng thường xuyên trong kinh tế, y dược, các ngành kỹ thuật quân sự, cũng như trong các phần mềm máy tính thông dụng trong gia đình và trò chơi điện tử.

QĐND - Trí tuệ nhân tạo (TTNT) là "khả năng suy luận và thực hiện các hành động" của các thiết bị, máy móc tương tự như trong não người. Thuật ngữ này được dùng để nói đến các máy tính có mục đích không nhất định, ngành khoa học nghiên cứu lý thuyết và các ứng dụng của TTNT. Đây là một ngành trọng yếu của tin học, liên quan đến cách cư xử, sự học hỏi và khả năng thích ứng thông minh của máy móc. TTNT trở thành một môn học với mục đích chính là cung cấp lời giải cho các vấn đề của cuộc sống thực tế. Ngày nay, các hệ thống nhân tạo được dùng thường xuyên trong kinh tế, y dược, các ngành kỹ thuật quân sự, cũng như trong các phần mềm máy tính thông dụng trong gia đình và trò chơi điện tử.

Mặc dù trong các thế kỷ 18 và 19, sự hình thức hóa trong khoa học và toán học đã tạo điều kiện tiên quyết về mặt trí tuệ cho việc nghiên cứu TTNT, nhưng phải đến thế kỷ 20 cùng với sự ra đời của máy tính số thì TTNT mới trở thành một ngành khoa học có sức sống. Năm 1943, Walter Pitts xuất bản cuốn “Các phép tính logic trong hoạt động trí tuệ” đặt nền móng cho mạng neuron. Thập niên 1950 là thời kỳ có nhiều hoạt động trong lĩnh vực TTNT. Trong các thập niên 1960 và 1970, nhiều nhà toán học đã đưa ra tập hợp các bài toán trong chương trình “cực đại”; các nhà khoa học đã chứng minh các giới hạn của mạng neuron đơn giản, phát triển hệ thống sử dụng luật để biểu diễn tri thức và suy diễn trong các chẩn đoán và liệu pháp y học trong hệ chuyên gia đầu tiên; chiếc xe đầu tiên được máy tính điều khiển tự động cũng ra đời trong thời gian này.


Tên lửa thông minh Elipson của Nhật Bản được ứng dụng TTNT có khả năng dò tìm và khắc phục sự cố trong khi bay. Ảnh tư liệu.
Cuối thập niên 1970, một số nghiên cứu cơ bản trong các lĩnh vực như xử lý ngôn ngữ tự nhiên, biểu diễn tri thức… đã mang lại diện mạo mới cho TTNT. Thị trường tin học đã bắt đầu đón nhận những sản phẩm TTNT ứng dụng đầu tiên mang tính thương mại. Đó là các hệ chuyên gia được áp dụng trong các lĩnh vực khác nhau. Hệ chuyên gia là các phần mềm máy tính, chứa các thông tin và tri thức về một lĩnh vực cụ thể nào đó, có khả năng giải quyết những yêu cầu của người dùng ở một mức độ nào đó với trình độ như một chuyên gia có kinh nghiệm lâu năm. Một trong những hệ chuyên gia đầu tiên được sử dụng thành công trong thực tế là hệ MYCIN. Năm 1972, một sự kiện quan trọng trong sự phát triển khoa học TTNT là sự ra đời của ngôn ngữ PROLOG. Thập niên 1980, mạng neuron được sử dụng rộng rãi với thuật toán truyền ngược. Thập niên 1990 đánh dấu các thành tựu chính trong nhiều lĩnh vực của TTNT và được thể hiện trong nhiều ứng dụng đa dạng như máy tính Deep Blue, một máy tính chơi cờ đã thắng Garry Kasparov trong một trận đấu 6 ván nổi tiếng năm 1997. Bộ Quốc phòng Mỹ công bố chi phí tiết kiệm được do sử dụng công nghệ TTNT để lên kế hoạch cho các đơn vị tham chiến trong Chiến tranh vùng Vịnh lần thứ nhất đã bù lại được toàn bộ đầu tư của chính phủ Mỹ cho nghiên cứu TTNT kể từ thập niên 1950. Gần đây, người máy ASIMOTO của các nhà khoa học Nhật Bản biết đi lên và xuống các bậc cầu thang đã minh chứng cho sự phát triển vượt bậc của TTNT.

Có hai trường phái TTNT là truyền thống và tính toán. TTNT truyền thống là các phương pháp học máy, đặc trưng bởi hình thức hóa và phân tích thống kê. TTNT truyền thống còn được gọi là TTNT biểu tượng, TTNT logic, TTNT ngăn nắp và TTNT cổ điển. Các phương pháp của TTNT truyền thống gồm: Hệ chuyên gia, áp dụng các khả năng suy luận để đưa ra kết luận. Một hệ chuyên gia có thể xử lý các lượng lớn thông tin đã biết và đưa ra các kết luận dựa trên các thông tin đó. Chương trình trợ giúp có hình cái kẹp giấy Clippy của Microsoft Office là một ví dụ. Khi người dùng gõ phím, Clippy nhận ra các xu hướng nhất định và đưa ra các gợi ý cho người dùng... TTNT tính toán nghiên cứu việc học hoặc phát triển lặp. Ví dụ: Tinh chỉnh tham số trong hệ thống. Các phương pháp chính gồm: Phương pháp mạng neuron, phương pháp hệ mờ, phương pháp tính toán tiến hóa.

Con người đã phát triển hệ thống thông minh lai, trong đó kết hợp cả hai trường phái trên. Các phương pháp trí tuệ nhân tạo thường được dùng trong các công trình nghiên cứu khoa học nhận thức, một ngành đang cố gắng tạo ra mô hình nhận thức của con người. TTNT hiện vẫn đang tiếp tục được nghiên cứu. Ở các quốc gia phát triển, ngành khoa học này luôn được coi là ngành khoa học mũi nhọn. Nhiều loại trang thiết bị quân sự hiện đã được ứng dụng TTNT như trong các rô-bốt được thiết kế cho các nhiệm vụ đặc biệt, trong các hệ thống mô phỏng, điều khiển vũ khí, trong UAV (máy bay không người lái)…


Đỗ Văn Trưởng

# Học Công nghệ thông tin cần những tố chất gì?



1. Công nghệ thông tin là gì? 

Khái niệm: Công nghệ thông tin (CNTT) hiểu theo nghĩa rộng và tổng quát nhất là việc sử dụng các công nghệ hiện đại vào việc tạo ra, lưu trữ, xử lý và truyền dẫn thông tin. Có nhiều cách phân loại các chuyên ngành học CNTT nhưng theo chuẩn ACM của Mỹ thì bậc học đại học CNTT được chia làm 5 chuyên ngành là: 
Khoa học máy tính (Computer Science): thiên về các lý thuyết cơ bản của ngành CNTT như lý thuyết tính toán, khoa học vật liệu, lý thuyết xử lý hình ảnh, âm thanh, lý thuyết khai thác cơ sở dữ liệu, …
Kỹ nghệ máy tính (Computer Technology): thiên về đào tạo lý thuyết và ứng dụng liên quan đến thiết kế và sản xuất phần cứng máy tính.
Kỹ nghệ phần mềm (Software Technology): lý thuyết và ứng dụng các công nghệ sản xuất phần mềm, quy trình, công cụ, ngôn ngữ lập trình.
Hệ thống thông tin (Information System): lý thuyết và ứng dụng CNTT trong việc quản lý hệ thống thông tin của doanh nghiệp, tổ chức.
Ứng dụng CNTT (Information Technology): ứng dụng và triển khai CNTT trong các lĩnh vực hoạt động của cuộc sống.
Mỗi ngành chính lại có thể chia ra một số hướng hẹp hơn như trong Kỹ nghệ phần mềm có thể có hướng chuyên sâu về phần mềm nhúng, về các hệ thống phân tán… 

2. Những tố chất khi theo học ngành CNTT

Theo TS Quách Tuấn Ngọc, Giám đốc Trung tâm Tin học Bộ GD-ĐT, sự thành đạt trong ngành CNTT không phụ thuộc nhiều vào bằng cấp. Có thể lấy ngay ví dụ về các ông chủ của hãng phần mềm nổi tiếng thế giới như Microsoft, Apple... đều không phải được đào tạo từ "lò" CNTT. Ngay ở Việt Nam, nhiều người thành công trong lĩnh vực IT nhưng lại không phải là cử nhân hay kỹ sư CNTT, trong khi đó, nhiều người được đào tạo khá bài bản nhưng khi tốt nghiệp lại phải… chuyển nghề. 

Học CNTT không phải là một ngành học có thể chạy theo “mốt” mà nó đòi hỏi người học phải có niềm đam mê và khả năng tư duy tốt. Nhu cầu nguồn nhân lực trong lĩnh vực CNTT ở Việt Nam trong những năm tới là rất lớn, nhưng đòi hỏi phải có chất lượng cao. Yêu cầu đầu tiên khi tuyển dụng của ngành CNTT là sử dụng thành thạo ít nhất một ngoại ngữ cộng với khả năng cập nhật công nghệ và có những kỹ năng cá nhân và chuyên môn. 

Các bạn học sinh phải nhận thức được rằng, không phải ai theo học CNTT cũng có thể kiếm được việc làm đúng nghề, đúng chuyên ngành được đào tạo. Chỉ có người có khả năng (kỹ thuật, ngoại ngữ) mới có công việc tốt. 

Điều đầu tiên để theo học ngành CNTT là bạn cần có trình độ Toán xuất sắc và đầu óc tư duy tốt. 

Ngoại ngữ cũng là điều bắt buộc khi theo học CNTT, nhưng nếu bạn chưa biết hay còn rất yếu về ngoại ngữ thì cũng đừng nên lấy đó là rào cản cho niềm say mê của mình. Ví dụ như tại ĐH FPT, những sinh viên chưa biết ngoại ngữ sẽ được đào tạo qua nhiều mức độ ngoại ngữ cho đến mức có thể theo học được. Vì vậy, bạn hãy trau dồi vốn Tiếng Anh của mình bởi môn học này rất cần thiết khi học tin học. Có học tốt ngoại ngữ thì mới có khả năng đọc tài liệu tin học bằng tiếng Anh và mới có khả năng nghiên cứu tin học.


Nguồn: Internet

# Học ngành Công nghệ thông tin ra trường làm gì?


 

Khối ngành Công nghệ thông tin (CNTT) luôn thu hút sự quan tâm của nhiều thí sinh, đặc biệt là các bạn có niềm đam mê về tin học, mạng máy tính... Sau khi tốt nghiệp khối ngành này, sinh viên sẽ được trang bị những kiến thức gì, làm những công việc gì, bài viết dưới đây sẽ trả lời câu hỏi đó.

>>> Tủ sách hướng nghiệp: Ngành Công nghệ thông tin

Khối ngành CNTT không chiếm tỉ lệ lớn về lượng hồ sơ đăng ký dự thi hàng năm nhưng lại luôn được nhắc đến nhiều bởi sự bùng nổ của ngành CNTT. Tuy nhiên, trong những năm gần đây, lượng thí sinh thi vào khối ngành này đang có xu hướng giảm, tỉ lệ chọi xuống thấp kéo theo đó là mức điểm chuẩn cũng giảm dần. Mức điểm chuẩn của các chuyên ngành trong khối ngành này năm 2011 chủ yếu là dưới 20.

1. Công nghệ thông tin

Ngành CNTT là một ngành chung, sinh viên được trang bị các kiến thức về khoa học tự nhiên, các kiến thức cơ bản như mạng máy tính, an toàn và bảo mật hệ thống thông tin, phân tích và thiết kế hệ thống thông tin, lập trình, phần mềm… đồng thời người học sẽ được lựa chọn các kiến thức các chuyên ngành chuyên sâu như Hệ thống thông tin; công nghệ phần mềm; mạng và truyền thông máy tính; khoa học máy tính. Tùy theo từng chuyên ngành mà sẽ có hướng chuyên sâu và khả năng công tác khác nhau. Khi ra trường, sinh viên được cấp bằng kỹ sư CNTT hoặc cử nhân CNTT tùy theo thời gian đào tạo. Sinh viên sau khi tốt nghiệp có khả năng tham mưu tư vấn, thực hiện các công việc trong lĩnh vực chuyên ngành như lập trình, phân tích thiết kế hệ thống, lập trình hệ thống thống tin, lập dự án xây dựng các phần mềm ứng dụng,… Tham gia công tác tại các cơ quan trong và ngoài nước có liên quan đến lĩnh vực CNTT, các công ty phần mềm, mạng.. các phòng chức năng trong các cơ quan, công ty, trong tâm phụ trách CNTT, hệ thống quản trị; tham gia giảng dạy và nghiên cứu tại các trường ĐH,CĐ,TCCN có đào tạo ngành hoặc chuyên ngành về CNTT.

2. Khoa học máy tính

Đây 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ó học phần/chuyên ngành chuyên sâu, một số chuyên ngà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 chuyên ngà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 chuyên ngà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à chuyên ngà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.

Một số trường đào tạo ngành Khoa học máy tính: Đại học Công Nghệ - ĐHQGHN, ĐH Bách Khoa HN, ĐH Công Nghiệp Hà Nội, ĐH Hà Nội, ĐH Kinh Tế Quốc Dân, ĐH Quốc tế Sài Gòn, Đại Học Thành Đô…

Sau khi tốt nghiệp sinh viên ngành Khoa học máy tính có thể đảm nhận các vị trí xây dựng, vận hành và bảo trì hệ thống máy tính trong các cơ quan nhà nước, các tổ chức kinh tế xã hội, các doanh nghiệp;Các công ty phần mềm, xây dựng website, gia công phần mềm, các công ty tư vấn về lĩnh vực CNTT, các công ty tư vấn và bản trì về mạng và các thiết bị máy tính…, làm việc tại các trung tâm nghiên cứu, viện khoa học công nghệ, tham gia giảng dạy tại các trường ĐH,CĐ có đào tạo chuyên ngành.

3. Hệ thống thông tin

Đây là một chuyên ngành tương đối mới, nhiều sinh viên học năm 1, năm 2 của ngành vẫn chưa hiểu sau này ra làm gì? Công tác ở đâu?

Trước hết, các bạn cần hiểu, hệ thống thông tin là sự kết hợp của phần cứng, phần mềm và mạng truyền thông được xây dựng và sử dụng để thu thập, tạo, và phân phối các dữ liệu, thông tin và tri thức hữu ích một cách đặc trưng trong bối cảnh của tổ chức. Các tổ chức sử dụng các hệ thống thông tin với nhiều mục đích khác nhau: đạt được lợi thế cạnh tranh, nắm bắt được nhiều khác hàng hơn hoặc cải tiến dịch vụ.

Sinh viên tốt nghiệp ngành Hệ thống thông tin có thể làm việc ở nhiều vị trí khác nhau: Phân tích viên hệ thống (systems analyst), tích hợp hệ thống (system integrator), quản trị cơ sở dữ liệu, phân tích hệ thống thông tin; Quản trị hệ thống thông tin trong cơ quan, xínghiệp; Lập trình quản lý cơ sở dữ liệu; Quản lý cơ sở dữ liệu, hỗ trợ ra quyết định cho lãnh đạo; Đào tạo và hướng dẫn các nhân viên ở các bộ phận khác sử dụng thông tin và hệ thống một cách có hiệu quả; Đảm nhận vai trò của một CIO (giám đốc thông tin); Cán bộ quản lý dự án trong các hướng ngành đang có nhu cầu rất lớn của xã hội: giáo dục điện tử (elearning), thương mại điện tử (e-commerce), chính phủ điện tử (e-government), các hệ thống thông tin địa lý (GIS)... Nghiên cứu viên, giảng viên.

4. Mạng máy tính và truyền thông

Người học được trang bị kiến thức về kỹ thuật truyền tin mạng diện rộng, mạng cục bộ, hệ cơ sở dữ liệu phân tán, kỹ năng thiết kế, cài đặt, phát triển ứng dụng các mạng tin học viễn thông.

Ngành mạng máy tính và truyền thông đào tạo kỹ sư nắm vững kiến thức cơ bản và chuyên sâu về ngành nghề, đáp ứng yêu cầu về nghiên cứu, ứng dụng, có khả năng thiết kế chế tạo, bảo trì, sản xuất, thử nghiệm, quản lý các hệ thống mạng máy tính và truyền thông.

Sinh viên tốt nghiệp có khả năng đảm nhận các chức năng tham mưu, tư vấn, tổ chức thực hiện nhiệm vụ với tư cách là một chuyên viên trong lĩnh vực CNTT.

5. Ngành kỹ thuật máy tính

Ngành này đào tạo kỹ sư ngành kỹ thuật máy tính nắm vững các nguyên lý cơ bản và thực tiễn trong lĩnh vực kỹ thuật máy tính, đặc biệt là lĩnh vực thiết kế vi mạch.
Sau khi hoàn thành chương trình, kỹ sư ngành kĩ thuật máy tính có khả năng nghiên cứu và thiết kế các bộ phận chức năng của máy tính, tham gia làm việc trong các dự án sản xuất các thiết bị máy tính cho các tập đoàn lớn trên thế giới đã đầu tư vào Việt Nam như: Intel, IBM, Samsung, Nidec…

6. Ngành kĩ  thuật phần mềm

Ngành kĩ thuật phần mềm trang bị cho sinh viên kiến thức tổng quát về qui trình xây dựng, quản lý và bảo trì hệ thống phần mềm; có khả năng phân tích, thiết kế và quản lý các dự án phần mềm; cung cấp phương pháp luận và công nghệ mới để sinh viên có thể nắm bắt và làm chủ các tiến bộ khoa học.

Sinh viên được cung cấp kiến thức cơ bản về tổ chức và quản lý công nghệ phần mềm để có khả năng xây dựng mô hình và áp dụng các nguyên tắc của công nghệ phần mềm vào thực tế.


(sưu tầm)

# Bài thực hành C\C++ (CDTin K8 - 26/10/2012)

# Bài thực hành C\C++ (CDTin K8 - 26/10/2012)
/* Bài 1. In ra màn hình tất cả các số nguyên gồm 4 chữ số, sao cho tổng các chữ số là số nguyên tố */



#include<iostream.h> 
#include<conio.h> 
void main() {  
     int a, dv,ch,tr,ng;  
     cout<<"\n Ket qua: "; 
     for(a=1000;a<=9999; a++)
    {  
     dv=a%10;   
     ch=(a/10)%10; 
     tr=(a/100)%10;  
    ng=a/1000;
  
   // kiem tra nguyen to   
   int test=0,s=dv+ch+tr+ng;
   for(int i=2;i<s;i++)    
        if(s%i==0){ test=1; break;}  
   if (test==0) cout<<a<<", ";

  } 
getch(); 
}
//------------------------------------------------------
/* Bài 2.
- Nhập vào 1 dãy số nguyên có n số (1<=n<=100)
- In ra màn hình các số lớn hơn 0
- Tìm max
- Tính tổng các số lớn hơn 10
*/

#include<iostream.h> 
#include<conio.h> 

void main(){

int a[100],n;
// Nhap so phan tu n
do{ cout<<"\n n= ";
cin>>n;
if(n<1||n>100) cout<<"\n Nhap lai n!";
}while (n<1||n>100); 
// Nhap day so cout<<"\n Nhap day so:"; for (int i=0; i<n;i++)
{ cout<<"\n a["<<i<<"]= ";
cin>>a[i]; }

// In ra cac so >=0
cout<<"\n In r so khong am: ";
for (i=0;i<n;i++)
if (a[i]>=0)
cout<<a[i]<<", ";

// Tim max
int max=a[0];
for (i=0;i<n;i++)
if (a[i]>max) max=a[i];
cout<<"\n Max= "<<max;

// Tinh tong so >10 long s=0; for (i=0;i<n;i++)
if (a[i]>10) s+=a[i];  cout<<"\n Tong= "<<s;

getch();

} 

# Giới thiệu tổng quan về ngôn ngữ lập trình C


Ngôn ngữ lập trình C là một ngôn ngữ mệnh lệnh được phát triển từ đầu thập niên 1970 bởi Ken Thompson và Dennis Ritchie để dùng trong hệ điều hành UNIX. Từ dó, ngôn ngữ này đã lan rộng ra nhiều hệ điều hành khác và trở thành một những ngôn ngữ phổ dụng nhất. C là ngôn ngữ rất có hiệu quả và được ưa chuộng nhất để viết các phần mềm hệ thống, mặc dù nó cũng được dùng cho việc viết các ứng dụng. Ngoài ra, C cũng thường được dùng làm phương tiện giảng dạy trong khoa học máy tính mặc dù ngôn ngữ này không được thiết kế dành cho người nhập môn.

Tổng quan
C là một ngôn ngữ lập trình tương đối nhỏ gọn vận hành gần với phần cứng và nó giống với ngôn ngữ Assembler hơn hầu hết các ngôn ngữ bậc cao. Hơn thế, C đôi khi được đánh giá như là "có khả năng di động", cho thấy sự khác nhau quan trọng giữa nó với ngôn ngữ bậc thấp như là Assembler, đó là việc mã C có thể được dịch và thi hành trong hầu hết các máy tính, hơn hẳn các ngôn ngữ hiện tại trong khi đó thì Assembler chỉ có thể chạy trong một số máy tính đặc biệt. Vì lý do này C được xem là ngôn ngữ bậc trung.

C đã được tạo ra với một mục tiêu là làm cho nó thuận tiện để viết các chương trình lớn với số lỗi ít hơn trong mẫu hình lập trình thủ tục mà lại không đặt gánh nặng lên vai người viết ra trình dịch C, là những người bề bộn với các đặc tả phức tạp của ngôn ngữ. Cuối cùng C có thêm những chức năng sau:

Một ngôn ngữ cốt lõi đơn giản, với các chức năng quan trọng chẳng hạn như là những hàm hay việc xử lý tập tin sẽ được cung cấp bởi các bộ thư viện các thủ tục.
Tập trung trên mẫu hình lập trình thủ tục, với các phương tiện lập trình theo kiểu cấu trúc.
Một hệ thống kiểu đơn giản nhằm loại bỏ nhiều phép toán không có ý nghĩa thực dụng.
Dùng ngôn ngữ tiền xử lý, tức là các câu lệnh tiền xử lý C, cho các nhiệm vụ như là định nghĩa các macro và hàm chứa nhiều tập tin mã nguồn (bằng cách dùng câu lệnh tiền xử lý dạng #include chẳng hạn).

Mức thấp của ngôn ngữ cho phép dùng tới bộ nhớ máy tính qua việc sử dụng kiểu dữ liệu pointer.

Số lượng từ khóa rất nhỏ gọn.

Các tham số được đưa vào các hàm bằng giá trị, không bằng địa chỉ.
Hàm các con trỏ cho phép hình thành một nền tảng ban đầu cho tính đóng và tính đa hình.
Hỗ trợ các bản ghi hay các kiểu dữ liệu kết hợp do người dùng từ khóa định nghĩa struct cho phép các dữ liệu liên hệ nhau có thể được tập hợp lại và được điều chỉnh như là toàn bộ.
Một số chức năng khác mà C không có (hay còn thiếu) nhưng có thể tìm thấy ở các ngôn ngữ khác bao gồm:

- An toàn kiểu,

- Tự động Thu dọn rác,

- Các lớp hay các đối tượng cùng với các ứng xử của chúng (xem thêm OOP),

- Các hàm lồng nhau,

- Lập trình tiêu bản hay Lập trình phổ dụng,

- Quá tải và Quá tải toán tử,

- Các hỗ trợ cho đa luồng, đa nhiệm và mạng.

Mặc dù C còn thiếu nhiều chức năng hữu ích nhưng lý do quan trọng để C được chấp nhận vì nó cho phép các trình dịch mới được tạo ra một cách nhanh chóng trên các nền tảng mới và vì nó cho phép người lập trình dễ kiểm soát được những gì mà chương trình (do họ viết) thực thi. Đây là điểm thường làm cho mã C chạy hiệu quả hơn các ngôn ngữ khác. Thường thì chỉ có ngôn ngữ ASM chỉnh bằng tay chạy nhanh hơn (ngôn ngữ C), bởi vì ASM kiểm soát được toàn bộ máy. Mặc dù vậy, với sự phát triển các trình dịch C, và với sự phức tạp của các CPU hiện đại, C đã dần thu nhỏ khoảng cách khác biệt về vận tốc này.

Một lý do nữa cho việc C được sử dụng rộng rãi và hiệu quả là do các trình dịch, các thư viện và các phần mềm thông dịch của các ngôn ngữ bậc cao khác lại thường được tạo nên từ C.

Thí dụ "hello, world"

Thí dụ đơn giản sau đây được thấy trong lần in đầu tiên của cuốn "The C Programming Language", và đã trở thành bài tiêu chuẩn trong chương nhập môn của hầu hết các loại sách giáo khoa về lập trình. Chương trình hiển thị câu "hello, world!" trên đầu ra chuẩn, mà thường là một màn hình. Mặc dù vậy, nó có thể xuất ra một tập tin hay xuất ra trên một thiết bị phần cứng kể cả trên một vùng chứa, tùy thuộc vào việc đầu ra chuẩn được chỉ thị vào đâu khi chương trình này được thực thi.
#include <stdio.h> int main(void){    printf("hello, world!");    return 0;}
Chương trình trên sẽ dịch đúng trong hầu hết các trình dịch hỗ trợ chuẩn ANSI C hay chuẩn C99.

Sau đây là các phân tích theo từng dòng mã của thí dụ trên

#include <stdio.h>
Dòng đầu tiên này là một chỉ thị tiền xử lý #include. Điều này sẽ làm cho bộ tiền xử lý (bộ tiền xử lý này là một công cụ để kiểm tra mã nguồn trước khi nó được dịch) tiến hành thay dòng lệnh đó bởi toàn bộ các dòng mã hay thực thể trong tập tin mà nó đề cập đến (tức là tập tin stdio.h). Dấu ngoặc nhọn bao quanh stdio.h cho biết rằng tập tin này có thể tìm thấy trong các nơi đã định trước cho bộ tiền xử lý biết thông qua các đường tìm kiếm đến các tập tin header. Tập hợp các tập tin được khai báo sử dụng qua các chỉ thị tiền xử lý còn được gọi là các tập tin bao gồm.

int main(void)

Dòng trên biểu thị một hàm chuẩn tên main. Hàm này có mục đích đặc biệt trong C. Khi chương trình thi hành thì hàm main() được gọi trước tiên. Phần mã int chỉ ra rằng giá trị trả về của hàm main (tức là giá trị mà main() sẽ được trả về sau khi thực thi) sẽ có kiểu là một số nguyên. Còn phần mã (void) cho biết rằng hàm main sẽ không cần đến tham số để gọi nó. 

Dấu '{' cho biết sự bắt đầu của định nghĩa của hàm main.

    printf("hello, world\n");
Dòng trên gọi đến một hàm chuẩn khác tên là printf. Hàm này đã được khai báo trước đó trong trong tập tin stdio.h. Dòng này sẽ cho phép tìm và thực thi mã (đã được hỗ trợ sẵn) với ý nghĩa là hiển thị lên đầu ra chuẩn dòng chữ

hello, world<kí tự xuống dòng EOL-chuyển dấu nhắc sang dòng mới>.

Mã kí tự \n là một dãy thoát được chuyển dịch thành dấu kí tự EOL (viết tắt từ chữ End-Of-Line) có nghĩa là chuyển vị trí dấu nhắc xuống đầu một dòng kế. Gía trị trả về của hàm printf (theo khai báo nguyên mẫu chuẩn của hàm này trong C) có kiểu int, nhưng vì giá trị trả về này không được (người lập trình) dùng tới nên giá trị đó bị bỏ qua (một cách lặng lẽ).

    return 0;

Dòng này sẽ kết thúc việc thực thi mã của hàm main và buộc nó trả về giá trị 0 (là một số nguyên như khai báo ban đầu int main ).

}
Dấu '}' cho biết việc kết thúc mã cho hàm main.

Các kiểu

C có một hệ thống kiểu tương tự như của Pascal, mặc dù chúng khác nhau trong một số khía cạnh. Có nhiều kiểu cho các số nguyên với nhiều cỡ cho có đấu và không có dấu, có kiểu số floating point, kiểu các kí tự char, các kiểu thứ tự enum, kiểu bản ghi record và kiểu đơn vị union.

C tạo ra sự mở rộng mạnh mẽ việc sử dụng của kiểu các con trỏ pointer, một dạng đơn giản các tham chiếu mà chúng chứa địa chỉ các vùng nhớ. Các con trỏ có thể được tham chiếu ngược (dereference) để lấy về giá trị của dữ liệu được chứa trong địa chỉ đó (địa chỉ mà con trỏ chỉ vào). Địa chỉ này có thể được điều chỉnh bằng các phép gán thông thường và các phép toán số học trên con trỏ. Trong thời gian thực thi, một con trỏ đại diện cho một địa chỉ của bộ nhớ. Trong thời gian chuyển dịch, nó là một kiểu phức tạp đại diện cho cả địa chỉ và kiểu của dữ liệu. Điều này cho phép các biểu thức bao gồm các con trỏ được kiểm tra về kiểu. Các con trỏ thì được dùng cho nhiều mục tiêu trong C. Các dòng kí tự string thường được đại diện bởi một con trỏ chỉ tới một dãy của các kí tự. Sự cấp phát bộ nhớ động, được miêu tả sau đây, thì được tiến hành thông qua các con trỏ.

Một con trỏ rỗng có nghĩa là nó không chỉ đến một chỗ nào hết. Điều này có ích trong những trường hợp như là con trỏ next trong một nút cuối của một danh sách liên kết linked list. Việc tham chiếu ngược một con trỏ trống gây ra các biểu hiện không dự đoán trước được. Các con trỏ kiểu void thì lại có thể chỉ đến một đối tượng mà không cần biết kiểu của đối tượng đó. Điều này đặc biệt hữu dụng trong lập trình tiêu bản bởi vì cỡ và kiểu của các đối tượng mà chúng chỉ tới thì không thể biết được và do đó không thể thực hiện tham chiếu ngược, nhưng chúng lại có thể được hoán chuyển thành các con trỏ của các kiểu khác.

Các kiểu mảng array trong C thì có cỡ cố định, độ lớn tĩnh của nó phải được biết trước trong thời gian chuyển dịch. Điều này gây nhiều trở ngại trong thực tế bởi vì người ta có thể chỉ định các vùng nhớ ở thời gian thực thi dựa trên các thư viện chuẩn và hành xử chúng như là các mảng. Không như các ngôn ngữ khác, C biểu thị các mảng giống như trường hợp các con trỏ: chúng đóng vai trò một địa chỉ của bộ nhớ và một kiểu dữ liệu. Do đó, các giá trị chỉ số có thể vượt quá cỡ của một mảng.

C cũng cung cấp các kiểu mảng đa chiều. Các giá trị chỉ số của các mảng đa chiều thì được gán theo thứ tự hàng chính. Một cách có ý nghĩa thì các mảng này hoạt động như là mảng của các mảng nhưng thực chất chúng được phân bố như là mảng một chiều với việc tính và tạo các vị trí tương đối.

C thường được dùng trong việc lập trình các hệ thống bậc thấp, ở đó có thể cần thiết để xem số nguyên như là một địa chỉ của bộ nhớ, là một giá trị double precision, hay là một kiểu con trỏ. Trong các trường hợp này, C cung cấp việc hoán chuyển, mà phép toán này sẽ bắt buộc chuyển đổi giá trị từ một kiểu sang một kiểu khác. Dùng phép hoán chuyển sẽ làm mất đi phần nào tính an toàn mà thường được cung cấp bởi hệ thống kiểu.

Tồn trữ dữ liệu

Một trong những chức năng quan trọng nhất của một ngôn ngữ lập trình là việc cung cấp cơ sở cho việc quản lý bộ nhớ và các đối tượng được chứa trong bộ nhớ. C cung ứng 3 phương cách để cấp phát bộ nhớ cho các đối tượng:

Sự cấp phát vùng nhớ tĩnh: khoảng trống dành cho đối tượng thì được cung cấp trong phần mã nhị phân ở thời gian dịch; những đối tượng này có một thời gian sống lâu dài theo sự tồn tại của phần mã nhị phân chứa chúng (các đối tượng).

Sự cấp phát vùng nhớ tự động: Các đối tượng tạm thời có thể được chứa trong một chồng (stack), và khoảng trống này thì được trả về một cách tự động và có thể được dùng lại sau khi khối mã mà chúng (tức các đối tượng tạm thời) được khai báo đã thực thi xong.

Sự cấp phát vùng nhớ động: Các khối của bộ nhớ với bất kì cỡ lớn mong muốn nào đều có thể được yêu cầu (hay xin) trong thời gian thi hành bằng cách dùng các hàm thư viện như là malloc(), realloc() và free() từ một khu vực của bộ nhớ có tên là heap; các khối này có thể được tái dụng sau khi gọi hàm free() để hoàn trả chúng lại cho bộ nhớ.

Ba phương án này thích hợp cho các tình huống khác nhau và có những hậu quả khác nhau. Thí dụ, kiểu cấp phát tĩnh sẽ không cần thời gian (để tính toán) cho sự cấp phát, kiểu cấp phát tự động sẽ cần một khoảng thời gian nào đó cho dự tính, và kiểu cấp phát động có thể đòi hỏi một lượng lớn thời gian dùng dễ tính toán cho việc cấp phát và hoàn trả (các vùng nhớ đã được yêu cầu trước đó). Mặt khác, khoảng trống của chồng thường giới hạn cho vùng nhớ tĩnh hay cho khoảng trống của heap, và chỉ kiểu cấp phát vùng nhớ động là cho phép sự cấp phát cho các đối tượng mà kích thước của nó chỉ có thể biết được trong lúc thi hành. Hầu hết các chương trình C đều dùng nhiều cả ba phương cách này.

Khi có thể thì sự cấp phát tự động hay sự cấp phát tĩnh thường được dề nghị dùng vì kho nhớ được quản lý bởi trình dịch, giải phóng cho người lập trình những lồi lầm phiền hà khi phải xin cấp phát và hoàn trả các vùng nhớ bằng tay. Rất tiếc nhiều cấu trúc dữ liệu có thể trương nở trong thời gian thực thi và vì kiểu cấp phát tĩnh và kiểu tự động phải có một độ lớn cố định ở thời gian dịch nên trong nhiều tình huống mà buộc phải dùng kiểu cấp phát động. Các dãy thay đổi về độ lớn là một thí dụ điển hình của trường hợp này. (Xem thí dụ từ bài malloc về các dãy được cấp phát vùng nhớ động.)

Cú pháp

Cú pháp ngôn ngữ C

Không như Fortran, C là ngôn ngữ dạng tự do, cho phép người lập trình tùy tiện sử dụng kí tự whitespace để xếp đặt (cách trình bày) mã nguồn. Các dòng chú giải hoặc có thể đặt nằm giữa /* và */ hoặc viết từng dòng bắt đầu bởi // theo sau đó là các chú giải.

Mỗi tập tin chứa mã có thể chứa các khai báo và các định nghĩa hàm. Các định nghĩa hàm, chính chúng, cũng chứa các khai báo và các mệnh đề. Các khai báo thì hoặc là định nghĩa những kiểu mới với các từ khoá như struct, union, và enum, hoặc là gán các kiểu và đăng kí vùng chứa (trong bộ nhớ) cho các biến mới (thí dụ: *char myname = "ABC"). Các từ khoá như là char và int cũng như là kí hiệu con trỏ chỉ tới * là các kiểu sẵn có. Các khối mã thì được đóng ở giữa các dấu { và } để chỉ ra phần (mã) mà các khai báo và các cấu trúc điều khiển (bên trong dấu ngoặc) có hiệu lực.

Như là một ngôn ngữ mệnh lệnh, C phụ thuộc vào các mệnh đề (câu lệnh) để làm hầu hết các việc. Hầu hết các mệnh đề lại là các mệnh đề biểu thức mà một cách đơn giản chúng tạo nên việc đánh giá các biểu thức đó -- và trong quá trình này, các biến nhận được các giá trị mới hoặc các giá trị này được trả ra. Các mệnh đề dòng điều khiển cũng có hiệu lực cho việc thực thi có điều kiện hay có lặp lại, mà chúng được cấu tạo với các từ khóa như là if, else, switch, do, while và for. Các nhảy dòng cũng có thể thực hiện qua câu lệnh goto. Nhiều phép toán khác nhau được cung cấp sẵn để thực thi trên các phép tính cơ sản về số học, lô gíc, so sánh, kiểu bit, chỉ số của mảng, và phép gán giá trị. Các biểu thức cũng gọi các hàm, bao gồm một số lượng lớn các hàm thư viện, để tiến hành các thao tác chung.

Các vấn đề của C

Một câu nói phổ biến được người ta lập lại nhiều lần của một nhà thiết kế trình dịch Bjarne Stroustrup, người sáng lập ra C++, là "C makes it easy to shoot yourself in the foot." (tạm dịch: "C làm cho việc bạn tự hại bạn trở nên dễ dàng") [1]. Nói cách khác, C cho phép nhiều phép toán không mong muốn trong một cách tổng quát, và do đó, nhiều lỗi đơn giản đã được tạo ra bởi một người lập trình mà chúng lại không thể phát hiện qua trình dịch hay ngay cả không phát hiện ra trong lúc thi hành. Điều này là nguyên nhân của một số chương trình có các ứng xử không lường trước được và có các lỗ hổng về an toàn. Một dị bản ngôn ngữ C là Cyclone điều chỉnh được một phần trong số các vấn đề như vậy.

Một lý do của các vấn đề nêu trên là để tránh cho cái giá quá cao phải trả cho việc kiểm soát (lỗi) ở thời gian dịch và thời gian thi hành. Một lý do khác là sự đòi hỏi để giữ C được càng hiệu quả và càng uyển chuyển càng tốt. Một ngôn ngữ càng mạnh thì càng khó khăn cho ngôn ngữ đó để làm rõ ràng mọi thứ trong các chương trình (được viết trong ngôn ngữ này). Một số việc kiểm tra đã được dựa trên các công cụ bên ngoài, những công cụ như vậy được bàn đến trong phần Các công cụ kiểm tra tĩnh bên ngoài cho trình dịch.


Sự cấp phát vùng nhớ

Một vấn đề với C (và đây thường là vấn đề lớn cho những người mới làm quen với C) là việc cấp phát (vùng nhớ) một cách tự động hay một cách động cho các đốì tượng mà không khởi động chúng. Các đối tượng này, ban đầu, chứa các giá trị bất kì trong khoảng nhớ mà chúng được cấp phát. Các giá trị này có thể là các giá trị ngẫu nhiên còn lại trong bộ nhớ mà chưa được làm sạch, chúng hoàn toàn không dự đoán được. Nếu một chương trình có khai biến mà lại không gán giá trị ban đầu, thường là 0 (cho kiểu số) hay null (cho kiểu con trỏ) hay "" (cho kiểu dãy kí tự, ...) thì có thể gây ra các phản ứng không lường trước được của chương trình đó. Hầu hết các trình dịch C hiện đại có thể phát hiện và cảnh cáo về việc "quên gán giá trị khởi động" trong nhiều trường hợp, nhưng cũng không hoàn toàn hiệu quả.

Một vấn đề thường thấy khác là bộ nhớ heap không thể được tái dụng cho tới khi nó được hoàn trả lại về cho bộ nhớ bởi người lập trình bằng câu lệnh free(). Hậu quả là nếu người lập trình quên hoàn trả các vùng đã cấp phát về cho bộ nhớ và lại tiếp tục dùng các lệnh cấp phát, thì càng lúc càng nhiều các phần của bộ nhớ bị chiếm chỗ. Lỗi này là một loại lỗi kiểu memory leak tức là "rỉ bộ nhớ". Ngược lại, cũng có trường hợp trả tự do phần đã cấp phát về cho bộ nhớ quá sớm và lại tiếp tục sử dụng vùng nhớ đã trả về thì cũng có thể dễ gây ra việc nhận sai các giá trị hay tạo ra các tình huống không lường trước được. Lý do là vì máy tính khi nhận lại các vùng đã được trả sẽ có thể dùng vùng nhớ đó cho các việc khác. Một số ngôn ngữ xử lý chuyện này với việc tự động dọn rác.

Các con trỏ

Các con trỏ là một nguồn gốc chính của nhiều nguy hiểm bởi vì chúng không được kiểm tra, một con trỏ có thể được tạo ra để chỉ tới bất kì đối tượng nào bất kể kiểu nào, kể cả các mã (nhị phân), và khi được dùng đến (hay được viết ra), có thể gây ra các hiệu ứng không lường trước được. Mặc dù hầu hết các con trỏ thường chỉ tới các chỗ an toàn, chúng vẫn có thể di chuyển tới những chỗ không an toàn như khi dùng các phép toán số học trên các con trỏ (thường là cộng trừ trên các địa chỉ mà chúng chỉ tới), vùng nhớ chỗ chúng chỉ tới có thể đã được trả về và đã được tái dụng (con trỏ đu đưa), chúng có thể đã không được khởi động (con trỏ hoang), hay chúng được trực tiếp gán một giá trị nào đó qua việc dùng toán tử đổi kiểu (cast) hoặc được gán qua một con trỏ đã bị hủy hoại. Một vấn đề khác với các con trỏ là việc C cho phép tự do chuyển đổi giữa hai kiểu con trỏ bất kì. Các ngôn ngữ khác điều chỉnh các vấn đề này bằng cách dùng các kiểu tham chiếu bị giới hạn hơn.

Các mảng

Mặc dù C có hỗ trợ riêng cho các mảng tĩnh, nhưng nó không kiểm tra xem các chỉ số mảng có hợp lệ hay không (kiểm tra biên). Thí dụ, người ta có thể viết phần tử thứ 6 của một mảng được định nghĩa với 5 phần tử, và điều này có thể mang lại các hậu quả không mong muốn. Lỗi này thuộc loại lỗi tràn bộ nhớ đệm. Đây là nguồn gốc của nhiều lỗ hổng an ninh trong các chương trình viết bằng C. Mặt khác, do sự giới hạn về kỹ thuật kiểm tra biên ở thời điểm C ra đời (khi gần như chưa có kỹ thuật kiểm tra biên), nên việc kiểm tra biên trở nên ảnh hưởng nặng đến tốc độ thực thi, đặc biệt là trong các tính toán số.

Các mảng đa chiều rất cần thiết khi cài đặt các thuật toán số (chủ yếu áp dụng cho đại số tuyến tính) để chứa các ma trận. Nhưng cấu trúc mảng theo C không những không đáp ứng mà còn không tương hợp cho thao tác chuyên biệt này. Vấn đề này đã được bàn thảo trong sách Numerical Recipes in C, chương 1.2, trang 20 ff (đọc trực tuyến). Người ta có thể tìm thấy ở đây một giải pháp tốt được dùng xuyên suốt trong cả cuốn sách này.

Các hàm tham lượng động

Một vấn đề thường thấy khác là về các hàm tham lượng động (variadic function), tức là, các hàm mà có thể thay đổi được số lượng của các tham số. Không giống như các nguyên mẫu khác của hàm trong C, kiểm tra số lượng tham số ở thời điểm dịch là không bắt buộc bởi tiêu chuẩn, và một cách tổng quát là không thể kiểm tra được nếu không có thêm thông tin. Nếu dữ liệu có kiểu không đúng được chuyển vào, thì hậu quả sẻ không lường được, và thường tạo sự hư hại hoàn toàn. Các hàm tham lượng động cũng xử lý các hằng số con trỏ rỗng trong một cách không biết trước được.

Thí dụ: Họ các hàm printf cung cấp bởi thư viện chuẩn, được dùng để định dạng các dòng chữ xuất ra, thì có tiếng vì các lỗi trong giao diện tham lượng động của nó; nó dựa trên một sự định dạng của dãy kí tự để biểu trưng số và kiểu của các tham số theo sau.

Mặc dù kiểm tra kiểu của các hàm tham lượng động từ thư viện chuẩn là một vấn đề về chất lượng của sự thiết lập, nhiều trình dịch hiện đại đặc biệt tiến hành kiểm tra kiểu của việc gọi printf, và sản sinh ra các cảnh cáo nếu danh mục tham số mà không tương ứng với dãy kí tự định dạng. Dẫu sao thì không phải tất cả các lần gọi printf đều có thể được kiểm tra một cách tĩnh bởi vì có thể dãy kí tự định dạng chỉ được lập thành ở thời gian thực thi, khi mà các hàm tham lượng động thường vẫn không kiểm tra được.

Cú pháp

C có nhiều điểm yếu trong cú pháp. Đáng chú ý là:
Nguyên mẫu của hàm nào không chỉ ra tham số nào thì được hiểu ngầm là cho phép một tập bất kì các tham số. Một vấn đề về cú pháp đã được đề ra cho khả năng tương thích ngược của K&R C, về việc thiếu các nguyên mẫu.

Một số sự chọn lựa đáng ngờ vực về thứ tự ưu tiên của các toán tử, chẳng hạn như == "nối kết" một cách chặt chẽ hơn & và | trong các biểu thức như là x & 1 == 0.

Việc dùng toán tử "=" một cách dễ nhầm lẫn. Nếu dùng trong đẳng thức toán học để chỉ các phép gán, dẫn tới các phép gán không chủ định trong việc so sánh và dẫn tới một ấn tượng sai lầm rằng phép gán có tính bắc cầu. Thí dụ: việc dùng câu lệnh if (x=0) { ...} sẽ dễ gây ra các lỗi bất ngờ.

Thiếu các toán tử infix cho các đối tượng phức tạp, đặc biệt là cho các phép toán trên dãy các kí tự làm cho chương trình phụ thuộc nặng nề lên các phép toán rất khó đọc.

Dựa vào quá nhiều trên hệ thống kí hiệu làm cơ sở cho cú pháp ngay cả ở nơi không tường minh như là "&&" và "||" thay vì dùng "and" và "or".

Cú pháp khai báo không được dễ hiểu, đặc biệt cho hàm của các con trỏ. Trong tình huống hoàn toàn tương tự của C++, nhà nghiên cứu Damian Conway nói về cú pháp của khai báo như sau:

Khó để mà đặc tả một kiểu trong C++ bởi vì thực tế là một số phần tử của việc khai báo (như là con trỏ) thì là các toán tử tiền tố trong khi một số khác (như là mảng) lại là toán tử hậu tố (nghĩa là phải đặt * đứng trước tên con trỏ và dặt [] sau tên mảng -- người dịch). Nhừng toán tử khai báo này lại có các thứ tự ưu tiên khác nhau, cần phải được đặt trong các dấu ngoặc cẩn thận để đạt được sự khai báo mong muốn.


Các vấn đề về bảo trì

Có một số vấn đề khác của C mà không trực tiếp do các lỗi hay sai sót, nhưng lại làm ngăn trở khả năng của người lập trình để xây đựng một hệ thống cỡ lớn, có thể bảo trì và ổn định. Các điển hình bao gồm:

Hệ thống rời rạc vì các câu lệnh định nghĩa nhập (#include) dựa trên các dòng chữ nội tại rải rác không đồng nhất (trong các tập tin) nhằm giữ các nguyên mẫu và các định nghiã được đồng bộ. Điều này làm tăng đáng kể số lần cho việc tạo dựng (phần mềm).

Mô hình chuyển dịch rối rắm. Nó buộc phải có việc theo dõi các sự phụ thuộc (về mã) bằng tay và nó ngăn cấm sự tối ưu hóa trình dịch giữa các mô dun (ngoại trừ sự tối ưu hoá thời gian liên kết).

Hệ thống kiểu yếu dẫn tới việc các chương trình có lỗi hiển nhiên nhưng vẩn được dịch mà không bị bắt lỗi.

Các công cụ kiểm tra tĩnh cho trình dịch

Nhiều công cụ đã được tạo ra để giúp người lập trình C tránh dược các lỗi. Việc kiểm tra và kiểm toán mã nguồn tự động thì rất hiệu quả trong mọi ngôn ngữ. Chẳng hạn cho C là Lint. Một thực tế là sử dụng Lint để phát hiện các mã có nghi vấn khi một chương trình được viết lần đầu. Một khi chương trình đã qua được Lint, thì nó được chuyển dịch bởi một trình dịch C. 

Cũng có một thư viện cho việc tiến hành kiểm tra các biên của mảng và một dạng giới hạn của việc tự động dọn rác, nhưng đó không phải là một phần tiêu chuẩn của C.

Điều nên nhận thức là các công cụ này không phải là vạn năng. Bởi vì sự linh hoạt của C, nhiều kiểu lỗi như là việc dùng sai các hàm tham lượng động, việc dùng chỉ số ngoài biên của mảng và quản lý bộ nhớ không đúng thì không thể phát hiện được. Mặc dù vậy, nhiều trường hợp (lỗi) thông thường đều có thể được nhận ra.


Quan hệ với C++

C++ nguyên là sự kết thừa từ C. Mặc dù vậy, không phải mọi chương trình trong C đều hợp lệ trong C++. Vì là hai ngôn ngữ độc lập, số lượng không tương thích giữa hai ngôn ngữ này đã tăng lên. [2]. Phiên bản cuối cùng C99 đã tạo ra thêm nhiều tính năng xung đột (giữa C và C++). Các sự khác nhau này tạo ra khó khăn để viết các chương trình và thư viện đẻ có thể được dịch và hoạt động chính xác trong cả hai loại mã C hay C++, đồng thời gây nhầm lẫn cho những người lập trình dùng cả hai ngôn ngữ này. Sự chênh lệch này cũng gây khó khăn cho ngôn ngữ này có thể tiếp thu các tính năng của ngôn ngữ kia.

Bjarne Stroustrup, cha đẻ của C++ đã lập đi lập lại rằng [3]: Các tính chất không tương thích giữa C và C++ nên được hạ thấp càng nhiều càng tốt để mở rộng tối đa khả năng hoạt động thông suốt của hai ngôn ngữ này. Một số người tranh biện rằng vì C và C++ là hai ngôn ngữ khác nhau, sự tương thích giữ chúng thì hữu ích nhưng không phải có tính sống còn, theo lập trường này, nỗ lực để giảm sự không tương thích không được phá hủy cố gắng để nâng cao mỗi ngôn ngữ đứng riêng.

Ngày nay, những khác nhau căn bản, không kể các mở rộng thêm vào của C++ như là các lớp, các tiêu bản, các không gian tên, và quá tải, giữa hai ngôn ngữ là:

inline — các hàm inline có giá trị toàn cục trong C++ và chỉ có giá trị trong phạm vi tập tin trong C.

Từ khóa bool trong C99 thì có riêng tập tin tiêu dề của nó là <stdbool.h>. Các chuẩn C trước đây đã không định nghĩa kiểu boolean và nhiều phương pháp không tương thích đã được dùng để mô phỏng kiểu boolean.

Các hằng kí tự (được đặt trong dấu ') có độ lớn của một int trong C và có độ lớn của một char trong C++. Mặc dù vậy, ngay cả trong C các hàng này sẽ không bao giờ vượt quá giá trị của một char, cho nên việc chuyển đổi kiểu (char)'a' thì hoàn toàn an toàn.

Nhừng từ khóa mới thêm vào trong C++ sẽ không thể dược dùng làm các tên trong C như trước đây nữa. (Thí dụ: try, catch, template, new, delete, ...).

Trong C++, trình dịch tự dộng tạo một "thẻ" cho mỗi struct, union hay enum, do vậy, struct S {}; trong C++ tương đương với typedef struct S {} S; trong C.

C99 tiếp thu một số tính năng mà xuất hiện đầu tiên trong C++. Trong số đó là:
Bắt cuộc khai báo nguyên mẫu của hàm.

Thêm từ khóa inline.

Hủy bỏ "hiểu ngầm" của sự trả về sẽ có kiểu int.

Ngôn ngữ trung gian

C được dùng như là một ngôn ngữ trung gian vì nó có thể xuất thành dạng tập tin object hay ngôn ngữ máy. Việc này giúp C trở nên dễ vận chuyển hay dễ tối ưu hóa. Các trình dịch C thường có sẵn cho nhiều loại CPU và các hệ điều hành và hầu hết những trình dịch đó cho ra được tập tin *.obj cũng như ngôn ngữ máy có tối ưu hóa. Do đó, các đầu ra của mã nguồn C đột nhiên trở nên rất là dễ vận chuyển, và có khả năng dùng trong dạng *.obj hay mã máy được tối ưu hóa. Dầu sao thì C được thiết kế như là một ngôn ngữ lập trình, nó không phải là lý tưởng cho việc dùng như là một ngôn ngữ trung gian. Điều này dẫn tới việc phát triển các ngôn ngữ trung gian lấy C làm cơ sở, như là một C--.

Các trình dịch quan trọng

Những trình dịch về C ngày nay thương được cung cấp kèm chung với C++ và ngay cả trình dịch cho ngôn ngữ Assembly. Những sản phẩm trình dịch được bán phổ biến trên thị trường cũng thường cung cấp thêm nhiều công cụ trợ giúp cho người lập trình như là IDE, debugger, ...
Sau đây là danh sách một số trình dịch phổ biến:
GCC trình dịch hoàn toàn miễn phí của theo giấy phép GNU toàn bộ gói sẽ bao gồm trình dịch của nhiều ngôn ngữ điển hình là C/C++ và Fortran. Đây là trình dịch chính dùng cho các hệ diều hành Linux. Nó hỗ trợ hầu hết các tiêu chuẩn C/C++. Tuy nhiên vì là miễn phí nên nó không cung cấp các phương tiện đồ họa hỗ trợ cho việc sửa lỗi và viết mã mặc dù nó cũng có các công cụ để giúp phát hiện lỗi rất mạnh như gdb.

Borland C/C++, trình dịch này ngày nay đã đổi tên thành Borland Builder và bị giảm sút thị phần rất nhiều nhưng đây là trình dịch có hỗ trợ chuẩn C98.

Microsoft C/C++, đây là trình dịch chỉ được dùng chủ yếu để phát triển tcác phần mềm trên các hệ Windows. Trình dịch này rất mạnh về các hỗ trợ đồ họa cũng như các công cụ để phát triển và sản xuất phần mềm. Rất tiếc, trình dịch này không hoàn toàn tương thích với các chuẩn. Để có mã nguồn theo chuẩn thì người lập trình phải cài đặt lại một số thông số mặc định. Một điểm yếu của trình dịch này là nó không hỗ trợ cho các hệ điều hành nào không do Microsoft sản xuất.

Ngoài ra, còn rất nhiều trình dịch khác ở mức độ ít phổ biến hơn như là trình dịch C/C++ của Intel, Bell Labs,...

(theo Wiki)

Danh mục bài viết