LINUX.ORG.RU

VSCode как IDE для Fortran

 ,


3

1

Среди бесплатных IDE для языка Fortran можно использовать несколько приложений. Самый простой из них в использовании, особенно для начинающих, наверное, Code::Blocks, в котором проще всего создать проект. Помимо него возможность работы с проектами на Fortran имеют

  • Eclipse - используется компонент «Photran» из «Eclipse for Parallel Application Developers», на вид имеет хороший список инструментов;
  • Netbeans - создаётся как проект C/С++;
  • Oracle Developer Studio - для скачивания требует регистрации.

Если кто имеет опыт работы в них, будет интересно более подробно о них узнать, особенно о возможностях и инструментах, которые понравились. Может ещё какие бесплатные IDE стоит отметить, о которых я не упомянул.

Долго я смотрел на vscode и не мог решиться его на чём-нибудь попробовать. В итоге решил посмотреть, есть ли в нём возможность работы с проектами на Fortran.

Пока только настроил: кусок на скриншоте писал в Kate, остальное попробую дописать в vscode. Просто класс для разбора формата базы термодинамических данных в формате NASA 7, с последующим запихиванием всего в массив структур (название, компонентный состав, коэффициенты полинома). Только начал переписывать этот же класс с C++ (ранее написанный), поэтому пока есть только чтение коэффициентов для текущего компонента, без чтения имени и элементного состава и использования этих компонентов для вычисления того, для чего они предназначены.

Для примера, кусок кода со скриншота на C++ выглядит примерно так:

if ( (str.length() >= 80) && (str.substr(1, 1) != "!") && (str.substr(79, 1) == "2") ) {
    for(int i = 0; i < 5; ++i) {
        Sp_tmp.coef.push_back( std::stod(str.substr(i*15, 15)) );
    }
}

Настройка

Прежде всего, после скачивания с оф. сайта архива code-stable-code_1.17.0-1507160143_amd64.tar.gz, его распаковки в нужный мне домашний каталог и первого запуска, я отключил передачу «телеметрии» (но это не отключает передачу «телеметрии» расширениями):

«File - Preferences - Settings: [Crtl + ,]» поиск «telemetry» и для параметров «telemetry.enableTelemetry» и «telemetry.enableCrashReporter» выставил значения «false».

Для языка Fortran для VSCode есть 3 расширения (2 из них от одного автора, просто разных версий). Наиболее интересным и полезным в данном случае является расширение «Modern Fortran 0.6.0». Оно обеспечивает

  • подстветку синтаксиса;
  • вставку шаблонов блоков кода (code snippets);
  • всплывающие подсказки по документации для встроенных функций;
  • анализ кода на присутствие возможных ошибок с помощью gfortran (code linting);
  • автодополнение кода (в стадии beta).

Установить его можно через поиск дополнений или командой
Ctrl+P : ext install linter-gfortran

Для отладки приложений понадобится установить расширение С/C++ (cpptools)
Ctrl+P: ext install cpptools

Дальнейшая настройка большей частью основана на статье по настройке окружения для расширения C/С++.

Создадим tasks «build debug» и «build release» (Task - Configure Task) на основе шаблона «other task», приведя исходный шаблон, например, к виду (в том числе для того, чтобы запускать их потом из группы задач посредством Ctrl+Shift+B или F5 т.к. это действие всё равно будет вызывать по умолчанию):

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "taskName": "build debug",
            "type": "shell",
            "command": "make debug",
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }    
        {
            "taskName": "build release",
            "type": "shell",
            "command": "make all",
            "group": {
                "kind": "build",
                "isDefault": false
            }
        }
    ]
}

Здесь можно было либо явно указывать что собирать (как в примере из руководства), либо использовать make или cmake. Содержимое Makefile для проекта из файлов main.f95, species.f95:

# On the base of: http://genius2k.is-programmer.com/posts/40301.html
# Start of the makefile
# Defining variables
objects = species.o main.o
f95comp = gfortran
switch = -Wall -O2
# Makefile
all: executable
executable: $(objects)
	$(f95comp) -o a.out $(switch) $(objects)
class_species.mod: species.o species.f95
	$(f95comp) -c $(switch) species.f95
species.o: species.f95
	$(f95comp) -c $(switch) species.f95
main.o: class_species.mod main.f95
	$(f95comp) -c $(switch) main.f95
