Вот несколько быстрых ответов, основанных на памяти. (Вы всегда можете подробно изучить код компилятора.)
1) Позволяет нацеливаться на разные фреймворки, не пытаясь неявно использовать какие-либо сборки mscorlib / FSharp.Core. Таким образом, вы используете это, например, когда вы явно ссылаетесь на Silverlight mscorlib / FSharp.Core, чтобы указать на Silverlight.
2) Да, почти все из них, и я не знаю, чем они все являются. Вы можете посмотреть на opt.fs.
3) Отладка - при использовании VS в режиме «Отладка» --tailcalls-
передается для отключения оконечных вызовов и сохранения всех кадров стека для упрощения отладки.
4) FSharp может выполнять встраивание и другие оптимизации через границы сборки. Это может быть опасно для опубликованных библиотек, потому что, если ссылки A B и A были скомпилированы с помощью перекрестной оптимизации, а затем развернуты, а затем кто-то изменил / повторно развернул B, возможно, что A "вызовет" метод в "старом" B, потому что это код из B был встроен в A, и поэтому A все еще имеет «старый B» код, если A не перекомпилирован. На практике это редко имеет значение, но в «типичном» сценарии, если у вас есть несколько зависимых, но независимо распространяемых библиотек F #, вы хотите отключить перекрестную оптимизацию, чтобы избавиться от хрупких зависимостей.
5) Это больше не существует.