Dos2unix в файлах Java

Есть ли какие-либо воздействия или последствия, если команда dos2unix выполняется для исходных файлов Java непосредственно перед их компиляцией? Файлы Java будут загружены из репозитория CVS в Linux, а затем скомпилированы в jar с помощью сценария Ant. Спасибо.


person Vince-V    schedule 06.03.2018    source источник
comment
Боже мой, репозиторий CVS.   -  person lexicore    schedule 06.03.2018


Ответы (3)


Нет необходимости даже проверять это (теоретически): в языках Java разрывы строк не имеют семантического значения. Поэтому их наличие не имеет значения (для компилятора то есть).

Таким образом, человеческому читателю очень неприятно смотреть на исходный код, который имеет ноль новых строк или новую строку в любом месте, где они допустимы - для компилятора, как сказано: это не имеет значения. .

Поэтому такие инструменты, как dos2unix, не должны вносить какие-либо изменения в исходный код, которые могут привести к «семантической» разнице.

И, конечно же, настоящий ответ таков: не тратьте свое время на беспокойство о разрывах строк. Вложите их в перенос всей системы с 1999 на 2018 год (например, заменив CVS на git, а Ant на maven/gradle).

person GhostCat    schedule 06.03.2018
comment
Ну, новые строки, безусловно, имеют некоторое значение, поскольку они считаются пробелами, разделяющими токены. Например, a\nb — это два отдельных токена, a и b, а ab — это один токен, ab. Тем не менее, что касается вопроса, на который стоит ваша точка зрения, я думаю, что это исключение не делает недействительным преобразование новых строк (но их удаление может быть опасным). - person BeeOnRope; 07.03.2018

Нет. Все, что он делает, это имеет дело с окончаниями строк.

person Dave Newton    schedule 06.03.2018

Практический тест

Сначала я создал тестовый файл с окончаниями строк Linux, названными Main.java, что неудивительно в Linux, который был скомпилирован.

0x63 [ c]  0x6c [ l]  0x61 [ a]  0x73 [ s]  0x73 [ s]  
0x20 [  ]  0x4d [ M]  0x61 [ a]  0x69 [ i]  0x6e [ n]  
0x20 [  ]  0x7b [ {]  0x0a [\n]  0x7d [ }]  0x0a [\n]  
0x0a [\n]

Преобразование в окончания DOS дало это:

0x63 [ c]  0x6c [ l]  0x61 [ a]  0x73 [ s]  0x73 [ s]  
0x20 [  ]  0x4d [ M]  0x61 [ a]  0x69 [ i]  0x6e [ n]  
0x20 [  ]  0x7b [ {]  0x0d [\r]  0x0a [\n]  0x7d [ }]  
0x0d [\r]  0x0a [\n]  0x0d [\r]  0x0a [\n]

Который все еще компилируется, и обратное преобразование дает:

0x63 [ c]  0x6c [ l]  0x61 [ a]  0x73 [ s]  0x73 [ s]  
0x20 [  ]  0x4d [ M]  0x61 [ a]  0x69 [ i]  0x6e [ n]  
0x20 [  ]  0x7b [ {]  0x0a [\n]  0x7d [ }]  0x0a [\n]  
0x0a [\n]

То же, что и раньше

Окончания строк

Разница между окончаниями строк в Windows (dos) и Linux/Mac (unix) заключается в том, что строка, заканчивающаяся в unix, равна \n, а строка, заканчивающаяся в dos, — \r\n.

Полученные результаты

  • Поскольку unix2dos / dos2unix изменяет только окончания строк, это не меняет содержимое
  • По крайней мере, в Linux javac может компилировать исходные файлы с успешным завершением любой строки.
person jrtapsell    schedule 06.03.2018