Trình chuyển đổi Js sang C++ trực tuyến

Rất, rất phức tạp --- Javascript là một ngôn ngữ rất năng động, trong đó hầu hết mọi thứ đều có thể được thay đổi trong thời gian chạy. tên của các biến, hàm, loại, v.v. Vì vậy, nó ánh xạ rất tệ lên C. Và điều đó thậm chí còn chưa tính đến eval(), điều này sẽ cho phép bạn xây dựng các đoạn Javascript tùy ý trong các chuỗi và chạy chúng

Bất kỳ trình dịch Javascript nào cũng phải có khả năng đối phó với những thứ như vậy, điều đó có nghĩa là nó sẽ phải dịch Javascript sang C trong thời gian chạy --- điều này khiến nó trở thành một JIT mà bạn đang sử dụng

Thay vào đó, bạn có thể muốn xem cách viết các ràng buộc C cho Javascript. Những thứ này sẽ cho phép mã Javascript của bạn gọi ra mã C và ngược lại. Điều này sẽ cho phép mọi người viết các plugin bằng C, biên dịch chúng thành các thư viện chia sẻ .so, giờ đây bạn có thể tải và chạy từ mã Javascript của mình. Điều này có nghĩa là bạn không cần phải dịch bất cứ điều gì

Tôi e rằng Javascript không phải là lĩnh vực của tôi nên tôi không thể đề xuất bất kỳ cơ chế cụ thể nào --- nhưng tôi sẽ rất ngạc nhiên nếu V8Juice mà bạn đã tìm thấy không cho phép bạn làm điều này

Giả sử bạn cần tự động chuyển một số mã từ ngôn ngữ này sang ngôn ngữ khác, bạn sẽ làm điều đó như thế nào? . Điều đó nghe có vẻ đơn giản hơn nhiều so với

Trong bài viết này, chúng ta sẽ thảo luận về một số chiến lược để dịch JavaScript sang một ngôn ngữ rất khác, chẳng hạn như C#. Chúng tôi sẽ thảo luận về các vấn đề với điều đó và lên kế hoạch cho một số giải pháp khả thi. Chúng tôi sẽ không đến để viết mã. điều đó sẽ quá phức tạp để giới thiệu về chủ đề. Hãy tránh tập hợp một thứ gì đó khủng khiếp chỉ vì mục đích gõ một số mã

Phải nói rằng, chúng ta sẽ xem tất cả các vấn đề bạn có thể gặp phải khi chuyển đổi một dự án JavaScript thực. Fuzzysearch, một thư viện nhỏ nhưng rất thành công để tính toán sự khác biệt giữa hai chuỗi, trong ngữ cảnh sửa lỗi chính tả

'use strict';

function fuzzysearch (needle, haystack) {
  var hlen = haystack.length;
  var nlen = needle.length;
  if (nlen > hlen) {
    return false;
  }
  if (nlen === hlen) {
    return needle === haystack;
  }
  outer: for (var i = 0, j = 0; i < nlen; i++) {
    var nch = needle.charCodeAt(i);
    while (j < hlen) {
      if (haystack.charCodeAt(j++) === nch) {
        continue outer;
      }
    }
    return false;
  }
  return true;
}

module.exports = fuzzysearch;

Khi nó xứng đáng với nỗ lực

Trước hết, bạn nên tự hỏi liệu việc chuyển đổi đó có xứng đáng với nỗ lực không. Ngay cả khi bạn có thể lấy thành công một số C# có thể chạy được, bạn phải cân nhắc rằng phong cách và kiến ​​trúc có thể sẽ không tự nhiên. Nó sẽ không phải là các phương pháp và mẫu tốt nhất được áp dụng bởi phần còn lại của mã của bạn. Do đó, dự án có thể khó duy trì hơn nếu bạn viết nó từ đầu bằng C#

Đây là một vấn đề phổ biến ngay cả trong quá trình chuyển đổi được lên kế hoạch cẩn thận, với tư cách là người tạo ra Lucene. net, bắt đầu như một chuyển đổi từ Java sang C#. Hơn nữa, bạn sẽ không thể sử dụng nó nếu không thao tác thủ công cho từng dự án cụ thể, bởi vì ngay cả các thư viện tiêu chuẩn cũng khác nhau. Nhìn vào ví dụ. trong khi bạn có thể tận dụng chiều dài của đống cỏ khô. độ dài, bạn không thể chỉ viết hoa charCodeAt, bởi vì bạn sẽ phải ánh xạ các chức năng khác nhau trong ngôn ngữ nguồn và ngôn ngữ đích