%.o: %.f95
	$(f95comp) -c $(switch) $<
debug: switch = -g -Wall
debug: executable
# Cleaning everything
clean:
	rm species.mod
	rm $(objects)
# End of the makefile

На вкладке Debug нажмём иконку настроек и приведём файл launch.json к виду:

{
        "version": "0.2.0",
        "configurations": [
            {
                "name": "(gdb) Launch",
                "type": "cppdbg",
                "request": "launch",
                "program": "${workspaceRoot}/a.out",
                "args": [],
                "stopAtEntry": false,
                "cwd": "${workspaceRoot}",
                "environment": [],
                "externalConsole": true,
                "MIMode": "gdb",
                "setupCommands": [
                    {
                        "description": "Enable pretty-printing for gdb",
                        "text": "-enable-pretty-printing",
                        "ignoreFailures": true
                    }
                ],
                "preLaunchTask": "build debug"
            }
        ]
    }

По умолчанию, для исходных текстов на языке фортран (и других не поддерживаемых) не будет работать расстановка breakpoits. Чтобы исправить это, можно зайти в настройки «File - Preferences - Settings::» и найти File -> Preferences -> Settings -> Debug присвоив параметру «debug.allowBreakpointsEverywhere» значение «true».

К сожалению, cpptools при отладке пока не умеет работать со встроенным в vscode терминалом и умеет выводить данные только в xterm (его видно в нижней части экрана на скриншоте) или gnome terminal.

Всё, теперь при нажатии F5 будут пересобираться файлы проекта и запускаться отладка. К сожалению, примерно так же настраивать придётся для каждого нового проекта.

>>> Просмотр (1680x1050, 259 Kb)

★★★★★

Проверено: JB ()
Последнее исправление: JB (всего исправлений: 2)
Ответ на: комментарий от awesomelackware

Ни одно вещество не пострадало.

grem ★★★★★
() автор топика

Приятный редактор, только все никак его для себя не настрою. И так и не начал им пользоваться, практически. Хотя уже все нужное в нем для меня есть

sehellion ★★★★★
()

Лишь бы Емакс не использовать...

BceM_IIpuBeT ★★☆☆☆
()

В чем проблема писать код в текстовом редакторе? Тут большой выбор: kwrite,kate,gedit,vim,emacs,...

Deleted
()
Ответ на: комментарий от Deleted

Проблемы обычно нет, до тех пор пока не нужно в режиме отладки пройтись по циклам и отследить как изменяются элементы массивов в них по мере прохода. В этом случае встроенные средства отладки обычно удобнее, чем выводы в файл/терминал.

В данном случае это, действительно, не столь актуально, так как в основном идёт работа с однообразными строками и небольшими массивами. Можно понапихать «print'ов», куски которых видны на картинке.

grem ★★★★★
() автор топика
Ответ на: комментарий от basp

Не сомневаюсь, мне особенно нравится, когда поддерживается подсветка разметки f77 (выделяются первые 6 позиций). Это нечасто встречается. Но он платный, что мне пока не подходит.

grem ★★★★★
() автор топика

А вот у меня два вопроса:

1. Зачем четыре раза повторять

str(1:1) /= '!'
?

2. Почему не Python? Для работы с текстом фортран — зверское извращение, по-моему (хотя у меня у самого есть программы на фортране для парсинга, но я сто раз пожалел, что не знал питон, когда их писал).

knovich
()
Ответ на: комментарий от knovich

1. Да, тут можно и наружу вынести. Не помню почему решил всё в одно условие писать. Скорее всего проверял на одной строке, а потом размножил. В варианте на C++ ещё проверялось, что строка не меньше 80 символов, а то вдруг короче. Хотя в целом предполагается, что в читаемом файле нет ошибок заполнения. И из-за трёх проверок, решил, что особого смысла нет выносить одну наружу или делать последовательно вложенную структуру. Выполняется всё равно очень быстро.

2. Почему не питон? Потому, что на python, а после более аккуратно на C++ я это уже написал. В Python я не понял как создать класс содержащий массив структур. Поэтому класс содержал структуру, а снаружи был массив из членов этого класса, который заполнялся. В C++ с этим проблем не было.

