Tìm hiểu cách ý tưởng lưu chương trình—thường gắn với John von Neumann—đã cho phép phần mềm tái sử dụng, máy tính đa dụng và lập trình hiện đại.

Cốt lõi của máy tính hiện đại là một câu hỏi đơn giản: điều gì làm cho một máy có thể thực hiện nhiều công việc khác nhau mà không phải xây lại mỗi lần? Những máy tính điện tử đầu tiên có thể tính toán nhanh, nhưng “đổi nhiệm vụ” thường có nghĩa là thay đổi cấu hình phần cứng. Ý tưởng lưu chương trình là bước ngoặt khiến máy tính trở nên thực sự có thể lập trình được.
Một máy tính lưu chương trình giữ các lệnh cho một nhiệm vụ (chương trình) trong cùng loại bộ nhớ nội bộ như dữ liệu mà chương trình thao tác. Thay vì đi dây hoặc cấu hình bảng điều khiển, bạn chỉ cần nạp một tập lệnh mới vào bộ nhớ và chạy một công việc khác.
Nghe thì rõ ràng bây giờ, nhưng đó là một chuyển đổi sâu sắc:
Đây không chỉ là chuyện lịch sử. Khái niệm lưu chương trình giải thích tại sao “phần mềm” tồn tại tách biệt với “phần cứng”, và tại sao cập nhật thiết bị ngày nay có thể mở khóa tính năng mới mà không cần thay chip. Trong các phần tiếp theo, chúng ta sẽ đi qua vấn đề các máy đầu gặp phải, điều gì thay đổi khi áp dụng lưu chương trình, những người và tài liệu làm rõ ý tưởng (bao gồm báo cáo EDVAC nổi tiếng), và cách thuật ngữ “kiến trúc von Neumann” trở thành đại diện cho một thiết kế được dùng phổ biến.
Mặc dù tên John von Neumann gắn mật thiết với lưu chương trình, công lao được chia cho nhiều người và nhiều nhóm. Nhiều nhà nghiên cứu đang cùng hướng tới ý tưởng tương tự khi xây những máy tính điện tử đầu tiên. Bài viết này giữ bối cảnh đó để hiểu vì sao ý tưởng lan nhanh và trở thành mô hình mặc định cho hầu hết máy tính sau này.
Trước ý tưởng lưu chương trình, nhiều máy tính đầu không “chạy phần mềm” theo nghĩa ngày nay. Chúng có thể tính toán nhanh, nhưng để nói cho chúng phải làm gì thường là phải thay đổi cấu hình vật lý của máy.
Một cách phổ biến là dùng bảng cắm, dây nối và bảng công tắc. Người vận hành sẽ nối dây giữa các ổ cắm, đặt hàng loạt công tắc, và đôi khi điều chỉnh đơn vị thời gian để tín hiệu đến đúng thứ tự. “Chương trình” không phải là tệp bạn nạp—nó là sơ đồ đi dây tạm thời.
Cách này hoạt động, nhưng có chi phí ẩn: mỗi nhiệm vụ mới là một dự án kỹ thuật nhỏ. Nếu muốn thay đổi thứ tự thao tác (cộng, nhân, so sánh, lặp), bạn có thể phải di chuyển hàng chục hoặc hàng trăm kết nối. Một dây cắm sai có thể gây lỗi tinh vi khó chẩn đoán, vì logic phân tán trong kết nối phần cứng thay vì được viết thành các bước dễ đọc.
Cấu hình lại có thể mất giờ hoặc ngày, nhất là khi máy phải tắt nguồn cẩn thận, đi dây lại và kiểm tra. Điều đó nghĩa là tính linh hoạt hạn chế: các máy thường được lên lịch cho một loại tính toán trong thời gian dài vì chuyển đổi quá phiền toái.
Hãy tưởng tượng một máy được cấu hình để tính bảng bắn đạn—tính toán dài lặp với một công thức cố định. Nếu sau đó các nhà nghiên cứu muốn máy giải một bài toán khác, như tổng hợp số liệu thống kê cho cuộc điều tra dân số, thì không thể “chỉnh chương trình rồi chạy lại” nhanh. Thứ tự thao tác, bước lưu trung gian và kiểm tra điều kiện có thể khác nhau hoàn toàn, cần phải thiết kế lại bảng cắm và kiểm chứng lại từ đầu.
Đó là thế giới mà máy lưu chương trình được thiết kế để thoát ra.
Một máy tính lưu chương trình là máy mà ở đó các lệnh (chương trình) nằm trong cùng bộ nhớ làm việc với dữ liệu mà chương trình dùng. Nói cách khác, máy không xem “phải làm gì” khác với “phải làm việc trên gì”—cả hai đều được lưu dưới dạng bit trong bộ nhớ.
Khi các nhà tiên phong nói về bộ nhớ, họ ám chỉ bộ lưu nội bộ nhanh của máy—gần giống với RAM ngày nay. Đó là nơi bộ xử lý có thể đọc và ghi nhanh trong khi chạy.
Nó khác với lưu trữ lâu dài như ổ đĩa: ổ đĩa tốt để giữ tệp khi mất điện, nhưng không phải là vùng làm việc ngay lập tức mà bộ xử lý liên tục truy xuất lệnh tiếp theo và cập nhật kết quả trung gian.
Khi lệnh được lưu trong bộ nhớ, việc chuyển đổi nhiệm vụ trở nên đơn giản hơn rất nhiều: bạn nạp chương trình mới vào bộ nhớ và chạy, không cần xây dựng lại, đi dây lại hay cấu hình phần cứng. Cùng một máy đa dụng có thể làm bảng lương buổi sáng và tính toán đạn đạo buổi chiều—vì “cách làm” chỉ là một dãy bit bạn có thể thay thế.
Hãy tưởng tượng một nhà bếp nơi công thức và nguyên liệu được để cùng một tủ. Người nấu (bộ xử lý) nhiều lần mở tủ (bộ nhớ) để đọc bước công thức tiếp theo (lệnh) và lấy hoặc cập nhật nguyên liệu (dữ liệu).
Muốn làm món khác? Bạn không sửa nhà bếp. Bạn chỉ thay công thức—vẫn dùng cùng bàn, lò và dụng cụ.
John von Neumann không “phát minh ra máy tính,” và ông cũng không một mình tạo ra ý tưởng lưu chương trình. Điều ông làm—một cách xuất sắc—là giúp biến một khái niệm hứa hẹn thành một thiết kế được diễn đạt rõ ràng, dễ chia sẻ để các kỹ sư và phòng thí nghiệm khác xây theo.
Von Neumann tham gia sâu vào các dự án tính toán thời chiến và hậu chiến, tư vấn cho các nhóm và mài dũa cấu trúc logic của các thiết kế đầu. Ông có năng khiếu giải thích các lựa chọn kỹ thuật phức tạp một cách rõ ràng, điều quan trọng khi lĩnh vực chuyển động nhanh và nhiều nhóm cùng giải quyết vấn đề giống nhau.
Quan trọng không kém, ông viết và lưu hành các mô tả ảnh hưởng về cách máy có thể lưu lệnh chương trình trong cùng bộ nhớ dùng cho dữ liệu. Cách trình bày rõ ràng đó giúp người khác dễ thảo luận, dạy và sao chép phương pháp.
Tên gọi thường gắn với người có mô tả trở thành điểm tham chiếu hơn là người đầu tiên có ý tưởng. Các bài viết của von Neumann được đọc rộng rãi, sao chép và trích dẫn—vì vậy người đọc sau này tự nhiên liên kết tổ chức lưu chương trình với ông.
Cách gọi tắt này cũng làm lịch sử đơn giản hơn: nói “kiến trúc von Neumann” dễ hơn là liệt kê mọi đóng góp. Nhưng cách gọi ngắn có thể che mờ bức tranh thực tế.
Máy tính điện tử thời đầu là công sức hợp tác giữa nhiều viện, gồm toán học, kỹ thuật và lập trình. Ý tưởng lưu chương trình trưởng thành qua thảo luận, bản thảo, nguyên mẫu và sửa đổi giữa các nhóm. Vai trò bền vững của von Neumann là giúp kết tinh và truyền bá ý tưởng—thúc đẩy việc áp dụng—chứ không phải tạo ra nó một mình.
EDVAC (Electronic Discrete Variable Automatic Computer) là một trong những dự án máy tính hậu chiến nhằm vượt khỏi các máy “một lần dùng”. Cùng quan trọng với nỗ lực phần cứng là quyết định ghi chép ý tưởng thiết kế rõ ràng để chia sẻ. Lúc đó, xây máy vẫn là kỹ thuật thử nghiệm—kiến thức nằm trong sổ tay phòng thí nghiệm, cuộc họp và trong đầu vài chuyên gia. Một báo cáo có thể biến những hiểu biết rời rạc thành thứ các nhóm khác thảo luận, phê bình và tái sử dụng.
First Draft of a Report on the EDVAC (thường gọi tắt là “báo cáo EDVAC”) trình bày, bằng ngôn ngữ khái niệm dễ hiểu, ý tưởng lưu chương trình: một máy tính nên giữ lệnh chương trình trong cùng loại bộ nhớ nội bộ như dữ liệu. Bộ nhớ đó không chỉ là nơi giữ số khi phép tính chạy—nó còn chứa các bước bảo cho máy biết phải làm gì tiếp theo.
Cách trình bày này khiến máy tính bớt giống thiết bị cố định và giống máy tổng quát có thể “đổi nhiệm vụ” bằng cách thay đổi nội dung bộ nhớ. Bạn không đi dây lại hệ thống để chuyển từ nhiệm vụ này sang nhiệm vụ khác; bạn tải một dãy lệnh khác.
Ngoài khái niệm, báo cáo giúp chuẩn hóa cách mọi người nói về máy: bộ nhớ, điều khiển, số học và nhập/xuất như các phần chức năng riêng hợp tác với nhau. Có một ngôn ngữ chung và mô tả được đọc rộng rãi không chỉ giải thích EDVAC—nó cung cấp cho lĩnh vực một mô hình tinh thần chung để xây, so sánh và cải tiến máy lưu chương trình.
Rất dễ muốn hỏi “ai phát minh ra máy tính lưu chương trình?” và chờ một cái tên duy nhất. Nhưng khoa học và kỹ thuật hiếm khi như vậy. Ý tưởng thường phát triển song song, được mài giũa qua thảo luận, và chỉ thuyết phục khi được chứng minh bằng phần cứng hoạt động.
John von Neumann gắn chặt với ý tưởng lưu chương trình, nhưng công trình thời đầu liên quan nhiều người và nhiều nhóm:
Máy tính lưu chương trình không phải một phát hiện duy nhất. Nó kết hợp (1) bước nhảy khái niệm rằng lệnh có thể sống trong bộ nhớ như dữ liệu, (2) kỹ thuật để xây bộ nhớ và đơn vị điều khiển đáng tin cậy, và (3) thực hành lập trình để làm thiết kế hữu dụng. Mỗi người đóng góp vào những mảnh khác nhau.
Một lý do khác khiến công lao được chia: đề xuất một ý tưởng không bằng xây một máy chạy được ngày qua ngày. Báo cáo và thảo luận làm rõ khái niệm; nguyên mẫu và hệ thống sản xuất chứng minh tính khả thi. Lịch sử cẩn trọng tôn trọng cả hai loại đóng góp—mà không ép một kết luận “người phát minh đầu tiên” đơn giản.
Khi người ta nói “kiến trúc von Neumann”, họ thường chỉ một mô hình đơn giản, hay được dạy, về cách tổ chức máy tính lưu chương trình. Nó không phải thương hiệu hay một máy lịch sử duy nhất—mà là nhãn tiện dụng cho một kế hoạch cơ bản xuất hiện ở nhiều máy.
Ở mức khái niệm, hình ảnh như sau:
Ý chính là CPU không có chỗ vật lý riêng cho “chương trình” khác với “dữ liệu.” Nó kéo mọi thứ cần từ bộ nhớ.
CPU chạy chương trình bằng cách lặp một vòng thường mô tả là fetch–decode–execute:\n\n1. Fetch: đọc lệnh tiếp theo từ bộ nhớ.\n2. Decode: dịch lệnh đó ra hành động (cộng, so sánh, load, store, nhảy…).\n3. Execute: thực hiện hành động, có thể đọc/ghi bộ nhớ hoặc tương tác với I/O.
Mô tả này đơn giản hóa, nhưng nắm bắt lõi: chương trình là dãy lệnh lưu trong bộ nhớ, và CPU đi qua chúng từng bước.
Đặt lệnh và dữ liệu cùng nơi làm cho máy tính đa dụng theo cách rất thực tế:\n\n- Để thay đổi nhiệm vụ, bạn thường thay chương trình trong bộ nhớ, không phải đi dây.\n- Chương trình có thể bị xem là thông tin—sao chép, nạp, chỉnh sửa (mặc dù hệ thống hiện đại thường hạn chế điều này vì an toàn).\n- Dễ xây công cụ như assembler, compiler và hệ điều hành hơn, vì “một chương trình” chỉ là một loại thông tin được lưu.
Vậy “kiến trúc von Neumann” là một cách gọi tắt cho mô hình lưu chương trình với CPU, bộ nhớ chung chứa lệnh và dữ liệu, và I/O—một ý tưởng gắn chặt với các mô tả rõ ràng của von Neumann, dù câu chuyện lịch sử thực tế có nhiều người đóng góp.
Người ta thường nói “von Neumann” và “Harvard” như hai triết lý đối lập, nhưng thực ra là hai cách thực tế sắp xếp lệnh chương trình và dữ liệu để máy có thể lấy thứ cần.
Trong thiết kế kiểu von Neumann, lệnh và dữ liệu sống trong cùng bộ nhớ và thường đi qua cùng đường chính tới CPU.
Đơn giản về mặt khái niệm: chương trình là byte trong bộ nhớ, ngay cạnh số, văn bản và hình ảnh nó thao tác. Nó cũng làm máy đa dụng dễ dùng—phần mềm có thể nạp, thay đổi và lưu bằng cùng cơ chế như dữ liệu.
Nhược điểm: khi lệnh và dữ liệu chia sẻ “đường”, chúng có thể tranh tài băng thông. (Người ta thường gọi là “nút thắt”, nhưng ý chính là chia sẻ.)
Kiểu Harvard giữ vùng lưu lệnh riêng và vùng lưu dữ liệu riêng, thường với đường truy xuất riêng. Sự tách này giúp lấy lệnh tiếp theo đồng thời với đọc/ghi dữ liệu—hữu ích cho hệ thống nhỏ, dự đoán được. Ví dụ điển hình là nhiều microcontroller, nơi mã chương trình nằm trong flash còn biến nằm trong RAM.
CPU hiện đại thường nhìn giống “von Neumann” với phần mềm (một không gian địa chỉ), trong khi nội bộ vay ý tưởng Harvard. Ví dụ phổ biến là cache lệnh và cache dữ liệu tách biệt. Với phần mềm, vẫn có cảm giác một bộ nhớ, nhưng phần cứng có thể lấy mã và dữ liệu hiệu quả hơn.
Điều cần nhớ: không có câu trả lời tuyệt đối. Von Neumann nhấn mạnh đơn giản và linh hoạt; Harvard nhấn mạnh tách bạch và thông lượng. Nhiều máy kết hợp để cân bằng khả lập trình, chi phí, điện năng và tốc độ.
Máy lưu chương trình không chỉ chạy phép tính—nó có thể nạp một tập lệnh vào bộ nhớ, thực thi và sau đó nạp một tập lệnh khác. Sự chuyển đổi này khiến phần mềm có thể tái sử dụng và chia sẻ: chương trình có thể viết một lần, lưu, sao chép, cải thiện và phân phối mà không chạm phần cứng.
Khi chương trình sống trong bộ nhớ, cùng phần cứng có thể làm nhiều việc khác nhau đơn giản bằng cách đổi lệnh. Đó là ý nghĩa thực sự của “đa dụng”: một máy, nhiều chương trình. Máy không còn bị định nghĩa bởi một quy trình duy nhất; nó trở thành nền tảng.
Ví dụ hiện đại quen thuộc: laptop bạn chạy email, game và bảng tính. Về bản chất, đó là cùng ý tưởng: phần cứng giữ nguyên trong khi các chương trình khác nhau được nạp và chạy khi bạn chuyển ứng dụng.
Khi lệnh được xem như dữ liệu trong bộ nhớ, việc xây các lớp phần mềm hỗ trợ viết phần mềm trở nên khả thi:
Những công cụ này dựa trên giả định rằng chương trình có thể được lưu, di chuyển và xử lý như thông tin khác. Đó là thứ biến phần mềm thành một hệ sinh thái thay vì sản phẩm một lần gắn với đi dây.
Một cách nhìn cung cấp vòng quay dài hạn: lưu chương trình cho phép compiler và OS, các công cụ tốt hơn cho phép chương trình phức tạp hơn—và hôm nay chúng ta có thêm lớp trừu tượng nơi bạn mô tả ứng dụng bằng ngôn ngữ tự nhiên và công cụ tạo mã hoạt động. Ví dụ, Koder.ai là một nền tảng vibe-coding nơi bạn xây web, backend hoặc app di động qua giao diện chat, dựa trên LLMs và quy trình agent để rút ngắn con đường từ ý định (“nó nên làm gì?”) đến lệnh thực thi (mã nguồn bạn có thể xuất, triển khai và rollback bằng snapshots).
Kết quả vẫn là chu trình tích cực: lưu chương trình làm công cụ tốt hơn có thể, và công cụ tốt hơn làm chương trình tham vọng hơn có thể—biến máy tính thành thiết bị đa dụng, linh hoạt.
Ý tưởng lưu chương trình làm máy tính linh hoạt, nhưng cũng lộ ra một giới hạn thực tế mà kỹ sư vẫn bàn luận: “nút thắt von Neumann.” Nói nôm na, nó giống tắc nghẽn giao thông trên đường giữa CPU (người làm) và bộ nhớ (kho hàng).
Trong thiết kế lưu chương trình điển hình, cả lệnh và dữ liệu nằm trong bộ nhớ. CPU lấy một lệnh, sau đó lấy dữ liệu cần thiết, rồi ghi kết quả—thường qua cùng một kết nối. Nếu kết nối đó không truyền đủ nhanh, CPU phải chờ dù có thể tính nhanh hơn.
Hai yếu tố liên quan định hình nút thắt:\n\n- Độ trễ bộ nhớ: mất bao lâu để lấy mẩu thông tin đầu tiên sau khi yêu cầu.\n- Băng thông bộ nhớ: bao nhiêu thông tin có thể chuyển mỗi giây khi bắt đầu truyền.
CPU có thể thực hiện hàng tỷ phép mỗi giây, nhưng nếu bộ nhớ không cung cấp dòng lệnh và dữ liệu liên tục, hiệu năng bị giới hạn bởi bước chậm nhất: lấy byte lên xuống.
Đây là vấn đề kỹ thuật phổ biến, và máy hiện đại sử dụng vài kỹ thuật để giảm ảnh hưởng:\n\n- Cache: bộ nhớ nhỏ, nhanh gần CPU giữ lệnh/dữ liệu gần đây.\n- Prefetching: dự đoán cái cần đến và tải sớm.\n- Song song: làm nhiều việc cùng lúc (nhiều lõi, chồng chéo truy xuất bộ nhớ với tính toán).
Những cách này không xóa bỏ con đường cơ bản, nhưng giúp giảm tắc—để CPU làm nhiều hơn, chờ ít hơn.
Ý tưởng lưu chương trình không phải cổ vật: đó là cách máy tính hàng ngày giữ tính linh hoạt. Thiết bị của bạn không cần “đi dây lại” để làm gì mới; chúng chỉ nạp lệnh khác vào bộ nhớ và chạy.
Trên điện thoại, chạm biểu tượng app khiến hệ điều hành nạp mã app từ lưu trữ vào bộ nhớ, rồi CPU thực thi. Trên laptop, tương tự khi mở trình duyệt, sửa tài liệu hay chơi game. Trên server, chuyện này càng rõ: máy có thể chạy hàng nghìn tải thay đổi—yêu cầu web, truy vấn DB, công việc nền—mà không đổi phần cứng.
Ngay cả những tính năng ta nghĩ là “phần cứng” thường được định nghĩa bằng phần mềm. Định tuyến mạng, giải mã video, xử lý ảnh, và chính sách quản lý năng lượng thường được cập nhật qua firmware và phần hệ thống—mã mới, cùng thiết bị.
Ngôn ngữ như Python và JavaScript thường chạy qua trình thông dịch hoặc máy ảo. Thay vì CPU thực thi trực tiếp mã nguồn, chương trình được dịch thành dạng cấu trúc (bytecode hoặc lệnh nội bộ) được lưu trong bộ nhớ và thực thi từng bước. JVM của Java, .NET, runtime WebAssembly và engine JS của trình duyệt đều dựa trên nguyên tắc này: lệnh trở thành cấu trúc dữ liệu mà máy có thể nạp, di chuyển và thực thi.
Vì lệnh chỉ là thông tin, các cuộc tấn công cố gắng giấu mã độc trong dữ liệu là phổ biến—ví dụ chèn mã. Các biện pháp như bảo vệ bộ nhớ, ký mã và vùng bộ nhớ không thực thi tồn tại để giữ dữ liệu không đáng tin cậy khỏi trở thành lệnh chạy được.
Tất cả quay trở lại lời hứa trung tâm của lưu chương trình: linh hoạt nhờ phần mềm—hành vi mới trên cùng phần cứng.
Khi xem một máy (hoặc đọc thông số), các câu hỏi sau giúp thấy mô hình cơ bản:\n\n- Lệnh được lưu ở đâu khi chạy: cùng bộ nhớ với dữ liệu hay bộ nhớ riêng?\n- Lệnh và dữ liệu đi trên cùng bus/đường hay có đường riêng (thường thấy ở Harvard)?\n- Hệ thống có thể sửa hoặc sinh mã rồi thực thi nó không (khả năng lưu chương trình cổ điển), hay lưu mã cố định/khép kín?\n- Bộ nhớ chương trình có mô tả là flash/ROM trong khi bộ nhớ dữ liệu là RAM (gợi ý phân chia kiểu Harvard ở nhiều microcontroller)?
Nếu bạn muốn thêm các bài thân thiện với nền tảng như thế này, hãy duyệt /blog.
Ghi chú: Nếu bạn thử nghiệm các cách hiện đại biến “lệnh” thành hệ thống chạy được—dù bằng cách viết mã trực tiếp hay dùng nền tảng xây dựng bằng chat như Koder.ai—hãy cân nhắc ghi chép những gì học được. Koder.ai cũng có chương trình kiếm tín dụng cho nội dung xuất bản và giới thiệu, có thể là cách thực tế để tài trợ cho các thử nghiệm và hướng dẫn thêm.
Một máy tính lưu chương trình giữ lệnh chương trình trong cùng bộ nhớ nội bộ mà nó dùng để lưu dữ liệu mà các lệnh đó thao tác. Để đổi nhiệm vụ, bạn nạp một tập lệnh khác vào bộ nhớ thay vì phải đi dây lại hoặc cấu hình phần cứng bằng tay.
Trước khi có lưu chương trình, nhiều máy được “lập trình” bằng bảng cắm, dây nối và các công tắc. Thay đổi thứ tự thao tác có thể mất nhiều giờ hoặc nhiều ngày để đi dây lại và kiểm tra, và chỉ một kết nối sai có thể gây ra lỗi khó tìm.
Ở đây, “bộ nhớ” nghĩa là bộ lưu nhanh để làm việc của máy (tương tự RAM hiện đại) mà CPU có thể đọc và ghi liên tục khi chạy. Nó khác với lưu trữ lâu dài (như ổ đĩa/SSD), nơi lưu chương trình và tệp khi tắt nguồn.
Báo cáo EDVAC mô tả rõ ràng tổ chức nơi lệnh và dữ liệu dùng chung bộ nhớ nội bộ, cùng với một từ vựng hữu ích để nói về các phần của máy (bộ nhớ, điều khiển, số học, nhập/xuất). Sự rõ ràng đó giúp các nhóm khác thảo luận, so sánh và xây dựng các hệ thống tương tự nhanh hơn.
Tên của von Neumann gắn với ý tưởng chủ yếu vì các mô tả của ông được lan truyền rộng rãi và dễ tham chiếu, không phải vì ông là người đóng góp duy nhất. Cách tiếp cận lưu chương trình xuất phát từ cộng đồng rộng hơn (kỹ sư, nhà toán học và lập trình viên thời đầu) cùng giải quyết vấn đề vào cùng thời điểm.
“Kiến trúc von Neumann” thường chỉ một mô hình gồm:
Đó là nhãn tiện dụng để dạy ý tưởng lưu chương trình, không phải khẳng định về một máy lịch sử hay một người phát minh duy nhất.
Trong thiết kế kiểu von Neumann, lệnh và dữ liệu dùng chung một bộ nhớ (thường cùng một đường truyền đến CPU). Trong kiểu Harvard, vùng lưu lệnh và vùng lưu dữ liệu tách biệt (thường có đường truy xuất riêng).
Nhiều hệ thống hiện đại kết hợp cả hai—ví dụ: mô hình bộ nhớ một không gian cho phần mềm, nhưng có cache lệnh và cache dữ liệu riêng trong phần cứng.
“Nút thắt von Neumann” là giới hạn hiệu năng xảy ra khi CPU và bộ nhớ chia sẻ một đường truyền giới hạn cho cả lệnh và dữ liệu. Các biện pháp giảm thiểu phổ biến gồm cache, prefetching, và đa song song (ví dụ nhiều lõi), giúp giảm thời gian chờ nhưng không loại bỏ hoàn toàn hạn chế cơ bản.
Bởi vì chương trình chỉ là thông tin có thể nạp vào bộ nhớ, bạn có thể thay đổi hành vi bằng cách cập nhật phần mềm thay vì thay chip. Đó là lý do cùng một điện thoại hay laptop có thể chạy nhiều app khác nhau, và cập nhật firmware/OS có thể thêm tính năng mà không cần thiết kế lại phần cứng.
Vì lệnh được biểu diễn như dữ liệu trong bộ nhớ, kẻ tấn công đôi khi cố làm cho hệ thống coi dữ liệu không tin cậy là mã thực thi (ví dụ chèn mã). Các biện pháp phòng thủ hiện đại gồm bảo vệ bộ nhớ (vùng không thực thi), ký mã, và các kiểm soát khác để ngăn dữ liệu chưa kiểm chứng thành mã được chạy.