Если это всегда - тот же столбец, то можно создать представление, которое не имеет его в нем.
Иначе, нет я не думаю так.
Если все, что вам нужно, это перевести ключевые слова, то (хотя вам определенно нужен правильный синтаксический анализатор, иначе изменение строк, комментариев и c становится кошмаром) задача довольно простая. Например, поскольку вы упомянули Python:
import cStringIO
import keyword
import token
import tokenize
samp = '''\
for x in range(8):
if x%2:
y = x
while y>0:
print y,
y -= 3
print
'''
translate = {'for': 'per', 'if': 'se', 'while': 'mentre', 'print': 'stampa'}
def toks(tokens):
for tt, ts, src, erc, ll in tokens:
if tt == token.NAME and keyword.iskeyword(ts):
ts = translate.get(ts, ts)
yield tt, ts
def main():
rl = cStringIO.StringIO(samp).readline
toki = toks(tokenize.generate_tokens(rl))
print tokenize.untokenize(toki)
main()
, я надеюсь, что очевидно, как обобщить это, чтобы «перевести» любой исходный код Python и на любой язык (я предоставляю только частичный перевод слов на итальянский язык). Это выдает:
per x in range (8 ):
se x %2 :
y =x
mentre y >0 :
stampa y ,
y -=3
stampa
(странный, хотя и правильный пробел, но это можно легко исправить). Как говорящий по-итальянски, я могу сказать, что это ужасно читать, но это обычное дело для любого «перевода на язык программирования» по вашему желанию. Хуже того, НЕ-ключевые слова, такие как диапазон
, остаются непереведенными (согласно вашим спецификациям) - конечно, у вас нет , чтобы ограничить ваш перевод только ключевыми словами (это достаточно легко удалить if
, который делает это выше; -).
import cStringIO
import keyword
import token
import tokenize
samp = '''\
for x in range(8):
if x%2:
y = x
while y>0:
print y,
y -= 3
print
'''
translate = {'for': 'per', 'if': 'se', 'while': 'mentre', 'print': 'stampa'}
def toks(tokens):
for tt, ts, src, erc, ll in tokens:
if tt == token.NAME and keyword.iskeyword(ts):
ts = translate.get(ts, ts)
yield tt, ts
def main():
rl = cStringIO.StringIO(samp).readline
toki = toks(tokenize.generate_tokens(rl))
print tokenize.untokenize(toki)
main()
Я надеюсь, что очевидно, как обобщить это, чтобы «перевести» любой исходный код Python и на любой язык (я предоставляю только частичный перевод ключевых слов на итальянский язык). Это выдает:
per x in range (8 ):
se x %2 :
y =x
mentre y >0 :
stampa y ,
y -=3
stampa
(странный, хотя и правильный пробел, но это можно легко исправить). Как говорящий по-итальянски, я могу сказать, что это ужасно читать, но это нормально для любого «перевода на язык программирования» по вашему желанию. Хуже того, НЕ-ключевые слова, такие как диапазон
, остаются непереведенными (согласно вашим спецификациям) - конечно, у вас нет , чтобы ограничить ваш перевод только ключевыми словами (это достаточно легко удалить if
, который делает это выше; -).
import cStringIO
import keyword
import token
import tokenize
samp = '''\
for x in range(8):
if x%2:
y = x
while y>0:
print y,
y -= 3
print
'''
translate = {'for': 'per', 'if': 'se', 'while': 'mentre', 'print': 'stampa'}
def toks(tokens):
for tt, ts, src, erc, ll in tokens:
if tt == token.NAME and keyword.iskeyword(ts):
ts = translate.get(ts, ts)
yield tt, ts
def main():
rl = cStringIO.StringIO(samp).readline
toki = toks(tokenize.generate_tokens(rl))
print tokenize.untokenize(toki)
main()
Я надеюсь, что очевидно, как обобщить это, чтобы «перевести» любой исходный код Python и на любой язык (я предоставляю только частичный перевод ключевых слов на итальянский язык). Это выдает:
per x in range (8 ):
se x %2 :
y =x
mentre y >0 :
stampa y ,
y -=3
stampa
(странный, хотя и правильный пробел, но это можно легко исправить). Как говорящий по-итальянски, я могу сказать, что это ужасно читать, но это обычное дело для любого «перевода на язык программирования» по вашему желанию. Хуже того, НЕ-ключевые слова, такие как диапазон
, остаются непереведенными (согласно вашим спецификациям) - конечно, у вас нет , чтобы ограничить перевод только ключевыми словами (это достаточно легко удалить if
, который делает это выше; -).
per x in range (8 ):
se x %2 :
y =x
mentre y >0 :
stampa y ,
y -=3
stampa
(странный, хотя и правильный пробел, но это можно легко исправить). Как говорящий по-итальянски, я могу сказать, что это ужасно читать, но это нормально для любого «перевода на язык программирования» по вашему желанию. Хуже того, НЕ-ключевые слова, такие как диапазон
, остаются непереведенными (согласно вашим спецификациям) - конечно, у вас нет , чтобы ограничить перевод только ключевыми словами (это достаточно легко удалить if
, который делает это выше; -).
per x in range (8 ):
se x %2 :
y =x
mentre y >0 :
stampa y ,
y -=3
stampa
(странный, хотя и правильный пробел, но это можно легко исправить). Как говорящий по-итальянски, я могу сказать, что это ужасно читать, но это обычное дело для любого «перевода на язык программирования» по вашему желанию. Хуже того, НЕ-ключевые слова, такие как диапазон
, остаются непереведенными (согласно вашим спецификациям) - конечно, у вас нет , чтобы ограничить ваш перевод только ключевыми словами (это достаточно легко удалить if
, который делает это выше; -).
диапазон
, остаются непереведенными (согласно вашим спецификациям) - конечно, у вас нет , чтобы ограничить ваш перевод только ключевыми словами (это достаточно легко удалить if
, который делает это выше; -). Как говорящий по-итальянски, я могу сказать, что это ужасно читать, но это нормально для любого «перевода на язык программирования» по вашему желанию. Хуже того, НЕ-ключевые слова, такие как диапазон
, остаются непереведенными (согласно вашим спецификациям) - конечно, у вас нет , чтобы ограничить ваш перевод только ключевыми словами (это достаточно легко удалить if
, который делает это выше; -). Проблема, с которой вы столкнетесь, заключается в том, что, если у вас нет строгих стандартов кодирования, тот факт, что люди не обязательно будут следовать шаблону в том, как они делают код. И на любом динамическом языке у вас будет проблема, когда функция eval
будет содержать ключевые слова в кавычках.
Если вы пытаетесь обучать языку, вы можете создать DSL с ключевыми словами на испанском, поэтому что вы можете преподавать на своем языке, и это может быть обработано на python или javascript, поэтому вы в основном создали свой собственный язык с нужными вам конструкциями для обучения.
Как только они поймут, как программировать, им тогда понадобится чтобы начать изучать языки с ключевыми словами «английский», чтобы они могли общаться с другими, но это может произойти после того, как они поймут, как программировать, если это облегчит вашу жизнь.
Итак,
Это не оптимистичный ответ и не лучший. Однако я считаю, что в этом есть свои достоинства.
Я могу говорить о C # и перевод не стоит. Вот причины:
Я видел, как несколько человек обсуждали код C # на языке, отличном от английского. Во всех случаях авторы объясняют код на своем родном языке, но пишут его на английском языке, как есть. Лучшим подходом, по-видимому, является попытка выучить достаточно английского языка, чтобы чувствовать себя комфортно с C #, как это естественно.
Было бы невозможно сделать перевод, который обрабатывал бы каждый случай. Возьмем, к примеру, этот код Javascript:
var x = Math.random() < 0.5 ? window : { location : { href : '' } };
var y = x.location.href;
Переменная x может либо стать ссылкой на объект окна, либо ссылкой на вновь созданный объект. Было бы разумно переводить члены, только если это объект окна, иначе вам пришлось бы переводить и имена переменных, что было бы беспорядком и легко могло вызвать проблемы.
Кроме того, не очень полезно знать язык на неправильном языке. Вся документация и примеры будут на исходном языке, поэтому они будут бесполезны.
You should think that the 'de facto' language for tokens on commonly used programming languages is english. So, for purely educational objectives, to teach on a translated language can be harmful for your student(s). Но если вы действительно хотите перевести токены компьютерного языка, вы должны подумать над следующими проблемами:
While I don't have an answer to the question, I think it's an interesting one. It brings up some issues which I have been thinking about:
As developing countries start introducing their population to higher technologies, naturally some will be interested in learning to program. Will English-only programming languages be an impediment?
Let's say a programming language was developed in a non-English part of the world: the keywords were written in the native language for that area and it used the native punctuation (eg, «» instead of " ", a comma as the decimal point (123,45), and so forth). It's a fantastic programming language, generating lots of buzz. Do you think it would see widespread adoption? Would you use it?
Most English-speaking people answer "no" to the first question. Even non-English (but educated) people answer no. But they also answer "no" to the second question, which seems to be a contradiction.
Был момент, когда я подумал о чем-то подобном для сценариев bash, но идея может быть реализована и на других языках:
#!/bin/bash
PrintOnScreen() {
echo "$1 $2 $3 $4 $5 $6 $7 $8 $9"
}
PrintOnScreenWithoutNewline() {
echo -n "$1 $2 $3 $4 $5 $6 $7 $8 $9"
}
MathAdd() {
expr $1 + $2
}
Тогда мы можем добавить это в некоторый сценарий:
#!/bin/bash
. HumanLanguage.sh
PrintOnScreen Hello
PrintOnScreenWithoutNewline "Some number:"
MathAdd 2 3
Это даст:
Hello
Some number: 5
Вы можете найти Perl Lingua :: Romana :: Perligata интересным - он позволяет вам писать ваши Perl-программы на латыни. Это не совсем то же самое, что ваша идея, так как по сути реструктурирует семантику языка вокруг латинских идей, а не просто переводит строки.