Хотелось чуть попрактиковаться в Fortran. На самом деле, для работы со строками там, на мой взгляд, возможности богаче чем в чистом C - достаточно много встроенных функций: среди них: срезы (в python почти такие же); поиск внутри символа из набора символов, по подстроке, проверка на наличие символа не из набора символов - всё это как в прямом, так и в обратном направлении. Разве что сама строка фиксированной длины, поэтому в варианте на Fortran нет сравнения с длинной строки, она и так всё время 80 для переменной. Придётся динамически создавать строку нужной длины на основе среза. Что-то такое:

...
    character(20) :: tmp = "O "
    character(len=:), allocatable :: key
...
    allocate( key, source = tmp(:len_trim(tmp)) )
    print *, "_",tmp,"_"
    print *, "_",key,"_"
...
_O                   _
_O_

«_» - для визуализации границ.

Опять же, если числа читать по формату, то можно сразу кучей в массив передавать, без циклов.

grem ★★★★★
() автор топика
Последнее исправление: grem (всего исправлений: 2)
Ответ на: комментарий от grem
  1. Выполняется всё равно очень быстро.

    Да, но я это не со скоростью связывал, а с читаемостью. Опять же, если вдруг "!" поменяется на «WTF», то придётся четыре раза вносить изменения, и может закрасться ошибка.
  2. В Python я не понял как создать класс содержащий массив структур

    Что-то там было, я гуглил «struct alternative in python». И в numpy, и отдельной библиотекой. Хотя, конечно, жаль, что этого нет в стандарте, это да.
knovich
()
Ответ на: комментарий от pawnhearts

Ну это не совсем удобный struct, а вот namedtuple — то, что нужно. Я имел в виду, что нельзя сделать, например, массив из структур и обращаться к отдельным полям через имя массива:

type mytype
real::x,y
end type
type(mytype),dimension(10)::array
array(2:5)%x = [1.0,1.1,1.2,1.3]+array(1:4)%y

knovich
()
Ответ на: комментарий от knovich

Опять же, если вдруг "!" поменяется на «WTF», то придётся четыре раза вносить изменения, и может закрасться ошибка.

Не поменяется, формат фиксированный и все позиции у него (если он записан без ошибок) строго на своих местах должны быть. Другое дело, что можно isotat'ов воткнуть, для проверок соответствию формата, но пока лень :(

namedtuple

Прочитал про него, но не понял, как с его помощью создать класс, содержащий массив (лист) структур (элементов этого самого namedtuple). Я создавал, примерно такой класс и снаружи класса лист, который заполнял членами этого класса.

class Point():
    def __init__(self, x, y):
    self.x = x
    self.y = y

...
# снаружи класса
arr = []
...
    # где-то в цикле
    arr.append(Point(x, y))
...

Из примеров, которые я нашёл для namedtuple, делают то же самое - создают переменную этого типа (запихивая в неё разные данные), а потом добавляют её в лист.

grem ★★★★★
() автор топика
Ответ на: комментарий от grem

Вроде да, то же самое, просто не надо конструктор писать и переписывать, если вдруг хочется добавить поле в структуру.

knovich
()
Ответ на: комментарий от aedeph_

select case (не знаю почему я его существование игнорирую) ещё можно использовать, но цикл здесь малопригоден: в «четвёртой» строке считывается другое количество элементов и тогда в цикл придётся запихивать if; для «первой» строки её разбор вообще иначе на самом деле происходит. А так бы можно было и в forall запихнуть.

grem ★★★★★
() автор топика
Ответ на: комментарий от grem

но цикл здесь малопригоден

Нет, ты.

if (str(1:1) == '!') cycle

После чего все if'ы уходят в select case по 80-м символу.

Лично я бы ещё и форматы внёс в строковые переменные, заполняемые автоматически, но утверждение о большей читаемости было бы весьма дискуссионным.

aedeph_ ★★
()
Последнее исправление: aedeph_ (всего исправлений: 1)
Ответ на: комментарий от aedeph_

я бы ещё и форматы внёс в строковые переменные, заполняемые автоматически

То есть '(5e15.8)' и '(4e15.8)'? Угу, можно.

grem ★★★★★
() автор топика

восхитительно!

Deleted
()
Ответ на: комментарий от basp

вот хороший редактор и ide

А какие редакторы поддерживают разметку и выделение 6-й колонки («continuation column») для Fortran 77 (примерно как здесь https://a.fsdn.com/con/app/proj/cbfortran/screenshots/CB_Fortran_IDE_f77.png)?

Помню старый Visual Fortran такую имел.

grem ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.