40 nguyên tắc sáng tạo ứng dụng trong tin học và quá trình tiến hóa ngôn ngữ lập trình

Hệ thống giáo dục, thi thố tài năng bằng sự thuộc lòng những hiểu biết “uyên thâm” thách thức đối đáp thông thạo trước những câu đối chứa đựng các điển tích và những thuật chơi chữ hóc búa, chuẩn mực người tài là người “thông kim bác cổ”, hiểu biết “thiên kinh vạn quyển” đang dần bị thay thế bởi năng lực ra những quyết định sáng tạo trong các tình huống không ngừng biến động của hoàn cảnh. Điều đó càng rõ ràng trong bài luận này khi đã cho ta thấy được sự “có mặt” rộng khắp của 40 phương pháp sáng tạo như thế nào trong công nghệ thông tin nói chung và trong ngôn ngữ lập trình nói riêng. Ta cũng có thể thấy được sự phổ biến của nó trong cuộc sống quanh ta hiện nay nhiều như thế nào. Nó là sự kết tinh của hàng triệu bằng sáng tạo, vì vậy cũng dễ hiểu vì sao ngày càng nhiều nước trên thế giới du nhập, quan tâm đến nó hơn.

pdf43 trang | Chia sẻ: lylyngoc | Lượt xem: 2701 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu 40 nguyên tắc sáng tạo ứng dụng trong tin học và quá trình tiến hóa ngôn ngữ lập trình, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Fedora, …) 2. Nguyên tắc “tách khỏi”: Nội dung: - Tách phần gây “phiền phức” (tính chất “phiền phức”) hay ngược lại tách phần duy nhất “cần thiết” (tính chất “cần thiết”) ra khỏi đối tượng. Ví dụ: 6 - Trong cơ chế nén âm thanh MP3 loại bỏ đi các phần tín hiệu của âm thanh mà đa số mọi người không thể nghe được nhờ các đặc điểm chức năng nghe của con người. Tượng tự, trong kỹ thuật nén ảnh như JPEG loại bỏ thông tin để đạt được tỉ lệ nén ảnh cao hơn của một ảnh mà không biến dạng ảnh quá nhiều. - Khi dữ liệu ít, ta lưu trữ chúng ở vài máy tính trong phòng, trong công ty. Nhưng khi dữ liệu lớn sẽ khó khăn trong việc bảo trì, mở rộng, … Do đó, ta phải nhờ tới data center. 3. Nguyên tắc phẩm chất cục bộ: Nội dung: - Chuyển đối tượng (hay môi trường bên ngoài, tác động bên ngoài) có cấu trúc đồng nhất thành không đồng nhất. - Các phần khác nhau của đối tượng phải có các chức năng khác nhau. - Mỗi phần của đối tượng phải ở trong những điều kiện thích hợp nhất đối với công việc. Ví dụ: - Mô hình: Blackboard. Được sử dụng cho các vấn đề không xác định được chiến lược giải pháp. Ý tưởng là một tập hợp các chương trình độc lập mà cùng làm việc cộng tác trên một cấu trúc dữ liệu chung. Mỗi chương trình giải quyết một phần của tổng thế công việc, và tất cả chương trình làm việc với nhau về giải pháp. Các chương trình chuyên biệt này độc lập lẫn nhau. Chúng không gọi lẫn nhau, không có một sự tuần tự nào định trước về hoạt động của chúng. Thay vào đó, chúng được điều khiển bởi hệ thống chủ yếu dựa vào trạng thái hiện tại của tiến độ. Một thành phần điều khiển trung tâm sẽ đánh giá trạng thái hiện tại của việc xử lý và điều phối các chương trình. Cách thức điều khiển hướng dữ liệu này làm thử nghiệm với các thuật toán khác nhau có thể, 7 và cho phép việc suy ra qua các thử nghiệm “heuristic” để điều khiển việc xử lý. - Sửa một danh sách liên kết của các đối tượng xe máy thành một danh sách liên kết của các đối tượng xe. Việc trừu tượng hóa cao hơn này sẽ cho phép các đối tượng không đồng bộ (xe đạp, xe hơi, …) được lưu trữ trong cùng lớp bộ chứa và ngược lại. 4. Nguyên tắc phản đối xứng: Nội dung: - Chuyển đối tượng có hình dạng đối xứng thành không đối xứng (nói chung giảm bật đối xứng). Ví dụ: - Chuẩn của sắp xếp nhanh thường lấy phần tử giữa làm phần tử chốt. Bằng cách sử dụng phần tử trung vị trong ba phần tử đứng đầu, đứng giữa và đứng cuối làm phần tử chốt thường sẽ đạt được hiệu suất tốt hơn. - Trong thanh công cụ tìm kiếm bài hát, thay vì chỉ nhập vào tên bài hát. Ta có thể nhập vào tên ca sĩ, tên nhạc sĩ, một đoạn bài hát, … để giúp người dùng thuận lợi hơn trong việc tìm kiếm bài hát. 5. Nguyên tắc kết hợp: Nội dung: - Kết hợp các đối tượng đồng nhất hoặc các đối tượng dùng cho các hoạt động kế cận. - Kết hợp về mặt thời gian các hoạt động đồng nhất hoặc kế cận. Ví dụ: - Một trang web có thể được xây dựng từ nhiều khung (frame). Mỗi frame có thể được tải từ một server khác nhau. Điều này làm tăng tốc độ tải trang do nhiều kết nối được sử dụng đồng thời. 8 - Một tập đĩa RAID-5 phân chia một tập tin qua nhiều đĩa có thể truy xuất để lấy hay lưu trữ tập tin đó nhanh hơn vì nó được lấy/lưu trữ đồng thời. 6. Nguyên tắc vạn năng: Nội dung: - Đối tượng thực hiện một số chức năng khác nhau, do đó không cần sự tham gia của các đối tượng khác. Ví dụ: - Các phần mềm tăng tốc hệ thống như “tuneup utilities” có chức năng 1- click có thể dọn các registry, loại bỏ các shortcut bị phá hủy, xóa các tập tin tạm, phân mảnh ổ đĩa, … - Các trình duyệt web như IE, Firefox hay Google Chrome thì trong phần khung mà để ta nhập địa chỉ web vào thì ta cũng có thể nhập các từ khóa tìm kiếm vào đó để tìm kiếm thay vì truy cập các trang web tìm kiếm. 7. Nguyên tắc “chứa trong”: Nội dung: - Một đối tượng được đặt bên trong đối tượng khác và bản thân nó lại chứa đối tượng thứ ba ... - Một đối tượng chuyển động xuyên suốt bên trong đối tượng khác. Ví dụ: - Kiến trúc bảy tầng OSI trong network. - Cấu trúc dữ liệu như danh sách liên kết, cây. Các thuật toán đệ quy như: sắp xếp nhanh, backtracking, … 8. Nguyên tắc phản trọng lượng: Nội dung: - Bù trừ trọng lượng của đối tượng bằng cách gắn nó với các đối tượng khác có lực nâng. 9 - Bù trừ trọng lượng của đối tượng bằng tương tác với môi trường như sử dụng các lực thủy động, khí động... Ví dụ: - Để tăng hiệu xuất của các web server, ta có thể chia một trang thành nhiều frame và lưu trữ các frame trong các ổ đĩa khác nhau hay trên các server khác nhau. Người ta có thể phân bổ các ảnh lớn hay từng mảnh dữ liệu qua các ổ đĩa khác nhau thay vì đặt chúng chung một đĩa. Hiệu xuất sẽ tăng lên. - Trong các hàm băm, ta phân bổ các đối tượng vào một tập các bộ chứa trong khi giữ số lượng của các đối tượng trong một bộ chứa xấp xỉ bằng nhau. 9. Nguyên tắc gây ứng suất sơ bộ: Nội dung: - Gây ứng suất trước với đối tượng để chống lại ứng suất không cho phép hoặc không mong muốn khi đối tượng làm việc (hoặc gây ứng suất trước để khi làm việc sẽ dùng ứng suất ngược lại). Ví dụ: - Giả sử rằng một người sử dụng phải chờ đợi trong một khoảng thời gian cho một hành động thực thi nào đó (tìm kiếm, sao chép, cài đặt chương trình, ...). Nếu ta thông báo cho người sử dụng rằng sẽ mất khoảng 5 phút, nhưng nếu thời gian thực thi kéo dài hơn thì người sử dụng sẽ không thích. Nếu ta thông báo mất 10 phút và thời gian thực thi ít hơn thì người sử dụng sẽ vui hơn. - Khi một ứng dụng bắt đầu đọc từ một cơ sở dữ liệu, ta có thể tải (load) các bảng quan trọng hay các chỉ mục trước. 10. Nguyên tắc thực hiện sơ bộ: Nội dung: 10 - Thực hiện trước sự thay đổi cần có, hoàn toàn hoặc từng phần, đối với đối tượng. - Cần sắp xếp đối tượng trước, sao cho chúng có thể hoạt động từ vị trí thuận lợi nhất, không mất thời gian dịch chuyển. Ví dụ: - Đọc cache ổ đĩa trước chuẩn bị cho việc đọc đĩa thực sự. - Driver máy in kiểm thử tính sẵn sàng của máy in trước khi người sử dụng hoàn tất các thiết lập của họ 11. Nguyên tắc dự phòng: Nội dung: - Bù đắp độ tin cậy không lớn của đối tượng bằng cách chuẩn bị trước các phương tiện báo động, ứng cứu, an toàn. Ví dụ: - Hệ điều hành sao lưu dữ liệu các tập tin quan trọng của nó trước khi được sử dụng. Nếu xảy ra lỗi có thể khôi phục lại mà không phải cài lại. - Thiết lập thời gian timeout cho các thao tác như truy vấn cơ sở dữ liệu, kết nối tới một dịch vụ mạng, … 12. Nguyên tắc đẳng thế: Nội dung: - Thay đổi điều kiện làm việc để không phải nâng lên hay hạ xuống các đối tượng. Ví dụ: - Giữ các kết quả trung gian mà phải mất khá nhiều thời gian để tính toán. - Sắp xếp lại một cơ sở dữ liệu hay tập tin chỉ khi nào thực sự cần thiết. Thường thì dữ liệu bị xóa bằng một cái cờ đánh dấu nó bị xóa. Các bản ghi trong cơ sở dữ liệu không phải di chuyển mặc dù chúng dường như có vị trí mới trong cơ sở dữ liệu. 11 13. Nguyên tắc đảo ngược: Nội dung: - Thay vì hành động như yêu cầu bài toán, hành động ngược lại (ví dụ, không làm nóng mà làm lạnh đối tượng) - Làm phần chuyển động của đối tượng (hay môi trường bên ngoài) thành đứng yên và ngược lại, phần đứng yên thành chuyển động. Ví dụ: - Vài phép tính toán có thể gây ra tràn bộ nhớ. Bằng cách thay đổi thứ tự tính toán có thể ngăn chặn việc này. Công thức p = x * y / z; có thể được viết bằng p = (x / z) * y hay p = y / z * x; Ta có thể chọn một trong các công thức phụ thuộc vào mối quan hệ giá trị giữa x, y, z. - Các hệ thống backtracking 14. Nguyên tắc cầu (tròn) hoá: Nội dung: - Chuyển những phần thẳng của đối tượng thành cong, mặt phẳng thành mặt cầu, kết cấu hình hộp thành kết cấu hình cầu. - Sử dụng các con lăn, viên bi, vòng xoắn. - Chuyển sang chuyển độg quay, sử dung lực ly tâm. Ví dụ: - Thay tìm kiếm tuyến tính bằng tìm kiếm phức tạp hơn như tìm kiếm nhị phân. - Chuyển tọa độ từ chuẩn Cartesian sang Polar để dễ dàng hơn trong một số tính toán. 15. Nguyên tắc linh động: Nội dung: - Cần thay đổi các đặt trưng của đối tượng hay môi trường bên ngoài sao cho chúng tối ưu trong từng giai đoạn làm việc. 12 - Phân chia đối tượng thành từng phần, có khả năng dịch chuyển với nhau. Ví dụ: - Thay đổi chế độ nhìn trong một ứng dụng như PowerPoint. Chỉnh sửa văn bản trong chế độ outline thì sẽ dàng và nhìn tổng quan hơn trong chế độ trình bày. - Các gói dữ liệu thông minh định tuyến bản thân chúng trên network. 16. Nguyên tắc giải “thiếu” hoặc “thừa”: Nội dung: - Nếu như khó nhận được 100% hiệu quả cần thiết, nên nhận ít hơn hoặc nhiều hơn “một chút”. Lúc đó bài toán có thể trở nên đơn giản hơn và dễ giải hơn. Ví dụ: - Để sắp xếp một mảng lớn thì thì thuật toán sắp xếp nhanh thường được sử dụng. Tuy nhiên khi các mảng con để sắp xếp trở nên nhỏ, ít hơn 10 phần tử, các thuật toán khác được sử dụng thực thi tốt hơn. - Để nâng cao độ tin cậy của tàu vũ trụ, nhiều bộ xử lý khác nhau tính toán cùng đầu vào với nhiều thuật toán khác nhau. Nếu kết quả nào giống nhau nhiều nhất thì đó là kết quả đúng. 17. Nguyên tắc chuyển sang chiều khác: Nội dung: - Những khó khăn do chuyển động (hay sắp xếp) đối tượng theo đường (một chiều) sẽ được khắc phục nếu cho đối tượng khả năng di chuyển trên mặt phẳng (hai chiều). Tương tự, những bài toán liên quan đến chuyển động (hay sắp xếp) các đối tượng trên mặt phẳng sẽ được đơn giản hoá khi chuyển sang không gian (ba chiều). - Chuyển các đối tượng có kết cấu một tầng thành nhiều tầng. 13 - Đặt đối tượng nằm nghiêng. - Sử dụng mặt sau của diện tích cho trước. - Sử dụng các luồng ánh sáng tới diện tích bên cạnh hoặc tới mặt sau của diện tích cho trước. Ví dụ: - Một hàng đợi mà khi lớn dần và không còn chỗ để cho một phần tử mới vào thì có thể đặt phần tử đó vào ổ đĩa cho đến khi còn chỗ trống trong bộ nhớ chính. - Sử dụng ký hiệu thập lục phân cho các giá trị có thể làm cho các thao tác với bit trở nên dễ hiểu hơn. 18. Nguyên tắc sử dụng các dao động cơ học: Nội dung: - Làm đối tượng dao động. Nếu đã có dao động, tăng tầng số dao động ( đến tầng số siêu âm). - Sử dụng tầng số cộng hưởng. - Thay vì dùng các bộ rung cơ học, dùng các bộ rung áp điện. - Sử dụng siêu âm kết hợp với trường điện từ. Ví dụ: - Sử dụng thuật toán MIN-MAX luân phiên nhau trong trò chơi và trong trí tuệ nhân tạo. - Thuật toán round robin đọc luân phiên từ các hàng đợi. 19. Nguyên tắc tác động theo chu kỳ: Nội dung: - Chuyển tác động liên tục thành tác động theo chu kỳ (xung). - Nếu đã có tác động theo chu kỳ, hãy thay đổi chu kỳ. - Sử dụng các khoảng thời gian giữa các xung để thực hiện tác động khác. - 14 Ví dụ: - Bộ thu gom rác chỉ thực hiện khi rác trên một ngưỡng nhất định. - Trong vài trường hợp ta nên cập nhật một bảng nào đó của cơ sở dữ liệu chỉ một lần trên một ngày và tính toán lại việc sắp xếp chỉ mục một lần một ngày thay vì mỗi lần cập nhật đơn lẻ. Tương tự loại bỏ các mục được đánh dấu xóa chỉ một lần một ngày. 20. Nguyên tắc liên tục tác động có ích Nội dung: - Thực hiện công việc một cách liên tục (tất cả các phần của đối tượng cần luôn luôn làm việc ở chế độ đủ tải). - Khắc phục vận hành không tải và trung gian. - Chuyển chuyển động tịnh tiến qua lại thành chuyển động qua. Ví dụ: - Trong hệ điều hành đa nhiệm, các tác vụ có thể chạy nền như quét vi- rút, in ấn, … - Tự động hoàn thành các từ trong lúc gõ văn bản hay trong lập trình. 21. Nguyên tắc “vượt nhanh”: Nội dung: - Vượt qua các giai đoạn có hại hoặc nguy hiểm với vận tốc lớn. - Vượt nhanh để có được hiệu ứng cần thiết. Ví dụ: - Tắt kết nối tới cơ sở dữ liệu trong khi sao lưu. Sao lưu có thể thực hiện nhanh hơn và sau khi sao lưu mọi người có thể sử dụng cơ sở dữ liệu. - Khi phát hiện cúp điện, ta nên thực hiện thao tác dump bộ nhớ để ổ đĩa lưu các dữ liệu lại. 15 22. Nguyên tắc biến hại thành lợi: Nội dung: - Sử dụng những tác nhân có hại (thí dụ tác động có hại của môi trường) để thu được hiệu ứng có lợi. - Khắc phục tác nhân có hại bằng cách kết hợp nó với tác nhân có hại khác. - Tăng cường tác nhân có hại đến mức nó không còn có hại nữa. Ví dụ: - Nếu một chương trình mà có tác vụ tính toán hay truy vấn mất một thời gian dài thì hiển thị một thông báo để người sử dụng có thể pha một tách cafe hay làm các bài thể dục thư giãn khác. Điều này có thể tốn thời gian hơn nhưng người sử dụng không phải ở trong tình trạng chờ đợi thực sự. - Đọc bất kỳ một cuốn sách nào về các anti-pattern. 23. Nguyên tắc quan hệ phản hồi: Nội dung: - Thiết lập quan hệ phản hồi. - Nếu đã có quan hệ phản hồi, hãy thay đổi nó. Ví dụ: - Có một thành phần giám sát trong bất kỳ phần mềm nào để mà giám sát sự thực hiện, hiệu suất bộ nhớ và có hành động khắc phục. - Bộ xử lý ngoại lệ (exception handling) 24. Nguyên tắc sử dụng trung gian: Nội dung: - Sử dụng đối tượng trung gian, chuyển tiếp. Ví dụ: 16 - Sử dụng một máy chủ cho các máy in để giữ các công việc tạm thời khi các máy in đang offline. - Các thiết kế pattern thay vì biết trạng thái của vài đối tượng và giữ chúng cập nhật khi trạng thái của mình thay đổi, ta chỉ cần báo phần trung gian hay yêu cầu phần trung gian. Điều này làm giảm giao tiếp giữa các đối tượng và giảm độ phức tạp. Như tạo một đối tượng xử lý tất cả các vấn đề cấu hình hay observer pattern. 25. Nguyên tắc tự phục vụ: Nội dung: - Đối tượng phải tự phục vụ bằng cách thực hiện các thao tác phụ trợ, sửa chữa. - Sử dụng phế liệu, chát thải, năng lượng dư. Ví dụ: - Một trình duyệt web có thể chuyển hướng request của bạn tới một website khác nếu server không tồn tại. Chẳng hạn Google bị offline thì có chuyển tới Bing, Yahoo, … - Các packet tự quản lý bản thân mình, chúng tìm con đường tốt nhất của chúng khi định tuyến. 26. Nguyên tắc sao chép (copy): Nội dung: - Thay vì sử dụng những cái không được phép, phức tạp, đắt tiền, không tiện lợi hoặc dễ vỡ, sử dụng bản sao. - Thay thế đối tượng hoặc hệ các đối tượng bằng bản sao quang học (ảnh, hình vẽ) với các tỷ lệ cần thiết. - Nếu không thể sử dụng bản sao quang học ở vùng biẻu kiến (vùng ánh sáng nhìn thấy được bằng mắt thường), chuyển sang sử dụng các bản sao hồng ngoại hoặc tử ngoại. 17 Ví dụ: - Sử dụng các sản phẩm mã nguồn mở. - Các sản phẩm mô phỏng như mô phỏng lỗ đen vũ trụ, điều kiện trên mặt trăng, ... 27. Nguyên tắc “rẻ” thay cho “đắt”: Nội dung: - Thay thế đối tượng đắt tiền bằng bộ các đối tượng rẻ có chất lượng kém hơn (thí dụ như về tuổi thọ). Ví dụ: - Tính toán với số nguyên thay vì dùng số kiểu dấu chấm động nếu vẫn chính xác với ứng dụng của bạn, thời gian thực hiện sẽ nhanh hơn. - Xây dựng một siêu máy tính từ những máy tính cũ. 28. Thay thế sơ đồ cơ học: Nội dung: - Thay thế sơ đồ cơ học bằng điện, quang, nhiệt, âm hoặc mùi vị. - Sử dụng điện trường, từ trường và điện từ trường trong tương tác với đối tượng. - Chuyển các trường đứng yên sang chuyển động, các trường cố định sang thay đổi theo thời gian, các trường đồng nhất sang có cấu trúc nhất định. - Sử dụng các trường kết hợp với các hạt sắt từ. Ví dụ: - Dụng cụ ống nghe khám bệnh của một bác sĩ có thể bằng thế bằng một microphone và một headphone. Ưu điểm là một đoạn ghi âm được thực hiện, xử lý các tín hiệu phức tạp như phân tích tần số, nhịp tim, … - Chuyển đổi văn bản thành giọng nói (text-to-speech) hay giọng nói thành văn bản (speech-to-text). 18 29. Sử dụng các kết cấu khí và lỏng: Nội dung: - Thay cho các phần của đối tượng ở thể rắn, sử dụng các chất khí và lỏng: nạp khí, nạp chất lỏng, đệm không khí, thủy tĩnh, thủy phản lực. Ví dụ: - Sử dụng biến thay vì hằng số được code cứng. Khi hằng số thay đổi chỉ cần thay đổi ở một nơi. - Aero Glass GUI của Win7 hay Aqua GUI của Apple, … 30. Sử dụng vỏ dẻo và màng mỏng: Nội dung: - Sử dụng các vỏ dẻo và màng mỏng thay cho các kết cấu khối. - Cách ly đối tượng với môi trường bên ngoài bằng các vỏ dẻo và màng mỏng. Ví dụ: - Các lớp được định nghĩa với các interface có thể thay đổi nội dung các interface bên trong lớp. - Sử dụng các trường trong header của TCP/IP mà không được sử dụng để truyển tải dữ liệu (được sử dụng bởi những người viết virus để làm botnet). 31. Sử dụng các vật liệu nhiều lỗ: Nội dung: - Làm đối tượng có nhiều lỗ hoặc sử dụng thêm những chi tiết có nhiều lỗ (miếng đệm, tấm phủ…) - Nếu đối tượng đã có nhiều lỗ, sơ bộ tẩm nó bằng chất nào đó. Ví dụ: - Pattern Inversion of Control (IoC), các phụ thuộc sẽ được tiêm vào ứng dụng tại nơi xác định trước bởi bộ chứa thay vì phải code cứng. 19 - Các phần mềm thông qua việc định nghĩa các interface trước có thể được cắm vào bởi nhiều nhà phát triển bên thứ ba. 32. Nguyên tắc thay đổi màu sắc: Nội dung: - Thay đổi màu sắc của đối tượng hay môi trường bên ngoài. - Thay đổi độ trong suốt của của đối tượng hay môi trường bên ngoài. - Để có thể quan sát được những đối tượng hoặc những quá trình, sử dụng các chất phụ gia màu, hùynh quang. - Nếu các chất phụ gia đó đã được sử dụng, dùng các nguyên tử đánh dấu. - Sử dụng các hình vẽ, ký hiệu thích hợp. Ví dụ: - Một đồng hồ gần như trong suốt trong desktop trở nên ít trong suốt hơn khi gần đến thời gian một cuộc hẹn. - Các ứng dụng cho nhà thiên văn học có thể thay đổi màu sắc của giao diện người sử dụng đến màu đỏ hay đen thay vì đầy đủ màu sắc. Điều này cần thiết khi sử dụng trong bóng tối, mắt người cần thời gian để làm quen với bóng tối để xem các ngôi sao. Một giao diện màu đỏ hay đen không ảnh hưởng tới sự nhạy cảm của mắt. 33. Nguyên tắc đồng nhất: Nội dung: - Những đối tượng, tương tác với đối tượng cho trước, phải được làm từ cùng một vật liệu (hoặc từ vật liệu gần về các tính chất) với vật liệu chế tạo đối tượng cho trước. Ví dụ: - Sử dụng trình biên dịch để biên dịch chính nó. - Một hàm mà nhận các đối số là các lớp cơ sở để mà các lớp con cũng được xử lý như vậy. 20 34. Nguyên tắc phân hủy hoặc tái sinh các phần: Nội dung: - Phần đối tượng đã hoàn thành nhiệm vụ hoặc trở nên không càn thiết phải tự phân hủy (hoà tan, bay hơi..) hoặc phải biến dạng. - Các phần mất mát của đối tượng phải được phục hồi trực tiếp trong quá trình làm việc. Ví dụ: - Giải phóng bộ nhớ không cần sử dụng nữa bởi bộ thu gom rác như trong Java. - Giữ một vùng chứa của các đối tượng phức tạp mà thường xuyên được tạo ra, sử dụng và xóa đi. Bằng cách giữ chúng trong vùng chứa, quá trình tạo ra nhanh hơn nhiều khi các đối tượng được lấy từ vùng chứa. Nó cũng giảm tải cho bộ thu gom rác cho các đối tượng bị xóa. 35. Thay đổi các thông số hoá lý của đối tượng: Nội dung: - Thay đổi trạng thái đối tượng. - Thay đổi nồng độ hay độ đậm đặc. - Thay đổi độ dẻo. - Thay đổi nhiệt độ, thể tích. Ví dụ: - Bằng cách làm việc với template, một trình biên tập trở nên đa năng hơn, chẳng hạn tải một template highlight cú pháp khác làm cho trình biên tập phù hợp với một ngôn ngữ lập trình khác. - Chạy một chương trình với nhiều điều kiện tải khác nhau, chẳng hạn chạy trong hệ điều hành Windows hay Linux, màn hình 10’ hay 15’, … 36. Sử dụng chuyển pha: Nội dung: 21 - Sử dụng các hiện tượng nảy sinh trong quá trình chuyển pha như: thay đổi thể tích, toả hay hấp thu nhiệt lượng... Ví dụ: - Một danh sách liên kết có thể giữ một con trỏ ở phần tử cuối cùng được chèn vào. Khi ta cần tìm kiếm qua danh sách liên kết này, ta có thể kiểm tra con trỏ này để suy xét nên bắt đầu từ nút này trong danh sách hay bắt đầu từ đầu danh sách. Điều này tăng tốc tìm kiếm tuyến tính trung bình gấp 2 lần. - Khi chuyển đổi từ một loại thiết bị/OS/chương trình sang một cái khác, giám sát chặt chẽ những gì xảy ra chẳng hạn như cách chuyển đổi như thế nào có thể có ích trong tương lai. 37. Sử dụng sự nở nhiệt: Nội dung: - Sử dụng sự nở (hay co) nhiệt của các vật liệu. - Nếu đã dùng sự nở nhiệt, sử dụng với vật liệu có các hệ số nở nhiệt khác nhau. Ví dụ: - Khi dữ liệu được nén nó có thể được gửi nhanh hơn qua mạng, hoặc tốn ít không gian lưu trữ hơn. Người ta phải giải nén để có thể sử dụng nó. - Khi tính toán với đô-la hay các tiền tệ khác thì thường là một tính toán dấu chấm động. Bằng cách nhân các số với 100, ta có thể tính toán trong miền số nguyên, nhanh hơn và ít lỗi làm tròn số hơn. 38. Sử dụng các chất oxy hoá mạnh: Nội dung: - Thay không khí thường bằng không khí giàu oxy. - Thay không khí giàu oxy bằng chính oxy. - Dùng các bức xạ ion hoá tác động lên không khí hoặc oxy. 22 - Thay oxy giàu ozon (hoặc oxy bị ion hoá) bằng chính ozon. Ví dụ: - Sử dụng định dạng nhị phân để gia tăng hiệu quả cho việc xử lý, lưu trữ và lưu lượng mạng. - Chạy các chương trình trên các bộ xử lý nhanh nhất có sẵn và chấm điểm (benchmark) chúng. 39. Thay đổi độ trơ: Nội dung: - Thay môi trường thông thường bằng môi trường trung hoà. - Đưa thêm vào đối tượng các phần, các chất, phụ gia trung hoà. - Thực hiện quá trình trong chân không. Ví dụ: - Kiểm thử phần mềm trong một môi trường được kiểm soát để mà nếu có vấn đề gì thiệt hại thì chỉ giới hạn trong môi trường được kiểm soát mà thôi. - Cài đặt một máy tính giả ‘không được bảo vệ’ trên mạng Internet để sớm phát hiện và ngăn chặn các virut hay sâu máy tính. 40. Sử dụng các vật liệu hợp thành (composite): Nội dung: - Chuyển từ các vật liệu đồng nhất sang sử dụng những vật liệu hợp thành (composite). Hay nói chung sử dụng các vật liệu mới. Ví dụ: - Microsoft CLR (Common Language Runtime) cho phép các chương trình từ nhiều ngôn ngữ khác nhau tương tác với nhau. 23 II. Lịch sử phát triển ngôn ngữ lập trình: Bảng tiến hóa của các ngôn ngữ lập trình phổ biến 24 1. Zuse’s Plankalkül: Được thiết kế bởi Konrad Zuse vào năm 1943 nhưng mãi tới năm 1972 mới được công bố hoàn toàn. Nó được xem như là ngôn ngữ thuật toán lập trình đầu tiên. Trong Plankalkül kiểu đơn giản nhất là bit, có các cấu trúc dữ liệu cấp cao như dấu chậm động, mảng, bản ghi. Mỗi lệnh là hai hay ba dòng mã. Năm 1948, ông có xuất bản một bài báo về ngôn ngữ lập trình Plankalkül của mình. Tuy nhiên, nó đã không được hiện thực trong cuộc đời của ông ta và những sự đóng góp ban đầu của ông ta đã bị cô lập từ những sự phát triển khác. 2. Các ngôn ngữ mã giả: Từ mã giả ở đây có nghĩa khác với nghĩa hiện tại của nó bây giờ. Ta gọi các ngôn ngữ này là các mã giả bởi vì chúng được đặt tên như thế vào thời điểm chúng được phát triển và sử dụng (cuối những năm 1940 và đầu những năm 1950). Ngôn ngữ máy thì khó để mà đọc, cũng như sửa đổi và dài dòng. Máy thì không hỗ trợ xử lý dấu chấm động vì vậy đã ra đời các ngôn ngữ mã giả. 2.1. ShortCode Là ngôn ngữ mã giả đầu tiên, được phát triển bởi John Mauchly vào năm 1949 cho máy tính BINAC. Các biểu thức toán học hay phương trình được mã hóa. Các mã là các cặp giá trị byte, và nhiều phương trình được mã hóa trong một từ. Short Code không được chuyển thành mã máy. Nó được thực thi với một trình biên dịch, quá trình này vào thời điểm đó được gọi là lập trình tự động. Rõ ràng nó làm đơn giản hóa quá trình lập trình, nhưng biểu diễn bằng Short Code chậm hơn gần 50 lần so với mã máy. 25 2.2. Speedcoding Ở các nơi khác, các hệ thống thông dịch đang được phát triển để mở rộng các ngôn ngữ máy để có thể thao tác với dấu chấm động. Hệ thống Speedcoding được phát triển bởi John Backus cho IBM 701 (1954) là một ví dụ. Trình thông dịch Speedcoding chuyển đổi 701 thành một máy tính ảo có khả năng tính toán dấu chấm động. Hệ thống bao gồm các lệnh giả cho bốn thao tác số học (cộng, trừ, nhân, chia) trên dữ liệu dấu chấm động, cũng như các thao tác căn bậc hai, sin, arctang, số mũ, và lôgarit. Rẽ nhánh có điều kiện và không điều kiện và sự chuyển đổi đầu vào/đầu ra cũng là một phần của kiến trúc ảo. Một trong những giới hạn của hệ thống là bộ nhớ sau khi tải trình thông dịch vào máy thì chỉ còn 700 từ cho người sử dụng và mỗi lệnh thêm vào mất 4.2 mili giây để thực thi. Nhưng mặt khác, Speedcoding tự động tăng chỉ mục cho truy cập mảng. Chức năng này không xuất hiện trong phần cứng mãi đến các máy tính UNIVAC 1107 năm 1962. Nhờ chức năng đó, nhân ma trận có thể được thực hiện trong 12 lệnh Speedcoding. Backus xác nhận rằng vấn đề đó có thể mất hai tuần để lập trình trong mã máy thì chỉ mất vài giờ khi sử dụng Speedcoding. Ở đây ta có thể thấy “nguyên lý sử dụng trung gian” là sử dụng mã giả để làm cho chương trình ngắn gọn, dễ hiểu hơn, giảm bớt công sức lập trình. 3. IBM và Fortran Trước năm 1954, phần cứng lúc ấy không hỗ trợ dấu chấm động. Do đó tất cả các thao tác với dấu chấm động thì phải được mô phỏng trong phần mềm, một quá trình thông dịch tốn rất nhiều thời gian. Sự ra đời của IBM 704, máy hỗ trợ tập lệnh đánh chỉ mục và dấu chấm động đã dẫn tới ý tưởng của các ngôn ngữ biên dịch, bởi vì không còn phải tốn chi phí cho việc thông dịch dấu chấm động. Fortran 0 được thiết kế vào năm 1954 nhưng không được hiện thực. 26 Fortran I được thiết kế vào năm 1955 và phát hành vào năm 1957 dành cho các máy IBM 704 - Tên biến mở rộng lên sáu ký tự (trong Fortran 0 chỉ có hai ký tự) - Có câu lệnh lựa chọn If có 3 nhánh “If (expression) negative, zero, positive” - Có vòng lặp Do - Có định dạng đầu vào/đầu ra - Các chương trình con do người dùng định nghĩa nhưng không thể biên dịch riêng được - Không có lệnh định dạng kiểu dữ liệu (các biến có tên bắt đầu với I, J, K, L, M và N thì mặc nhiên là kiểu số nguyên, và còn lại mặc nhiên là kiểu dấu chấm động) - Trình biên dịch đầu tiên được phát hành vào tháng 4-1957 - Chương trình mà lớn hơn 400 dòng thì khó được biên dịch đúng, bởi vì sự yếu kém của máy IBM 704 - Tuyên bố táo bạo nhất bởi nhóm phát triển Fortran trong quá trình thiết kế ngôn ngữ là mã máy được sinh bởi trình biên dịch sẽ có hiệu suất khoảng một nửa khi viết mã máy bằng tay. Điều này đã làm cho nó trở nên hấp dẫn trước khi nó được phát hành, do đó nó nhanh chóng được sử dụng rộng rãi. Fortran II được phân phối vào mùa xuân 1958. Nó vá nhiều lỗi trong hệ thống biên dịch của Fortran I và thêm vào vài chức năng cho ngôn ngữ, quan trọng nhất là các chương trình con được biên dịch riêng biệt. Nguyên lý tách nhỏ: Các chương trình con không được biên dịch riêng biệt thì bất kỳ sự thay đổi trong một chương trình cũng yêu cầu toàn bộ chương trình được biên dịch lại. Việc biên dịch riêng biệt các chương trình con đã làm cho thời gian biên dịch được rút ngắn đáng kể và là điều kiện để phát triển các chương trình lớn hơn. 27 Fortran III được phát triển, nhưng nó không được phân phối rộng rãi. Lúc này IBM 1401 bộ nhớ lõi từ của nó chỉ có 8k. Vì vậy trình biên dịch đã sử dụng phương pháp “overlay” để cho phép chạy những chương trình lớn hơn bộ nhớ chính. Nguyên lý linh động: Để chạy được chương trình lớn hơn bộ nhớ chính thì chúng được chia thành các khối “mã đối tượng (là một chuỗi các chỉ thị 0, 1)” độc lập gọi là các “overlay” được đưa vào một cấu trúc cây. Một bộ quản lý sẽ tải các các “overlay” được yêu cầu từ bộ nhớ ngoài vào “vùng” yêu cầu khi nó cần. Ý tưởng cho thấy sự “linh động” trong việc đổi môi trường bộ nhớ và phân đối tượng thành từng phần có khả năng dịch chuyển với nhau. Tuy nhiên, Fortran IV lại trở thành một trong những ngôn ngữ lập trình được sử dụng phổ biến tại thời điểm đó. Được phát triển từ 1960 đến 1962 và được chuẩn hóa thành Fortran 66 (ANSI, 1966). Fortran IV là một sự cải tiến của Fortran II như - Khai báo kiểu tường minh cho các biến - Câu lệnh lựa chọn If theo logic “If (expression) true, false” - Có thể đặt các chương trình con như là các tham số vào các chương trình con khác. Nguyên lý vượt nhanh: Trong trường hợp một chương trình muốn gọi nhiều các chương trình khác như là các tham số (đầu vào) thì phải gán các chương trình được gọi vào các biến rồi đặt các biến đó vào chương trình muốn gọi, thì ta có thể đặt thẳng các chương trình được gọi như là tham số vào chương trình muốn gọi. Fortran 77 Fortran IV được thay thế bằng Fortran 77, nó trở thành chuẩn mới trong 1978 (ANSI, 1978a). Fortran 77 giữ lại hầu hết các tính năng của Fortran IV và thêm vào xử lý chuỗi ký tự, thay đổi vòng lặp Do cho phù hợp và If có một mệnh đề tùy chọn Else. 28 Fortran 90 (ANSI, 1992) thì khác đáng kể với Fortran 77. Các thay đổi lớn được thêm vào là mảng động, bản ghi, con trỏ, nhiều câu lệnh chọn lựa, và mô- đun. Ngoài ra, các chương trình con trong Fortran 90 có thể được gọi một cách đệ quy. Nguyên lý kết hợp: mô-đun để nhóm các thủ tục và dữ liệu có liên quan với nhau để các chương trình khác có thể sử dụng dễ dàng. Fortran 95 (INCITS/ISO/IEC, 1997) tiếp tục sự phát triển của ngôn ngữ, nhưng có một vài sự thay đổi như một vòng lặp mới Forall. Fortran 2003 hỗ trợ lập trình hướng đối tượng, các kiểu dẫn xuất được tham số hóa, con trỏ thủ tục, và tương tác với ngôn ngữ lập trình C. Fortran 2008(ISO/IEC 1539-1, 2010) có các tính năng mới như - Cấu trúc DO CONCURRENT, cho các vòng lặp không phụ thuộc lẫn nhau - Co-array Fortran (CAF), cung cấp một mô hình thực thi song song 4. Lập trình hàm AI (trí tuệ nhân tạo) bắt đầu được quan tâm vào giữa những năm 1950, một số là các nhà ngôn ngữ học, một số từ tâm lý học và một số từ toán học. Ngôn ngữ học thì quan tâm với việc xử lý ngôn ngữ tự nhiên. Tâm lý học thì hứng thú với mô hình hóa việc lưu trữ và truy xuất thông tin con người, cũng như các quá trình xử lý cơ bản khác của bộ não. Các nhà toán học thì quan tâm trong việc tự động hóa các phương pháp thông minh nào đó, chẳng hạn như chứng minh định lý. Tất cả các việc nghiên cứu này dẫn tới cùng một kết luận: vài phương pháp phải được phát triển để cho phép các máy tính xử lý dữ liệu ký hiệu trong danh sách liên kết. Tại lúc này, hầu hết các tính toán thì trên dữ liệu số trong các mảng. LISP Đi tiên phong trong ngôn ngữ lập trình hàm, được thiết kế bởi McCarthy tại MIT năm 1958. 29 Có hai kiểu dữ liệu: nguyên tố và danh sách. Các nguyên tố là các ký hiệu hay là các chữ số. Cú pháp LISP thì rất khác với các ngôn ngữ mệnh lệnh, bởi vì nó là một ngôn ngữ lập trình hàm. Ví dụ, cú pháp của Java là sự kết hợp phức tạp giữa tiếng Anh và đại số, trong khi cú pháp LISP là một mô hình của sự đơn giản dựa trên phép tính lambda. Hình trên biểu diễn danh sách (A B C D) và danh sách (A (B C) D (E (F G) ) ) Mã chương trình và dữ liệu có cùng hình thức: các danh sách được đặt trong dấu ngoặc đơn. Ví dụ: (A B C D) 30 Khi được thể hiện là dữ liệu, nó là danh sách gồm bốn phần tử. Khi được xem như là mã, nó là sự khai triển của hàm có tên là A đến ba tham số B, C và D. Đến nay vẫn còn được sử dụng phổ biến trong AI. Nguyên lý linh động: Vào lúc đó để hiện thực các cấu trúc dữ liệu như ngăn xếp, hàng đợi hay biểu thức ký hiệu … nếu sử dụng mảng thì mỗi lần thêm xóa các phần tử thì phải cấp phát lại hay phải tổ chức lại toàn bộ cấu trúc vì các phần tử được lưu trữ trong bộ nhớ liên tiếp nhau. Với danh sách liên kết, bộ nhớ các phần tử nằm rời rạc nhau nên ta có thể thêm, loại bỏ hay hoán đổi các phần tử tại bất kỳ điểm nào trong danh sách rất dễ dàng. 5. Bước đầu tiên tiến tới sự tinh xảo Vào những năm 1950, các ngôn ngữ lúc bấy giờ được phát triển quanh một kiến trúc duy nhất, một số ngôn ngữ thì cho máy UNIVAC và một số thì cho máy IBM series 700, tất cả đều phụ thuộc vào máy và không có một ngôn ngữ nào phổ dụng để biểu diễn các thuật toán. ALGOL là kết quả của quá trình nỗ lực để thiết kế một ngôn ngữ phổ dụng. GAMM và ACM gặp nhau trong bốn ngày để thiết kế tại Zurich (ngày 27 tháng 5 đến ngày 1 tháng 6 năm 1958, với các mục tiêu sau cho ngôn ngữ mới: - Cú pháp của ngôn ngữ phải được gần gũi với các ký hiệu toán học - Nó phải dễ dàng để mô tả các thuật toán - Nó phải được chuyển thành mã máy ALGOL 58 Nó kế thừa từ Fortran và có một số điểm chú ý như sau - Tên biến có chiều dài bất kỳ - Mảng có thể có nhiều chiều (mảng một chiều, hai chiều, …) - Tham số được tách biệt bởi hình thức (in & out) - Câu lệnh phức hợp (begin … end) - Dấu chẩm phẩy kết thúc một câu lệnh 31 - Thao tác gán là := - if có một mệnh đề else-if - Không có I/O Mặc dù ban đầu IBM rất tâm huyết, nhưng đã từ bỏ vào giữa năm 1959 và nó không được hiện thực. ALGOL 60 Chỉnh sửa của ALGOL 58 tại cuộc họp 6 ngày tại Paris. Nó là chuẩn để đưa ra các thuật toán cho hơn 20 năm. Tất cả các ngôn ngữ mệnh lệnh sau này được dựa trên nó. Là ngôn ngữ độc lập máy đầu tiên và cũng là ngôn ngữ đầu tiên có cú pháp chính thức được định nghĩa (BNF). Tuy nhiên chưa bao giờ được sử dụng rộng rãi, đặc biệt là ở Mỹ vì các lý do như thiếu I/O và tập ký tự làm cho các chương trình không portable, quá mềm dẻo dẫn tới việc khó khăn để hiện thực, BNF vào lúc đó thì quá xa lạ và được coi là phức tạp và thiếu sự hỗ trợ của IBM. Có các tính năng mới như - Cấu trúc khối (phạm vi cục bộ) - Tham số được đặt chương trình con có thể là tên biến hay giá trị - Đệ quy các chương trình con - Các hàm lồng nhau Nguyên lý tách khỏi: tách các các lệnh (đặt chúng vào khối) để chúng được xem như là một câu lệnh, và thu hẹp phạm vi khai báo tên biến, thủ tục, hàm được khai báo trong một khối để chúng không bị xung đột với các biến có cùng tên được sử dụng ở một nơi nào đó trong chương trình cho các mục đích khác nhau. Nguyên lý chứa trong: Một hàm lồng trong (hay thủ tục lồng trong) là một hàm mà bị bao bọc bên trong một hàm khác. Nó chỉ có thể được gọi bởi hàm lồng nó hay bởi các hàm bị lồng trực tiếp hay không trực tiếp trong cùng hàm lồng nó. Nói cách khác, phạm vi của hàm lồng trong bị giới bị giới hạn bởi hàm lồng nó. Hàm lồng nhau là một hình thức che dấu thông tin và hữu ích 32 trong các tác vụ thủ tục bị phân chia thành các tác vụ con mà chỉ có ý nghĩa trong cục bộ. Nó tránh làm lộn xộn đến các phần khác của chương trình (các hàm, biến khác, ...) mà không liên quan đến những phần này. Vì vậy, các hàm lồng nhau bổ sung những khả năng cho các cấu trúc khác như bản ghi hay các đối tượng. 6. Khởi đầu của ngôn ngữ cho doanh nghiệp Trái với ALGOL 60, mặc dù COBOL được sử dụng rộng tại thời điểm đó nhưng lại ít ảnh hưởng lên việc thiết kế các ngôn ngữ sau này, ngoại trừ PL/I. Có lẽ lý do quan trọng nhất nó được sử dụng rộng rãi là nó được thiết kế để trở thành một ngôn ngữ mới cho các ứng dụng doanh nghiệp. COBOL được thiết kế dựa trên ngôn ngữ FLOW-MATIC. Cuộc họp đầu tiên về việc thiết kế tại Pentagon tháng 5 – 1959. Mục tiêu thiết kế - Phải giống như tiếng Anh đơn giản - Phải dễ dàng sử dụng, thậm chí điều đó có thể làm giảm đi sức mạnh của nó - Không bị hướng theo bởi các vấn đề của các trình biên dịch hiện tại Những đóng góp - Có chức năng marco đầu tiên trong một ngôn ngữ lập trình cấp cao - Cấu trúc dữ liệu phân cấp (các bản ghi) - Các câu lệnh lựa chọn lồng nhau - Tên lên tới 30 ký tự, với dấu gạch ngang - Phân loại dữ liệu riêng biệt Nguyên lý tách khỏi: Một trong những lý do vì sao mã COBOL lại dễ dàng thay đổi khi chuyển sang máy mới hay thiết bị mới hay các yêu mới cũng như việc bảo trì là nhờ việc tách dữ liệu riêng biệt khỏi các câu lệnh thực thi. 33 7. Bắt đầu khái niệm chia sẻ thời gian Ngôn ngữ BASIC được thiết kế bởi Kemeny và Kurtz tại Dartmouth. Mục tiêu thiết kế: - Dễ sử dụng ngay cả với người mới học - Ngôn ngữ lập trình cho mọi mục đích - Cho phép các khả năng lập trình nâng cao dành riêng cho các chuyên gia mà vẫn giữ được sự đơn giản cho người mới học - Có tương tác với người dùng - Các thông báo lỗi rõ ràng và thân thiện - Chạy nhanh với các chương trình nhỏ - Không cần phải hiểu biết về phần cứng máy tính - Đứng giữa người sử dụng và hệ điều hành Ngôn ngữ phân nhánh của nó được sử dụng phổ biến hiện nay là VISUAL BASIC. Là ngôn ngữ đầu tiên được sử dụng rộng rãi thông qua thiết bị đầu cuối kết nối đến máy tính từ xa (trước đó có LISP nhưng không phổ biến) nhờ hệ thống chia sẻ thời gian. Nguyên lý liên tục tác động có ích: với hệ thống chia sẻ thời gian, thời gian xử lý của máy chủ được chia nhỏ ra và mỗi người sử dụng được một thời gian ngắn tuần tự. Sự luân chuyển đó đủ nhanh để người sử dụng sẽ có cảm giác là họ được sử dụng toàn bộ máy. Điều này sẽ giảm thiểu được chi phí, cũng như tận dụng tối đa công suất của máy. 8. Ngôn ngữ cho cả khoa học và doanh nghiệp: PL/I Vào năm 1963, những người sử dụng máy tính cho khoa học bắt đầu nhận ra rằng cần sử dụng I/O phức tạp hơn, giống như COBOL có. Những người sử dụng máy tính cho doanh nghiệp bắt đầu cần dấu chấm động và mảng cho MIS. Do đó cần xây dựng một máy tính mới cho cả hai loại ứng dụng khoa học và doanh nghiệp. Theo đó thiết kế một ngôn ngữ mới để cả hai loại ứng dụng. 34 PL/I được thiết kế trong năm tháng bởi ủy bản 3 X 3 (ba thành viên từ IBM, ba thành viên từ SHARE). Ý tưởng ban đầu là một mở rộng từ Fortran IV, được gọi là NPL (New Programming Language). Sau này được đổi tên thành PL/I vào 1965. Những đóng góp của PL/I - Là ngôn ngữ đầu tiên xử lý ngoại lệ - Cho phép tạo ra các chương trình con thực thi đồng thời - Con trỏ được xem như là một kiểu dữ liệu - Mặt cắt của mảng nhiều chiều có thể được tham chiếu. Ví dụ như hàng thứ ba của một ma trận có thể được tham chiếu như là mảng một chiều Nhưng nó có những hạn chế như - Nhiều chức năng mới được thiết kế quá kém - Quá lớn và quá phức tạp Nguyên lý dự phòng: với việc được xử lý được ngoại lệ, lập trình viên có thể cho chương trình tiếp tục thực hiện nếu ngoại lệ đó được phép chẳng hạn như lỗi chia cho 0 mà không làm chương trình thực hiện sai hay phải dừng lại. Nếu ngoại lệ như tràn bộ nhớ thì cũng có thể thông báo cho người sử dụng biết. 9. Hai ngôn ngữ động đầu tiên: APL và SNOBOL - Có đặc điểm là định kiểu động và cấp phát bộ nhớ động - Các biến thì được định kiểu khi nó được gán vào một giá trị. - Bộ nhớ được cấp phát cho một biến khi nó được gán vào một giá trị. Cả hai đều không ảnh hưởng nhiều đến các ngôn ngữ chính sau này 9.1. APL: A Programming Language Ban đầu không được thiết kế như một ngôn ngữ lập trình mà dự định là một phương tiện để mô tả kiến trúc máy tính, tại IBM bởi Ken Iverson vào năm 1960. Có nhiều toán tử cung cấp một lượng lớn các thao tác trên mảng (ví dụ, chuyển vị ma trận chỉ cần một toán tử duy nhất). Tuy nhiên, chương trình rất khó để đọc. Ngày nay vẫn còn sử dụng nhưng ít có sự thay đổi đáng kể. 35 9.2. SNOBOL Được thiết kế như là một ngôn ngữ thao tác chuỗi tại phòng thí nghiệm Bell bởi Farber, Griswold và Polensky vào năm 1964. Có các toán tử đầy sức mạnh cho việc so khớp mẫu chuỗi. Bởi vì bản chất động của ngôn ngữ làm cho nó chậm hơn so với các ngôn ngữ tương tự (và vì vậy không còn được sử dụng cho các bộ soạn thảo văn bản). Ngày nay vẫn còn sử dụng trong một ít tác vụ về xử lý văn bản. 10. Bắt đầu trừu tượng hóa dữ liệu: SIMULA 67 Được thiết kế chủ yếu cho việc mô phỏng hệ thống ở Na Uy bởi Nygaard và Dahl. Dựa trên ALGOL 60 và SIMULA I. Có những điểm chính như - Một loại chương trình con được gọi là “coroutine”. - Có cấu trúc lớp (bắt đầu hình thành khái niệm trừu tượng hóa dữ liệu) Nguyên tắc chuyển sang chiều khác: Thông thường mối quan hệ giữa một chương trình con gọi một chương trình khác và một chương trình con bị gọi là mối quan hệ “chủ-tớ”. Còn mối quan hệ giữa coroutine gọi và coroutine được gọi thì ngang hàng hơn. Coroutine là một thể loại đặc biệt của chương trình con. Thông thường các conroutine được tạo ra trong một ứng dụng bởi một đơn vị chương trình gọi là đơn vị chủ (không phải là một coroutine). Khi được tạo ra, các coroutine thực hiện các đoạn mã khởi tạo của chúng và sau đó trả quyền điều khiển cho đơn vị chủ. Khi toàn bộ các coroutine được khởi tạo, chương trình chủ “resume” một coroutine nào đó, và các coroutine sẽ “resume” lẫn nhau theo một thứ tự nào đó của công việc. Đến khi công việc hoàn thành các coroutine sẽ trả quyền điều khiển cho đơn vị chủ. Lúc này có thể các coroutine sẽ bị chấm dứt hay tiếp tục vẫn chạy tùy theo chương trình. Một ví dụ về vấn đề này là mô phỏng trò chơi đánh bài. Giả sử rằng trò chơi này có bốn người chơi. Một đơn vị chương trình chủ sẽ tạo ra bốn coroutine. Chương trình chủ sẽ khởi động chương trình mô phỏng bằng cách “resume” một 36 coroutine của người chơi nào đó. Khi người này xong lượt thì sẽ “resume” đến coroutine của người kế tiếp, và tiếp tục như vậy cho đến kết thúc trò chơi. Nguyên tắc đồng nhất: nhờ có sự đồng nhất sự trình bày của, và thao tác trên các đối tượng thành kiểu dữ liệu được trừu tượng hóa mà làm cho sự thay đổi biểu diễn dữ liệu hay mã thực thi không làm cho mã người dung thay đổi. Ngoài ra trừu tượng hóa dữ liệu còn giúp đóng gói dữ liệu để bảo vệ dữ liệu không bị truy xuất trực tiếp bởi mã người dùng. 11. Thiết kế trực giao: ALGOL 68 Tiếp tục phát triển từ ALGOL 60 nhưng không phải là một tập cha của ngôn ngữ này. Thiết kế dựa trên khái niệm của “trực giao” (Có một vài khái niệm cơ bản, thêm vào một vài sự kết hợp của các cơ chế). Có các tính năng đáng chú ý như: - Các cấu trúc dữ liệu do người sử dụng định nghĩa - Kiểu tham chiếu - Mảng động (khai báo mảng không cần chỉ kích thước) ALGOL 68 ít được sử dụng hơn ALGOL 60. Tuy nhiên ảnh hưởng mạnh mẽ lên các ngôn ngữ sau này, đặc biệt là Pascal, C và Ada. 12. Lập trình dựa trên Logic: Prolog Được phát triển bởi Comerauer và Roussel (đại học Aix-Marseille) với sự giúp đỡ của Kowalski (đại học Edinburgh). Không có thủ tục. Có thể tóm lại như là một hệ thống cơ sở dữ liệu thông minh sử dụng một quá trình suy diễn để suy ra sự thật (kết quả) của các câu truy vấn. Nó ít được sử dụng rộng rãi bởi vì cách tiếp cận không mệnh lệnh, các chương trình được viết bằng ngôn ngữ lôgic đến nay đã được chứng minh không có hiệu quả cao so với các chương trình mệnh lệnh. Thứ hai, vùng ứng 37 dụng của nó nhỏ cho một số ít loại hệ thống quản lý cơ sở dữ liệu và một số chương trình AI. 13. Ngôn ngữ được thiết kế công phu nhất: Ada Công sức bỏ ra cho việc thiết kế rất lớn, liên quan đến hàng trăm người, rất nhiều tiền của, và khoảng tám năm. Ngôn ngữ này được đặt tên theo Ada Augusta nữ bá tước xứ Lovelace, được xem như là lập trình viên đầu tiên. Có những tính năng đáng chú ý: - Mô hình gói (hỗ trợ trừu tượng hóa dữ liệu) - Xử lý ngoại lệ rất công phu - Hỗ trợ lập trình generic - Hỗ trợ lập trình tương tranh thông qua các mô hình tác vụ Nguyên lý đồng nhất: lập trình generic định nghĩa một thao tác dữ liệu với kiểu dữ liệu chung nhất nhằm tối đa hóa việc sử dụng lại mã trong chương trình, tạo ra kiểu dữ liệu an toàn cũng như tránh mã thừa để đem lại hiệu suất cao nhất. Ada 95 Bắt đầu vào năm 1988. Hỗ trợ OOP thông qua kiểu dẫn xuất. Kiểm soát tốt hơn các cơ chế chia sẽ dữ liệu. Có nhiều tính năng lập trình tương tranh mới. Tuy nhiên không còn phổ biến bởi bộ quốc phòng Mỹ không còn sử dụng nó và bởi vì sự phổ biến của C++. Ada 2005 được bổ sung một số tính năng như giao diện (interface) giống như Java, nhiều thuật toán điều khiển lập lịch hơn, và đồng bộ hóa giao diện. Ada được sử dụng nhiều trong quốc phòng, hàng không, giao thông vận tải đường sắt, và một số lĩnh vực khác. 38 14. Lập trình hướng đối tượng: Smalltalk Được phát triển tại Xerox PARC, khởi tạo bởi Alan Kay, sau này được thực hiện bởi Adele Goldberg. Ngôn ngữ đầu tiên hiện thực đầy đủ hướng đối tượng (trừu tượng hóa dữ liệu, thừa kế, và ràng buộc động). Đi tiên phong trong lĩnh vực thiết kế giao diện người sử dụng và đẩy mạnh OOP. Nguyên lý tách khỏi và nguyên lý kết hợp: các chương trình không OOP thường là một danh sách dài các câu lệnh. Các chương trình phức tạp thì thường nhóm các câu lệnh vào các hàm, mỗi một chúng sẽ thực hiện một công việc nào đó. Với thiết kế đó dữ liệu của các chương trình dễ trở nên toàn cục. Khi chương trình lớn dần, sẽ có nhiều hàm có quyền thay đổi dữ liệu, điều này có nghĩa khi có lỗi sẽ ảnh hưởng rộng. Với cách hướng đối tượng, lập trình viên đặt dữ liệu vào nơi mà nó không thể bị truy cập trực tiếp bởi các phần còn lại của chương trình. Thay vào đó, dữ liệu sẽ được truy cập bởi các phương thức. Kết hợp dữ liệu với tập các phương thức để truy cập và quản lý dữ liệu thì được gọi là một đối tượng. 15. Kết hợp giữa lập trình mệnh lệnh và lập trình hướng đối tượng: C++ Được phát triển tại phòng thí nghiệm Bell bởi Stroustrup vào năm 1980. Phát triển từ C và SIMULA 67. Lấy một phần từ SIMULA 67 cho lập trình hướng đối tượng. Hỗ trợ xử lý ngoại lệ. Một ngôn ngữ lớn và phức tạp, một phần bởi vì nó hỗ trợ cả lập trình thủ tục và hướng đối tượng. Nhanh chóng được phổ biến. Có một phiên bản của Microsoft (phát hành với .NET vào 2002): có chức năng ủy quyền, giao diện, không có đa kế thừa. 39 16. Một ngôn ngữ hướng đối tượng dựa trên mệnh lệnh: Java Được phát triển bởi Sun vào những năm đầu 1990. Vào lúc đó, C và C++ không an toàn, tin cậy để nhúng vào các thiết bị điện tử. Vì vậy ngôn ngữ Java ra đời, nó được dựa trên C++ nhưng được đơn giản hóa (không có struct, union, enum, pointer), chỉ hỗ trợ OOP và có tham chiếu nhưng không có con trỏ. Ngoài ra nó còn - Loại bỏ nhiều tính năng không an toàn của C++ - Hỗ trợ lập trình tương tranh - Có thư viện cho applet, interface, GUI, truy cập cơ sở dữ liệu - Portable dựa vào máy ảo Java, trình biên dịch JIT - Được sử dụng phổ biến trong lập trình web Nguyên lý trung gian: Java nổi tiếng với câu “viết một lần, chạy bất kỳ đâu” (chạy trên bất kỳ hệ máy nào) là nhờ có máy ảo Java, với máy ảo này các chương trình Java sau khi được biên dịch ra mã bytecode (các tập tin .class) sẽ được chúng biên dịch lại thành mã máy của hệ máy đó để thực thi. Nguyên lý sử dụng vỏ dẻo và màng mỏng: Với interface, các lớp được định nghĩa với các interface có thể thay đổi nội dung các interface bên trong lớp. 17. Các ngôn ngữ kịch bản cho Web 17.1. Perl Được thiết kế bởi Larry Wall, phiên bản đầu tiên được phát hành vào 1987. Các biến là kiểu tĩnh và được khai báo ngầm định. Có ba không gian tên (namespace), được biểu hiện bằng ký tự đầu tiên của một tên biến. Mạnh mẽ nhưng khá nguy hiểm. Được sử dụng phổ biến cho lập trình CGI trên Web. Cũng được sử dụng thay thế cho một ngôn ngữ quản trị hệ thống UNIX. 40 17.2. JavaScript Bắt đầu tại Netscape nhưng sau này được liên kết bởi Netscape và Sun Microsystems. Một ngôn ngữ kịch bản được nhúng vào HTML phía client, thường được sử dụng để tạo ra HTML động. Hoàn toàn được thông dịch. Chỉ có cú pháp tương tự là liên quan tới Java. Nguyên lý phẩm chất cục bộ: Lúc đầu tất cả các thao tác trên website đều được xử lý tại server. Sau này các tương tác cơ bản đối với người dùng như hiệu ứng hình ảnh, rê chuột, kiểm tra giá trị thông tin mà người dùng nhập vào, … thì được xử lý tại client bằng các ngôn như script như Javascript, VBScript, … để giảm gánh nặng cho server, tương tác nhanh chóng với người dùng 17.3. PHP PHP: Hypertext Preprocessor, được thiết kế bởi Rasmus Lerdorf. Một ngôn ngữ kịch bản được nhúng vào HTML phía server, thường được sử dụng cho xử lý form và truy cập dữ liệu qua Web. Hoàn toàn được thông dịch. 18. Xu hướng hiện nay Ngôn ngữ tiếp tục được phát triển trong cả công nghiệp lẫn nghiên cứu. Vài xu hướng hiện nay là : - Hỗ trợ lập trình phân tán - Bổ sung các cơ chế bảo mật, tin cậy cho ngôn ngữ - Tích hợp với các cơ sở dữ liệu - Phát triển phần mềm hướng thành phần - AOP (Aspect Oriented Programming) - Các ngôn ngữ lập trình song song đồng thời cho CPU và GPU Ta có thể dễ dàng thấy vài nguyên tắc sáng tạo được sử dụng như nguyên tắc phân nhỏ (trong phân tán), nguyên tắc linh hoạt (trong AOP), ... 41 III. Kết luận: Hệ thống giáo dục, thi thố tài năng bằng sự thuộc lòng những hiểu biết “uyên thâm” thách thức đối đáp thông thạo trước những câu đối chứa đựng các điển tích và những thuật chơi chữ hóc búa, chuẩn mực người tài là người “thông kim bác cổ”, hiểu biết “thiên kinh vạn quyển” đang dần bị thay thế bởi năng lực ra những quyết định sáng tạo trong các tình huống không ngừng biến động của hoàn cảnh. Điều đó càng rõ ràng trong bài luận này khi đã cho ta thấy được sự “có mặt” rộng khắp của 40 phương pháp sáng tạo như thế nào trong công nghệ thông tin nói chung và trong ngôn ngữ lập trình nói riêng. Ta cũng có thể thấy được sự phổ biến của nó trong cuộc sống quanh ta hiện nay nhiều như thế nào. Nó là sự kết tinh của hàng triệu bằng sáng tạo, vì vậy cũng dễ hiểu vì sao ngày càng nhiều nước trên thế giới du nhập, quan tâm đến nó hơn. Khi sự phát triển của khoa học và kỹ thuật nhanh như vũ bão, thế giới trở nên ngày một hội nhập thì việc ta có thể giải quyết một vấn đề nào đó trở nên rất có giá trị, nó sẽ mở ra cơ hội thành công rất lớn cho chúng ta cũng như cho xã hội. Thế nhưng việc “thấy” và “dụng” nó là hai việc khác nhau hoàn toàn. Do vậy để có thể áp dụng được nó đòi hỏi bạn cần phải nắm vững cũng như phải tập luyện thường xuyên, hãy thử liên tưởng vận dụng các nguyên tắc này vào ngay khi bạn gặp một vấn đề nào đó. Và hãy nhớ “Sự sáng tạo làm nên sự khác biệt giữa người dẫn đầu và kẻ bám đuôi” Steve Jobs 42 Tài liệu tham khảo: Website: - - - - - - Sách: - Concepts of Programming Languages, 10th Edition, Robert W.Sebesta - Phương pháp luận khoa học và kỹ thuật, Phan Dũng - Slides bài giảng môn ‘‘PHƯƠNG PHÁP NGHIÊN CỨU KHOA HỌC TRONG TIN HỌC’’, GS.TSKH. Hoàng Kiếm

Các file đính kèm theo tài liệu này:

  • pdfpt_nnlaptrinh__4811.pdf