Mặt khác, tất cả các ngôn ngữ đều có lĩnh vực chuyên môn mà bạn có thể quan tâm, chẳng hạn như Xử lý ngôn ngữ tự nhiên trong Python. Và nếu bạn chấp nhận thực tế rằng bạn sẽ phải thực hiện một số công việc thủ công và bạn rất quan tâm đến một dự án, thì việc tạo chuyển đổi tự động sẽ giúp bạn có một khởi đầu thuận lợi. Mặc dù nếu bạn quan tâm đến việc có một công cụ chung đã được thử nghiệm tốt, bạn có thể muốn tập trung vào các thư viện nhỏ, chẳng hạn như thư viện JavaScript trong ví dụ

Phân tích cú pháp với ANTLR

Bước đầu tiên là phân tích cú pháp và để làm được điều đó, bạn chỉ nên sử dụng ANTLR. Đã có sẵn nhiều ngữ pháp có thể không nhất thiết phải cập nhật. Nhưng tốt hơn nhiều so với bắt đầu từ đầu và họ sẽ cho bạn ý tưởng về quy mô của dự án. Bạn nên sử dụng khách truy cập thay vì người nghe vì chúng cho phép bạn kiểm soát luồng dễ dàng hơn. Bạn nên phân tích các thành phần khác nhau trong các lớp tùy chỉnh, có thể quản lý các vấn đề nhỏ phát sinh. Khi bạn đã hoàn thành việc này, việc tạo C# sẽ dễ dàng hơn

Sự khác biệt nhỏ

Có những thứ mà bạn có thể bỏ qua, chẳng hạn như dòng đầu tiên và dòng cuối cùng, rất có thể chúng không áp dụng cho dự án C# của bạn. Nhưng bạn phải chú ý đến những khác biệt nhỏ. từ khóa var có nghĩa khác trong JavaScript và C#. Thật tình cờ, nó sẽ hoạt động hầu hết thời gian và sẽ khá hữu ích để tránh vấn đề thiếu cách gõ nghiêm ngặt trong JavaScript. Nhưng nó không phải là phép thuật, bạn chỉ hy vọng rằng trình biên dịch sẽ tìm ra nó. Và đôi khi nó không phải là chuyển đổi 1-1. Chẳng hạn, bạn không thể sử dụng trong C# theo cách nó được sử dụng khi khởi tạo chu trình for

continue trước bên ngoài nên được chuyển đổi thành goto, nhưng khi ở một mình thì nó hoạt động giống như trong C#. Một sự khác biệt có thể được khắc phục khá khó khăn là so sánh bình đẳng nghiêm ngặt ===/!==, có thể được thay thế bằng ==/!= trong hầu hết các trường hợp, vì nó liên quan đến các vấn đề do cách gõ động của JavaScript. Nói chung, bạn có thể thực hiện kiểm tra trước khi phân tích cú pháp và chuyển đổi mã nguồn ban đầu để tránh một số sự cố hoặc thậm chí nhận xét một số điều không thể quản lý dễ dàng

Tôi trình bày cho bạn kẻ thù của bạn. Nhập động

Vấn đề thực sự là JavaScript sử dụng kiểu gõ động trong khi C# sử dụng kiểu gõ nghiêm ngặt. Trong JavaScript, bất cứ thứ gì cũng có thể là bất cứ thứ gì, điều này dẫn đến một số vấn đề nhất định, chẳng hạn như toán tử đẳng thức nghiêm ngặt đã nói ở trên, nhưng nó rất dễ sử dụng. Thay vào đó, trong C#, bạn cần biết loại biến của mình, vì có các kiểm tra được thực hiện. Và thông tin này đơn giản là không có sẵn trong mã nguồn JavaScript. Bạn có thể nghĩ rằng bạn chỉ có thể sử dụng từ khóa var, nhưng bạn không thể. Trình biên dịch phải có khả năng xác định kiểu thực tại thời điểm biên dịch, một điều không phải lúc nào cũng có thể thực hiện được. Ví dụ, bạn không thể sử dụng nó để khai báo đối số hàm

Bạn có thể sử dụng từ khóa dynamic để xác định loại tại thời điểm thực hiện. Tuy nhiên, điều này không khắc phục được tất cả các vấn đề, chẳng hạn như khởi tạo. Bạn có thể kiểm tra mã nguồn để khởi tạo theo nghĩa đen hoặc theo lý thuyết, thậm chí thực thi JavaScript gốc trong C# và tìm cách xác định đúng loại. Nhưng điều đó sẽ khá phức tạp. Bạn có thể gặp may mắn, và trong dự án nhỏ, chẳng hạn như ví dụ của chúng tôi, bạn sẽ gặp may, nhưng không phải lúc nào cũng vậy

Một kỹ thuật có thể hoạt động là tạo một lớp tùy chỉnh có thể quản lý vấn đề cụ thể của bạn trong thời gian chạy. Ví dụ, hãy tưởng tượng rằng bạn có một hàm đôi khi trả về một số thực và đôi khi là một số nguyên. Vấn đề là khi nó trả về một số thực, nó thực hiện một thao tác, nhưng nó lại thực hiện một thao tác khác khi nhận được một số nguyên. Bạn có thể tạo một lớp tùy chỉnh trong C# để xác định trong thời gian chạy kết quả hiện tại là loại thực tế nào và hoạt động tương ứng

