Có nhiều lý do có thể được xem xét để chọn ngôn ngữ X trên ngôn ngữ Y. Khả năng đọc chương trình, dễ lập trình, khả năng di chuyển đến nhiều nền tảng, sự tồn tại của môi trường lập trình tốt có thể là những lý do như vậy. Tuy nhiên, tôi sẽ chỉ xem xét tốc độ thực hiện theo yêu cầu trong câu hỏi. Câu hỏi dường như không xem xét, ví dụ, tốc độ phát triển.
Hai ngôn ngữ có thể biên dịch thành cùng mã byte, nhưng điều đó không có nghĩa là cùng một mã sẽ được tạo ra,
Trên thực tế, mã byte chỉ là mã cho một máy ảo cụ thể. Nó có lợi thế về kỹ thuật, nhưng không giới thiệu những khác biệt cơ bản với việc biên dịch trực tiếp cho một phần mềm cụ thể. Vì vậy, bạn cũng có thể xem xét so sánh hai ngôn ngữ được biên dịch để thực hiện trực tiếp trên cùng một máy.
Điều này nói rằng, vấn đề về tốc độ tương đối của các ngôn ngữ là một vấn đề cũ, bắt nguồn từ các trình biên dịch đầu tiên.
Trong nhiều năm, trong những thời kỳ đầu, chuyên gia cho rằng mã viết tay nhanh hơn mã biên dịch. Nói cách khác, ngôn ngữ máy được coi là nhanh hơn các ngôn ngữ cấp cao như Cobol hoặc Fortran. Và nó là, cả nhanh hơn và thường nhỏ hơn. Các ngôn ngữ cấp cao vẫn được phát triển vì chúng dễ sử dụng hơn đối với nhiều người không phải là nhà khoa học máy tính. Chi phí sử dụng các ngôn ngữ cấp cao thậm chí có một tên: tỷ lệ mở rộng, có thể liên quan đến kích thước của mã được tạo (một vấn đề rất quan trọng trong thời gian đó) hoặc số lượng lệnh thực sự được thực thi. Khái niệm này chủ yếu là thử nghiệm, nhưng tỷ lệ ban đầu lớn hơn 1, vì các trình biên dịch đã thực hiện một công việc khá đơn giản theo tiêu chuẩn ngày nay.
Do đó, ngôn ngữ máy đã nhanh hơn nói, Fortran.
Tất nhiên, điều đó đã thay đổi qua nhiều năm, khi các trình biên dịch trở nên tinh vi hơn, đến mức lập trình bằng ngôn ngữ lắp ráp bây giờ rất hiếm. Đối với hầu hết các ứng dụng, các chương trình ngôn ngữ lắp ráp cạnh tranh kém với mã được tạo bằng cách tối ưu hóa trình biên dịch.
Điều này cho thấy một vấn đề chính là chất lượng của các trình biên dịch có sẵn cho ngôn ngữ được xem xét, khả năng phân tích mã nguồn của chúng và để tối ưu hóa nó cho phù hợp.
Khả năng này có thể phụ thuộc vào một số mở rộng về các tính năng của ngôn ngữ để nhấn mạnh các thuộc tính cấu trúc và toán học của nguồn để làm cho công việc dễ dàng hơn cho trình biên dịch. Ví dụ, một ngôn ngữ có thể cho phép bao gồm các câu lệnh về các thuộc tính đại số của các hàm do người dùng xác định, để cho phép trình biên dịch sử dụng các thuộc tính này cho mục đích tối ưu hóa.
Quá trình biên dịch có thể dễ dàng hơn, do đó tạo ra mã tốt hơn, khi mô hình lập trình của ngôn ngữ gần với các tính năng của các máy sẽ giao tiếp mã, cho dù là máy thật hay máy ảo.
Một điểm khác là liệu các mô hình được thực hiện trong ngôn ngữ có bị đóng đối với loại vấn đề đang được lập trình hay không. Người ta hy vọng rằng một ngôn ngữ lập trình chuyên biệt cho các mô hình lập trình cụ thể sẽ biên dịch các tính năng rất hiệu quả liên quan đến mô hình đó. Do đó, việc lựa chọn ngôn ngữ lập trình có thể phụ thuộc, vì sự rõ ràng và tốc độ, của sự lựa chọn ngôn ngữ lập trình phù hợp với loại vấn đề đang được lập trình.
Sự phổ biến của C đối với lập trình hệ thống có lẽ là do C gần với kiến trúc máy và lập trình hệ thống cũng liên quan trực tiếp đến kiến trúc đó.
Một số vấn đề khác sẽ được lập trình dễ dàng hơn, với việc thực thi nhanh hơn bằng cách sử dụng lập trình logic và ngôn ngữ phân giải ràng buộc .
Các hệ thống phản ứng phức tạp có thể được lập trình rất hiệu quả với các ngôn ngữ lập trình đồng bộ chuyên dụng như Esterel , thể hiện kiến thức rất chuyên sâu về các hệ thống đó và tạo mã rất nhanh.
Hoặc lấy một ví dụ cực đoan, một số ngôn ngữ có tính chuyên môn cao, chẳng hạn như ngôn ngữ mô tả cú pháp được sử dụng để phân tích cú pháp chương trình. Một máy phát điện phân tích cú pháp là gì, nhưng một trình biên dịch cho các ngôn ngữ như vậy. Tất nhiên, nó không hoàn thành Turing, nhưng các trình biên dịch này cực kỳ tốt cho chuyên môn của họ: sản xuất các chương trình phân tích cú pháp hiệu quả. Các lĩnh vực kiến thức bị hạn chế, các kỹ thuật tối ưu hóa có thể rất chuyên biệt và điều chỉnh rất tinh vi. Các trình tạo trình phân tích cú pháp này thường tốt hơn nhiều so với những gì có thể thu được bằng cách viết mã bằng ngôn ngữ khác. Có nhiều ngôn ngữ chuyên môn cao với trình biên dịch tạo ra mã xuất sắc và nhanh chóng cho một lớp vấn đề bị hạn chế.
Do đó, khi viết một hệ thống lớn, có thể không nên dựa vào một ngôn ngữ duy nhất, mà nên chọn ngôn ngữ tốt nhất cho các thành phần khác nhau của hệ thống. Điều này, tất nhiên, đặt ra vấn đề tương thích.
Một điểm khác quan trọng thường đơn giản là sự tồn tại của các thư viện hiệu quả cho các chủ đề được lập trình.
Cuối cùng, tốc độ không phải là tiêu chí duy nhất và có thể mâu thuẫn với các tiêu chí khác như an toàn mã (ví dụ như liên quan đến đầu vào xấu hoặc khả năng phục hồi các lỗi hệ thống), sử dụng bộ nhớ, dễ lập trình (mặc dù khả năng tương thích mô hình thực sự có thể giúp điều đó ), kích thước mã đối tượng, khả năng duy trì chương trình, v.v.
Tốc độ không phải lúc nào cũng là thông số quan trọng nhất. Ngoài ra, nó có thể có những chiêu bài khác nhau, như độ phức tạp có thể là độ phức tạp trung bình hoặc độ phức tạp của trường hợp xấu hơn. Ngoài ra, trong một hệ thống lớn như trong một chương trình nhỏ hơn, có những phần mà tốc độ là rất quan trọng, và những phần khác là vấn đề nhỏ. Và không phải lúc nào cũng dễ dàng xác định điều đó trước.