Việc phát triển trình thông dịch dễ dàng hơn trình biên dịch.
nỗ lực trong việc xây dựng ...:
thông dịch bytecode <-phiên dịch < bytecode-JIT-biên dịch < biên dịch-to-nền tảng độc lập ngôn ngữ < biên dịch-to-nhiều-máy-phụ thuộc lắp ráp.
Đó là xu hướng chung để ngăn chặn sự phát triển ở trình biên dịch jit vì nền tảng độc lập. Chỉ có các ngôn ngữ ưu tiên liên quan đến hiệu suất và nghiên cứu trong khoa học máy tính lý thuyết và sẽ được phát triển theo mọi hướng có thể, bao gồm cả phiên dịch viên bytecode mới, ngay cả khi có trình biên dịch tốt và nâng cao để nền tảng ngôn ngữ độc lập và các trình lắp ráp phụ thuộc vào máy khác nhau.
Nghiên cứu ngôn ngữ OOP khá ... giả sử, so với ngôn ngữ chức năng, bởi vì công nghệ trình biên dịch và ngôn ngữ mới dễ dàng được thể hiện bằng/trong/sử dụng lý thuyết cathegory toán học và mô tả toán học -systems. Nói cách khác: nó gần như là chức năng trong chính nó, trong khi các ngôn ngữ mệnh lệnh gần như chỉ có các giao diện lắp ráp với một số đường cú pháp. Ngôn ngữ OOP có xu hướng là ngôn ngữ bắt buộc, bởi vì các ngôn ngữ chức năng đã đóng và lambda. Có nhiều cách khác để thực hiện "giao diện" giống java trong các ngôn ngữ chức năng, và không chỉ cần thêm các tính năng hướng đối tượng bổ sung.
Trong Haskell, việc thêm tính năng của chương trình giống như OOP có thể sẽ không chỉ bằng một vài bước trong công nghệ - sẽ không có điểm nào khi sử dụng công nghệ đó. (< - đó không chỉ là IMHO ... mà bạn từng nghe về GADT hoặc nhiều loại tham số?) Có lẽ có những cách tốt hơn để tự động tạo đối tượng với giao diện để giao tiếp với OOP-languges thay vì tự thay đổi ngôn ngữ đó . Nhưng cũng có các ngôn ngữ chức năng khác, kết hợp rõ ràng các khía cạnh chức năng và OOP. Chỉ có nhiều khoa học hơn với ngôn ngữ chủ yếu là chức năng hơn là các ngôn ngữ OO không hoạt động.
Các ngôn ngữ OO không thể dễ dàng được biên dịch sang các ngôn ngữ OO khác, tức là chúng ở một số cách "nâng cao" hơn. Thông thường, chúng có các tính năng như ngăn xếp ngăn xếp, khả năng gỡ lỗi nâng cao, đa luồng trừu tượng và có thể kiểm tra, tải đối tượng động từ các tệp từ internet ... Nhiều tính năng này không hoặc không dễ dàng thực hiện được với C hoặc C++ làm trình biên dịch -backend. LISP ngôn ngữ chức năng (50 năm tuổi!) Là AFAIK đầu tiên với bộ thu gom rác. Khi LISP trình biên dịch phụ trợ sử dụng phiên bản tấn công của ngôn ngữ C, bởi vì đồng bằng C không cho phép một số thứ đó, assembly đã cho phép, tức là các cuộc gọi thích hợp hoặc các bảng-tiếp-nối-mã. C-- cho phép điều đó.
Một khía cạnh khác: Các ngôn ngữ bắt buộc được dự định chạy trên một kiến trúc cụ thể, tức là các chương trình C và C++ chỉ chạy trên các kiến trúc đó, chúng được lập trình. Java là cực đoan hơn: nó chỉ chạy trên một kiến trúc duy nhất, một ảo, mà chính nó chạy trên những người khác. Ngôn ngữ chức năng thường được thiết kế độc lập với kiến trúc khá độc đáo: LISP được phát triển để có kiến trúc to lớn đến mức không thể xác định, nó có thể được biên dịch thành mã di truyền, trong một tương lai xa xôi. Có, giống như các chương trình chạy trong các tế bào sinh học sống.
Với mã byte cho LLVM, các ngôn ngữ chức năng sẽ được biên dịch thành bytecode trong tương lai. Hầu hết các ngôn ngữ bắt buộc sẽ có nhiều khả năng vẫn còn có cùng các vấn đề di truyền như chúng bây giờ không từ trừu tượng đến nay. Vâng, tôi không chắc chắn về clang và D, nhưng hai người đó không phải là "nhiều nhất".
Tôi đoán điều này là do chúng được thiết kế cho hiệu quả, và bytecode/VM hầu như luôn đi kèm với một sự cân bằng hiệu suất.Tuy nhiên, lưu ý rằng cả C++ và Objective-C biên dịch thành bytecode LLVM mà sau đó có thể được chuyển đổi thành mã gốc. –
@Diego: Trong * một số * triển khai. 'gcc' không biên dịch thành LLVM, và tôi chắc rằng Visual Studio cũng vậy. – sepp2k
@ sepp2k: Tôi không hiểu ý bạn là gì với "gcc không biên dịch thành LLVM". LLVM có thể biên dịch C, C++ và Objective-C thành bytecode và thành mã gốc sau đó (tất nhiên, trong một số nền tảng) một mình. –