Cũng có những vấn đề có thể dễ quản lý hơn bạn tưởng tượng. Chẳng hạn, gán một hàm cho một biến, đó không phải là điều bạn thường làm rõ ràng trong C# như bạn làm trong JavaScript. Nhưng thật dễ dàng khi sử dụng kiểu delegate và các cấu trúc như var0. Tất nhiên, bạn vẫn phải xử lý việc xác định các loại đối số chính xác, nếu có, nhưng nó không gây thêm bất kỳ khó khăn nào khác.

Không phải mọi thứ đều là đối tượng và các vấn đề khác

Trong Javascript chuỗi là một var1, nhưng không phải là một var2, trong khi trong C# mọi thứ đều là một đối tượng, không có ngoại lệ. Đây là một vấn đề có liên quan, nhưng nó ít gây ra vấn đề hơn so với gõ động. Chẳng hạn, để chuyển đổi ví dụ của chúng ta, chúng ta chỉ cần bọc xung quanh hàm một lớp tùy chỉnh, điều này không thực sự khó

Một vấn đề rõ ràng là có các thư viện khác nhau trong các ngôn ngữ khác nhau. Một số sẽ không có sẵn bằng ngôn ngữ đích. Mặt khác, một số phần của dự án có thể không cần thiết bằng ngôn ngữ đích vì đã có những lựa chọn thay thế tốt hơn. Tất nhiên, bạn vẫn phải thực sự thay đổi tất cả các mã liên quan hoặc bọc thư viện thực bằng ngôn ngữ đích xung quanh một lớp tùy chỉnh bắt chước lớp gốc

Phần kết luận

Thực sự có những khó khăn lớn ngay cả đối với dự án nhỏ để có thể chuyển đổi từ ngôn ngữ này sang ngôn ngữ khác, đặc biệt là khi chúng quá khác biệt như JavaScript và C#. Nhưng hãy hình dung rằng bạn quan tâm đến một thứ gì đó rất cụ thể, chẳng hạn như một thư viện rất thành công và các plugin của nó. Bạn muốn chuyển thư viện chính và cung cấp một cách đơn giản hơn để các nhà phát triển plugin chuyển công việc của họ. Có thể có nhiều điểm tương đồng trong mã và vì vậy bạn có thể thực hiện hầu hết công việc để quản lý các vấn đề điển hình và có thể cung cấp hướng dẫn cho những vấn đề còn lại

Chuyển đổi mã giữa các ngôn ngữ khác nhau về bản chất là điều không dễ dàng, đó là điều chắc chắn. Tuy nhiên, bạn có thể áp dụng một số cách tiếp cận tự động/thủ công hỗn hợp bằng cách tự động chuyển đổi một lượng lớn mã và sửa các trường hợp góc theo cách thủ công. Nếu bạn cũng có thể dịch các bài kiểm tra, có thể sau này bạn có thể cấu trúc lại mã, khi nó ở dạng C# và theo thời gian sẽ cải thiện chất lượng

phân tích cú pháp. Công cụ và Thư viện

Trình chuyển đổi Js sang C++ trực tuyến

Nhận hướng dẫn vào hộp thư đến của bạn để đọc nó trên tất cả các thiết bị của bạn khi bạn có thời gian. Tìm hiểu về phân tích cú pháp trong Java, Python, C# và JavaScript

Làm cách nào để chuyển đổi mã JavaScript sang C?

Biên dịch JavaScript sang Python, sau đó biên dịch Python sang C bằng Cython hoặc RPython . Vì các trình biên dịch này tương thích với một tập hợp con của Python, nên điều này sẽ cho phép một tập hợp con JavaScript được dịch sang C. Biên dịch JavaScript sang Lua bằng Castl, sau đó dịch mã Lua sang C bằng lua2c.

Chúng tôi có thể chuyển đổi JavaScript sang C# không?

string[] str = demo. Tách(",". ToCharArray()); Phần trên chuyển đổi mảng JavaScript thành C#.

Làm cách nào để chuyển đổi JavaScript sang Python trực tuyến?

Python3. Mô-đun js2py cung cấp một cách để chuyển đổi mã JS thành mã Python, chúng ta phải sử dụng hàm translate_file() cho việc này. Sau khi dịch, chúng tôi sẽ nhập tệp Python và cung cấp một cái gì đó cho hàm được khai báo trong tệp javascript.

Làm cách nào để chuyển đổi mã JS sang mã TS trực tuyến?

Để chuyển từ JS sang TS, chúng ta sẽ làm theo các bước sau. .
thêm tsconfig. tệp json vào dự án
Tích hợp với một công cụ xây dựng
Thay đổi tất cả. tập tin js để. tập tin ts
Kiểm tra bất kỳ lỗi nào