Nếu một cái gì đó có thể được tạo ra, thì thứ đó là dữ liệu, không phải mã.
Khi bạn quy định sau đó về mã đó là dữ liệu, mệnh đề của bạn giảm xuống thành "Nếu một cái gì đó có thể được tạo ra, thì thứ đó không phải là mã." Sau đó, bạn có thể nói rằng mã lắp ráp được tạo bởi trình biên dịch C không phải là mã? Điều gì xảy ra nếu nó trùng khớp chính xác với mã lắp ráp mà tôi viết bằng tay? Bạn được chào đón đến đó nếu bạn muốn, nhưng tôi sẽ không đến với bạn.
Thay vào đó, hãy bắt đầu với một định nghĩa về "mã". Không cần quá kỹ thuật, một định nghĩa khá hay cho mục đích của cuộc thảo luận này sẽ là "hướng dẫn hành động bằng máy để thực hiện tính toán."
Cho rằng, toàn bộ ý tưởng về việc tạo mã nguồn này có phải là một sự hiểu lầm không?
Vâng, đề xuất bắt đầu của bạn là mã không thể được tạo ra, nhưng tôi từ chối đề xuất đó. Nếu bạn chấp nhận định nghĩa của tôi về "mã" thì sẽ không có vấn đề khái niệm nào với việc tạo mã nói chung.
Đó là, nếu có một trình tạo mã cho một cái gì đó, vậy thì tại sao không biến cái đó thành một hàm thích hợp có thể nhận các tham số cần thiết và thực hiện đúng hành động mà mã "sẽ tạo" sẽ làm?
Đó là một câu hỏi hoàn toàn khác, về lý do sử dụng việc tạo mã, hơn là về bản chất của nó. Bạn đang đề xuất phương án thay vì viết hoặc sử dụng trình tạo mã, người ta viết một hàm tính kết quả trực tiếp. Nhưng trong ngôn ngữ nào? Đã qua rồi cái thời mà bất cứ ai viết trực tiếp bằng mã máy và nếu bạn viết mã bằng bất kỳ ngôn ngữ nào khác thì bạn phụ thuộc vào trình tạo mã dưới dạng trình biên dịch và / hoặc trình biên dịch để tạo chương trình thực sự chạy.
Tại sao, sau đó, bạn thích viết bằng Java hoặc C hoặc Lisp hay bất cứ điều gì? Ngay cả lắp ráp? Tôi khẳng định rằng ít nhất một phần vì các ngôn ngữ đó cung cấp sự trừu tượng cho dữ liệu và thao tác giúp dễ dàng thể hiện các chi tiết của tính toán mà bạn muốn thực hiện.
Điều tương tự cũng đúng với hầu hết các trình tạo mã cấp cao hơn. Các trường hợp nguyên mẫu có thể là máy quét và trình phân tích cú pháp như lex
và yacc
. Có, bạn có thể viết một trình quét và trình phân tích cú pháp trực tiếp bằng C hoặc bằng một số ngôn ngữ lập trình khác mà bạn chọn (ngay cả mã máy thô), và đôi khi một trình duyệt. Nhưng đối với một vấn đề phức tạp đáng kể, sử dụng ngôn ngữ có mục đích đặc biệt ở cấp độ cao hơn như lex's hoặc yacc để làm cho mã viết tay dễ viết, đọc và bảo trì hơn. Thường nhỏ hơn nhiều, quá.
Bạn cũng nên xem xét chính xác ý của bạn về "trình tạo mã". Tôi sẽ coi tiền xử lý C và khởi tạo các mẫu C ++ là các bài tập trong việc tạo mã; Bạn có phản đối những điều này? Nếu không, thì tôi nghĩ bạn sẽ cần phải thực hiện một số môn thể dục tinh thần để hợp lý hóa việc chấp nhận những thứ đó nhưng từ chối các hương vị khác của việc tạo mã.
Nếu nó đang được thực hiện vì lý do hiệu suất, thì điều đó nghe có vẻ như là một thiếu sót của trình biên dịch.
Tại sao? Về cơ bản, bạn đang đặt ra rằng một chương trình phổ quát mà người dùng cung cấp dữ liệu, một số được phân loại là "hướng dẫn" và một số khác là "đầu vào" và tiến hành tính toán và phát ra nhiều dữ liệu mà chúng ta gọi là "đầu ra". (Từ một quan điểm nhất định, người ta có thể gọi một chương trình phổ quát như vậy là "hệ điều hành".) Nhưng tại sao bạn cho rằng một trình biên dịch nên có hiệu quả trong việc tối ưu hóa một chương trình đa năng như vậy vì nó tối ưu hóa một chương trình chuyên dụng hơn chương trình? Hai chương trình có đặc điểm khác nhau và khả năng khác nhau.
Nếu nó được thực hiện để kết nối hai ngôn ngữ, thì điều đó nghe có vẻ như thiếu thư viện giao diện.
Bạn nói rằng như thể có một thư viện giao diện phổ quát đến một mức độ nào đó nhất thiết phải là một điều tốt. Có lẽ nó sẽ như vậy, nhưng trong nhiều trường hợp, một thư viện như vậy sẽ rất lớn, khó viết và bảo trì, và thậm chí có thể chậm. Và nếu một con thú như vậy trong thực tế không tồn tại để phục vụ vấn đề cụ thể trong tay, thì bạn là ai để khẳng định rằng chúng được tạo ra, khi một phương pháp tạo mã có thể giải quyết vấn đề nhanh chóng và dễ dàng hơn nhiều?
Am i thiếu cái gì ở đây?
Một số điều, tôi nghĩ.
Tôi biết rằng mã là dữ liệu là tốt. Điều tôi không hiểu là tại sao lại tạo mã nguồn? Tại sao không làm cho nó thành một chức năng có thể chấp nhận các tham số và hành động trên chúng?
Trình tạo mã biến đổi mã được viết bằng một ngôn ngữ thành mã bằng ngôn ngữ khác, thường là cấp thấp hơn. Sau đó, bạn đang hỏi tại sao mọi người muốn viết chương trình bằng nhiều ngôn ngữ và đặc biệt là tại sao họ có thể muốn kết hợp các ngôn ngữ ở các cấp độ chủ quan khác nhau.
Nhưng tôi đã chạm vào đó rồi. Người ta chọn một ngôn ngữ cho một nhiệm vụ cụ thể một phần dựa trên sự rõ ràng và tính biểu cảm của nó cho nhiệm vụ đó. Inasmuch vì mã nhỏ hơn có trung bình ít lỗi hơn và dễ bảo trì hơn, cũng có sự thiên vị đối với các ngôn ngữ cấp cao hơn, ít nhất là cho công việc quy mô lớn. Nhưng một chương trình phức tạp bao gồm nhiều nhiệm vụ và thường một số trong số chúng có thể được giải quyết hiệu quả hơn bằng một ngôn ngữ, trong khi những chương trình khác được giải quyết chính xác hơn hoặc chính xác hơn bằng ngôn ngữ khác. Sử dụng công cụ phù hợp cho công việc đôi khi có nghĩa là sử dụng việc tạo mã.