Một thái cực khác là nói hai chương trình tương đương với nhau nếu chúng tính toán cùng một chức năng (hoặc hiển thị cùng một hành vi có thể quan sát được trong các môi trường tương tự). Nhưng những điều này là không tốt: không phải tất cả các chương trình kiểm tra tính nguyên thủy đều giống nhau. Chúng tôi có thể thêm một dòng mã không ảnh hưởng đến kết quả và chúng tôi vẫn sẽ coi đó là cùng một chương trình.
Đây không phải là một cực đoan: sự tương đương của chương trình phải được xác định liên quan đến một khái niệm quan sát.
Định nghĩa phổ biến nhất trong nghiên cứu PL là tương đương theo ngữ cảnh. Trong tương đương theo ngữ cảnh, ý tưởng là chúng ta quan sát các chương trình bằng cách sử dụng chúng làm thành phần của các chương trình lớn hơn (bối cảnh). Vì vậy, nếu hai chương trình tính cùng một giá trị cuối cùng cho tất cả các bối cảnh, thì chúng được đánh giá là bằng nhau. Vì định nghĩa này định lượng trên tất cả các bối cảnh chương trình có thể, rất khó để làm việc trực tiếp. Vì vậy, một chương trình nghiên cứu điển hình trong PL là tìm ra các nguyên tắc lý luận thành phần trong đó ngụ ý sự tương đương theo ngữ cảnh.
Tuy nhiên, đây không phải là khái niệm duy nhất có thể quan sát được. Ví dụ, chúng ta có thể dễ dàng nói rằng bộ nhớ, thời gian hoặc hành vi sức mạnh của một chương trình là có thể quan sát được. Trong trường hợp này, có ít tương đương chương trình hơn, vì chúng ta có thể phân biệt nhiều chương trình hơn (ví dụ, sự hợp nhất hiện có thể phân biệt với quicksort). Nếu bạn muốn (nói) các ngôn ngữ thiết kế miễn nhiễm với các cuộc tấn công kênh thời gian hoặc để thiết kế các ngôn ngữ lập trình giới hạn không gian, thì đây là loại việc bạn phải làm.
Ngoài ra, chúng tôi có thể chọn đánh giá một số trạng thái trung gian của một tính toán là có thể quan sát được. Điều này luôn xảy ra đối với các ngôn ngữ đồng thời, do khả năng can thiệp. Nhưng bạn có thể muốn có chế độ xem này ngay cả đối với các ngôn ngữ tuần tự --- ví dụ: nếu bạn muốn đảm bảo rằng không có tính toán nào lưu trữ dữ liệu không được mã hóa trong bộ nhớ chính, thì bạn phải coi ghi vào bộ nhớ chính là có thể quan sát được.
Về cơ bản, không có khái niệm duy nhất về sự tương đương của chương trình; nó luôn luôn liên quan đến khái niệm quan sát bạn chọn, và điều đó phụ thuộc vào ứng dụng bạn có trong đầu.