Skip to content

Commit bbceccc

Browse files
hubwritersaritai
andauthored
Using Copilot to migrate a project to a new language (#54207)
Co-authored-by: Sarita Iyer <66540150+saritai@users.noreply.github.com>
1 parent 0463a51 commit bbceccc

File tree

7 files changed

+658
-0
lines changed

7 files changed

+658
-0
lines changed
242 KB
Loading
404 KB
Loading

Diff for: content/copilot/copilot-chat-cookbook/refactoring-code/index.md

+1
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ children:
1717
- /handling-cross-cutting-concerns
1818
- /simplifying-complex-inheritance-hierarchies
1919
- /fixing-database-deadlocks-or-data-integrity-issues
20+
- /translating-code-to-a-different-programming-language
2021
---
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
---
2+
title: Translating code to a different programming language
3+
shortTitle: Translating code
4+
intro: '{% data variables.product.prodname_copilot_chat_short %} can help you rewrite code to perform the same operations but in a different programming language.'
5+
versions:
6+
feature: copilot
7+
category:
8+
- 'Refactoring code'
9+
complexity:
10+
- Simple
11+
octicon: rocket
12+
topics:
13+
- Copilot
14+
---
15+
16+
There are many reasons why you might want to move code from one programming language to another. Each programming language has its own strengths and weaknesses, and you might want to take advantage of features that are available in another language. For example, you might want to move code to a language that has better performance, or which uses strong typing to help prevent bugs.
17+
18+
For ease of maintaining code, you might want to move code to a language that is more widely used in your organization. For example, if few people in your organization know an older language such as Perl, you might want to move any Perl code that's still in use to a more commonly used language such as Python or JavaScript.
19+
20+
{% data variables.product.prodname_copilot_short %} can help you translate code from one language to another. Translating a standalone file, such as a script, is straightforward. This process is described in this article.
21+
22+
Translating a project containing multiple files is a more complex process, and is described in [AUTOTITLE](/copilot/using-github-copilot/guides-on-using-github-copilot/using-copilot-to-migrate-a-project).
23+
24+
## Example scenario
25+
26+
The following Perl script prompts the user to enter the path to a text file. It checks what the user enters and if a text file is found at that path, it outputs a word count and character count for the contents of the file.
27+
28+
```perl copy
29+
#!/usr/bin/perl
30+
use strict;
31+
use warnings;
32+
use File::Spec;
33+
use File::Basename;
34+
35+
print "Please enter the path to a local text file: ";
36+
chomp(my $file_path = <STDIN>);
37+
38+
if ($file_path =~ /[`|;&<>(){}\[\]]/ || !File::Spec->file_name_is_absolute($file_path) && dirname($file_path) ne '.') {
39+
die "Invalid file path. Please provide a valid path.\n";
40+
}
41+
if (!-e $file_path) {
42+
die "File not found. Please provide an existing file path.\n";
43+
}
44+
45+
open(my $fh, '<', $file_path) or die "Could not open file '$file_path': $!\n";
46+
47+
my $is_binary = 0;
48+
while (read($fh, my $buffer, 1024)) {
49+
if ($buffer =~ /[^\x09\x0A\x0D\x20-\x7E]/) {
50+
$is_binary = 1;
51+
last;
52+
}
53+
}
54+
close($fh);
55+
56+
if ($is_binary) {
57+
die "The file '$file_path' is a binary file. Please provide a text file.\n";
58+
}
59+
60+
open($fh, '<', $file_path) or die "Could not open file '$file_path': $!\n";
61+
my $content = do { local $/; <$fh> };
62+
close($fh);
63+
64+
my $word_count = scalar(split /\s+/, $content);
65+
my $char_count = length($content);
66+
67+
print "The file '$file_path' contains $word_count words and $char_count characters.\n";
68+
```
69+
70+
## Example prompt
71+
72+
`Tell me how I can convert this Perl script to Typescript. The functionality and output of the new script should be exactly the same as the existing one. Also tell me how to run the new file using Node.`
73+
74+
## Example response
75+
76+
{% data variables.product.prodname_copilot_short %} generates the following Typescript code.
77+
78+
> [!NOTE] {% data variables.product.prodname_copilot_chat_short %} responses are non-deterministic, so you may get a different response from the one shown here.
79+
80+
```typescript copy
81+
import * as fs from 'fs';
82+
import * as path from 'path';
83+
import * as readline from 'readline';
84+
85+
const rl = readline.createInterface({
86+
input: process.stdin,
87+
output: process.stdout
88+
});
89+
90+
rl.question('Please enter the path to a local text file: ', (filePath) => {
91+
rl.close();
92+
93+
if (/[`|;&<>(){}\[\]]/.test(filePath) || (!path.isAbsolute(filePath) && path.dirname(filePath) !== '.')) {
94+
console.error('Invalid file path. Please provide a valid path.');
95+
process.exit(1);
96+
}
97+
98+
if (!fs.existsSync(filePath)) {
99+
console.error('File not found. Please provide an existing file path.');
100+
process.exit(1);
101+
}
102+
103+
const fileBuffer = fs.readFileSync(filePath);
104+
const isBinary = fileBuffer.some(byte => byte < 9 || (byte > 13 && byte < 32) || byte > 126);
105+
106+
if (isBinary) {
107+
console.error(`The file '${filePath}' is a binary file. Please provide a text file.`);
108+
process.exit(1);
109+
}
110+
111+
const content = fileBuffer.toString('utf-8');
112+
const wordCount = content.split(/\s+/).length;
113+
const charCount = content.length;
114+
115+
console.log(`The file '${filePath}' contains ${wordCount} words and ${charCount} characters.`);
116+
});
117+
```
118+
119+
Save this file as `wordcount.ts`.
120+
121+
{% data variables.product.prodname_copilot_short %} goes on to explain how to run the new file using Node.
122+
123+
1. **Install Node.js:** If you don't have it already, download and install Node.js from the official website: https://nodejs.org/.
124+
1. **Install TypeScript:**
125+
126+
```shell
127+
npm install -g typescript
128+
```
129+
130+
1. **Compile the TypeScript code:**
131+
132+
```shell
133+
tsc wordcount.ts
134+
```
135+
136+
This will create a `wordcount.js` file in the same directory.
137+
138+
1. **Run the JavaScript file with Node.js:**
139+
140+
```shell
141+
node wordcount.js
142+
```
143+
144+
## Further reading
145+
146+
{% data reusables.copilot.example-prompts.further-reading-items %}

Diff for: content/copilot/using-github-copilot/guides-on-using-github-copilot/index.md

+1
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,6 @@ redirect_from:
1111
children:
1212
- /getting-started-with-prompts-for-copilot-chat
1313
- /refactoring-code-with-github-copilot
14+
- /using-copilot-to-migrate-a-project
1415
- /writing-tests-with-github-copilot
1516
---

0 commit comments

Comments
 (0)